sark-gen 0.29.2

Sark proc-macro generators
Documentation
use crate::types;

#[derive(Clone, Copy)]
pub(super) enum Scalar {
    U64,
    I64,
    F64,
    Bool,
    String,
    Shared,
    Borrowed,
    Bytes,
    Token,
}

#[derive(Clone, Copy)]
pub(super) struct Classified {
    pub(super) scalar: Scalar,
    pub(super) optional: bool,
}

impl Classified {
    pub(super) fn of(ty: &syn::Type) -> syn::Result<Self> {
        let view = types::View::new(ty);
        let optional = view.is_optional();
        let inner = types::View::new(view.value());
        let scalar = if inner.is_named("u64") {
            Scalar::U64
        } else if inner.is_named("i64") {
            Scalar::I64
        } else if inner.is_named("f64") {
            Scalar::F64
        } else if inner.is_named("bool") {
            Scalar::Bool
        } else if inner.is_named("String") {
            Scalar::String
        } else if inner.is_named("Shared") {
            Scalar::Shared
        } else if inner.is_slice() {
            Scalar::Borrowed
        } else if inner.is_named("Bytes") {
            Scalar::Bytes
        } else if inner.is_named("Token") {
            Scalar::Token
        } else {
            use syn::Error;
            return Err(Error::new_spanned(
                ty,
                "unsupported #[sark_gen::json] field type",
            ));
        };
        Ok(Self { scalar, optional })
    }
}