ton_lib_macros 0.0.19

A collection of types and utilities for interacting with the TON network
Documentation
use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, FieldsNamed, ItemStruct};

pub(crate) fn ton_contract_impl(_attr: TokenStream, item: TokenStream) -> TokenStream {
    let input = parse_macro_input!(item as ItemStruct);
    let struct_name = &input.ident;
    let vis = &input.vis;
    let attrs = &input.attrs;
    let generics = &input.generics;
    let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();

    let mut new_fields = input.fields.clone();
    if let syn::Fields::Unnamed(_) = &new_fields {
        panic!("ton_contract derive does not support tuple structs, use named fields instead");
    };

    if let syn::Fields::Unit = new_fields {
        new_fields = syn::Fields::Named(FieldsNamed {
            named: syn::punctuated::Punctuated::new(),
            brace_token: syn::token::Brace::default(),
        })
    };

    if let syn::Fields::Named(fields) = &mut new_fields {
        fields.named.push(syn::parse_quote! {
            contract_ctx: ContractCtx
        });
    } else {
        panic!("unexpected error");
    }

    let output = quote! {
        #(#attrs)*
        #vis struct #struct_name #generics #new_fields

        impl #impl_generics ContractTrait for #struct_name #ty_generics #where_clause {
            fn ctx(&self) -> &ContractCtx {
                &self.contract_ctx
            }

            fn from_ctx(ctx: ContractCtx) -> Self {
                Self {
                    contract_ctx: ctx,
                }
            }
        }
    };
    output.into()
}