Return values from auto function

Piotr Mitana the.mail.of.mi2 at gmail.com
Sat Nov 7 22:00:18 UTC 2020


On Friday, 6 November 2020 at 10:51:20 UTC, Andrey Zherikov wrote:

> struct Result(T)
> {
>     struct Success
>     {
>         static if(!is(T == void))
>         {
>             T value;
>         }
>     }
>     struct Failure
>     {
>         string error;
>     }
>
>     Algebraic!(Success, Failure) result;
>
>     this(Success value)
>     {
>         result = value;
>     }
>     this(Failure value)
>     {
>         result = value;
>     }
> }
> auto success(T)(T value)
> {
>     return Result!T(Result!T.Success(value));
> }
> auto failure(string error)
> {
>     return Result!void(Result!void.Failure(error));
> }
>
> auto f(int i)
> {
>     return i > 0 ? success(i) : failure("err text"); // Error: 
> incompatible types for (success(i)) : (failure("err text")): 
> Result!int and Result!void
> }

I'd go with:

struct Result(T)
{
     Nullable!string error;

     static if(!is(T == void))
     {
         T value;

         static Result!T success(T value)
         {
             return Result!T(Nullable!string.init, value);
         }

         static Result!T failure(string error)
         {
             return Result!T(nullable(error), T.init);
         }
     }

     else
     {
         static Result!T success()
         {
             return Result!T(Nullable!string.init);
         }

         static Result!T failure(string error)
         {
             return Result!T(nullable(error));
         }
     }

     bool isSuccess()
     {
         return error.isNull();
     }
}

// Demo
Result!int intFun(int i)
{
     return i > 0 ? Result!int.success(i) : Result!int.failure("Be 
positive!");
}

Result!void voidFun(int i)
{
     return i > 0 ? Result!void.success() : 
Result!void.failure("Be positive!");
}

void main()
{
     auto intFunRes = intFun(5);

     if(intFunRes.isSuccess)
         writefln("Result: %d", intFunRes.value);
     else
         writefln("ERROR: %s", intFunRes.error.get);
}

Does this satisfy your needs?


More information about the Digitalmars-d-learn mailing list