ochami_rs/pcs/transitions/
types.rs

1use manta_backend_dispatcher::types::pcs::transitions::types::{
2  Location as FrontEndLocation, Operation as FrontEndOperation,
3  Transition as FrontEndTransition,
4};
5
6use serde::{Deserialize, Serialize};
7
8use crate::error::Error;
9
10#[derive(Debug, Serialize, Deserialize, Default)]
11pub struct Location {
12  pub xname: String,
13  #[serde(skip_serializing_if = "Option::is_none")]
14  #[serde(rename = "deputyKey")]
15  pub deputy_key: Option<String>,
16}
17
18impl From<FrontEndLocation> for Location {
19  fn from(value: FrontEndLocation) -> Self {
20    Location {
21      xname: value.xname,
22      deputy_key: value.deputy_key,
23    }
24  }
25}
26impl Into<FrontEndLocation> for Location {
27  fn into(self) -> FrontEndLocation {
28    FrontEndLocation {
29      xname: self.xname,
30      deputy_key: self.deputy_key,
31    }
32  }
33}
34
35// this matches the query, not the response
36#[derive(Debug, Serialize, Deserialize)]
37pub enum Operation {
38  #[serde(rename = "On")]
39  On,
40  #[serde(rename = "Off")]
41  Off,
42  #[serde(rename = "Soft-Off")]
43  SoftOff,
44  #[serde(rename = "Soft-Restart")]
45  SoftRestart,
46  #[serde(rename = "Hard-Restart")]
47  HardRestart,
48  #[serde(rename = "Init")]
49  Init,
50  #[serde(rename = "Force-Off")]
51  ForceOff,
52}
53
54impl Operation {
55  /* pub fn to_string(&self) -> String {
56      match self {
57          Operation::On => "on".to_string(),
58          Operation::Off => "off".to_string(),
59          Operation::SoftOff => "soft-off".to_string(),
60          Operation::SoftRestart => "soft-restart".to_string(),
61          Operation::HardRestart => "hard-restart".to_string(),
62          Operation::Init => "init".to_string(),
63          Operation::ForceOff => "force-off".to_string(),
64      }
65  } */
66
67  pub fn from_str(operation: &str) -> Result<Operation, Error> {
68    match operation {
69      "on" => Ok(Operation::On),
70      "off" => Ok(Operation::Off),
71      "soft-off" => Ok(Operation::SoftOff),
72      "soft-restart" => Ok(Operation::SoftRestart),
73      "hard-restart" => Ok(Operation::HardRestart),
74      "init" => Ok(Operation::Init),
75      "force-off" => Ok(Operation::ForceOff),
76      _ => Err(Error::Message("Operation not valid".to_string())),
77    }
78  }
79}
80
81impl From<FrontEndOperation> for Operation {
82  fn from(value: FrontEndOperation) -> Self {
83    match value {
84      FrontEndOperation::On => Operation::On,
85      FrontEndOperation::Off => Operation::Off,
86      FrontEndOperation::SoftOff => Operation::SoftOff,
87      FrontEndOperation::SoftRestart => Operation::SoftRestart,
88      FrontEndOperation::HardRestart => Operation::HardRestart,
89      FrontEndOperation::Init => Operation::Init,
90      FrontEndOperation::ForceOff => Operation::ForceOff,
91    }
92  }
93}
94impl Into<FrontEndOperation> for Operation {
95  fn into(self) -> FrontEndOperation {
96    match self {
97      Operation::On => FrontEndOperation::On,
98      Operation::Off => FrontEndOperation::Off,
99      Operation::SoftOff => FrontEndOperation::SoftOff,
100      Operation::SoftRestart => FrontEndOperation::SoftRestart,
101      Operation::HardRestart => FrontEndOperation::HardRestart,
102      Operation::Init => FrontEndOperation::Init,
103      Operation::ForceOff => FrontEndOperation::ForceOff,
104    }
105  }
106}
107
108/* impl FromStr for Operation {
109    type Err = Error;
110
111    fn from_str(operation: &str) -> Result<Operation, Error> {
112        Self::from_str(operation)
113    }
114} */
115
116#[derive(Debug, Serialize, Deserialize)]
117pub struct Transition {
118  pub operation: Operation,
119  #[serde(skip_serializing_if = "Option::is_none")]
120  #[serde(rename = "taskDeadlineMinutes")]
121  pub task_deadline_minutes: Option<usize>,
122  pub location: Vec<Location>,
123}
124
125impl From<FrontEndTransition> for Transition {
126  fn from(value: FrontEndTransition) -> Self {
127    Transition {
128      operation: Operation::from(value.operation),
129      task_deadline_minutes: value.task_deadline_minutes,
130      location: value
131        .location
132        .into_iter()
133        .map(|v| Location::from(v))
134        .collect(),
135    }
136  }
137}
138impl Into<FrontEndTransition> for Transition {
139  fn into(self) -> FrontEndTransition {
140    FrontEndTransition {
141      operation: self.operation.into(),
142      task_deadline_minutes: self.task_deadline_minutes,
143      location: self.location.into_iter().map(|v| v.into()).collect(),
144    }
145  }
146}