Skip to main content

af_move_type/
string.rs

1use std::str::FromStr;
2
3use af_sui_types::{Address, IdentStr, Identifier, StructTag, TypeTag};
4use serde::{Deserialize, Serialize};
5
6use af_sui_types::MOVE_STDLIB_ADDRESS;
7
8use crate::{
9    MoveStruct, MoveType, MoveTypeTag, ParseStructTagError, StaticAddress, StaticModule,
10    StaticName, StaticStructTag as _, StaticTypeParams, StaticTypeTag, StructTagError,
11    TypeParamsError, TypeTagError,
12};
13
14#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, PartialOrd, Ord, Serialize)]
15pub struct StringTypeTag;
16
17impl From<StringTypeTag> for TypeTag {
18    fn from(value: StringTypeTag) -> Self {
19        Self::Struct(Box::new(value.into()))
20    }
21}
22
23impl TryFrom<TypeTag> for StringTypeTag {
24    type Error = TypeTagError;
25
26    fn try_from(value: TypeTag) -> Result<Self, Self::Error> {
27        match value {
28            TypeTag::Struct(stag) => Ok((*stag).try_into()?),
29            other => Err(TypeTagError::Variant {
30                expected: "Struct(_)".to_owned(),
31                got: other,
32            }),
33        }
34    }
35}
36
37impl From<StringTypeTag> for StructTag {
38    fn from(_: StringTypeTag) -> Self {
39        String::struct_tag()
40    }
41}
42
43impl TryFrom<StructTag> for StringTypeTag {
44    type Error = StructTagError;
45
46    fn try_from(value: StructTag) -> Result<Self, Self::Error> {
47        use StructTagError::*;
48        let expected = String::struct_tag();
49        if *value.address() != *expected.address() {
50            return Err(Address {
51                expected: *expected.address(),
52                got: *value.address(),
53            });
54        }
55        if value.module() != expected.module() {
56            return Err(Module {
57                expected: expected.module().clone(),
58                got: value.module().clone(),
59            });
60        }
61        if value.name() != expected.name() {
62            return Err(Name {
63                expected: expected.name().clone(),
64                got: value.name().clone(),
65            });
66        }
67        if !value.type_params().is_empty() {
68            return Err(TypeParams(TypeParamsError::Number {
69                expected: 0,
70                got: value.type_params().len(),
71            }));
72        }
73        Ok(Self)
74    }
75}
76
77impl MoveTypeTag for StringTypeTag {
78    fn matches(tag: &TypeTag) -> bool {
79        let TypeTag::Struct(stag) = tag else {
80            return false;
81        };
82        stag.address() == &MOVE_STDLIB_ADDRESS
83            && stag.module().as_str() == "string"
84            && stag.name().as_str() == "String"
85            && stag.type_params().is_empty()
86    }
87}
88
89impl FromStr for StringTypeTag {
90    type Err = ParseStructTagError;
91
92    fn from_str(s: &str) -> Result<Self, Self::Err> {
93        let stag: StructTag = s.parse()?;
94        Ok(stag.try_into()?)
95    }
96}
97
98impl MoveType for String {
99    type TypeTag = StringTypeTag;
100}
101
102impl MoveStruct for String {
103    type StructTag = StringTypeTag;
104}
105
106impl StaticTypeTag for String {
107    fn type_() -> Self::TypeTag {
108        StringTypeTag {}
109    }
110}
111
112impl StaticAddress for String {
113    fn address() -> Address {
114        Address::from_static("0x1")
115    }
116}
117
118impl StaticModule for String {
119    fn module() -> Identifier {
120        IdentStr::cast("string").to_owned()
121    }
122}
123
124impl StaticName for String {
125    fn name() -> Identifier {
126        IdentStr::cast("String").to_owned()
127    }
128}
129
130impl StaticTypeParams for String {
131    fn type_params() -> Vec<TypeTag> {
132        vec![]
133    }
134}