@@ -125,6 +125,7 @@ impl Serdes for hir::Type {
125125 hir:: Type :: Array ( ty) => Box :: new ( ty. ser ( b, ser) ) ,
126126 hir:: Type :: Set ( ty) => Box :: new ( ty. ser ( b, ser) ) ,
127127 hir:: Type :: Map ( ty) => Box :: new ( ty. ser ( b, ser) ) ,
128+ hir:: Type :: Enum ( ty) => Box :: new ( ty. ser ( b, ser) ) ,
128129 hir:: Type :: Struct ( ty) => Box :: new ( ty. ser ( b, ser) ) ,
129130 } ;
130131
@@ -146,6 +147,7 @@ impl Serdes for hir::Type {
146147 hir:: Type :: Array ( ty) => Box :: new ( ty. des ( b, des) ) ,
147148 hir:: Type :: Set ( ty) => Box :: new ( ty. des ( b, des) ) ,
148149 hir:: Type :: Map ( ty) => Box :: new ( ty. des ( b, des) ) ,
150+ hir:: Type :: Enum ( ty) => Box :: new ( ty. des ( b, des) ) ,
149151 hir:: Type :: Struct ( ty) => Box :: new ( ty. des ( b, des) ) ,
150152 } ;
151153
@@ -439,6 +441,54 @@ impl Serdes for hir::MapType {
439441 }
440442}
441443
444+ impl Serdes for hir:: EnumType {
445+ fn ser < ' ty , ' b , ' ser : ' ty > (
446+ & ' ty self ,
447+ b : & ' b mut Builder ,
448+ ser : & ' ser Ser ,
449+ ) -> impl Fn ( & mut Builder , Expr ) + use < ' ty , ' ser > + ' ty {
450+ let variants = b. expr ( Expr :: Table (
451+ self . variants
452+ . iter ( )
453+ . enumerate ( )
454+ . map ( |( i, v) | ( Expr :: from ( v. as_str ( ) ) , Expr :: from ( i as f64 ) ) )
455+ . collect ( ) ,
456+ ) ) ;
457+
458+ let number = self . number . ser ( b, ser) ;
459+
460+ move |b : & mut Builder , from : Expr | {
461+ apicheck_full ! ( ser, check_type( b, from. clone( ) , "string" ) ) ;
462+
463+ let value = b. expr ( variants. expr ( ) . index ( from) ) ;
464+ apicheck_some ! ( ser, b. assert( value. expr( ) , "not a valid enum variant" ) ) ;
465+
466+ number ( b, value. expr ( ) ) ;
467+ }
468+ }
469+
470+ fn des < ' ty , ' b , ' des : ' ty > (
471+ & ' ty self ,
472+ b : & ' b mut Builder ,
473+ des : & ' des Des ,
474+ ) -> impl Fn ( & mut Builder ) -> InitVar + use < ' ty , ' des > + ' ty {
475+ let variants = b. expr ( Expr :: Table (
476+ self . variants
477+ . iter ( )
478+ . enumerate ( )
479+ . map ( |( i, v) | ( Expr :: from ( i as f64 ) , Expr :: from ( v. as_str ( ) ) ) )
480+ . collect ( ) ,
481+ ) ) ;
482+
483+ let number = self . number . des ( b, des) ;
484+
485+ move |b : & mut Builder | {
486+ let value = number ( b) ;
487+ b. expr ( variants. expr ( ) . index ( & value) )
488+ }
489+ }
490+ }
491+
442492impl Serdes for hir:: StructType {
443493 fn ser < ' ty , ' b , ' ser : ' ty > (
444494 & ' ty self ,
0 commit comments