#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TypeHint {
Long,
Double,
Int,
Float,
Bool,
LongArray,
DoubleArray,
IntArray,
FloatArray,
BooleanArray,
ObjectArray,
}
impl TypeHint {
pub fn from_tag(name: &str) -> Option<TypeHint> {
Some(match name {
"long" => TypeHint::Long,
"double" => TypeHint::Double,
"int" => TypeHint::Int,
"float" => TypeHint::Float,
"boolean" => TypeHint::Bool,
"longs" => TypeHint::LongArray,
"doubles" => TypeHint::DoubleArray,
"ints" => TypeHint::IntArray,
"floats" => TypeHint::FloatArray,
"booleans" => TypeHint::BooleanArray,
"objects" => TypeHint::ObjectArray,
_ => return None,
})
}
pub fn is_array(&self) -> bool {
matches!(
self,
TypeHint::LongArray
| TypeHint::DoubleArray
| TypeHint::IntArray
| TypeHint::FloatArray
| TypeHint::BooleanArray
| TypeHint::ObjectArray
)
}
pub fn element(&self) -> Option<TypeHint> {
Some(match self {
TypeHint::LongArray => TypeHint::Long,
TypeHint::DoubleArray => TypeHint::Double,
TypeHint::IntArray => TypeHint::Int,
TypeHint::FloatArray => TypeHint::Float,
TypeHint::BooleanArray => TypeHint::Bool,
_ => return None,
})
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn resolves_scalar_tags() {
assert_eq!(TypeHint::from_tag("long"), Some(TypeHint::Long));
assert_eq!(TypeHint::from_tag("double"), Some(TypeHint::Double));
assert_eq!(TypeHint::from_tag("boolean"), Some(TypeHint::Bool));
}
#[test]
fn resolves_array_tags() {
assert_eq!(TypeHint::from_tag("longs"), Some(TypeHint::LongArray));
assert_eq!(TypeHint::from_tag("doubles"), Some(TypeHint::DoubleArray));
assert!(TypeHint::LongArray.is_array());
assert_eq!(TypeHint::LongArray.element(), Some(TypeHint::Long));
}
#[test]
fn unknown_tag_is_none() {
assert_eq!(TypeHint::from_tag("String"), None);
assert_eq!(TypeHint::from_tag("MyRecord"), None);
}
}