ergo-sbe 0.1.21

Simple Binary Encoding (SBE) — opinionated, idiomatic Rust code generation for low-latency trading protocols.
Documentation
use crate::ir::PrimitiveType;
use crate::structured_ir::FieldType;

use super::runtime::to_pascal_case;

pub(crate) fn field_type_ident(ft: &FieldType, span: proc_macro2::Span) -> syn::Type {
    match ft {
        FieldType::Primitive(pt, Some(len)) => {
            let elem: syn::Type = field_type_ident(&FieldType::Primitive(*pt, None), span);
            let n = syn::LitInt::new(&len.to_string(), span);
            syn::parse_quote!([#elem; #n])
        }
        FieldType::Primitive(pt, None) => match pt {
            PrimitiveType::Char | PrimitiveType::UInt8 => syn::parse_quote!(u8),
            PrimitiveType::Int8 => syn::parse_quote!(i8),
            PrimitiveType::Int16 => syn::parse_quote!(i16),
            PrimitiveType::Int32 => syn::parse_quote!(i32),
            PrimitiveType::Int64 => syn::parse_quote!(i64),
            PrimitiveType::UInt16 => syn::parse_quote!(u16),
            PrimitiveType::UInt32 => syn::parse_quote!(u32),
            PrimitiveType::UInt64 => syn::parse_quote!(u64),
            PrimitiveType::Float => syn::parse_quote!(f32),
            PrimitiveType::Double => syn::parse_quote!(f64),
        },
        FieldType::Composite { name, .. } => {
            let ident = syn::Ident::new(&to_pascal_case(name), span);
            syn::parse_quote!(#ident)
        }
        FieldType::Enum { name, .. } => {
            let ident = syn::Ident::new(&to_pascal_case(name), span);
            syn::parse_quote!(#ident)
        }
        FieldType::Set { name, .. } => {
            let ident = syn::Ident::new(&to_pascal_case(name), span);
            syn::parse_quote!(#ident)
        }
    }
}