Esempio n. 1
0
        /// <summary>
        ///   Captures a completed Eff awaiter instance into a serialized PersistedEffect value.
        /// </summary>
        public static PersistedEffect FromCompletedAwaiter <TResult>(EffAwaiter <TResult> awaiter)
        {
            if (!awaiter.IsCompleted)
            {
                throw new ArgumentException("EffAwaiter is not in completed state.", nameof(awaiter));
            }

            bool   isException;
            string value;

            if (awaiter.Exception is Exception e)
            {
                isException = true;
                value       = JsonConvert.SerializeObject(e);
            }
            else
            {
                isException = false;
                value       = JsonConvert.SerializeObject(awaiter.Result);
            }

            return(new PersistedEffect()
            {
                IsException = isException, Value = value
            });
        }
Esempio n. 2
0
        public async Task Log(Exception ex, EffAwaiter awaiter)
        {
            var stateMachine = awaiter.AwaitingStateMachine?.GetAsyncStateMachine();

            if (stateMachine is null)
            {
                return;
            }

            var log =
                new ExceptionLog
            {
                CallerFilePath   = awaiter.CallerFilePath,
                CallerLineNumber = awaiter.CallerLineNumber,
                CallerMemberName = awaiter.CallerMemberName,
                Exception        = ex,
                Parameters       = stateMachine.GetParameterValues(),
                LocalVariables   = stateMachine.GetLocalVariableValues(),
            };

            if (!ex.Data.Contains("StackTraceLog"))
            {
                var queue = new Queue <ExceptionLog>();
                queue.Enqueue(log);
                ex.Data["StackTraceLog"] = queue;
                return;
            }

            ((Queue <ExceptionLog>)ex.Data["StackTraceLog"] !).Enqueue(log);
        }
Esempio n. 3
0
            public async override Task Handle <TValue>(EffAwaiter <TValue> awaiter)
            {
                var result = MaybeEffectHandler.Run(awaiter.Eff);

                if (result.HasValue)
                {
                    awaiter.SetResult(result.Value);
                    var next = _continuation.MoveNext();
                    Result = MaybeEffectHandler.Run(next);
                }
            }
Esempio n. 4
0
 public void ToAwaiter <TResult>(EffAwaiter <TResult> awaiter)
 {
     if (Exception is Exception e)
     {
         awaiter.SetException(e);
     }
     else
     {
         awaiter.SetResult((TResult)Value !);
     }
 }
Esempio n. 5
0
 public static RecordedResult FromAwaiter <TResult>(EffAwaiter <TResult> awaiter)
 {
     return((awaiter.Exception is Exception e) ?
            new RecordedResult()
     {
         Exception = e
     } :
            new RecordedResult()
     {
         Value = awaiter.Result
     });
 }
Esempio n. 6
0
        public override async Task Handle <TResult>(EffAwaiter <TResult> effect)
        {
            try
            {
                var result = await effect.Eff.Run(this);

                effect.SetResult(result);
            }
            catch (Exception ex)
            {
                await Log(ex, effect);

                throw;
            }
        }
Esempio n. 7
0
        ///<summary>
        ///  Hydrates an incomplete awaiter instance with the persisted result.
        ///</summary>
        public void WriteToAwaiter <TResult>(EffAwaiter <TResult> awaiter)
        {
            if (awaiter.IsCompleted)
            {
                throw new ArgumentException("EffAwaiter is in completed state.", nameof(awaiter));
            }

            if (IsException)
            {
                var exn = JsonConvert.DeserializeObject <Exception>(Value);
                awaiter.SetException(exn);
            }
            else
            {
                var value = JsonConvert.DeserializeObject <TResult>(Value);
                awaiter.SetResult(value !);
            }
        }
Esempio n. 8
0
        public void Log(object?result, EffAwaiter awaiter)
        {
            var stateMachine = awaiter.AwaitingStateMachine?.GetAsyncStateMachine();

            if (stateMachine is null)
            {
                return;
            }

            var log = new ResultLog
            {
                Result           = result,
                CallerFilePath   = awaiter.CallerFilePath,
                CallerLineNumber = awaiter.CallerLineNumber,
                CallerMemberName = awaiter.CallerMemberName,
                Parameters       = stateMachine.GetParameterValues(),
                LocalVariables   = stateMachine.GetLocalVariableValues(),
            };

            TraceLogs.Add(log);
        }
Esempio n. 9
0
 public override async Task Handle<TResult>(EffAwaiter<TResult> effect)
 {
     var result = await effect.Eff.Run(this);
     effect.SetResult(result);
     await Log(result, effect);
 }