bambulab_mqtt/
request_command.rs

1use serde::{Deserialize, Serialize};
2use nanoid::nanoid;
3
4#[derive(Serialize, Deserialize, Debug)]
5#[serde(rename_all = "snake_case")]
6pub enum RequestCommand {
7    Info(Info),
8    Print(Print),
9}
10
11impl RequestCommand {
12    /// Serialize `self` into a pretty-printed JSON `String`.
13    pub fn to_payload(&self) -> Result<String, serde_json::Error> {
14        serde_json::to_string(self)
15    }
16
17    pub fn get_sequence_id(&self) -> Option<String> {
18        match self {
19            RequestCommand::Info(info) => info.get_sequence_id(),
20            RequestCommand::Print(print) => print.get_sequence_id(),
21        }
22    }
23}
24
25
26
27#[derive(Serialize, Deserialize, Debug)]
28#[serde(tag = "command", rename_all = "snake_case")]
29pub enum Info {
30    GetVersion(GetVersion)
31}
32
33impl Info {
34    fn get_sequence_id(&self) -> Option<String> {
35        match self {
36            Info::GetVersion(get_version) => Some(get_version.sequence_id.clone()),
37        }
38    }
39}
40
41#[derive(Serialize, Deserialize, Debug)]
42pub struct GetVersion{
43    sequence_id: String
44}
45
46impl GetVersion {
47    pub fn new() -> Self{
48        GetVersion { sequence_id: nanoid!()}
49    }
50}
51
52
53#[derive(Serialize, Deserialize, Debug)]
54#[serde(tag = "command", rename_all = "snake_case")]
55pub enum Print {
56    ProjectFile(ProjectFile),
57    Stop(Stop),
58}
59
60impl Print {
61    fn get_sequence_id(&self) -> Option<String> {
62        match self {
63            Print::ProjectFile(project_file) => Some(project_file.sequence_id.clone()),
64            Print::Stop(stop) => Some(stop.sequence_id.clone()),
65        }
66    }
67}
68
69#[derive(Serialize, Deserialize, Debug)]
70pub struct ProjectFile{
71    sequence_id: String,
72    param: String,
73    url: String,
74    subtask_id: String,
75    use_ams: bool,
76    timelapse: bool,
77    flow_cali: bool,
78    bed_leveling: bool,
79    layer_inspect: bool,
80    vibration_cali: bool,
81}
82
83impl ProjectFile {
84    pub fn new_simple(file_name: String) -> Self{
85        ProjectFile { 
86            sequence_id: nanoid!(),
87            param: "Metadata/plate_1.gcode".to_string(),
88            url: "file:///sdcard/model/".to_string() + &file_name,
89            subtask_id: "0".to_string(),
90            use_ams: false,
91            timelapse: false,
92            flow_cali: false,
93            bed_leveling: false,
94            layer_inspect: false,
95            vibration_cali: false,
96        }
97    }
98}
99
100#[derive(Serialize, Deserialize, Debug)]
101pub struct Stop{
102    sequence_id: String,
103    param: String,
104}
105
106#[cfg(test)]
107mod tests {
108    use super::*;
109    use log::info;
110
111
112    #[test]
113    fn info_export_string() {
114        let get_version = RequestCommand::Info(Info::GetVersion(GetVersion::new()));
115
116        // シリアライズを行う
117        let serialized = serde_json::to_string(&get_version).unwrap();
118        // シリアライズした文字列を表示
119        println!("Serialized: {}", serialized);
120
121        // シリアライズを行う
122        let payload = get_version.to_payload().unwrap();
123        // シリアライズした文字列を表示
124        println!("Payload: {}", payload);
125
126
127        // serializedとpayloadは同じ内容であることを確認する
128        assert_eq!(serialized, payload);
129        
130        // 期待される形式を確認する
131        assert!(serialized.contains("\"command\":\"get_version\""));
132        assert!(serialized.contains("\"sequence_id\":"));
133    }
134
135    #[test]
136    fn info_get_sequence_id() {
137        let get_version = RequestCommand::Info(Info::GetVersion(GetVersion::new()));
138        let sequence_id = get_version.get_sequence_id().unwrap();
139        println!("Sequence ID: {}", sequence_id);
140        assert!(!sequence_id.is_empty());
141    }
142
143}