@@ -119,6 +119,8 @@ let rec extractType ~env ~package (t : Types.type_expr) =
119
119
Some (Tpromise (env, payloadTypeExpr))
120
120
| Tconstr (Path. Pident {name = "array" } , [payloadTypeExpr ], _ ) ->
121
121
Some (Tarray (env, TypeExpr payloadTypeExpr))
122
+ | Tconstr (Path. Pident {name = "result" } , [okType ; errorType ], _ ) ->
123
+ Some (Tresult {env; okType; errorType})
122
124
| Tconstr (Path. Pident {name = "bool" } , [] , _ ) -> Some (Tbool env)
123
125
| Tconstr (Path. Pident {name = "string" } , [] , _ ) -> Some (Tstring env)
124
126
| Tconstr (Path. Pident {name = "exn" } , [] , _ ) -> Some (Texn env)
@@ -362,6 +364,15 @@ let rec resolveNested ~env ~full ~nested ?ctx (typ : completionType) =
362
364
typ
363
365
|> extractType ~env ~package: full.package
364
366
|> Utils.Option. flatMap (fun t -> t |> resolveNested ~env ~full ~nested )
367
+ | NVariantPayload {constructorName = "Ok" ; itemNum = 0 } , Tresult {okType} ->
368
+ okType
369
+ |> extractType ~env ~package: full.package
370
+ |> Utils.Option. flatMap (fun t -> t |> resolveNested ~env ~full ~nested )
371
+ | ( NVariantPayload {constructorName = " Error" ; itemNum = 0 },
372
+ Tresult {errorType} ) ->
373
+ errorType
374
+ |> extractType ~env ~package: full.package
375
+ |> Utils.Option. flatMap (fun t -> t |> resolveNested ~env ~full ~nested )
365
376
| ( NVariantPayload {constructorName; itemNum},
366
377
Tvariant {env; constructors; typeParams; typeArgs} ) -> (
367
378
match
@@ -481,6 +492,12 @@ let rec resolveNestedPatternPath (typ : innerType) ~env ~full ~nested =
481
492
| ( NVariantPayload {constructorName = " Some" ; itemNum = 0 },
482
493
Toption (env, typ) ) ->
483
494
Some (typ, env)
495
+ | ( NVariantPayload {constructorName = " Ok" ; itemNum = 0 },
496
+ Tresult {env; okType} ) ->
497
+ Some (TypeExpr okType, env)
498
+ | ( NVariantPayload {constructorName = " Error" ; itemNum = 0 },
499
+ Tresult {env; errorType} ) ->
500
+ Some (TypeExpr errorType, env)
484
501
| NArray , Tarray (env , typ ) -> Some (typ, env)
485
502
| _ -> None ))
486
503
| patternPath :: nested -> (
@@ -527,6 +544,12 @@ let rec resolveNestedPatternPath (typ : innerType) ~env ~full ~nested =
527
544
| ( NVariantPayload {constructorName = " Some" ; itemNum = 0 },
528
545
Toption (env, typ) ) ->
529
546
typ |> resolveNestedPatternPath ~env ~full ~nested
547
+ | ( NVariantPayload {constructorName = " Ok" ; itemNum = 0 },
548
+ Tresult {env; okType} ) ->
549
+ TypeExpr okType |> resolveNestedPatternPath ~env ~full ~nested
550
+ | ( NVariantPayload {constructorName = " Error" ; itemNum = 0 },
551
+ Tresult {env; errorType} ) ->
552
+ TypeExpr errorType |> resolveNestedPatternPath ~env ~full ~nested
530
553
| NArray , Tarray (env , typ ) ->
531
554
typ |> resolveNestedPatternPath ~env ~full ~nested
532
555
| _ -> None ))
@@ -613,6 +636,10 @@ let rec extractedTypeToString ?(inner = false) = function
613
636
" array<" ^ extractedTypeToString ~inner: true innerTyp ^ " >"
614
637
| Toption (_ , TypeExpr innerTyp ) ->
615
638
" option<" ^ Shared. typeToString innerTyp ^ " >"
639
+ | Tresult {okType; errorType} ->
640
+ " result<" ^ Shared. typeToString okType ^ " , "
641
+ ^ Shared. typeToString errorType
642
+ ^ " >"
616
643
| Toption (_ , ExtractedType innerTyp ) ->
617
644
" option<" ^ extractedTypeToString ~inner: true innerTyp ^ " >"
618
645
| Tpromise (_ , innerTyp ) -> " promise<" ^ Shared. typeToString innerTyp ^ " >"
@@ -687,6 +714,34 @@ module Codegen = struct
687
714
@ (expandedBranches
688
715
|> List. map (fun (pat : Parsetree.pattern ) ->
689
716
mkConstructPat ~payload: pat " Some" )))
717
+ | Tresult {okType; errorType} ->
718
+ let extractedOkType = okType |> extractType ~env ~package: full.package in
719
+ let extractedErrorType =
720
+ errorType |> extractType ~env ~package: full.package
721
+ in
722
+ let expandedOkBranches =
723
+ match extractedOkType with
724
+ | None -> []
725
+ | Some extractedType -> (
726
+ match extractedTypeToExhaustivePatterns ~env ~full extractedType with
727
+ | None -> []
728
+ | Some patterns -> patterns)
729
+ in
730
+ let expandedErrorBranches =
731
+ match extractedErrorType with
732
+ | None -> []
733
+ | Some extractedType -> (
734
+ match extractedTypeToExhaustivePatterns ~env ~full extractedType with
735
+ | None -> []
736
+ | Some patterns -> patterns)
737
+ in
738
+ Some
739
+ ((expandedOkBranches
740
+ |> List. map (fun (pat : Parsetree.pattern ) ->
741
+ mkConstructPat ~payload: pat " Ok" ))
742
+ @ (expandedErrorBranches
743
+ |> List. map (fun (pat : Parsetree.pattern ) ->
744
+ mkConstructPat ~payload: pat " Error" )))
690
745
| Tbool _ -> Some [mkConstructPat " true" ; mkConstructPat " false" ]
691
746
| _ -> None
692
747
0 commit comments