@@ -218,14 +218,39 @@ def build_has_attr_fn(self, fn_attr: str, prop_attr: str, doc_flag: str):
218218
219219@property
220220def impl_try_from_nums (self )-> str :
221+ def fn_prefix (typ :str ):
222+ s_val = int (
223+ self .typ [1 :]
224+ )# Will not work if `self.typ` is either isize or usize
225+ try :
226+ o_val = int (typ [1 :])
227+ except ValueError :
228+ o_val = float ("inf" )
229+
230+ if self .typ [0 ]!= typ [0 ]:
231+ arg = f"raw:{ typ } "
232+ id_def = "let id = raw.try_into().map_err(|_| ())?;"
233+ elif o_val > s_val :
234+ arg = f"raw:{ typ } "
235+ id_def = "let id = raw.try_into().map_err(|_| ())?;"
236+ elif o_val == s_val :
237+ arg = f"id:{ typ } "
238+ id_def = ""
239+ else :
240+ arg = f"raw:{ typ } "
241+ id_def = "let id = raw.into();"
242+
243+ return f"""
244+ fn try_from({ arg } ) -> Result<Self, Self::Error> {{
245+ { id_def }
246+ """ .strip ()
247+
221248return "\n \n " .join (
222249f"""
223250impl TryFrom<{ typ } > for{ self .enum_name } {{
224251 type Error = ();
225252
226- fn try_from(raw:{ typ } ) -> Result<Self, Self::Error> {{
227- #[allow(clippy::unnecessary_fallible_conversions)]
228- let id = raw.try_into().map_err(|_| ())?;
253+ { fn_prefix (typ )}
229254 if Self::is_valid(id) {{
230255 // SAFETY: We just validated that we have a valid opcode id.
231256 Ok(unsafe {{ std::mem::transmute::<{ self .typ } , Self>(id) }})