moverox_traits/
vector.rs

1use moverox_types::TypeTag;
2
3use crate::{ConstTypeTag, MoveType, MoveTypeTag, ParseTypeTagError, TypeTagError};
4
5impl<T: MoveType> MoveType for Vec<T> {
6    type TypeTag = VecTypeTag<T::TypeTag>;
7}
8
9#[derive(Clone, PartialOrd, Ord, PartialEq, Eq, Debug, Hash)]
10#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
11pub struct VecTypeTag<T: MoveTypeTag>(pub T);
12
13impl<T: MoveTypeTag> MoveTypeTag for VecTypeTag<T> {
14    fn as_datatype_tag(&self) -> Option<&dyn crate::MoveDatatypeTag> {
15        None
16    }
17
18    fn from_type_tag(value: &TypeTag) -> Result<Self, TypeTagError> {
19        match value {
20            TypeTag::Vector(type_) => Ok(Self(MoveTypeTag::from_type_tag(type_)?)),
21            _ => Err(TypeTagError::Variant {
22                expected: "Vector(_)".to_owned(),
23                got: crate::type_tag_variant_name(value),
24            }),
25        }
26    }
27
28    fn to_type_tag(&self) -> TypeTag {
29        TypeTag::Vector(Box::new(self.0.to_type_tag()))
30    }
31}
32
33impl<T: ConstTypeTag> ConstTypeTag for Vec<T> {
34    const TYPE_TAG: VecTypeTag<T::TypeTag> = VecTypeTag(T::TYPE_TAG);
35}
36
37impl<T: MoveTypeTag> std::fmt::Display for VecTypeTag<T> {
38    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
39        let stag = MoveTypeTag::to_type_tag(self);
40        write!(f, "{}", stag)
41    }
42}
43
44impl<T: MoveTypeTag> std::str::FromStr for VecTypeTag<T> {
45    type Err = ParseTypeTagError;
46
47    fn from_str(s: &str) -> Result<Self, Self::Err> {
48        let tag = s.parse().map_err(ParseTypeTagError::from_str)?;
49        Ok(Self::from_type_tag(&tag)?)
50    }
51}