bambulab_mqtt/
request_command.rs1use 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 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 let serialized = serde_json::to_string(&get_version).unwrap();
118 println!("Serialized: {}", serialized);
120
121 let payload = get_version.to_payload().unwrap();
123 println!("Payload: {}", payload);
125
126
127 assert_eq!(serialized, payload);
129
130 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}