wick-component-codegen 0.6.0

Code generator for wick components
Documentation
use proc_macro2::{Ident, TokenStream};
use quote::quote;
use wick_interface_types::OperationSignature;

use crate::generate::config;
use crate::generate::dependency::Dependency;
use crate::generate::ids::*;

pub(crate) fn gen_wrapper_fn(config: &mut config::Config, component: &Ident, op: &OperationSignature) -> TokenStream {
  let impl_name = id(&snake(op.name()));
  let wrapper_name = op_wrapper_name(op);
  let wrapper_id = id(&wrapper_name);
  let outputs_name = id("Outputs");

  config.add_dep(Dependency::WickPacket);
  config.add_dep(Dependency::WasmRs);
  config.add_dep(Dependency::WasmRsRuntime);

  quote! {
    fn #wrapper_id(input: wasmrs_rx::BoxFlux<wasmrs::Payload, wasmrs::PayloadError>) -> std::result::Result<wasmrs_rx::BoxFlux<wasmrs::RawPayload, wasmrs::PayloadError>,wick_component::BoxError> {
      let (channel, rx) = wasmrs_rx::FluxChannel::<wasmrs::RawPayload, wasmrs::PayloadError>::new_parts();
      let outputs = #impl_name::#outputs_name::with_channel(channel.clone());

      runtime::spawn(#wrapper_name,async move {
         let (config, inputs) = #impl_name::process_incoming(input);
         let config = match config.await {
          Ok(config) => {
            config
          },
          Err(e) => {
            let _ = channel.send_result(
              wick_packet::Packet::component_error(format!("Component sent invalid context: {}", e)).into(),
            );
            return;
          }
        };
        use self::#impl_name::Operation;
        if let Err(e) = #component::#impl_name(inputs, outputs, config).await {
          let _ = channel.send_result(
            wick_packet::Packet::component_error(e.to_string()).into(),
          );
        }
      });

      Ok(Box::pin(rx))
    }
  }
}