1use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
13pub struct Runner {
14 #[serde(default)]
16 pub identity: String,
17
18 #[serde(default)]
20 pub hostname: String,
21
22 #[serde(default)]
24 pub process: String,
25
26 #[serde(default)]
28 pub pid: u32,
29
30 #[serde(default)]
32 pub uid: u32,
33
34 #[serde(default)]
36 pub gid: u32,
37
38 #[serde(default, skip_serializing_if = "Option::is_none")]
40 pub instance_id: Option<u64>,
41
42 #[serde(default, skip_serializing_if = "Option::is_none")]
44 pub timestamp: Option<u64>,
45
46 #[serde(flatten, default)]
48 pub extra: HashMap<String, serde_json::Value>,
49}
50
51#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
56pub struct RunnerRequest {
57 #[serde(skip_serializing_if = "Option::is_none")]
59 pub instance_id: Option<u64>,
60
61 #[serde(skip_serializing_if = "Option::is_none")]
63 pub timestamp: Option<u64>,
64
65 #[serde(flatten)]
67 pub extra: HashMap<String, serde_json::Value>,
68}
69
70impl RunnerRequest {
71 pub fn new() -> Self {
73 Self::default()
74 }
75
76 pub fn with_instance_id(mut self, id: u64) -> Self {
78 self.instance_id = Some(id);
79 self
80 }
81
82 pub fn with_timestamp(mut self, ts: u64) -> Self {
84 self.timestamp = Some(ts);
85 self
86 }
87
88 pub fn with_current_timestamp(mut self) -> Self {
90 self.timestamp = Some(
91 std::time::SystemTime::now()
92 .duration_since(std::time::UNIX_EPOCH)
93 .map(|d| d.as_secs())
94 .unwrap_or(0),
95 );
96 self
97 }
98
99 pub fn with_field(mut self, key: impl Into<String>, value: impl Into<serde_json::Value>) -> Self {
101 self.extra.insert(key.into(), value.into());
102 self
103 }
104}
105
106#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
111pub struct Identity {
112 pub identity: String,
114
115 pub idm_url: String,
117
118 pub config_url: String,
120
121 pub token: String,
123
124 pub runner: Runner,
127}
128
129#[derive(Debug, Deserialize)]
131pub(crate) struct DaemonResponse {
132 pub status: String,
133 #[serde(flatten)]
134 pub data: ResponseData,
135}
136
137#[derive(Debug, Deserialize)]
139#[serde(untagged)]
140pub(crate) enum ResponseData {
141 Success {
142 identity: String,
143 idm_url: String,
144 config_url: String,
145 token: String,
146 runner: Runner,
147 },
148 Error {
149 error_code: String,
150 message: String,
151 },
152}
153
154impl DaemonResponse {
155 pub fn is_ok(&self) -> bool {
157 self.status == "ok"
158 }
159}