Files
encrypt/src/gpsl/external_function.rs
2022-07-21 16:04:00 +09:00

110 lines
3.2 KiB
Rust

use serde::{Deserialize, Deserializer, Serialize};
use crate::gpsl::{permission::Permission, variable::Variable};
use std::{
io::{BufRead, BufReader, Read, Write},
net::TcpStream,
sync::{Arc, Mutex},
};
#[derive(PartialEq, Debug, Serialize, Deserialize)]
pub enum ExternalFuncStatus {
SUCCESS,
NOTFOUND,
ERROR,
REJECTED,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ExternalFuncReturn {
pub status: ExternalFuncStatus,
pub value: Option<Variable>,
}
#[allow(dead_code)]
pub const STD_FUNC: fn(
String,
Vec<Variable>,
Vec<Permission>,
Vec<Permission>,
) -> ExternalFuncReturn = |name, args, accept, reject| {
let name = name.as_str();
match name {
"println" => {
if accept.contains(&Permission::StdIo) && !reject.contains(&Permission::StdIo) {
match &args[0] {
Variable::Text { value } => println!("{}", value),
Variable::Number { value } => println!("{}", value),
_ => {}
}
ExternalFuncReturn {
status: ExternalFuncStatus::SUCCESS,
value: None,
}
} else {
ExternalFuncReturn {
status: ExternalFuncStatus::REJECTED,
value: None,
}
}
}
"print" => {
if accept.contains(&Permission::StdIo) && !reject.contains(&Permission::StdIo) {
match &args[0] {
Variable::Text { value } => print!("{}", value),
Variable::Number { value } => print!("{}", value),
_ => {}
}
ExternalFuncReturn {
status: ExternalFuncStatus::SUCCESS,
value: None,
}
} else {
ExternalFuncReturn {
status: ExternalFuncStatus::REJECTED,
value: None,
}
}
} /*
"receive" => {
println!("Waiting for client...");
let mut buffer = String::default();
let data = data.unwrap();
let mut stream = data.stream.lock().unwrap();
let stream = match &mut *stream {
Some(stream) => stream,
None => panic!("Cannot access to tcp stream"),
};
let mut reader = BufReader::new(stream);
reader.read_line(&mut buffer).unwrap();
ExternalFuncReturn {
status: ExternalFuncStatus::SUCCESS,
value: Some(serde_json::from_str(&buffer).unwrap()),
}
}
"send" => {
let data = data.unwrap();
let mut stream = data.stream.lock().unwrap();
let stream = match &mut *stream {
Some(stream) => stream,
None => panic!("Cannot access to tcp stream"),
};
let value = serde_json::to_string(&args[0]).unwrap();
stream.write_fmt(format_args!("{}\n", value)).unwrap();
ExternalFuncReturn {
status: ExternalFuncStatus::SUCCESS,
value: None,
}
}*/
_ => ExternalFuncReturn {
status: ExternalFuncStatus::NOTFOUND,
value: None,
},
}
};