use syn::Type;
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum FieldTypeKind {
Bool,
Numeric,
String,
ImString,
Tuple,
Vec,
Array,
Map,
Other,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum NumericWidgetKind {
Default,
Input,
Slider,
Drag,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum NumericTypeTag {
I32,
U32,
F32,
F64,
}
pub fn classify_numeric_type(ty: &Type) -> Option<NumericTypeTag> {
if let Type::Path(tp) = ty {
if let Some(seg) = tp.path.segments.last() {
match seg.ident.to_string().as_str() {
"i32" => Some(NumericTypeTag::I32),
"u32" => Some(NumericTypeTag::U32),
"f32" => Some(NumericTypeTag::F32),
"f64" => Some(NumericTypeTag::F64),
_ => None,
}
} else {
None
}
} else {
None
}
}
pub fn classify_field_type(ty: &Type) -> FieldTypeKind {
match ty {
Type::Tuple(_) => FieldTypeKind::Tuple,
Type::Array(_) => FieldTypeKind::Array,
Type::Path(tp) => {
if let Some(seg) = tp.path.segments.last() {
let ident = seg.ident.to_string();
match ident.as_str() {
"bool" => FieldTypeKind::Bool,
"i8" | "i16" | "i32" | "i64" | "isize" | "u8" | "u16" | "u32" | "u64"
| "usize" | "f32" | "f64" => FieldTypeKind::Numeric,
"String" => FieldTypeKind::String,
"ImString" => FieldTypeKind::ImString,
"Vec" => FieldTypeKind::Vec,
"HashMap" | "BTreeMap" => FieldTypeKind::Map,
_ => FieldTypeKind::Other,
}
} else {
FieldTypeKind::Other
}
}
_ => FieldTypeKind::Other,
}
}