diff --git a/workflow/hello_world_macro/Cargo.toml b/workflow/hello_world_macro/Cargo.toml new file mode 100644 index 00000000..7d8be16e --- /dev/null +++ b/workflow/hello_world_macro/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "hello_world_macro" +version = "0.0.1" +edition = "2018" +authors = ["HugoByte "] +repository = "https://github.com/HugoByte/internal-research-and-sample-code/tree/hello-world-workflow-macro" +license = "Apache-2.0" +description = "Derive macro for hello world workflow" + +[dependencies] +quote = "1.0.33" +syn = "2.0.29" + +[lib] +proc-macro = true \ No newline at end of file diff --git a/workflow/hello_world_macro/src/lib.rs b/workflow/hello_world_macro/src/lib.rs new file mode 100644 index 00000000..b5121c86 --- /dev/null +++ b/workflow/hello_world_macro/src/lib.rs @@ -0,0 +1,23 @@ +extern crate proc_macro; + +use proc_macro::TokenStream; +use syn::DeriveInput; + +#[proc_macro_derive(HelloWorldDerive)] +pub fn hello_world_derive_macro(item: TokenStream) -> TokenStream { + + let ast: DeriveInput = syn::parse(item).unwrap(); + let ident = ast.ident; + + // implement the function and return as TokenStream object + quote::quote! { + impl #ident{ + pub fn run(&mut self) -> Result<(), String>{ + self.output = serde_json::to_value(format!("Hello {}", self.input.name)) + .map_err(|e|e.to_string())?; + Ok(()) + } + } + } + .into() +}