@@ -605,3 +605,109 @@ public AlgebraicType GetAlgebraicType(ITypeRegistrar registrar) =>
605605 // --- / customized ---
606606 }
607607}
608+
609+ public partial record Result < T , E > : TaggedEnum < ( T Ok , E Err ) >
610+ {
611+ public static implicit operator Result < T , E > ( T value ) => new OkR ( value ) ;
612+
613+ public static implicit operator Result < T , E > ( E error ) => new ErrR ( error ) ;
614+
615+ public TResult Match < TResult > ( Func < T , TResult > onOk , Func < E , TResult > onErr ) =>
616+ this switch
617+ {
618+ OkR ( var v ) => onOk ( v ) ,
619+ ErrR ( var e ) => onErr ( e ) ,
620+ _ => throw new InvalidOperationException ( "Unknown Result variant." ) ,
621+ } ;
622+
623+ public static Result < T , E > Ok ( T value ) => new OkR ( value ) ;
624+
625+ public static Result < T , E > Err ( E error ) => new ErrR ( error ) ;
626+
627+ public T UnwrapOrThrow ( )
628+ {
629+ return this switch
630+ {
631+ OkR ( var v ) => v ,
632+ ErrR ( var e ) when e is not null => throw new Exception ( e . ToString ( ) ) ,
633+ ErrR ( _ ) => throw new InvalidOperationException (
634+ "Result failed without an error object."
635+ ) ,
636+ _ => throw new InvalidOperationException ( "Unknown Result variant." ) ,
637+ } ;
638+ }
639+
640+ public T UnwrapOr ( T defaultValue ) =>
641+ this switch
642+ {
643+ OkR ( var v ) => v ,
644+ _ => defaultValue ,
645+ } ;
646+
647+ public T UnwrapOrElse ( Func < E , T > f ) =>
648+ this switch
649+ {
650+ OkR ( var v ) => v ,
651+ ErrR ( var e ) => f ( e ) ,
652+ _ => throw new InvalidOperationException ( "Unknown Result variant." ) ,
653+ } ;
654+
655+ // ----- auto-generated -----
656+
657+ private Result ( ) { }
658+
659+ internal enum @enum : byte
660+ {
661+ Ok ,
662+ Err ,
663+ }
664+
665+ public sealed record OkR ( T Value ) : Result < T , E > ;
666+
667+ public sealed record ErrR ( E Error ) : Result < T , E > ;
668+
669+ private enum Variant : byte
670+ {
671+ Ok = 0 ,
672+ Err = 1 ,
673+ }
674+
675+ public readonly struct BSATN < OkRW , ErrRW > : IReadWrite < Result < T , E > >
676+ where OkRW : struct , IReadWrite < T >
677+ where ErrRW : struct , IReadWrite < E >
678+ {
679+ private static readonly SpacetimeDB . BSATN . Enum < @enum > __enumTag = new ( ) ;
680+ private static readonly OkRW okRW = new ( ) ;
681+ private static readonly ErrRW errRW = new ( ) ;
682+
683+ public Result < T , E > Read ( BinaryReader reader ) =>
684+ __enumTag . Read ( reader ) switch
685+ {
686+ @enum . Ok => new OkR ( okRW . Read ( reader ) ) ,
687+ @enum . Err => new ErrR ( errRW . Read ( reader ) ) ,
688+ _ => throw new InvalidOperationException ( ) ,
689+ } ;
690+
691+ public void Write ( BinaryWriter writer , Result < T , E > value )
692+ {
693+ switch ( value )
694+ {
695+ case OkR ( var v ) :
696+ __enumTag . Write ( writer , @enum . Ok ) ;
697+ okRW . Write ( writer , v ) ;
698+ break ;
699+
700+ case ErrR ( var e ) :
701+ __enumTag . Write ( writer , @enum . Err ) ;
702+ errRW . Write ( writer , e ) ;
703+ break ;
704+ }
705+ }
706+
707+ public AlgebraicType GetAlgebraicType ( ITypeRegistrar registrar ) =>
708+ AlgebraicType . MakeResult (
709+ okRW . GetAlgebraicType ( registrar ) ,
710+ errRW . GetAlgebraicType ( registrar )
711+ ) ;
712+ }
713+ }
0 commit comments