diff options
author | Robin Jarry <robin@jarry.cc> | 2023-02-17 09:42:06 +0100 |
---|---|---|
committer | Robin Jarry <robin@jarry.cc> | 2023-10-31 19:00:51 +0100 |
commit | 13cce987905bbe134dea4de35872302cccca271b (patch) | |
tree | 701b220e848a55458fdac7c63b2f1d373e63069c /derive-macro/src/derives.rs | |
parent | 202e8c9d06bab32217549f23125d6b274107afda (diff) | |
download | aerc-13cce987905bbe134dea4de35872302cccca271b.tar.gz aerc-13cce987905bbe134dea4de35872302cccca271b.zip |
wip
Signed-off-by: Robin Jarry <robin@jarry.cc>
Diffstat (limited to 'derive-macro/src/derives.rs')
-rw-r--r-- | derive-macro/src/derives.rs | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/derive-macro/src/derives.rs b/derive-macro/src/derives.rs new file mode 100644 index 00000000..fdb83a0d --- /dev/null +++ b/derive-macro/src/derives.rs @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2023 Robin Jarry + +use proc_macro2::TokenStream; +use proc_macro_error::abort_call_site; +use quote::quote; +use syn::{self, Data, DataStruct, DeriveInput, Field, Fields, Generics, Ident}; + +use crate::dummies; +use crate::item::Item; + +pub fn derive_ini(input: &DeriveInput) -> TokenStream { + let ident = &input.ident; + + match input.data { + Data::Struct(DataStruct { + fields: Fields::Named(ref fields), + .. + }) => { + dummies::ini(ident); + + let item = Item::from_args_struct(input); + let fields = fields + .named + .iter() + .map(|field| { + let item = Item::from_args_field(field); + (field, item) + }) + .collect::<Vec<_>>(); + gen_for_struct(&item, ident, &input.generics, &fields) + } + _ => abort_call_site!("`#[derive(Ini)]` only supports non-tuple structs"), + } +} + +fn gen_for_struct( + item: &Item, + name: &Ident, + generics: &Generics, + fields: &[(&Field, Item)], +) -> TokenStream { + let (impl_generics, ty_generics, where_clause) = generics.split_for_impl(); + + let into_app = into_app::gen_for_struct(item, name, generics); + let args = args::gen_for_struct(item, name, generics, fields); + + quote! { + impl #impl_generics clap::Parser for #name #ty_generics #where_clause {} + + #into_app + #args + } +} |