< Summary

Information
Class: Nabs.ScenarioGrains.ScenarioGrain<T>
Assembly: Nabs.ScenarioGrains
File(s): /home/runner/work/Nabs/Nabs/src/Nabs.ScenarioGrains/ScenarioGrain.cs
Tag: 90_14636759620
Line coverage
83%
Covered lines: 20
Uncovered lines: 4
Coverable lines: 24
Total lines: 62
Line coverage: 83.3%
Branch coverage
66%
Covered branches: 4
Total branches: 6
Branch coverage: 66.6%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
OnActivateAsync()75%4480%
OnDeactivateAsync()50%2275%

File(s)

/home/runner/work/Nabs/Nabs/src/Nabs.ScenarioGrains/ScenarioGrain.cs

#LineLine coverage
 1namespace Nabs.ScenarioGrains;
 2
 3public interface IScenarioGrain : IAddressable;
 4
 5public abstract class ScenarioGrain<TGrainState> : Grain, IScenarioGrain
 6        where TGrainState : class
 7{
 8    protected IPersistentState<TGrainState> GrainState { get; }
 9    protected IGrainRepository<TGrainState> GrainRepository { get; }
 10
 111    public ScenarioGrain(
 112        IPersistentState<TGrainState> state,
 113        IGrainRepository<TGrainState> grainRepository)
 14    {
 115        GrainState = state;
 116        GrainRepository = grainRepository;
 117    }
 18
 19    public override async Task OnActivateAsync(
 20        CancellationToken cancellationToken)
 21    {
 122        await GrainState.ReadStateAsync();
 23
 124        if (!GrainState.RecordExists)
 25        {
 126            var queryResult = await GrainRepository.Query(this);
 27
 128            if (queryResult.IsSuccess)
 29            {
 130                GrainState.State = queryResult.Value;
 131                await GrainState.WriteStateAsync();
 32            }
 33            else
 34            {
 035                throw new InvalidOperationException(
 036                    $"Failed to query for {this.GetType().FullName}: {this.GetPrimaryKey()}");
 37            }
 38        }
 39
 140        await base.OnActivateAsync(cancellationToken);
 141    }
 42
 43    public override async Task OnDeactivateAsync(
 44        DeactivationReason reason,
 45        CancellationToken cancellationToken)
 46    {
 147        await GrainState.WriteStateAsync();
 48
 149        var persistResult = await GrainRepository.Persist(this, GrainState.State);
 150        if (persistResult.IsSuccess)
 51        {
 152            await GrainState.ClearStateAsync();
 53        }
 54        else
 55        {
 056            throw new InvalidOperationException(
 057                $"Failed to persist for {this.GetType().FullName}: {this.GetPrimaryKey()}");
 58        }
 59
 160        await base.OnDeactivateAsync(reason, cancellationToken);
 161    }
 62}