wick-component-codegen 0.6.0

Code generator for wick components
Documentation
use itertools::Itertools;
use proc_macro2::TokenStream;
use quote::quote;
use wick_config::config::Binding;

use crate::generate::ids::*;

pub(crate) fn imported_component_container<T>(name: &str, required: &[Binding<T>]) -> TokenStream {
  let mod_id = id(&format!("{}_wasm", snake(name)));
  let method_id = id(&snake(name));
  let struct_id = id(&pascal(name));
  let trait_id = id(&format!("{}Context", pascal(name)));

  let required_names = required
    .iter()
    .map(|r: &Binding<T>| {
      let name = id(&snake(r.id()));
      let orig_name = r.id();
      let response_name = id(&component_id(r));
      quote! { #name : #response_name::new(config.#method_id.get(#orig_name).cloned().unwrap(), inherent.clone()) }
    })
    .collect_vec();
  let fields = required
    .iter()
    .map(|v| {
      let name = id(&snake(v.id()));
      let uc_name = id(&component_id(v));
      quote! {pub #name: #uc_name}
    })
    .collect_vec();

  quote! {
    #[allow(unused)]
    #[cfg(target_family = "wasm")]
    mod #mod_id {
      #[allow(unused)]
      use super::*;
      pub(crate) struct #struct_id {
        #(#fields),*
      }

      pub(crate) trait #trait_id {
        fn #method_id(&self) -> #struct_id;
      }

      impl<T> #trait_id for wick_component::flow_component::Context<T> where T:std::fmt::Debug{
        fn #method_id(&self) -> #struct_id {
          let config = get_config();
          let inherent = self.inherent.clone();
          #struct_id {
            #(#required_names),*
          }
        }
      }
    }
    #[cfg(target_family = "wasm")]
    pub(crate) use #mod_id::*;
  }
}