1+ using System ;
2+ using System . Runtime . CompilerServices ;
3+ using System . Threading . Tasks ;
4+ using ManagedCode . Communication . Extensions ;
5+ using Microsoft . Extensions . Logging ;
6+
7+ namespace ManagedCode . Communication ;
8+
9+ public class ResultErrorHandler
10+ {
11+ private readonly ILogger < ResultErrorHandler > ? _logger ;
12+
13+ public ResultErrorHandler ( ILogger < ResultErrorHandler > ? logger )
14+ {
15+ _logger = logger ;
16+ }
17+
18+ public async Task < Result > ExecuteAsync ( Func < Task < Result > > func ,
19+ [ CallerMemberName ] string memberName = "" ,
20+ [ CallerFilePath ] string sourceFilePath = "" ,
21+ [ CallerLineNumber ] int sourceLineNumber = 0 )
22+ {
23+ try
24+ {
25+ var result = await func . Invoke ( ) ;
26+
27+ if ( result . IsFail )
28+ {
29+ _logger ? . LogError ( $ "{ memberName } { result . Error } in { sourceFilePath } :line { sourceLineNumber } ") ;
30+ }
31+
32+ return result ;
33+ }
34+ catch ( Exception e )
35+ {
36+ _logger ? . LogException ( e ) ;
37+
38+ return Result . Fail ( Error < ErrorCode > . FromException ( e ) ) ;
39+ }
40+ }
41+
42+ public async Task < Result < TValue > > ExecuteAsync < TValue > ( Func < Task < Result < TValue > > > func ,
43+ [ CallerMemberName ] string memberName = "" ,
44+ [ CallerFilePath ] string sourceFilePath = "" ,
45+ [ CallerLineNumber ] int sourceLineNumber = 0 )
46+ {
47+ try
48+ {
49+ var result = await func . Invoke ( ) ;
50+
51+ if ( result . IsFail )
52+ {
53+ _logger ? . LogError ( $ "{ memberName } { result . Error ? . ErrorCode } { result . Error ? . Message } in { sourceFilePath } :line { sourceLineNumber } ") ;
54+ }
55+
56+ return result ;
57+ }
58+ catch ( Exception e )
59+ {
60+ _logger ? . LogException ( e ) ;
61+
62+ return Result < TValue > . Fail ( Error < ErrorCode > . FromException ( e ) ) ;
63+ }
64+ }
65+
66+ public async Task < TResult > ExecuteAsync < TResult , TErrorCode > ( Func < Task < TResult > > func ,
67+ [ CallerMemberName ] string memberName = "" ,
68+ [ CallerFilePath ] string sourceFilePath = "" ,
69+ [ CallerLineNumber ] int sourceLineNumber = 0 ) where TErrorCode : Enum where TResult : BaseResult < TErrorCode >
70+ {
71+ try
72+ {
73+ var result = await func . Invoke ( ) ;
74+
75+ if ( result . IsFail )
76+ {
77+ _logger ? . LogError (
78+ $ "{ memberName } { result . Error ? . ErrorCode ? . ToString ( ) } { result . Error ? . Message } { result . Error } in { sourceFilePath } :line { sourceLineNumber } ") ;
79+ }
80+
81+ return result ;
82+ }
83+ catch ( Exception e )
84+ {
85+ _logger ? . LogException ( e ) ;
86+
87+ var constructor = typeof ( TResult ) . GetConstructor ( new [ ] { typeof ( Error < TErrorCode > ) } ) ! ;
88+
89+ var obj = constructor . Invoke ( new object [ ] { Error < TErrorCode > . FromException ( e ) } ) as TResult ;
90+
91+ return obj ! ;
92+ }
93+ }
94+ }
0 commit comments