@@ -119,6 +119,8 @@ let rec extractType ~env ~package (t : Types.type_expr) =
119119 Some (Tpromise (env, payloadTypeExpr))
120120 | Tconstr (Path. Pident {name = "array" } , [payloadTypeExpr ], _ ) ->
121121 Some (Tarray (env, TypeExpr payloadTypeExpr))
122+ | Tconstr (Path. Pident {name = "result" } , [okType ; errorType ], _ ) ->
123+ Some (Tresult {env; okType; errorType})
122124 | Tconstr (Path. Pident {name = "bool" } , [] , _ ) -> Some (Tbool env)
123125 | Tconstr (Path. Pident {name = "string" } , [] , _ ) -> Some (Tstring env)
124126 | Tconstr (Path. Pident {name = "exn" } , [] , _ ) -> Some (Texn env)
@@ -362,6 +364,15 @@ let rec resolveNested ~env ~full ~nested ?ctx (typ : completionType) =
362364 typ
363365 |> extractType ~env ~package: full.package
364366 |> 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 )
365376 | ( NVariantPayload {constructorName; itemNum},
366377 Tvariant {env; constructors; typeParams; typeArgs} ) -> (
367378 match
@@ -481,6 +492,12 @@ let rec resolveNestedPatternPath (typ : innerType) ~env ~full ~nested =
481492 | ( NVariantPayload {constructorName = " Some" ; itemNum = 0 },
482493 Toption (env, typ) ) ->
483494 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)
484501 | NArray , Tarray (env , typ ) -> Some (typ, env)
485502 | _ -> None ))
486503 | patternPath :: nested -> (
@@ -527,6 +544,12 @@ let rec resolveNestedPatternPath (typ : innerType) ~env ~full ~nested =
527544 | ( NVariantPayload {constructorName = " Some" ; itemNum = 0 },
528545 Toption (env, typ) ) ->
529546 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
530553 | NArray , Tarray (env , typ ) ->
531554 typ |> resolveNestedPatternPath ~env ~full ~nested
532555 | _ -> None ))
@@ -613,6 +636,10 @@ let rec extractedTypeToString ?(inner = false) = function
613636 " array<" ^ extractedTypeToString ~inner: true innerTyp ^ " >"
614637 | Toption (_ , TypeExpr innerTyp ) ->
615638 " option<" ^ Shared. typeToString innerTyp ^ " >"
639+ | Tresult {okType; errorType} ->
640+ " result<" ^ Shared. typeToString okType ^ " , "
641+ ^ Shared. typeToString errorType
642+ ^ " >"
616643 | Toption (_ , ExtractedType innerTyp ) ->
617644 " option<" ^ extractedTypeToString ~inner: true innerTyp ^ " >"
618645 | Tpromise (_ , innerTyp ) -> " promise<" ^ Shared. typeToString innerTyp ^ " >"
@@ -687,6 +714,34 @@ module Codegen = struct
687714 @ (expandedBranches
688715 |> List. map (fun (pat : Parsetree.pattern ) ->
689716 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" )))
690745 | Tbool _ -> Some [mkConstructPat " true" ; mkConstructPat " false" ]
691746 | _ -> None
692747
0 commit comments