From bee11083f038719907835b4ca73f432701b69385 Mon Sep 17 00:00:00 2001 From: Masato Imai Date: Tue, 6 Sep 2022 12:03:08 +0900 Subject: [PATCH] fix type system and add write_value,read_value --- client2.gpsl | 8 +++--- src/gpsl/external_function.rs | 31 ++++++++++++++++++++++- src/gpsl/gpsl_type.rs | 46 +++++++++++++++++++++++++++++++++-- test.gvalue | 1 + 4 files changed, 78 insertions(+), 8 deletions(-) create mode 100644 test.gvalue diff --git a/client2.gpsl b/client2.gpsl index 4563085..9a72e2b 100644 --- a/client2.gpsl +++ b/client2.gpsl @@ -1,7 +1,5 @@ fn main() { - let t: Vec = vec(""); - t[0] = "test"; - t = push(t, "test2"); - println(decrypt(a + b)); - println(t[0] + t[1]); + let users: Vec = vec(""); + let tmp: Vec = vec(encrypt(0)); + let polls: Vec> = vec(tmp); } diff --git a/src/gpsl/external_function.rs b/src/gpsl/external_function.rs index 02a616e..5847172 100644 --- a/src/gpsl/external_function.rs +++ b/src/gpsl/external_function.rs @@ -1,6 +1,6 @@ use primitive_types::U512; use serde::{Deserialize, Serialize}; -use std::io::{stdout, Write}; +use std::{io::{stdout, Write, Read}, fs}; use crate::{ elliptic_curve::{elliptic_curve::EllipticCurvePoint, encryption::Encryption}, @@ -40,6 +40,34 @@ pub const STD_FUNC: fn( ) -> ExternalFuncReturn = |name, args, accept, reject, data| { let name = name.as_str(); match name { + "read_value" => { + let file_name = args[0].clone(); + let mut file = fs::File::open(file_name.extract_text().unwrap()).unwrap(); + let mut contents = String::default(); + file.read_to_string(&mut contents).unwrap(); + ExternalFuncReturn { + status: ExternalFuncStatus::SUCCESS, + value: Some(serde_json::from_str(&contents).unwrap()), + } + } + "write_value" => { + if !accept.contains(&Permission::FileWrite) || reject.contains(&Permission::FileWrite) { + return ExternalFuncReturn { + status: ExternalFuncStatus::REJECTED, + value: None, + }; + } + 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(serde_json::to_string(&content).unwrap().as_bytes()) + .unwrap(); + ExternalFuncReturn { + status: ExternalFuncStatus::SUCCESS, + value: None, + } + } "write" => { if !accept.contains(&Permission::FileWrite) || reject.contains(&Permission::FileWrite) { return ExternalFuncReturn { @@ -106,6 +134,7 @@ pub const STD_FUNC: fn( if arg.get_type() == typ.to_str() { vec.push(arg); } else { + println!("{} != {}", arg.get_type(), typ.to_str()); return ExternalFuncReturn { status: ExternalFuncStatus::ERROR, value: None, diff --git a/src/gpsl/gpsl_type.rs b/src/gpsl/gpsl_type.rs index 604d8fb..5bc2f37 100644 --- a/src/gpsl/gpsl_type.rs +++ b/src/gpsl/gpsl_type.rs @@ -21,12 +21,43 @@ impl GPSLType { let children: Vec = self.child.iter().map(|c| c.to_str()).collect(); if children.len() > 0 { s.push_str("<"); - s.push_str(&children.join(",")); + s.push_str(&children.join("")); s.push_str(">"); } s } + pub fn from_str(s: &str) -> Result { + let mut typ = GPSLType { + type_str: String::new(), + child: Vec::new(), + }; + let mut main = String::new(); + let mut read_count = 0; + for x in s.chars() { + if !x.is_alphabetic() && x != '<' && x != '>' && x != ',' { + return Err(format!("Invalid character: {}", x)); + } + if x != '<' && x != '>' && x != ',' { + main.push(x); + } else { + break; + } + + read_count += 1; + } + typ.type_str = main.clone(); + + if read_count != s.len() { + let mut child = s[read_count..].to_string(); + child.pop().unwrap(); + child.remove(0); + + typ.child.push(GPSLType::from_str(&child)?); + } + Ok(typ) + } +/* pub fn from_str(s: &str) -> Result { let mut type_str = String::new(); let mut child = Vec::new(); @@ -64,7 +95,7 @@ impl GPSLType { } Ok(GPSLType { type_str, child }) } - + */ pub fn is_correct(&self) -> bool { if self.type_str == "U512" || self.type_str == "num" @@ -85,3 +116,14 @@ impl GPSLType { true } } + +#[cfg(test)] +mod tests { + use crate::gpsl::gpsl_type::GPSLType; + + #[test] + fn to_str_test() { + let typ = GPSLType::from_str("Vec").unwrap(); + assert_eq!(typ, GPSLType::from_str(&typ.to_str()).unwrap()); + } +} \ No newline at end of file diff --git a/test.gvalue b/test.gvalue new file mode 100644 index 0000000..e34ae08 --- /dev/null +++ b/test.gvalue @@ -0,0 +1 @@ +{"Vec":{"value":[{"Text":{"value":"test"}},{"Text":{"value":"test2"}},{"Text":{"value":"test2"}},{"Text":{"value":"test2"}},{"Text":{"value":"test2"}},{"Text":{"value":"test2"}},{"Text":{"value":"test2"}},{"Text":{"value":"test2"}},{"Text":{"value":"test2"}},{"Text":{"value":"test2"}},{"Text":{"value":"test2"}},{"Text":{"value":"test2"}},{"Text":{"value":"test2"}},{"Text":{"value":"test2"}},{"Text":{"value":"test2"}},{"Text":{"value":"test2"}},{"Text":{"value":"test2"}},{"Text":{"value":"test2"}},{"Text":{"value":"test2"}},{"Text":{"value":"test2"}},{"Text":{"value":"test2"}},{"Text":{"value":"test2"}}],"gpsl_type":{"type_str":"Vec","child":[{"type_str":"String","child":[]}]}}} \ No newline at end of file