tag2upload_service_manager/
o2m_messages.rs

1
2use crate::prelude::*;
3
4define_derive_deftly! {
5    Outcome:
6
7    impl Outcome {
8        pub fn job_status(&self) -> JobStatus {
9            match self { $(
10                $vtype($vname {}) => JobStatus::$vname,
11            ) }
12        }
13    }
14}
15
16#[derive(Deftly)]
17#[derive_deftly(MessageToOracle)]
18#[deftly(o2m(keyword = "t2u-manager-ready"))]
19pub struct Ready {}
20
21#[derive(Deftly)]
22#[derive_deftly(MessageFromOracle)]
23pub enum ClientGreeting {
24    Real(VersionRequest),
25    Local(local::Greeting),
26}
27
28#[derive(Deftly, Debug)]
29#[derive_deftly(MessageFromOracle)]
30#[deftly(o2m(keyword = "t2u-oracle-version"))]
31pub struct VersionRequest {
32    pub version: u32,
33}
34
35#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]
36#[derive(strum::FromRepr)]
37pub enum ProtocolVersion {
38    // enums default to starting at 0; always define value explicitly
39    PV4 = 4, // TODO remove
40    PV5 = 5,
41}
42impl UiDisplay for ProtocolVersion {
43    fn ui_display(&self) -> Cow<str> { (*self as isize).to_string().into() }
44}
45
46#[derive(Deftly, Debug)]
47#[derive_deftly(MessageFromOracle)]
48pub struct WorkerId {
49    pub worker: types::WorkerId,
50    pub fidelity: types::WorkerFidelity,
51}
52
53#[derive(Deftly, Debug)]
54#[derive_deftly(MessageFromOracle)]
55#[deftly(o2m(keyword = "worker-id"))]
56pub struct WorkerIdV2 {
57    pub worker: types::WorkerId,
58}
59
60#[derive(Deftly)]
61#[derive_deftly(MessageToOracle)]
62pub struct Ayt {}
63
64#[derive(Deftly)]
65#[derive_deftly(MessageFromOracle)]
66pub struct Ack {}
67
68#[derive(Deftly)]
69#[derive_deftly(MessageToOracle)]
70#[deftly(o2m(keyword = "restart-worker"))]
71pub struct RestartWorker {}
72
73#[derive(Deftly)]
74#[derive_deftly(MessageToOracle)]
75#[deftly(o2m(keyword = "job"))]
76pub struct JobV3 {
77    pub jid: JobId,
78    pub url: String,
79    #[deftly(o2m(data_blocks))]
80    pub body: TagObjectData,
81}
82
83#[derive(Deftly)]
84#[derive_deftly(MessageToOracle)]
85pub struct Job {
86    pub jid: JobId,
87    pub source: PackageName,
88    pub url: String,
89    #[deftly(o2m(data_blocks))]
90    pub body: TagObjectData,
91}
92
93#[derive(Deftly)]
94#[derive_deftly(MessageFromOracle)]
95pub struct Message {
96    #[deftly(o2m(rest_of_line))]
97    pub message: String,
98}
99
100#[derive(Deftly)]
101#[derive_deftly(MessageFromOracle)]
102pub struct Uploaded {}
103
104#[derive(Deftly)]
105#[derive_deftly(MessageFromOracle)]
106pub struct Irrecoverable {}
107
108#[derive(Deftly)]
109#[derive_deftly(MessageFromOracle, Outcome)]
110pub enum Outcome {
111    Uploaded(Uploaded),
112    Irrecoverable(Irrecoverable),
113}
114
115#[derive(Error, Debug)]
116#[derive(Deftly)]
117#[derive_deftly(MessageToOracle, MessageFromOracle)]
118#[deftly(o2m(infallible))]
119#[error("{message}")]
120pub struct ProtocolViolation {
121    #[deftly(o2m(rest_of_line))]
122    pub message: String,
123}
124
125pub mod local {
126    use super::*;
127
128    #[derive(Deftly, Debug)]
129    #[derive_deftly(MessageFromOracle)]
130    #[deftly(o2m(keyword = "t2u-local-client"))]
131    pub struct Greeting;
132
133    /// Instruction putatively sent from a local client
134    ///
135    /// **Important**: there is nothing actually stopping the oracle
136    /// from sending these!  So they shouldn't do anything too dangerous.
137    #[derive(Deftly, Debug)]
138    #[derive_deftly(MessageFromOracle)]
139    pub enum Insn {
140        Release(Release),
141        ShowRelease(ShowRelease),
142        UnreleaseAll(UnreleaseAll),
143        RestartWorkers(RestartWorkers),
144    }
145
146    #[derive(Deftly, Debug)]
147    #[derive_deftly(MessageFromOracle)]
148    pub struct Release {
149        pub fidelity: ReleaseFidelity,
150        pub jid: JobId,
151    }
152
153    #[derive(Deftly, Debug)]
154    #[derive_deftly(MessageFromOracle)]
155    pub struct ShowRelease {
156    }
157
158    #[derive(Deftly, Debug)]
159    #[derive_deftly(MessageFromOracle)]
160    pub struct UnreleaseAll {
161    }
162
163    #[derive(Deftly, Debug)]
164    #[derive_deftly(MessageFromOracle)]
165    pub struct RestartWorkers {
166    }
167
168    #[derive(Debug, Clone, Copy)]
169    pub enum ReleaseFidelity {
170        Unrelease,
171        Release(WorkerFidelity),
172    }
173    impl FromStr for ReleaseFidelity {
174        type Err = <WorkerFidelity as FromStr>::Err;
175        fn from_str(s: &str) -> Result<Self, Self::Err> {
176            Ok({
177                use ReleaseFidelity as L;
178                if s == "unrelease" { L::Unrelease }
179                else { L::Release(s.parse()?) }
180            })
181        }
182    }
183
184    #[derive(Deftly)]
185    #[derive_deftly(MessageToOracle)]
186    #[deftly(o2m(keyword = "ok"))]
187    pub struct OkResponse {
188        pub message: String,
189    }
190}