1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
// This file is part of the serde-bindgen-core libraries
// Copyright (C) 2022 Thomas Chiantia <thomas.chiantia@gmail.com>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
// @author Thomas Chiantia <thomas.chiantia@gmail.com>
// @date 2022
#[cfg(test)]
mod tests;
mod attributes;
mod context;
mod field;
mod keyword;
mod path;
mod utils;
use attributes::AttributeConfig;
use context::Context;
use proc_macro::TokenStream;
use quote::quote;
use syn::parse_macro_input;
#[proc_macro_attribute]
pub fn binding(attr: TokenStream, item: TokenStream) -> TokenStream {
let prefix = parse_macro_input!(attr as AttributeConfig)
.0
.map(|(_, _, s)| s.value())
.unwrap_or("foo".to_string());
// Prse the callers decorated struct
let ctx: Context = parse_macro_input!(item);
// create an "owned" version of the struct. (no references)
let owned = ctx.impl_owned();
// create impl Default block
let impl_default = ctx.impl_default();
// create impl From block
let impl_from = ctx.impl_from();
// create binding for copy function
let binding_copy = ctx.binding_copy(&prefix);
// create binding for init function
let binding_init = ctx.binding_init(&prefix);
// create binding for parse function
let binding_parse = ctx.binding_parse(&prefix);
// create binding for parse function
let binding_print = ctx.binding_print(&prefix);
// render all the new items
let quoted = quote! {
#[derive(serde::Deserialize)]
#[derive(serde::Serialize)]
#[serde(crate="self::serde")]
#ctx
#owned
#impl_default
#impl_from
#binding_copy
#binding_init
#binding_parse
#binding_print
};
proc_macro::TokenStream::from(quoted)
}