inventor_parameters/
lib.rs

1use serde;
2use std::{error::Error, io, collections::HashMap, fs, path};
3use rust_xlsxwriter::*;
4
5#[derive(Default, Debug, serde::Serialize, serde::Deserialize)]
6struct AutodeskParameters{
7    params: HashMap<String, Value>
8}
9impl AutodeskParameters{
10    // Simple add parameter capability, will support something other than floats eventually. Functions will be next.
11    fn add_param(&mut self, key: String, value: Value)-> Result<(), Box<dyn Error>>{
12        // println!("Parameter: {}, {:?}", key, value);
13        self.params.insert(key, value);
14        Ok(())
15    }
16    // Initial Functionality here. 
17    fn write_parameter_file(&self, parameter_file_name: &str)-> Result<(), Box<dyn Error>> {
18        let string_format = Format::new();
19        let decimal_format = Format::new().set_num_format("0.000");
20        let mut workbook = Workbook::new(parameter_file_name);
21        let worksheet = workbook.add_worksheet();
22        let mut row = 0;
23        worksheet.write_string(row, 0, "Parameter", &string_format).expect("Couldn't write.");
24        worksheet.write_string(row, 1, "Value", &string_format).expect("Couldn't write.");
25        worksheet.write_string(row, 2, "Units", &string_format).expect("Couldn't write.");
26        worksheet.write_string(row, 3, "Comments", &string_format).expect("Couldn't write.");
27
28        row = 1;
29        for param in &self.params{
30            worksheet.write_string(row, 0, &param.1.name, &string_format).expect("Couldn't write.");
31            worksheet.write_number(row, 1, param.1.value, &decimal_format).expect("Couldn't write.");
32            worksheet.write_string(row, 2, &param.1.unit, &string_format).expect("Couldn't write.");
33            worksheet.write_string(row, 3, &param.1.comment, &string_format).expect("Couldn't write.");
34            row+=1;
35        }
36        workbook.close().expect("Couldn't close.");
37        
38        Ok(())
39    }
40    // Kind of the opposite of my use case, but will support one day.
41    fn read_parameter_file(&self, parameter_file_name: &str)-> Result<(), Box<dyn Error>> {      
42        Ok(())
43    }
44}
45// Simple f64 Value holder.
46#[derive(Default, Debug, serde::Serialize, serde::Deserialize)]
47struct Value{
48    name: String,
49    value: f64,
50    unit: String,
51    comment: String
52}
53
54
55// Tests
56#[cfg(test)]
57mod tests {
58    use super::*;
59    #[test]
60    fn test(){
61        let test_file_name = "autodesk_params_test.xlsx";
62        let mut autodesk_parameters = AutodeskParameters::default();
63        autodesk_parameters.add_param("length".to_string(), Value{name: "length".to_string(), value: 0.01, unit: "ul".to_string(), comment: "N/A".to_string()}).expect("Couldn't insert.");
64        
65        if let Err(err) = autodesk_parameters.write_parameter_file(test_file_name){
66            println!("Error writing parameter file: {}", err);
67            assert!(false);
68        }
69        else{
70            println!("Succesfully wrote parameter file.");
71            assert!(true);            
72        }
73    }
74}