diff options
Diffstat (limited to 'bzipper_macros/src/lib.rs')
-rw-r--r-- | bzipper_macros/src/lib.rs | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/bzipper_macros/src/lib.rs b/bzipper_macros/src/lib.rs new file mode 100644 index 0000000..f7979c8 --- /dev/null +++ b/bzipper_macros/src/lib.rs @@ -0,0 +1,102 @@ +// Copyright 2024 Gabriel Bjørnager Jensen. +// +// This file is part of bzipper. +// +// bzipper is free software: you can redistribute +// it and/or modify it under the terms of the GNU +// Lesser General Public License as published by +// the Free Software Foundation, either version 3 +// of the License, or (at your option) any later +// version. +// +// bzipper is distributed in the hope that it will +// be useful, but WITHOUT ANY WARRANTY; without +// even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Less- +// er General Public License along with bzipper. If +// not, see <https://www.gnu.org/licenses/>. + +#![doc(html_logo_url = "https://gitlab.com/bjoernager/bzipper/-/raw/master/doc-icon.svg?ref_type=heads")] + +//! Binary (de)serialisation. +//! +//! This crate implements macros for the [`bzipper`](https://crates.io/crates/bzipper/) crate. + +use proc_macro::TokenStream; +use quote::quote; +use syn::{Data, DeriveInput, parse_macro_input}; + +macro_rules! use_mod { + ($vis:vis $name:ident) => { + mod $name; + $vis use $name::*; + }; +} +pub(in crate) use use_mod; + +use_mod!(closure); +use_mod!(discriminant); +use_mod!(generic_name); + +mod impls; + +#[proc_macro_derive(Deserialise)] +pub fn derive_deserialise(input: TokenStream) -> TokenStream { + let input = parse_macro_input!(input as DeriveInput); + + let impl_body = match input.data { + Data::Enum( ref data) => impls::deserialise_enum( data), + Data::Struct(ref data) => impls::deserialise_struct(data), + + Data::Union(..) => panic!("unions cannot derive `Deserialise`"), + }; + + let type_name = &input.ident; + + let generic_params = &input.generics.params; + let generic_where = &input.generics.where_clause; + + let generic_names = GenericName::extract_from(&input.generics); + + let output = quote! { + impl<#generic_params> ::bzipper::Deserialise for #type_name<#generic_names> + #generic_where { + #impl_body + } + }; + + output.into() +} + +#[proc_macro_derive(Serialise)] +pub fn derive_serialise(input: TokenStream) -> TokenStream { + let input = parse_macro_input!(input as DeriveInput); + + let impl_body = match input.data { + Data::Enum( ref data) => impls::serialise_enum( data), + Data::Struct(ref data) => impls::serialise_struct(data), + + Data::Union(..) => panic!("unions cannot derive `Serialise`"), + }; + + let type_name = &input.ident; + + let generic_params = &input.generics.params; + let generic_where = &input.generics.where_clause; + + let generic_names = GenericName::extract_from(&input.generics); + + let output = quote! { + impl<#generic_params> ::bzipper::Serialise for #type_name<#generic_names> + #generic_where { + #impl_body + } + }; + + //if let Data::Enum(..) = input.data { panic!("{output}") }; + + output.into() +} |