Skip to content

Commit dfda5e3

Browse files
committed
Update readme for new updates
1 parent 57cea33 commit dfda5e3

File tree

13 files changed

+235
-293
lines changed

13 files changed

+235
-293
lines changed

README.md

Lines changed: 101 additions & 145 deletions
Large diffs are not rendered by default.

docs/images/conveyer.jpg

616 KB
Loading

src/ResultBoxes/ResultBoxes/ResultBox.cs

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,16 @@ namespace ResultBoxes;
33

44
public record ResultBox<TValue> where TValue : notnull
55
{
6+
private readonly Exception? exception;
67
internal ResultBox(TValue? value, Exception? exception) =>
7-
(Value, Exception) = (value, exception);
8+
(Value, this.exception) = (value, exception);
89

910
[JsonIgnore]
10-
public bool IsSuccess => Exception is null;
11+
public bool IsSuccess => Exception is null && Value is not null;
1112
public static ResultBox<TValue> OutOfRange => new(new ResultValueNullException());
1213
internal TValue? Value { get; }
13-
public Exception? Exception { get; }
14+
public Exception? Exception =>
15+
exception ?? (Value is null ? new ResultValueNullException() : null);
1416
public Exception GetException() =>
1517
Exception ?? throw new ResultsInvalidOperationException("no exception");
1618
public TValue GetValue() =>
@@ -34,56 +36,56 @@ public ResultBox<TValueResult> Remap<TValueResult>(
3436
Func<TValue, ResultBox<TValueResult>> valueFunc) where TValueResult : notnull =>
3537
this switch
3638
{
37-
{ IsSuccess: false } error => error.GetException(),
38-
{ IsSuccess: true } value => valueFunc(value.GetValue()),
39+
{ IsSuccess: false } => GetException(),
40+
{ IsSuccess: true } => valueFunc(GetValue()),
3941
_ => new ResultValueNullException()
4042
};
4143
public async Task<ResultBox<TValueResult>> RemapAsync<TValueResult>(
4244
Func<TValue, Task<ResultBox<TValueResult>>> valueFunc) where TValueResult : notnull =>
4345
this switch
4446
{
45-
{ IsSuccess: false } error => error.GetException(),
46-
{ IsSuccess: true } value => await valueFunc(value.GetValue()),
47+
{ IsSuccess: false } => GetException(),
48+
{ IsSuccess: true } => await valueFunc(GetValue()),
4749
_ => new ResultValueNullException()
4850
};
4951
public ResultBox<TValueResult> RemapResult<TValueResult>(
5052
Func<ResultBox<TValue>, ResultBox<TValueResult>> valueFunc)
5153
where TValueResult : notnull =>
5254
this switch
5355
{
54-
{ IsSuccess: false } error => error.GetException(),
55-
{ IsSuccess: true } value => valueFunc(value),
56+
{ IsSuccess: false } => GetException(),
57+
{ IsSuccess: true } => valueFunc(this),
5658
_ => new ResultValueNullException()
5759
};
5860
public async Task<ResultBox<TValueResult>> RemapResultAsync<TValueResult>(
5961
Func<ResultBox<TValue>, Task<ResultBox<TValueResult>>> valueFunc)
6062
where TValueResult : notnull =>
6163
this switch
6264
{
63-
{ IsSuccess: false } error => error.GetException(),
64-
{ IsSuccess: true } value => await valueFunc(value),
65+
{ IsSuccess: false } => GetException(),
66+
{ IsSuccess: true } => await valueFunc(this),
6567
_ => new ResultValueNullException()
6668
};
6769
public async Task<ResultBox<TValueResult>> RemapAsync<TValueResult>(
6870
Func<TValue, Task<TValueResult>> valueFunc) where TValueResult : notnull =>
6971
this switch
7072
{
71-
{ IsSuccess: false } error => error.GetException(),
72-
{ IsSuccess: true } value => await valueFunc(value.GetValue()),
73+
{ IsSuccess: false } => GetException(),
74+
{ IsSuccess: true } => await valueFunc(GetValue()),
7375
_ => new ResultValueNullException()
7476
};
7577

7678
public static implicit operator ResultBox<TValue>(TValue value) => new(value, null);
7779
public static implicit operator ResultBox<TValue>(Exception exception) =>
7880
new(default, exception);
7981

80-
public ResultBox<TwoValues<TValue, TValue2>> Append<TValue2>(TValue2 value)
82+
public ResultBox<TwoValues<TValue, TValue2>> Append<TValue2>(TValue2 value2)
8183
where TValue2 : notnull =>
8284
this switch
8385
{
84-
{ IsSuccess: false } error => error.GetException(),
85-
{ IsSuccess: true } addingValue => new ResultBox<TwoValues<TValue, TValue2>>(
86-
new TwoValues<TValue, TValue2>(addingValue.GetValue(), value),
86+
{ IsSuccess: false } => GetException(),
87+
{ IsSuccess: true } => new ResultBox<TwoValues<TValue, TValue2>>(
88+
new TwoValues<TValue, TValue2>(GetValue(), value2),
8789
null),
8890
_ => new ResultValueNullException()
8991
};
@@ -135,4 +137,24 @@ public static async Task<ResultBox<TValue>> FromValue<TValue>(Task<TValue> value
135137
public static async Task<ResultBox<TValue>> FromValue<TValue>(Func<Task<TValue>> value)
136138
where TValue : notnull =>
137139
new(await value(), null);
140+
141+
public static void LogResult<TValue>(ResultBox<TValue> result) where TValue : notnull
142+
=> LogResult(result, "");
143+
144+
public static void LogResult<TValue>(ResultBox<TValue> result, string marking)
145+
where TValue : notnull
146+
{
147+
switch (result)
148+
{
149+
case { IsSuccess: true }:
150+
Console.WriteLine(SpaceWithMarking(marking) + "Value: " + result.GetValue());
151+
break;
152+
case { IsSuccess: false }:
153+
Console.WriteLine(
154+
SpaceWithMarking(marking) + "Error: " + result.GetException().Message);
155+
break;
156+
}
157+
}
158+
private static string SpaceWithMarking(string marking) =>
159+
string.IsNullOrWhiteSpace(marking) ? "" : marking + " ";
138160
}

src/ResultBoxes/ResultBoxes/ScanExtensions.cs

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ public static ResultBox<TValue> Scan<TValue>(
1010
{
1111
switch (result)
1212
{
13-
case { IsSuccess: false } error:
14-
actionError?.Invoke(error.GetException());
13+
case { IsSuccess: false }:
14+
actionError?.Invoke(result.GetException());
1515
break;
1616
case { IsSuccess: true }:
1717
action(result.GetValue());
@@ -74,10 +74,10 @@ public static async Task<ResultBox<TValue>> Scan<TValue>(
7474
{
7575
switch (result)
7676
{
77-
case { IsSuccess: false } error:
77+
case { IsSuccess: false }:
7878
if (actionErrorAsync is not null)
7979
{
80-
await actionErrorAsync(error.GetException());
80+
await actionErrorAsync(result.GetException());
8181
}
8282
break;
8383
case { IsSuccess: true }:
@@ -144,8 +144,8 @@ public static async Task<ResultBox<TValue>> Scan<TValue>(
144144
var res = await result;
145145
switch (res)
146146
{
147-
case { IsSuccess: false } error:
148-
actionError?.Invoke(error.GetException());
147+
case { IsSuccess: false }:
148+
actionError?.Invoke(res.GetException());
149149
break;
150150
case { IsSuccess: true }:
151151
action(res.GetValue());
@@ -211,10 +211,10 @@ public static async Task<ResultBox<TValue>> Scan<TValue>(
211211
var res = await result;
212212
switch (res)
213213
{
214-
case { IsSuccess: false } error:
214+
case { IsSuccess: false }:
215215
if (actionErrorAsync is not null)
216216
{
217-
await actionErrorAsync(error.GetException());
217+
await actionErrorAsync(res.GetException());
218218
}
219219
break;
220220
case { IsSuccess: true }:
@@ -279,3 +279,16 @@ public static async Task<ResultBox<FiveValues<TValue1, TValue2, TValue3, TValue4
279279
async values => await values.CallAction(action),
280280
actionErrorAsync);
281281
}
282+
public static class LogExtensions
283+
{
284+
public static ResultBox<TValue> Log<TValue>(
285+
this ResultBox<TValue> result,
286+
string marking = "")
287+
where TValue : notnull => result.ScanResult(_ => ResultBox.LogResult(result, marking));
288+
289+
public static async Task<ResultBox<TValue>> Log<TValue>(
290+
this Task<ResultBox<TValue>> resultAsync,
291+
string marking = "")
292+
where TValue : notnull =>
293+
(await resultAsync).ScanResult(result => ResultBox.LogResult(result, marking));
294+
}

src/ResultBoxes/ResultBoxes/UnwrapExtensions.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,16 @@ public static async Task<TValue> UnwrapBox<TValue>(this Task<ResultBox<TValue>>
88
where TValue : notnull => await result switch
99
{
1010
{ IsSuccess: false } error => throw error.GetException(),
11-
{ IsSuccess: true } value => value.GetValue(),
11+
{ IsSuccess: true } success => success.GetValue(),
1212
_ => throw new ResultsInvalidOperationException()
1313
};
1414
public static TValueReturn UnwrapBox<TValue, TValueReturn>(
1515
this ResultBox<TValue> result,
1616
Func<TValue, TValueReturn> returnFunc) where TValue : notnull =>
1717
result switch
1818
{
19-
{ IsSuccess: false } error => throw error.GetException(),
20-
{ IsSuccess: true } value => returnFunc(value.GetValue()),
19+
{ IsSuccess: false } => throw result.GetException(),
20+
{ IsSuccess: true } => returnFunc(result.GetValue()),
2121
_ => throw new ResultsInvalidOperationException()
2222
};
2323
public static async Task<TValueReturn> UnwrapBox<TValue, TValueReturn>(
@@ -26,7 +26,7 @@ public static async Task<TValueReturn> UnwrapBox<TValue, TValueReturn>(
2626
await result switch
2727
{
2828
{ IsSuccess: false } error => throw error.GetException(),
29-
{ IsSuccess: true } value => returnFunc(value.GetValue()),
29+
{ IsSuccess: true } success => returnFunc(success.GetValue()),
3030
_ => throw new ResultsInvalidOperationException()
3131
};
3232
public static async Task<TValueReturn> UnwrapBox<TValue, TValueReturn>(
@@ -35,7 +35,7 @@ public static async Task<TValueReturn> UnwrapBox<TValue, TValueReturn>(
3535
await result switch
3636
{
3737
{ IsSuccess: false } error => throw error.GetException(),
38-
{ IsSuccess: true } value => await returnFunc(value.GetValue()),
38+
{ IsSuccess: true } success => await returnFunc(success.GetValue()),
3939
_ => throw new ResultsInvalidOperationException()
4040
};
4141
}

src/Samples/ConsoleApp1/Program.cs

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,27 +11,48 @@ internal class Program
1111

1212
private static void Main(string[] args)
1313
{
14-
// use switch case to handle Result
15-
Increment(100)
16-
.ScanResult(HandleResult);
17-
Increment(1001)
18-
.ScanResult(HandleResult);
19-
20-
Console.WriteLine(RunIncrement(100));
21-
Console.WriteLine(RunIncrement(1001));
22-
}
23-
private static void HandleResult(ResultBox<int> result)
24-
{
14+
// Handle ResultBox<int> with switch expression
15+
// Value: 101
16+
var result = Increment(100);
2517
switch (result)
2618
{
27-
case { IsSuccess: true } success: Console.WriteLine("Value: " + success.GetValue());
19+
case { IsSuccess: false }:
20+
Console.WriteLine($"Error: {result.GetException().Message}");
2821
break;
29-
case { IsSuccess: false } failure: Console.WriteLine("Error: " + failure.GetException().Message);
22+
case { IsSuccess: true }:
23+
Console.WriteLine($"Value: {result.GetValue()}");
3024
break;
31-
}
32-
}
25+
}
26+
27+
// Log() displays value.ToString() if IsSuccess is true, otherwise displays exception.Message
28+
// case2 Error: Specified argument was out of the range of valid values. (Parameter 'target')
29+
Increment(1001).Log("case2");
3330

34-
// use switch expression to handle Result
31+
// RunIncrement() is a method that handles ResultBox<int> with switch expression
32+
// Value: 101
33+
Console.WriteLine(RunIncrement(100));
34+
35+
// Handle ResultBox with if statement
36+
// Error: Specified argument was out of the range of valid values. (Parameter 'target')
37+
var result4 = Increment(1001);
38+
if (result4.IsSuccess)
39+
{
40+
Console.WriteLine($"Value: {result4.GetValue()}");
41+
}
42+
else
43+
{
44+
Console.WriteLine($"Error: {result4.GetException().Message}");
45+
}
46+
47+
// Handle ResultBox with ternary operator ?:
48+
// Value: 2
49+
var result5 = Increment(1);
50+
Console.WriteLine(
51+
result5.IsSuccess ? $"Value: {result5.GetValue()}"
52+
: $"Error: {result5.GetException().Message}");
53+
54+
}
55+
// Handle ResultBox<int> with switch expression
3556
private static string RunIncrement(int target) =>
3657
Increment(target) switch
3758
{

src/Samples/ConsoleApp2Optional/Program.cs

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,13 @@ public static ResultBox<OptionalValue<string>> ConvertStringToHalfLength(string
1212
};
1313
private static void Main(string[] args)
1414
{
15-
ConvertStringToHalfLength("")
16-
.ScanResult(HandleResult);
17-
ConvertStringToHalfLength("H")
18-
.ScanResult(HandleResult);
19-
ConvertStringToHalfLength("Hello")
20-
.ScanResult(HandleResult);
21-
}
22-
private static void HandleResult(ResultBox<OptionalValue<string>> result)
23-
{
24-
switch (result)
25-
{
26-
case { IsSuccess: true } success when success.GetValue().HasValue: Console.WriteLine("Value: " + success.GetValue().Value);
27-
break;
28-
case { IsSuccess: true } success when !success.GetValue().HasValue: Console.WriteLine("No Value");
29-
break;
30-
case { IsSuccess: false } failure: Console.WriteLine("Error: " + failure.GetException().Message);
31-
break;
32-
}
15+
// Error: Input string is empty
16+
ConvertStringToHalfLength("").Log();
17+
18+
// Value: OptionalValue { Value = , HasValue = False }
19+
ConvertStringToHalfLength("H").Log();
20+
21+
// Value: OptionalValue { Value = Hel, HasValue = True }
22+
ConvertStringToHalfLength("Hello").Log();
3323
}
3424
}

src/Samples/ConsoleApp3WrapTry/Program.cs

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,11 @@ public static int Divide(int numerator, int denominator) =>
1010
private static void Main(string[] args)
1111
{
1212
// This will return exception result
13-
ResultBox<int>.WrapTry(() => Divide(10, 0))
14-
.ScanResult(HandleResult);
13+
// Error: can not divide by 0
14+
ResultBox<int>.WrapTry(() => Divide(10, 0)).Log();
1515

1616
// This will return value result
17-
ResultBox<int>.WrapTry(() => Divide(10, 2))
18-
.ScanResult(HandleResult);
19-
}
20-
public static void HandleResult(ResultBox<int> result)
21-
{
22-
switch (result)
23-
{
24-
case { IsSuccess: true } success: Console.WriteLine("Value: " + success.GetValue());
25-
break;
26-
case { IsSuccess: false } failure: Console.WriteLine("Error: " + failure.GetException().Message);
27-
break;
28-
}
17+
// Value: 5
18+
ResultBox<int>.WrapTry(() => Divide(10, 2)).Log();
2919
}
3020
}

src/Samples/ConsoleApp5ROP1/Program.cs

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,34 +24,24 @@ private static void Main(string[] args)
2424
Increment(1001)
2525
.Conveyor(Double)
2626
.Conveyor(Triple)
27-
.ScanResult(HandleResult);
27+
.Log();
2828

2929
// Error: System.ApplicationException: 1001 is not allowed for Double
3030
Increment(1000)
3131
.Conveyor(Double)
3232
.Conveyor(Triple)
33-
.ScanResult(HandleResult);
33+
.Log();
3434

3535
// Error: System.ApplicationException: 1202 is not allowed for Triple
3636
Increment(600)
3737
.Conveyor(Double)
3838
.Conveyor(Triple)
39-
.ScanResult(HandleResult);
39+
.Log();
4040

4141
// Value: 24
4242
Increment(3)
4343
.Conveyor(Double)
4444
.Conveyor(Triple)
45-
.ScanResult(HandleResult);
46-
}
47-
private static void HandleResult(ResultBox<int> result)
48-
{
49-
switch (result)
50-
{
51-
case { IsSuccess: true } success: Console.WriteLine("Value: " + success.GetValue());
52-
break;
53-
case { IsSuccess: false } failure: Console.WriteLine("Error: " + failure.GetException().Message);
54-
break;
55-
}
45+
.Log();
5646
}
5747
}

0 commit comments

Comments
 (0)