lmrc_gitlab/models/
runner.rs1use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
11pub struct Runner {
12 pub id: u64,
14
15 pub description: String,
17
18 #[serde(default)]
20 pub ip_address: Option<String>,
21
22 pub active: bool,
24
25 #[serde(default)]
27 pub online: bool,
28
29 pub status: RunnerStatus,
31
32 pub runner_type: RunnerType,
34
35 #[serde(default)]
37 pub is_shared: bool,
38
39 #[serde(default)]
41 pub name: Option<String>,
42
43 #[serde(default)]
45 pub tag_list: Vec<String>,
46
47 #[serde(default)]
49 pub version: Option<String>,
50
51 #[serde(default)]
53 pub architecture: Option<String>,
54
55 #[serde(default)]
57 pub platform: Option<String>,
58
59 #[serde(default)]
61 pub contacted_at: Option<DateTime<Utc>>,
62
63 #[serde(default)]
65 pub maximum_timeout: Option<u64>,
66
67 #[serde(default)]
69 pub run_untagged: bool,
70
71 #[serde(default)]
73 pub locked: bool,
74
75 #[serde(default)]
77 pub access_level: Option<String>,
78}
79
80#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)]
84#[serde(rename_all = "snake_case")]
85pub enum RunnerStatus {
86 Online,
88
89 Offline,
91
92 Paused,
94
95 #[serde(other)]
97 Unknown,
98}
99
100impl RunnerStatus {
101 pub fn is_available(self) -> bool {
113 self == Self::Online
114 }
115}
116
117impl std::fmt::Display for RunnerStatus {
118 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
119 match self {
120 Self::Online => write!(f, "online"),
121 Self::Offline => write!(f, "offline"),
122 Self::Paused => write!(f, "paused"),
123 Self::Unknown => write!(f, "unknown"),
124 }
125 }
126}
127
128#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)]
132#[serde(rename_all = "snake_case")]
133pub enum RunnerType {
134 #[serde(rename = "instance_type")]
136 Instance,
137
138 #[serde(rename = "group_type")]
140 Group,
141
142 #[serde(rename = "project_type")]
144 Project,
145}
146
147impl std::fmt::Display for RunnerType {
148 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
149 match self {
150 Self::Instance => write!(f, "instance"),
151 Self::Group => write!(f, "group"),
152 Self::Project => write!(f, "project"),
153 }
154 }
155}
156
157#[cfg(test)]
158mod tests {
159 use super::*;
160
161 #[test]
162 fn test_runner_status_is_available() {
163 assert!(RunnerStatus::Online.is_available());
164 assert!(!RunnerStatus::Offline.is_available());
165 assert!(!RunnerStatus::Paused.is_available());
166 }
167
168 #[test]
169 fn test_runner_status_display() {
170 assert_eq!(RunnerStatus::Online.to_string(), "online");
171 assert_eq!(RunnerStatus::Offline.to_string(), "offline");
172 assert_eq!(RunnerStatus::Paused.to_string(), "paused");
173 }
174
175 #[test]
176 fn test_runner_type_display() {
177 assert_eq!(RunnerType::Instance.to_string(), "instance");
178 assert_eq!(RunnerType::Group.to_string(), "group");
179 assert_eq!(RunnerType::Project.to_string(), "project");
180 }
181
182 #[test]
183 fn test_runner_status_serialization() {
184 let status = RunnerStatus::Online;
185 let json = serde_json::to_string(&status).unwrap();
186 assert_eq!(json, "\"online\"");
187
188 let deserialized: RunnerStatus = serde_json::from_str(&json).unwrap();
189 assert_eq!(deserialized, RunnerStatus::Online);
190 }
191
192 #[test]
193 fn test_runner_type_serialization() {
194 let runner_type = RunnerType::Instance;
195 let json = serde_json::to_string(&runner_type).unwrap();
196 assert_eq!(json, "\"instance_type\"");
197
198 let deserialized: RunnerType = serde_json::from_str(&json).unwrap();
199 assert_eq!(deserialized, RunnerType::Instance);
200 }
201}