drt-sc-derive 0.0.1

DharitriOne smart contract API procedural macros
Documentation
use crate::{model::Supertrait, parse::split_path_last};

pub fn is_contract_base(supertrait: &syn::TypeParamBound) -> bool {
    match supertrait {
        syn::TypeParamBound::Trait(t) => t.path.segments.last().unwrap().ident == "ContractBase",
        _ => false,
    }
}

pub fn parse_supertrait(supertrait: &syn::TypeParamBound) -> Supertrait {
    match supertrait {
        syn::TypeParamBound::Trait(t) => {
            if let Some((leading_segments, last_segment)) = split_path_last(&t.path) {
                assert!(
                    last_segment.arguments.is_empty(),
                    "No generics allowed when specifying contract supertraits."
                );
                Supertrait {
                    full_path: t.path.clone(),
                    trait_name: last_segment,
                    module_path: leading_segments,
                }
            } else {
                panic!("All contract module supertraits must be specfied with some module specifier (e.g. `path::to::module::ContractName`)");
            }
        },
        _ => panic!("Contract trait can only extend other traits."),
    }
}