Skip to content

Commit 75b2db3

Browse files
committed
Updated result and added ErrorCodes
1 parent 0223e8b commit 75b2db3

6 files changed

Lines changed: 130 additions & 115 deletions

File tree

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
5+
namespace ManagedCode.Communication;
6+
7+
public abstract class BaseResult<TErrorCode> where TErrorCode : Enum
8+
{
9+
public bool IsSuccess { get; }
10+
public bool IsFail => !IsSuccess;
11+
public Error<TErrorCode>? Error => Errors?.FirstOrDefault();
12+
public List<Error<TErrorCode>>? Errors { get; set; }
13+
14+
15+
protected BaseResult(bool isSuccess)
16+
{
17+
IsSuccess = isSuccess;
18+
}
19+
20+
protected BaseResult(Error<TErrorCode> error)
21+
{
22+
IsSuccess = false;
23+
Errors = new List<Error<TErrorCode>> {error};
24+
}
25+
26+
protected BaseResult(List<Error<TErrorCode>> errors)
27+
{
28+
IsSuccess = false;
29+
Errors = errors;
30+
}
31+
}
32+
33+
public abstract class BaseResult<T, TErrorCode> : BaseResult<TErrorCode> where TErrorCode : Enum
34+
{
35+
public T? Value { get; }
36+
public T? ValueOrDefault(T? defaultValue = default) => Value ?? defaultValue;
37+
38+
protected BaseResult(T value) : base(true)
39+
{
40+
Value = value;
41+
}
42+
43+
protected BaseResult(bool isSuccess) : base(isSuccess)
44+
{
45+
}
46+
47+
protected BaseResult(Error<TErrorCode> error) : base(error)
48+
{
49+
}
50+
51+
protected BaseResult(List<Error<TErrorCode>> errors) : base(errors)
52+
{
53+
}
54+
}

ManagedCode.Communication/Error.cs

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,35 @@
22

33
namespace ManagedCode.Communication;
44

