From 4e09e5e4aba6f60e456ebcfb7768cf48b198d438 Mon Sep 17 00:00:00 2001 From: sigil-03 Date: Mon, 18 Mar 2024 21:11:11 -0600 Subject: [PATCH] add get_storage_info and some try_load_file --- src/main.rs | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 2d63719..9d7544a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -27,6 +27,17 @@ struct Info { } +#[derive(Deserialize, Debug)] +struct StorageInfo { + storage_list: Vec, +} + +#[derive(Deserialize, Debug)] +struct Storage { + path: String, + name: String, +} + struct Prusa { api_key: String, ip_addr: String, @@ -54,7 +65,37 @@ impl Prusa { Ok(info) } - fn try_load_file(&self, _filepath: &str) -> Result { + // TODO return this into a specific type + fn get_storage_info(&self) -> Result<(StorageInfo), Error> { + let api_target = "/api/v1/storage"; + let resp = self.client.get(format!("http://{}{api_target}", self.ip_addr)) + .header("X-Api-Key", &self.api_key) + .send()?; + let text = resp.text()?; + // println!("{text}"); + let info: StorageInfo = serde_json::from_str(&text)?; + + Ok(info) + } + + // Prusalink load file schema: + // content: + // application/octet-stream: + // schema: + // type: string + // format: binary + + fn try_load_file(&self, filepath: &str) -> Result { + let data = fs::read(filepath)?; + + // TODO: Allow storage selection + // For now, assume that we're using only USB: + let api_target = "/api/v1/files/usb/{path}"; + let resp = self.client.put(format!("http://{}{api_target}", self.ip_addr)) + .header("X-Api-Key", &self.api_key) + .send()?; + let text = resp.text()?; + println!("{text}"); todo!("implement try_load_file") } @@ -74,6 +115,18 @@ impl Prusa { Ok(()) } + + fn print_storage_info(&self) -> Result<(), Error> { + let info = self.get_storage_info()?; + for (index, storage) in info.storage_list.iter().enumerate() { + println!("\n------------------"); + println!("STORAGE: {index}"); + println!(" PATH:\t{}", storage.path); + println!(" NAME:\t{}", storage.name); + println!("--------------------\n"); + } + Ok(()) + } } #[derive(Parser)] @@ -130,7 +183,10 @@ fn main() -> Result<(), Error> { "prusa-mk4" => { let prusa = Prusa::new(&config.printer.api_key, &config.printer.ip_addr); match cli.command { - Command::Info => prusa.print_info()?, + Command::Info => { + prusa.print_info()?; + prusa.print_storage_info()?; + }, // Should generate UUID for the filename: Command::Load {filepath} => { let uuid = prusa.try_load_file(&filepath)?;