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 crate::ast::AstResult;
use crate::base::artifact::{NativeCodeGen, NativeGenStrategy};
use crate::errors::*;
use crate::java::callback::{CallbackGen, InnerCallbackGen};
use crate::java::interface::InterfaceGen;
use crate::java::internal::InnerTraitGen;
use crate::java::manager::ManagerGen;
use crate::java::struct_::StructGen;
use crate::java::wrapper::WrapperGen;
use std::path::PathBuf;

pub(crate) struct JavaCodeGen<'a> {
    pub java_gen_dir: &'a PathBuf,
    pub ast: &'a AstResult,
    pub namespace: String,
    pub so_name: String,
    pub ext_libs: String,
}

#[derive(Clone)]
pub(crate) struct JavaExtra {
    pub namespace: String,
    pub so_name: String,
    pub ext_libs: String,
}

impl<'a> JavaCodeGen<'a> {
    pub(crate) fn gen_files(&self) -> Result<()> {
        let strategy = NativeGenStrategy::<JavaExtra> {
            gen_bridge_callback: Box::new(|ctx, desc| {
                InnerCallbackGen {
                    desc,
                    pkg: ctx.extra.namespace.clone(),
                }
                .gen()
            }),
            gen_callback: Box::new(|ctx, desc| {
                CallbackGen {
                    desc,
                    pkg: ctx.extra.namespace.clone(),
                }
                .gen()
            }),
            gen_bridge_trait: Box::new(|ctx, desc| {
                InnerTraitGen {
                    desc,
                    pkg: ctx.extra.namespace.clone(),
                    callbacks: ctx.callbacks.clone(),
                }
                .gen()
            }),
            gen_wrapper_trait: Box::new(|ctx, desc| {
                WrapperGen {
                    desc,
                    pkg: ctx.extra.namespace.clone(),
                }
                .gen()
            }),
            gen_trait: Box::new(|ctx, desc| {
                InterfaceGen {
                    desc,
                    pkg: ctx.extra.namespace.clone(),
                }
                .gen()
            }),
            gen_struct: Box::new(|ctx, desc| {
                StructGen {
                    desc,
                    pkg: ctx.extra.namespace.clone(),
                }
                .gen()
            }),
            gen_manager: Box::new(|ctx| {
                ManagerGen {
                    ast: ctx.ast,
                    pkg: ctx.extra.namespace.clone(),
                    so_name: ctx.extra.so_name.clone(),
                    ext_libs: ctx.extra.ext_libs.clone(),
                }
                .gen()
            }),
        };

        let gen = NativeCodeGen {
            gen_dir: self.java_gen_dir,
            file_ext: "java".to_string(),
            ast: self.ast,
            extra: JavaExtra {
                namespace: self.namespace.clone(),
                so_name: self.so_name.clone(),
                ext_libs: self.ext_libs.clone(),
            },
            strategy,
        };

        gen.gen_files()
    }
}