scale_info_legacy/
insert_name.rs1use crate::lookup_name::{LookupName, LookupNameDef};
19use alloc::borrow::Cow;
20use alloc::borrow::ToOwned;
21use alloc::format;
22use alloc::string::{String, ToString};
23use core::fmt::Write;
24use smallvec::SmallVec;
25
26#[allow(missing_docs)]
28#[derive(Debug, thiserror::Error)]
29pub enum ParseError {
30 #[error("Failed to parse the string. Expected something like 'Foo' or 'Bar<A, B>'.")]
31 Invalid,
32 #[error("Expected the generic params to be names like 'A' or 'B', not arrays or tuples.")]
33 ExpectingNamedParam,
34 #[error("Expected the generic params to be capitalized.")]
35 ExpectingUppercaseParams,
36}
37
38#[derive(Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
52pub struct InsertName {
53 pub(crate) name: String,
54 pub(crate) params: SmallVec<[String; 4]>,
55 pub(crate) pallet: Option<String>,
56}
57
58impl InsertName {
59 pub fn parse(s: &str) -> Result<Self, ParseError> {
61 let ty_name = LookupName::parse(s).map_err(|_| ParseError::Invalid)?;
62 ty_name.try_into()
63 }
64
65 pub fn in_pallet(mut self, pallet_name: impl Into<String>) -> InsertName {
68 self.pallet = Some(pallet_name.into());
69 self
70 }
71}
72
73impl core::str::FromStr for InsertName {
74 type Err = ParseError;
75 fn from_str(s: &str) -> Result<Self, Self::Err> {
76 Self::parse(s)
77 }
78}
79
80impl core::convert::TryFrom<LookupName> for InsertName {
81 type Error = ParseError;
82 fn try_from(mut ty_name: LookupName) -> Result<Self, Self::Error> {
83 let pallet = ty_name.take_pallet();
84
85 let LookupNameDef::Named(named_ty) = ty_name.def() else {
87 return Err(ParseError::Invalid);
88 };
89
90 let name = named_ty.name().to_owned();
91 let params = named_ty
92 .param_defs()
93 .map(|param| {
94 let LookupNameDef::Named(name) = param else {
96 return Err(ParseError::ExpectingNamedParam);
97 };
98 if name.name().starts_with(|c: char| c.is_lowercase()) {
100 return Err(ParseError::ExpectingUppercaseParams);
101 }
102 Ok(name.name().to_owned())
103 })
104 .collect::<Result<_, _>>()?;
105
106 Ok(InsertName { name, params, pallet })
107 }
108}
109
110impl core::convert::TryFrom<&str> for InsertName {
111 type Error = ParseError;
112 fn try_from(s: &str) -> Result<Self, Self::Error> {
113 Self::parse(s)
114 }
115}
116
117impl core::convert::TryFrom<String> for InsertName {
118 type Error = ParseError;
119 fn try_from(s: String) -> Result<Self, Self::Error> {
120 Self::parse(&s)
121 }
122}
123
124impl core::fmt::Debug for InsertName {
125 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
126 write!(f, "{}", self)
127 }
128}
129
130impl core::fmt::Display for InsertName {
131 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
132 f.write_str(&self.name)?;
133 if !self.params.is_empty() {
134 f.write_char('<')?;
135 for (idx, param) in self.params.iter().enumerate() {
136 if idx != 0 {
137 f.write_str(", ")?;
138 }
139 f.write_str(param)?;
140 }
141 f.write_char('>')?;
142 }
143 Ok(())
144 }
145}
146
147impl serde::Serialize for InsertName {
148 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
149 where
150 S: serde::Serializer,
151 {
152 serializer.serialize_str(&self.to_string())
153 }
154}
155
156impl<'de> serde::Deserialize<'de> for InsertName {
157 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
158 where
159 D: serde::Deserializer<'de>,
160 {
161 use serde::de::Error;
162 let s = <Cow<'de, str>>::deserialize(deserializer)?;
163 InsertName::parse(&s)
164 .map_err(|e| D::Error::custom(format!("Could not deserialize into InsertName: {e}")))
165 }
166}