5-
public class Error
5+
public class Error<TErrorCode> where TErrorCode : Enum
66
{
7-
public Error(string message)
7+
public Error(string message, TErrorCode? errorCode = default)
88
{
99
Message = message;
10+
ErrorCode = errorCode;
1011
}
1112

12-
public Error(Exception? exception)
13+
public Error(Exception exception, TErrorCode? errorCode = default)
1314
{
1415
Exception = exception;
15-
Message = exception.Message;
16+
ErrorCode = errorCode;
17+
Message = exception.Message ?? string.Empty;
1618
}
1719

18-
public Exception? Exception { get; set; }
20+
public Error(Exception exception, string message, TErrorCode? errorCode = default)
21+
{
22+
Exception = exception;
23+
ErrorCode = errorCode;
24+
Message = message;
25+
}
26+
27+
1928
public string Message { get; set; }
29+
public Exception? Exception { get; set; }
30+
public TErrorCode? ErrorCode { get; set; }
31+
32+
public static Error<TErrorCode> FromException(Exception exception, TErrorCode? errorCode = default)
33+
{
34+
return new Error<TErrorCode>(exception, errorCode);
35+
}
2036
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
namespace ManagedCode.Communication;
2+
3+
public enum ErrorCode
4+
{
5+
Unknown,
6+
InvalidArguments,
7+
InvalidOperation,
8+
InvalidState,
9+
NotFound,
10+
NotSupported,
11+
Timeout,
12+
AccessDenied,
13+
NotImplemented,
14+
NotInitialized,
15+
AlreadyExists,
16+
}
Lines changed: 36 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,84 +1,71 @@
11
using System;
2+
using System.Collections.Generic;
23

34
namespace ManagedCode.Communication;
45

5-
public class Result
6+
public class Result : BaseResult<ErrorCode>
67
{
7-
public bool IsSuccess { get; }
8-
public bool IsError => !IsSuccess;
9-
public Error? Error { get; }
10-
11-
protected Result(Exception exception)
8+
internal Result(bool isSuccess) : base(isSuccess)
129
{
13-
IsSuccess = false;
14-
Error = new Error(exception);
1510
}
1611

17-
protected Result(string errorMessage)
12+
internal Result(Error<ErrorCode> error) : base(error)
1813
{
19-
IsSuccess = false;
20-
Error = new Error(errorMessage);
2114
}
2215

23-
protected Result(bool isSuccess)
16+
internal Result(List<Error<ErrorCode>> errors) : base(errors)
2417
{
25-
IsSuccess = isSuccess;
26-
Error = null;
2718
}
2819

29-
protected Result(Error error)
30-
{
31-
IsSuccess = false;
32-
Error = error;
33-
}
3420

35-
public static Result Succeed()
36-
{
37-
return new Result(true);
38-
}
21+
public static implicit operator Result(Error<ErrorCode> error) => new(error);
22+
public static implicit operator Result(List<Error<ErrorCode>> errors) => new(errors);
3923

40-
public static Result Fail()
41-
{
42-
return new Result(false);
43-
}
4424

45-
public static Result Fail(Error error)
46-
{
47-
return new Result(error);
48-
}
25+
public static Result Success() => new(true);
26+
public static Result Fail() => new(false);
27+
public static Result Fail(Error<ErrorCode> error) => new(error);
28+
public static Result Fail(List<Error<ErrorCode>> errors) => new(errors);
29+
}
4930

50-
public static Result Fail(Exception error)
31+
public class Result<T> : BaseResult<T, ErrorCode>
32+
{
33+
internal Result(T value) : base(value)
5134
{
52-
return new Result(error);
5335
}
5436

55-
public static Result Fail(string errorMessage)
37+
internal Result(bool isSuccess) : base(isSuccess)
5638
{
57-
return new Result(errorMessage);
5839
}
5940

60-
public static Result<T> Succeed<T>(T content)
41+
internal Result(Error<ErrorCode> error) : base(error)
6142
{
62-
return new Result<T>(true, content);
6343
}
6444

65-
public static Result<T> Fail<T>()
45+
internal Result(List<Error<ErrorCode>> errors) : base(errors)
6646
{
67-
return new Result<T>(false);
6847
}
6948

70-
public static Result<T> Fail<T>(Error error)
71-
{
72-
return new Result<T>(error);
73-
}
7449

75-
public static Result<T> Fail<T>(Exception exception)
76-
{
77-
return new Result<T>(exception);
78-
}
50+
public static implicit operator Result<T>(T value) => new(value);
51+
public static implicit operator Result<T>(Error<ErrorCode> error) => new(error);
52+
public static implicit operator Result<T>(List<Error<ErrorCode>> errors) => new(errors);
53+
7954

80-
public static Result<T> Fail<T>(string errorMessage)
55+
public static Result<T> Success(T value) => new(value);
56+
public static Result<T> Fail() => new(false);
57+
public static Result<T> Fail(Error<ErrorCode> error) => new(error);
58+
public static Result<T> Fail(List<Error<ErrorCode>> errors) => new(errors);
59+
60+
61+
public Result<T> WithError(Error<ErrorCode> error)
8162
{
82-
return new Result<T>(errorMessage);
63+
if (IsSuccess)
64+
{
65+
throw new InvalidOperationException("Cannot add error to success result");
66+
}
67+
68+
Errors!.Add(error);
69+
return this;
8370
}
8471
}

ManagedCode.Communication/ResultExtensions.cs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,16 @@
1+
using System;
12
using System.Threading.Tasks;
23

34
namespace ManagedCode.Communication;
45

56
public static class ResultExtensions
67
{
7-
public static Result<T> ToSucceededResult<T>(this T value)
8-
{
9-
return new Result<T>(true, value);
10-
}
11-
12-
public static Task<Result<T>> AsTask<T>(this Result<T> value)
8+
public static Task<BaseResult<T, TErrorCode>> AsTask<T, TErrorCode>(this BaseResult<T, TErrorCode> value) where TErrorCode : Enum
139
{
1410
return Task.FromResult(value);
1511
}
1612

17-
public static Task<Result> AsTask(this Result value)
13+
public static Task<BaseResult<TErrorCode>> AsTask<TErrorCode>(this BaseResult<TErrorCode> value) where TErrorCode : Enum
1814
{
1915
return Task.FromResult(value);
2016
}

ManagedCode.Communication/ResultT.cs

Lines changed: 0 additions & 54 deletions
This file was deleted.

0 commit comments

Comments
 (0)