@@ -272,12 +272,45 @@ impl AddAssign<&ChargedResources> for ChargedResources {
272272 }
273273}
274274
275+ // Opcode name constants.
276+ const BLAKE_OPCODE_NAME : & str = "blake" ;
277+
275278#[ cfg_attr( feature = "transaction_serde" , derive( serde:: Deserialize ) ) ]
276279#[ derive( Clone , Debug , Eq , Hash , PartialEq , Serialize , Ord , PartialOrd ) ]
277280pub enum OpcodeName {
278281 Blake ,
279282}
280283
284+ impl OpcodeName {
285+ /// Converts an [`OpcodeName`] to its string representation.
286+ pub fn to_str ( & self ) -> & ' static str {
287+ match self {
288+ OpcodeName :: Blake => BLAKE_OPCODE_NAME ,
289+ }
290+ }
291+ }
292+
293+ impl std:: fmt:: Display for OpcodeName {
294+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
295+ f. write_str ( self . to_str ( ) )
296+ }
297+ }
298+
299+ impl std:: str:: FromStr for OpcodeName {
300+ type Err = ParseCairoPrimitiveNameError ;
301+
302+ fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
303+ match s {
304+ BLAKE_OPCODE_NAME => Ok ( OpcodeName :: Blake ) ,
305+ _ => Err ( ParseCairoPrimitiveNameError ) ,
306+ }
307+ }
308+ }
309+
310+ /// Error type for parsing [`OpcodeName`] or [`CairoPrimitiveName`] from a string.
311+ #[ derive( Debug , Clone , PartialEq , Eq ) ]
312+ pub struct ParseCairoPrimitiveNameError ;
313+
281314#[ cfg_attr( feature = "transaction_serde" , derive( serde:: Deserialize ) ) ]
282315#[ derive( Clone , Debug , Eq , Hash , PartialEq , Serialize , Ord , PartialOrd ) ]
283316// Serialize as an untagged enum to avoid a type prefix, for backward compatibility with
@@ -288,6 +321,31 @@ pub enum CairoPrimitiveName {
288321 Opcode ( OpcodeName ) ,
289322}
290323
324+ impl CairoPrimitiveName {
325+ /// Converts a [`CairoPrimitiveName`] to its string representation.
326+ pub fn to_str ( & self ) -> & ' static str {
327+ match self {
328+ CairoPrimitiveName :: Builtin ( builtin) => builtin. to_str ( ) ,
329+ CairoPrimitiveName :: Opcode ( opcode) => opcode. to_str ( ) ,
330+ }
331+ }
332+ }
333+
334+ impl std:: str:: FromStr for CairoPrimitiveName {
335+ type Err = ParseCairoPrimitiveNameError ;
336+
337+ /// Tries to parse as a builtin first, then as an opcode.
338+ fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
339+ if let Some ( builtin) = BuiltinName :: from_str ( s) {
340+ return Ok ( CairoPrimitiveName :: Builtin ( builtin) ) ;
341+ }
342+ if let Ok ( opcode) = s. parse :: < OpcodeName > ( ) {
343+ return Ok ( CairoPrimitiveName :: Opcode ( opcode) ) ;
344+ }
345+ Err ( ParseCairoPrimitiveNameError )
346+ }
347+ }
348+
291349impl From < BuiltinName > for CairoPrimitiveName {
292350 fn from ( builtin_name : BuiltinName ) -> Self {
293351 CairoPrimitiveName :: Builtin ( builtin_name)
@@ -300,6 +358,12 @@ impl From<OpcodeName> for CairoPrimitiveName {
300358 }
301359}
302360
361+ impl std:: fmt:: Display for CairoPrimitiveName {
362+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
363+ f. write_str ( self . to_str ( ) )
364+ }
365+ }
366+
303367pub type CairoPrimitiveCounterMap = BTreeMap < CairoPrimitiveName , usize > ;
304368
305369pub type BuiltinCounterMap = BTreeMap < BuiltinName , usize > ;
0 commit comments