Result handing in D: some|none

9il ilyayaroshenko at gmail.com
Sun Jan 30 10:58:33 UTC 2022


[mir.algebraic](http://mir-core.libmir.org/mir_algebraic.html) 
additions:
  - `some`, `none`, and `suit` second level algebraic visitor 
handlers
  - `@reflectErr` UDA
  - `Err` auto expanded wrapper when `@reflectErr` can't be used
  - Required utility API

```d
import mir.algebraic;
import mir.conv: to;

alias orElse(alias fun) = visit!(some!"a", none!fun);
alias convertErrToString = orElse!(to!string);

// can be any other type including integer enums
@reflectErr
static struct ErrorInfo {
     string msg;
     auto toString() const { return msg; }
}

alias V = Variant!(Err!string, ErrorInfo, long, double);
alias R = typeof(convertErrToString(V.init));

static assert(is(R == Variant!(string, long, double)), 
R.stringof);
assert(convertErrToString(V(1)) == 1);
assert(convertErrToString(V(1.0)) == 1.0);
assert(convertErrToString(ErrorInfo("b")) == "b");
assert(convertErrToString("Ш".err) == "Ш");
```


More information about the Digitalmars-d-announce mailing list