tag2upload_service_manager/
o2m_messages.rs

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