use super::*;
use crate::Error;
impl From<StructType> for ValueType {
fn from(value: StructType) -> Self {
ValueType::Struct(value)
}
}
impl From<ListType> for ValueType {
fn from(value: ListType) -> Self {
ValueType::List(value)
}
}
impl From<MapType> for ValueType {
fn from(value: MapType) -> Self {
ValueType::Map(value)
}
}
impl From<TypeType> for ValueType {
fn from(value: TypeType) -> Self {
ValueType::Type(value)
}
}
impl From<OpaqueType> for ValueType {
fn from(value: OpaqueType) -> Self {
ValueType::Opaque(value)
}
}
impl From<OptionalType> for ValueType {
fn from(value: OptionalType) -> Self {
ValueType::Optional(value)
}
}
impl From<TypeParamType> for ValueType {
fn from(value: TypeParamType) -> Self {
ValueType::TypeParam(value)
}
}
impl From<FunctionType> for ValueType {
fn from(value: FunctionType) -> Self {
ValueType::Function(value)
}
}
impl From<EnumType> for ValueType {
fn from(value: EnumType) -> Self {
ValueType::Enum(value)
}
}
#[derive(thiserror::Error, Debug, Clone)]
pub struct InvalidMapKeyType(pub ValueType);
impl InvalidMapKeyType {
pub fn new(ty: ValueType) -> Self {
Self(ty)
}
}
impl std::fmt::Display for InvalidMapKeyType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "invalid key type: {}", self.0)
}
}
impl From<InvalidMapKeyType> for Error {
fn from(error: InvalidMapKeyType) -> Self {
Error::invalid_argument(format!("invalid key type: {}", error.0))
}
}
impl From<MapKeyType> for ValueType {
fn from(key: MapKeyType) -> Self {
match key {
MapKeyType::Bool => ValueType::Bool,
MapKeyType::Int => ValueType::Int,
MapKeyType::Uint => ValueType::Uint,
MapKeyType::String => ValueType::String,
MapKeyType::Dyn => ValueType::Dyn,
MapKeyType::TypeParam(tp) => ValueType::TypeParam(tp),
}
}
}
impl TryFrom<ValueType> for MapKeyType {
type Error = InvalidMapKeyType;
fn try_from(value: ValueType) -> Result<Self, Self::Error> {
match value {
ValueType::Bool => Ok(MapKeyType::Bool),
ValueType::Int => Ok(MapKeyType::Int),
ValueType::Uint => Ok(MapKeyType::Uint),
ValueType::String => Ok(MapKeyType::String),
ValueType::Dyn => Ok(MapKeyType::Dyn),
ValueType::TypeParam(tp) => Ok(MapKeyType::TypeParam(tp)),
_ => Err(InvalidMapKeyType::new(value)),
}
}
}