use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
pub struct Runner {
#[serde(default)]
pub identity: String,
#[serde(default)]
pub hostname: String,
#[serde(default)]
pub process: String,
#[serde(default)]
pub pid: u32,
#[serde(default)]
pub uid: u32,
#[serde(default)]
pub gid: u32,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instance_id: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub timestamp: Option<u64>,
#[serde(flatten, default)]
pub extra: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
pub struct RunnerRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub instance_id: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub timestamp: Option<u64>,
#[serde(flatten)]
pub extra: HashMap<String, serde_json::Value>,
}
impl RunnerRequest {
pub fn new() -> Self {
Self::default()
}
pub fn with_instance_id(mut self, id: u64) -> Self {
self.instance_id = Some(id);
self
}
pub fn with_timestamp(mut self, ts: u64) -> Self {
self.timestamp = Some(ts);
self
}
pub fn with_current_timestamp(mut self) -> Self {
self.timestamp = Some(
std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.map(|d| d.as_secs())
.unwrap_or(0),
);
self
}
pub fn with_field(mut self, key: impl Into<String>, value: impl Into<serde_json::Value>) -> Self {
self.extra.insert(key.into(), value.into());
self
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Identity {
pub identity: String,
pub idm_url: String,
pub config_url: String,
pub token: String,
pub runner: Runner,
}
#[derive(Debug, Deserialize)]
pub(crate) struct DaemonResponse {
pub status: String,
#[serde(flatten)]
pub data: ResponseData,
}
#[derive(Debug, Deserialize)]
#[serde(untagged)]
pub(crate) enum ResponseData {
Success {
identity: String,
idm_url: String,
config_url: String,
token: String,
runner: Runner,
},
Error {
error_code: String,
message: String,
},
}
impl DaemonResponse {
pub fn is_ok(&self) -> bool {
self.status == "ok"
}
}