using System; namespace ScreenConnect; public struct Result(Union union) { private Union inner = union; public static implicit operator Result(Union union) { return new Result(union); } public static implicit operator Result(TResult result) { return new Result(result); } public static implicit operator Result(TError error) { return new Result(error); } public bool TryGetValue(out TResult result) { return inner.IsFirst(out result); } public bool TryGetError(out TError error) { return inner.IsSecond(out error); } public bool Deconstruct(out TResult result, out TError error) { error = inner.Second; return inner.IsFirst(out result); } public bool IsOk() { TResult value; return inner.IsFirst(out value); } public bool IsError() { TError value; return inner.IsSecond(out value); } public Result Map(Func func) { return inner.MatchFirst(func); } public T MapOr(T defaultValue, Func resultFunc) { return inner.Match(resultFunc, (TError _) => defaultValue); } public T MapOrElse(Func defaultFunc, Func resultFunc) { return inner.Match(resultFunc, defaultFunc); } public Result MapError(Func func) { return inner.MatchSecond(func); } public TResult UnwrapOr(TResult defaultValue) { return MapOr(defaultValue, (TResult it) => it); } public TResult UnwrapOrElse(Func defaultFunc) { return MapOrElse(defaultFunc, (TResult it) => it); } public TError UnwrapError() { return inner.Match(delegate { throw new InvalidCastException(); }, (TError it) => it); } public override string ToString() { return inner.Match((TResult it) => it.SafeToString(), (TError it) => it.SafeToString()); } }