diff --git a/diff.patch b/diff.patch index 50378e0..8e7c6df 100644 --- a/diff.patch +++ b/diff.patch @@ -1,3 +1,64 @@ +diff --git a/crates/ssd/src/generators/rhai.rs b/crates/ssd/src/generators/rhai.rs +index d4ba8e3..178d4bb 100644 +--- a/crates/ssd/src/generators/rhai.rs ++++ b/crates/ssd/src/generators/rhai.rs +@@ -45,6 +45,10 @@ fn error_to_runtime_error(e: E) -> Box { + + use rhai::Token; + ++fn script_count_vec(v: &Vec) -> usize { ++ v.len() ++} ++ + fn script_exists(path: &str) -> bool { + PathBuf::from(path).exists() + } +@@ -281,21 +285,31 @@ pub fn build_engine(messages: Rc>>, debug: bool) -> Engine { + engine.register_global_module(package.as_shared_module()); + + engine.register_iterator::>(); ++ engine.register_iterator::(); ++ engine.register_type::(); + +- engine +- .register_iterator::>() +- .register_iterator::>() +- .register_iterator::>() +- .register_iterator::() +- .register_iterator::>() +- .register_iterator::>() +- .register_iterator::>() +- .register_iterator::>() +- .register_iterator::>() +- .register_iterator::>() +- .register_iterator::>() +- .register_iterator::>() +- .register_iterator::>(); ++ macro_rules! register_vec { ++ ($T: ty) => { ++ engine ++ .register_type::>() ++ .register_fn("len", Vec::<$T>::len) ++ .register_iterator::>(); ++ }; ++ } ++ ++ register_vec!(SsdModule); ++ register_vec!(Import); ++ register_vec!(Attribute); ++ register_vec!(Dependency); ++ register_vec!(Parameter); ++ register_vec!((String, Namespace)); ++ register_vec!((String, Event)); ++ register_vec!((String, Enum)); ++ register_vec!((String, EnumValue)); ++ register_vec!((String, DataType)); ++ register_vec!((String, Service)); ++ register_vec!((String, TypeName)); ++ register_vec!((String, Function)); + + engine.register_fn("to_string", |this: &mut Import| this.path.clone()); + #[allow(clippy::cast_possible_truncation, clippy::cast_sign_loss)] diff --git a/crates/ssd/src/generators/tera.rs b/crates/ssd/src/generators/tera.rs index 2cfb3eb..251a225 100644 --- a/crates/ssd/src/generators/tera.rs diff --git a/ssd_to_acme/ssd_to_acme.rhai b/ssd_to_acme/ssd_to_acme.rhai new file mode 100644 index 0000000..24de00b --- /dev/null +++ b/ssd_to_acme/ssd_to_acme.rhai @@ -0,0 +1,112 @@ +fn get_attr(atts, name) { + for att in atts { + if att.name.join(".") == name { + return att; + } + } +} + +fn get_param(params, name) { + for param in params { + if param.name == name { + return param; + } + } +} + +"packages:" ++ NL; +IND ++ "- name: " ++ module.name.join(".") ++ NL; +IND ++ " interfaces:" ++ NL; + +for service in module.services { + IND(2) ++ "- name: " ++ service.first ++ NL; + + let version = get_attr(service.second.attributes, "version"); + IND(2) ++ " version:" + NL; + let major = "1"; + let minor = "0"; + if version != () { + major = get_param(version.parameters, "major").value.unwrap_or(major); + minor = get_param(version.parameters, "minor").value.unwrap_or(minor); + } + IND(3) ++ "major: " ++ major ++ NL; + IND(3) ++ "minor: " ++ minor ++ NL; + + if service.second.functions.len() > 0 { + IND(2) ++ " methods:" ++ NL; + + for function in service.second.functions { + IND(3) ++ "- name: " ++ function.first ++ NL; + + if function.second.arguments.len() > 0 { + IND(3) ++ " arguments:" + NL; + for argument in function.second.arguments { + IND(4) ++ "- name: " ++ argument.first ++ NL; + IND(4) ++ " type: " ++ argument.second.typ.join("::") ++ NL; + } + } + + if is_some(function.second.return_type) { + let return_type = unwrap(function.second.return_type); + IND(3) ++ " return: " ++ return_type.typ.join("::"); + } + } + } + + -(to_string(service.second.events.len())); + if service.second.events.len() > 0 { + IND(2) ++ " events:" ++ NL; + for event in service.second.events { + let is_field = get_attr(event, "field") != (); + debug(is_field); + } + } + +} + + +/* + +for enum in module.enums { + "enum " ++ enum.first ++ " {"; + let prefix = ""; + for enum_value in enum.second.values { + let name = enum_value.first; + let enum_value = enum_value.second; + if is_some(enum_value.value) { + prefix ++ NL ++ IND ++ name ++ " = " ++ unwrap(enum_value.value); + } else { + prefix ++ NL ++ IND ++ name; + } + prefix = "," + } + NL ++ "};" ++ NL(2); +} + +end("ENUMS"); + +-(NL); + +begin("DATATYPES"); + +for data_type in module.data_types { + "struct " ++ data_type.first ++ " {" ++ NL; + for property in data_type.second.properties { + if property.second.is_list { + let count = property.second.count; + if is_some(count) { + let count = unwrap(count); + IND ++ property.second.typ.join("::") ++ " " ++ property.first ++ "[" ++ count ++ "];" ++ NL; + } else { + IND ++ property.second.typ.join("::") ++ " " ++ property.first ++ "[]" ++ ";" ++ NL; + } + } else { + IND ++ property.second.typ.join("::") ++ " " ++ property.first ++ ";" ++ NL; + } + } + "};" ++ NL(2); +} +end("DATATYPES"); + +"}" ++ NL +*/ diff --git a/ssd_to_acme/test.svc b/ssd_to_acme/test.svc new file mode 100644 index 0000000..a7664fc --- /dev/null +++ b/ssd_to_acme/test.svc @@ -0,0 +1,23 @@ +data FullName { + firstname: String, + surname: String, +}; + +#[list(item="FullName")] +data NameList {}; + +#[error] +enum ApiError { + EmptyNameError, +}; + +#[version(major = "1", minor = "0")] +service Greetings { + + #[throws(ApiError::EmptyNameError)] + fn GenerateGreeting(names: NameList) -> String; + + event VIPGreeted(name: FullName); + #[field] + event GreetingsRequested(count: u16); +};