diff --git a/kloud_entries_macro_derive/.gitignore b/kloud_entries_macro_derive/.gitignore new file mode 100644 index 0000000..c3a29c2 --- /dev/null +++ b/kloud_entries_macro_derive/.gitignore @@ -0,0 +1,10 @@ +/target +target +Cargo.lock +.cache +.temp +.env +*.log +.DS_Store +logs +tmp diff --git a/kloud_entries_macro_derive/Cargo.toml b/kloud_entries_macro_derive/Cargo.toml new file mode 100644 index 0000000..6bc49a8 --- /dev/null +++ b/kloud_entries_macro_derive/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "kloud_entries_macro_derive" +version = "0.1.0" +authors = ["JesusPerez "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +proc-macro = true + +[dependencies] +syn = { version = "1.0.60", features = ["extra-traits"]} +quote = "1.0.9" +# darling = "0.12.3" +proc-macro2 = "1.0.26" diff --git a/kloud_entries_macro_derive/README.md b/kloud_entries_macro_derive/README.md new file mode 100644 index 0000000..d9dca5c --- /dev/null +++ b/kloud_entries_macro_derive/README.md @@ -0,0 +1,3 @@ +### Macro DSC derive + +Macro derive definition for **DscEntries** \ No newline at end of file diff --git a/kloud_entries_macro_derive/TODO.md b/kloud_entries_macro_derive/TODO.md new file mode 100644 index 0000000..d1b8c40 --- /dev/null +++ b/kloud_entries_macro_derive/TODO.md @@ -0,0 +1,4 @@ +### Macro DSC derive + +- [ ] Add new methods for storages + diff --git a/kloud_entries_macro_derive/src/lib.rs b/kloud_entries_macro_derive/src/lib.rs new file mode 100644 index 0000000..44789aa --- /dev/null +++ b/kloud_entries_macro_derive/src/lib.rs @@ -0,0 +1,69 @@ +extern crate proc_macro; +extern crate syn; +// #[macro_use] +extern crate quote; + +// use std::collections::BTreeMap; + +use proc_macro::{TokenStream}; +use syn::{parse_macro_input, DeriveInput }; +use quote::quote; +// use proc_macro2::{Span, TokenStream}; +// use syn::{parse_macro_input, Attribute, DeriveInput, Ident, Result}; +// use proc_macro::TokenStream; + +// #[proc_macro_derive(KloudEntries, attributes(kloud_entries))] // It does not work from caller +#[proc_macro_derive(KloudEntries)] +pub fn kloud_entries_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + // Construct a representation of Rust code as a syntax tree + // that we can manipulate + // let ast = syn::parse(input).unwrap(); + // // Build the trait implementation + // impl_kloud_entries(&ast).into() + let input = parse_macro_input!(input as DeriveInput); + // proc_macro::TokenStream::from(impl_kloud_entries(&input)) + impl_kloud_entries(&input) +} + +fn impl_kloud_entries(ast: &syn::DeriveInput) -> TokenStream { + let name = &ast.ident; + // let attrs = &ast.attrs; + // eprintln!("{:#?}",&attrs); + // let name_items = &format!("{}Items",&ast.ident); + let gen = quote! { + impl KloudEntries for #name { + fn load_content_data(content: &str, frmt: &str) -> Vec<#name> { + match frmt { + "yaml" => ::serde_yaml::from_str(&content) + .unwrap_or_else(|e| { + eprintln!(); + Vec::new() + }), + "json" => ::serde_json::from_str(&content) + .unwrap_or_else(|e| { + eprintln!(); + Vec::new() + }), + "toml" => ::toml::from_str(&content) + .unwrap_or_else(|e| { + eprintln!(); + Vec::new() + }), + _ => Vec::new(), + } + } + fn data_map_to_content(data_map: BTreeMap, frmt: &str) -> Result { + Ok(match frmt { + "toml" => toml::to_string_pretty(&data_map) + .context("Failed to 'string' loaded data")?, + "yaml" => serde_yaml::to_string(&data_map) + .context("Failed to 'string' loaded data")?, + "json" => serde_json::to_string_pretty(&data_map) + .context("Failed to 'string' loaded data")?, + _ => String::from(""), + }) + } + } + }; + gen.into() +}