@@ -424,6 +424,7 @@ impl<'arena, 'env, 'data> Context<'arena, 'env, 'data> {
424424 ( Prim :: FormatDeref , [ FunApp ( format) , FunApp ( r#ref) ] ) => self . read_deref ( format, r#ref) ,
425425 ( Prim :: FormatStreamPos , [ ] ) => read_stream_pos ( reader, span) ,
426426 ( Prim :: FormatSucceed , [ _, FunApp ( elem) ] ) => Ok ( elem. clone ( ) ) ,
427+ ( Prim :: FormatOrSucceed , [ FunApp ( cond) , FunApp ( format) , FunApp ( default) ] ) => self . read_or_succeed ( reader, cond, format, default) ,
427428 ( Prim :: FormatFail , [ ] ) => Err ( ReadError :: ReadFailFormat ( span) ) ,
428429 ( Prim :: FormatUnwrap , [ _, FunApp ( option) ] ) => match option. match_prim_spine ( ) {
429430 Some ( ( Prim :: OptionSome , [ FunApp ( elem) ] ) ) => Ok ( elem. clone ( ) ) ,
@@ -540,6 +541,20 @@ impl<'arena, 'env, 'data> Context<'arena, 'env, 'data> {
540541 self . lookup_or_read_ref ( pos, format)
541542 }
542543
544+ fn read_or_succeed (
545+ & mut self ,
546+ reader : & mut BufferReader < ' data > ,
547+ cond : & ArcValue < ' arena > ,
548+ format : & ArcValue < ' arena > ,
549+ default : & ArcValue < ' arena > ,
550+ ) -> Result < ArcValue < ' arena > , ReadError < ' arena > > {
551+ match cond. as_ref ( ) {
552+ Value :: ConstLit ( Const :: Bool ( true ) ) => self . read_format ( reader, format) ,
553+ Value :: ConstLit ( Const :: Bool ( false ) ) => Ok ( default. clone ( ) ) ,
554+ _ => Err ( ReadError :: InvalidValue ( Span :: Empty ) ) ,
555+ }
556+ }
557+
543558 fn lookup_ref < ' context > (
544559 & ' context self ,
545560 pos : usize ,
0 commit comments