boltffi_bindgen 0.2.0

Code generation library for BoltFFI - generates Swift, Kotlin, and TypeScript bindings
Documentation
use crate::ir::plan::AbiType;
use crate::ir::types::PrimitiveType;

pub fn primitive_c_type(p: PrimitiveType) -> String {
    match p {
        PrimitiveType::Bool => "bool".to_string(),
        PrimitiveType::I8 => "int8_t".to_string(),
        PrimitiveType::U8 => "uint8_t".to_string(),
        PrimitiveType::I16 => "int16_t".to_string(),
        PrimitiveType::U16 => "uint16_t".to_string(),
        PrimitiveType::I32 => "int32_t".to_string(),
        PrimitiveType::U32 => "uint32_t".to_string(),
        PrimitiveType::I64 => "int64_t".to_string(),
        PrimitiveType::U64 => "uint64_t".to_string(),
        PrimitiveType::F32 => "float".to_string(),
        PrimitiveType::F64 => "double".to_string(),
        PrimitiveType::ISize => "intptr_t".to_string(),
        PrimitiveType::USize => "uintptr_t".to_string(),
    }
}

pub fn abi_type_c(abi_type: &AbiType) -> String {
    match abi_type {
        AbiType::Void => "void".to_string(),
        AbiType::Bool => "bool".to_string(),
        AbiType::I8 => "int8_t".to_string(),
        AbiType::U8 => "uint8_t".to_string(),
        AbiType::I16 => "int16_t".to_string(),
        AbiType::U16 => "uint16_t".to_string(),
        AbiType::I32 => "int32_t".to_string(),
        AbiType::U32 => "uint32_t".to_string(),
        AbiType::I64 => "int64_t".to_string(),
        AbiType::U64 => "uint64_t".to_string(),
        AbiType::F32 => "float".to_string(),
        AbiType::F64 => "double".to_string(),
        AbiType::ISize => "intptr_t".to_string(),
        AbiType::USize => "uintptr_t".to_string(),
        AbiType::Pointer(element) => format!("{}*", primitive_c_type(*element)),
        AbiType::InlineCallbackFn(params) => {
            let mut param_types = vec!["void*".to_string()];
            param_types.extend(params.iter().map(|p| match p {
                AbiType::Pointer(element) => format!("const {}*", primitive_c_type(*element)),
                other => abi_type_c(other),
            }));
            format!("void (*)({})", param_types.join(", "))
        }
        AbiType::Handle(class_id) => format!("const struct {} *", class_id.as_str()),
        AbiType::CallbackHandle => "BoltFFICallbackHandle".to_string(),
        AbiType::Struct(record_id) => format!("___{}", record_id.as_str()),
    }
}