@@ -560,6 +560,16 @@ pub struct EventLimits {
560560 pub max_n_emitted_events : usize ,
561561}
562562
563+ #[ derive( Error , Debug ) ]
564+ pub enum RawOsResourcesError {
565+ #[ error( "os_resources.execute_syscalls are missing a selector: {0:?}" ) ]
566+ MissingSelector ( SyscallSelector ) ,
567+ #[ error( "os_resources.execute_tx_inner is missing transaction_type: {0:?}" ) ]
568+ MissingTxType ( TransactionType ) ,
569+ #[ error( "unknown os resource {0}" ) ]
570+ UnknownResource ( String ) ,
571+ }
572+
563573// TODO(Dori): Remove `Deserialize` derive here.
564574#[ derive( Clone , Debug , Default , Deserialize ) ]
565575// Serde trick for adding validations via a customr deserializer, without forgoing the derive.
@@ -583,24 +593,16 @@ pub struct OsResources {
583593}
584594
585595impl OsResources {
586- pub fn validate < ' de , D : Deserializer < ' de > > (
587- & self ,
588- ) -> Result < ( ) , <D as Deserializer < ' de > >:: Error > {
596+ pub fn validate ( & self ) -> Result < ( ) , RawOsResourcesError > {
589597 for tx_type in TransactionType :: iter ( ) {
590598 if !self . execute_txs_inner . contains_key ( & tx_type) {
591- return Err ( DeserializationError :: custom ( format ! (
592- "ValidationError: os_resources.execute_tx_inner is missing transaction_type: \
593- {tx_type:?}"
594- ) ) ) ;
599+ return Err ( RawOsResourcesError :: MissingTxType ( tx_type) ) ;
595600 }
596601 }
597602
598603 for syscall_handler in SyscallSelector :: iter ( ) {
599604 if !self . execute_syscalls . contains_key ( & syscall_handler) {
600- return Err ( DeserializationError :: custom ( format ! (
601- "ValidationError: os_resources.execute_syscalls are missing syscall handler: \
602- {syscall_handler:?}"
603- ) ) ) ;
605+ return Err ( RawOsResourcesError :: MissingSelector ( syscall_handler) ) ;
604606 }
605607 }
606608
@@ -633,9 +635,7 @@ impl OsResources {
633635 execution_resources. flat_map ( |resources| resources. builtin_instance_counter . keys ( ) ) ;
634636 for builtin_name in builtin_names {
635637 if !( known_builtin_names. contains ( builtin_name. to_str_with_suffix ( ) ) ) {
636- return Err ( DeserializationError :: custom ( format ! (
637- "ValidationError: unknown os resource {builtin_name}"
638- ) ) ) ;
638+ return Err ( RawOsResourcesError :: UnknownResource ( builtin_name. to_string ( ) ) ) ;
639639 }
640640 }
641641
@@ -768,7 +768,9 @@ impl<'de> Deserialize<'de> for OsResources {
768768 // Validations.
769769
770770 #[ cfg( not( test) ) ]
771- os_resources. validate :: < D > ( ) ?;
771+ os_resources
772+ . validate ( )
773+ . map_err ( |error| DeserializationError :: custom ( format ! ( "ValidationError: {error}" ) ) ) ?;
772774
773775 Ok ( os_resources)
774776 }
0 commit comments