@@ -14,7 +14,7 @@ use std::time::{Duration, Instant};
1414use web_time:: { Duration , Instant } ;
1515
1616use cactus:: Cactus ;
17- use cfgrammar:: { yacc:: YaccGrammar , RIdx , Span , TIdx } ;
17+ use cfgrammar:: { header :: Value , yacc:: YaccGrammar , RIdx , Span , TIdx } ;
1818use lrtable:: { Action , StIdx , StateTable } ;
1919use num_traits:: { AsPrimitive , PrimInt , Unsigned } ;
2020use proc_macro2:: TokenStream ;
@@ -629,6 +629,90 @@ pub enum RecoveryKind {
629629 None ,
630630}
631631
632+ impl TryFrom < RecoveryKind > for Value {
633+ type Error = cfgrammar:: header:: HeaderError ;
634+ fn try_from ( rk : RecoveryKind ) -> Result < Value , Self :: Error > {
635+ use cfgrammar:: {
636+ header:: { Namespaced , Setting } ,
637+ Location ,
638+ } ;
639+ let from_loc = Location :: Other ( "From<RecoveryKind>" . to_string ( ) ) ;
640+ Ok ( match rk {
641+ RecoveryKind :: CPCTPlus => Value :: Setting ( Setting :: Unitary ( Namespaced {
642+ namespace : Some ( ( "RecoveryKind" . to_string ( ) , from_loc. clone ( ) ) ) ,
643+ member : ( "CPCTPlus" . to_string ( ) , from_loc. clone ( ) ) ,
644+ } ) ) ,
645+ RecoveryKind :: None => Value :: Setting ( Setting :: Unitary ( Namespaced {
646+ namespace : Some ( ( "RecoveryKind" . to_string ( ) , from_loc. clone ( ) ) ) ,
647+ member : ( "None" . to_string ( ) , from_loc. clone ( ) ) ,
648+ } ) ) ,
649+ } )
650+ }
651+ }
652+
653+ impl TryFrom < & Value > for RecoveryKind {
654+ type Error = cfgrammar:: header:: HeaderError ;
655+ fn try_from ( rk : & Value ) -> Result < RecoveryKind , Self :: Error > {
656+ use cfgrammar:: header:: { HeaderError , HeaderErrorKind , Namespaced , Setting } ;
657+
658+ match rk {
659+ Value :: Flag ( _, loc) => Err ( HeaderError {
660+ kind : HeaderErrorKind :: ConversionError (
661+ "RecoveryKind" ,
662+ "Cannot convert boolean to RecoveryKind" ,
663+ ) ,
664+ locations : vec ! [ loc. clone( ) ] ,
665+ } ) ,
666+ Value :: Setting ( Setting :: Num ( _, loc) ) => Err ( HeaderError {
667+ kind : HeaderErrorKind :: ConversionError (
668+ "RecoveryKind" ,
669+ "Cannot convert number to RecoveryKind" ,
670+ ) ,
671+ locations : vec ! [ loc. clone( ) ] ,
672+ } ) ,
673+ Value :: Setting ( Setting :: Unitary ( Namespaced {
674+ namespace,
675+ member : ( kind, kind_loc) ,
676+ } ) ) => {
677+ match namespace {
678+ Some ( ( ns, loc) ) if ns. to_lowercase ( ) != "recoverykind" => {
679+ return Err ( HeaderError {
680+ kind : HeaderErrorKind :: ConversionError (
681+ "RecoveryKind" ,
682+ "Unknown namespace" ,
683+ ) ,
684+ locations : vec ! [ loc. clone( ) ] ,
685+ } )
686+ }
687+ _ => { }
688+ }
689+ match kind. to_lowercase ( ) . as_ref ( ) {
690+ "cpctplus" => Ok ( RecoveryKind :: CPCTPlus ) ,
691+ "none" => Ok ( RecoveryKind :: None ) ,
692+ _ => Err ( HeaderError {
693+ kind : HeaderErrorKind :: ConversionError ( "RecoveryKind" , "Unknown variant" ) ,
694+ locations : vec ! [ kind_loc. clone( ) ] ,
695+ } ) ,
696+ }
697+ }
698+ Value :: Setting ( Setting :: Constructor {
699+ ctor : _,
700+ arg :
701+ Namespaced {
702+ namespace : _,
703+ member : ( _, arg_loc) ,
704+ } ,
705+ } ) => Err ( HeaderError {
706+ kind : HeaderErrorKind :: ConversionError (
707+ "RecoveryKind" ,
708+ "Cannot convert constructor to RecoveryKind" ,
709+ ) ,
710+ locations : vec ! [ arg_loc. clone( ) ] ,
711+ } ) ,
712+ }
713+ }
714+ }
715+
632716impl quote:: ToTokens for RecoveryKind {
633717 fn to_tokens ( & self , tokens : & mut TokenStream ) {
634718 tokens. extend ( match * self {
0 commit comments