1use crate::{Error, files::Service};
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct QueryService {
7 pub status: Status,
8 pub status_since: Option<i64>,
9 pub pid: Option<i64>,
10 pub memory_usage: Option<u64>,
11 pub task_class: Option<String>,
12 pub last_error: Option<Error>,
13 pub definition: Service,
14}
15impl QueryService {
16 pub fn default_of(definition: Service) -> Self {
17 Self {
18 status: Status::Stopped,
19 status_since: None,
20 pid: None,
21 memory_usage: None,
22 task_class: None,
23 last_error: None,
24 definition,
25 }
26 }
27}
28
29#[derive(Debug, Clone, Serialize, Deserialize)]
31pub struct QuerySystem {
32 pub status: Status,
34
35 pub boot_timestamp: i64,
37
38 pub booted_since: Option<i64>,
40
41 pub is_booting: bool,
43
44 pub milestones: Vec<EnteredMilestone>,
46
47 pub instance_name: String,
49
50 pub services: Vec<String>,
52}
53
54#[derive(Debug, Clone, Default, Copy, PartialEq, Eq, Serialize, Deserialize)]
56#[serde(rename_all = "kebab-case")]
57pub enum Status {
58 Active,
60
61 #[default]
63 Stopped,
64}
65
66#[derive(Debug, Clone, Serialize, Deserialize)]
68pub struct LogRecord {
69 pub timestamp: i64,
71
72 pub module: String,
74
75 pub message: String,
77}
78
79#[derive(Debug, Clone, Serialize, Deserialize)]
81pub struct EnteredMilestone {
82 pub name: String,
84
85 pub begin_timestamp: i64,
87
88 pub finish_timestamp: i64,
90}
91
92#[derive(Debug, Clone, Serialize, Deserialize)]
94pub struct Event {
95 pub id: String,
97
98 pub payload: String,
100}
101impl Event {
102 pub fn new(id: String, payload: String) -> Self {
104 Self { id, payload }
105 }
106}
107
108pub trait ConnectionExt<'a>: crate::Connection {
110 fn sideload_service(&'a mut self, name: &'a str, service: &'a Service) -> Self::Invoke<'a, ()> {
112 self.invoke("system.sideload_service", (name, service))
113 }
114
115 fn start_service(&'a mut self, name: &'a str) -> Self::Invoke<'a, ()> {
117 self.invoke("system.start_service", name)
118 }
119
120 fn stop_service(&'a mut self, name: &'a str) -> Self::Invoke<'a, ()> {
122 self.invoke("system.stop_service", name)
123 }
124
125 fn kill_service(&'a mut self, name: &'a str) -> Self::Invoke<'a, ()> {
127 self.invoke("system.kill_service", name)
128 }
129
130 fn reload_service(&'a mut self, name: &'a str) -> Self::Invoke<'a, ()> {
132 self.invoke("system.reload_service", name)
133 }
134
135 fn cache_service(&'a mut self, name: &'a str) -> Self::Invoke<'a, ()> {
137 self.invoke("system.cache_service", name)
138 }
139
140 fn uncache_service(&'a mut self, name: &'a str) -> Self::Invoke<'a, ()> {
142 self.invoke("system.uncache_service", name)
143 }
144
145 fn query_service(&'a mut self, name: &'a str) -> Self::Invoke<'a, QueryService> {
147 self.invoke("system.query_service", name)
148 }
149
150 fn interrupt_service_task(&'a mut self, name: &'a str) -> Self::Invoke<'a, ()> {
152 self.invoke("system.interrupt_service_task", name)
153 }
154
155 fn query_system(&'a mut self) -> Self::Invoke<'a, QuerySystem> {
157 self.invoke("system.query_system", ())
158 }
159
160 fn list_services(&'a mut self) -> Self::Invoke<'a, Vec<String>> {
162 self.invoke("system.list_services", ())
163 }
164
165 fn refresh(&'a mut self) -> Self::Invoke<'a, Vec<(String, Error)>> {
167 self.invoke("system.refresh", ())
168 }
169
170 fn gc(&'a mut self) -> Self::Invoke<'a, ()> {
172 self.invoke("system.gc", ())
173 }
174
175 fn enter_milestone(&'a mut self, name: &'a str) -> Self::Invoke<'a, ()> {
177 self.invoke("system.enter_milestone", name)
178 }
179
180 fn set_instance_name(&'a mut self, name: &'a str) -> Self::Invoke<'a, ()> {
182 self.invoke("system.set_instance_name", name)
183 }
184
185 fn trigger_event(&'a mut self, event: &'a Event) -> Self::Invoke<'a, ()> {
187 self.invoke("system.trigger_event", event)
188 }
189
190 fn unregister_extension(&'a mut self, name: &'a str) -> Self::Invoke<'a, ()> {
192 self.invoke("system.unregister_extension", name)
193 }
194}
195impl<T> ConnectionExt<'_> for T where T: crate::Connection {}