From c38e751a85f5662fdd2c7350e9c31988d65c8741 Mon Sep 17 00:00:00 2001 From: Tait Hoyem Date: Wed, 19 Apr 2023 16:33:15 -0600 Subject: [PATCH] Add new macro to generate the get method --- ibihf-macros/src/lib.rs | 53 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/ibihf-macros/src/lib.rs b/ibihf-macros/src/lib.rs index 12e85fa..63d094c 100644 --- a/ibihf-macros/src/lib.rs +++ b/ibihf-macros/src/lib.rs @@ -30,3 +30,56 @@ pub fn derive(input: TokenStream) -> TokenStream { }; output.into() } + +#[derive(FromDeriveInput, Default)] +#[darling(default, attributes(table_names))] +struct TableNameOpts { + table_name: String, + name_func: String, + name_table_name: String, + name_table_name_fk: String, +} + +#[proc_macro_derive(NameTableName, attributes(table_names))] +pub fn derive_get(input: TokenStream) -> TokenStream { + let input = parse_macro_input!(input); + let opts = TableNameOpts::from_derive_input(&input).expect("Wrong options"); + let DeriveInput { ident, .. } = input; + + let table_name = opts.table_name; + let name_table_name = opts.name_table_name; + let name_table_name_fk = opts.name_table_name_fk; + let name_func = opts.name_func; + let answer = quote! { + //const TABLE_NAME: &'static str = #table_name; + const NAME_TABLE_NAME: &'static str = #name_table_name; + const NAME_TABLE_FK_NAME: &'static str = #name_table_name_fk; + }; + + let query = format!(r#" +SELECT + {0}.*, + {1}({0}.id, $2) AS name +FROM {0} +WHERE {0}.id = $1;"#, + table_name, + name_func, + ); + let output = quote! { + impl NameTableName for #ident { + #answer + } + impl #ident { + pub async fn get(pool: &sqlx::PgPool, id: i32, lang: i32) -> Result, sqlx::Error> { + sqlx::query_as!( + #ident, + #query, + id, lang + ) + .fetch_optional(pool) + .await + } + } + }; + output.into() +}