cido-macros 0.2.0

Macros for generating code that enables easier interfacing with cido
Documentation
use crate::parse::deps::*;
use proc_macro2::TokenStream;
use quote::{ToTokens, quote};

use super::dyn_error;

impl crate::codegen::CodegenWrapper<super::TransformerStruct> {
  pub(crate) fn gen_from_impls(&self, token_stream: &mut TokenStream) {
    let from_name = self.struct_name();
    let to_name = self.graphql_output_name();
    let from_fields = self.fields.iter().map(|f| &f.name);
    let conversions = self.fields.iter().map(|f| &f.name);
    let self_name = self.struct_name();
    let block_fields = if self.is_entity() {
      quote! {
        __block_number_range: <<<<#self_name as ::cido::__internal::Transformer>::Cidomap as ::cido::__internal::Cidomap>::Network as ::cido::__internal::Network>::BlockNumberRange as ::cido::__internal::BlockNumberRange>::new(
          <<<<#self_name as ::cido::__internal::Transformer>::Cidomap as ::cido::__internal::Cidomap>::Network as ::cido::__internal::Network>::BlockNumber as ::cido::__internal::BlockNumber>::MAX,
          ::core::option::Option::None
        ),
      }
    } else {
      quote! {
        __block_number: <<<<#self_name as ::cido::__internal::Transformer>::Cidomap as ::cido::__internal::Cidomap>::Network as ::cido::__internal::Network>::BlockNumber as ::cido::__internal::BlockNumber>::MAX,
      }
    };
    let error_ty = dyn_error();

    quote! {
      impl ::core::convert::TryFrom<#from_name> for #to_name {
        type Error = #error_ty;
        fn try_from(this: #from_name) -> ::core::result::Result<Self, Self::Error> {
          use ::core::convert::TryInto;
          let #from_name {
            #(#from_fields),*
          } = this;
          ::core::result::Result::Ok(#to_name {
            __query_block: <<<<#self_name as ::cido::__internal::Transformer>::Cidomap as ::cido::__internal::Cidomap>::Network as ::cido::__internal::Network>::BlockNumber as ::cido::__internal::BlockNumber>::MAX,
            #block_fields
            #(#conversions),*
          })
        }
      }
    }.to_tokens(token_stream);
  }
}