diff --git a/src/gpsl/external_function.rs b/src/gpsl/external_function.rs index b5aec56..11cdb6a 100644 --- a/src/gpsl/external_function.rs +++ b/src/gpsl/external_function.rs @@ -38,6 +38,18 @@ pub const STD_FUNC: fn( ) -> ExternalFuncReturn = |name, args, accept, reject, data| { let name = name.as_str(); match name { + "write" => { + let file_name = args[0].clone(); + let content = args[1].clone(); + let mut file = + std::fs::File::create(file_name.extract_text().unwrap().as_str()).unwrap(); + file.write_all(content.extract_text().unwrap().as_bytes()) + .unwrap(); + ExternalFuncReturn { + status: ExternalFuncStatus::SUCCESS, + value: None, + } + } "length" => { let vec = args[0].clone(); match vec { diff --git a/src/gpsl/variable.rs b/src/gpsl/variable.rs index 740f03c..7532a3b 100644 --- a/src/gpsl/variable.rs +++ b/src/gpsl/variable.rs @@ -54,4 +54,22 @@ impl Variable { _ => None, } } + + pub fn extract_text(&self) -> Option { + match self { + Variable::Text { value } => Some(value.clone()), + Variable::Number { value } => Some(value.to_string()), + Variable::PureEncrypted { value } => Some(value.to_string()), + Variable::PairedEncrypted { value } => Some(value.to_string()), + Variable::U512 { value } => Some(value.to_string()), + Variable::Vec { value, .. } => { + let mut result = String::new(); + for v in value { + result.push_str(&v.extract_text().unwrap()); + } + Some(result) + } + _ => None, + } + } }