rsbind 0.6.0

Provide tools to bind rust trait with other language and export library artifact directly. Invoke rust functions just like you write it in native language.
Documentation
use proc_macro2::TokenStream;
use rstgen::swift::Swift;
use rstgen::{swift, Tokens};

use crate::ast::types::AstType;
use crate::base::lang::{Convertible, Direction};
use crate::ident;

pub(crate) struct Callback {
    pub(crate) ty: AstType,
}

impl<'a> Convertible<Swift<'a>> for Callback {
    fn native_to_transferable(
        &self,
        origin: String,
        _direction: Direction,
    ) -> Tokens<'static, Swift<'a>> {
        if let AstType::Callback(base) = self.ty.clone() {
            return toks_f!(
                "Internal{}.callbackToModel(callback: {})",
                &base.origin,
                origin
            );
        }
        toks!("")
    }

    fn transferable_to_native(
        &self,
        origin: String,
        _direction: Direction,
    ) -> Tokens<'static, Swift<'a>> {
        if let AstType::Callback(base) = self.ty.clone() {
            return toks_f!("Internal{}.modelToCallback(model:{})", &base.origin, origin);
        }
        toks!("")
    }

    fn rust_to_transferable(&self, origin: TokenStream, _direction: Direction) -> TokenStream {
        let callback_to_c_pointers_fn_name =
            ident!(&format!("callback_to_c_pointers_{}", self.ty.origin()));
        quote! {{
            let #origin = callback_index;
            #callback_to_c_pointers_fn_name(#origin)
        }}
    }

    fn transferable_to_rust(&self, origin: TokenStream, _direction: Direction) -> TokenStream {
        let c_pointers_to_callback_fn =
            ident!(&format!("c_pointers_to_callback_{}", self.ty.origin()));
        quote! {
             #c_pointers_to_callback_fn(#origin)
        }
    }

    fn native_type(&self) -> Swift<'a> {
        match self.ty.clone() {
            AstType::Callback(origin) => swift::local(origin.origin),
            _ => swift::local(""),
        }
    }

    fn native_transferable_type(&self, _direction: Direction) -> Swift<'a> {
        match self.ty.clone() {
            AstType::Callback(origin) => {
                let callback_str = format!("{}_{}_Model", &origin.mod_name, &origin.origin);
                swift::local(callback_str)
            }
            _ => swift::local(""),
        }
    }

    fn rust_transferable_type(&self, _direction: Direction) -> TokenStream {
        match self.ty.clone() {
            AstType::Callback(origin) => {
                let ident = ident!(&format!("{}_{}_Model", &origin.mod_name, &origin.origin));
                quote! {#ident}
            }
            _ => quote! {},
        }
    }

    fn quote_common_in_bridge(&self) -> TokenStream {
        quote! {}
    }

    fn quote_common_in_native(&self) -> Tokens<'static, Swift<'a>> {
        Tokens::new()
    }

    fn quote_in_common_rs(&self) -> TokenStream {
        quote! {}
    }
}