private OneOf <WorkCompletedResult, ProgressMadeResult, SetbackResult> GetWorkOnItemResult(
            CrewContext context,
            WorkItem item)
        {
            var roll = context.GetRandomNumber(1, 20);

            // Well, something is fundamentally wrong. Likely a mistaken assumption or bad requirement
            if (roll == 1)
            {
                return(new SetbackResult(Priority.High));
            }

            // If we got a massive success, or we've previously made significant progress, it's done
            if (roll >= 20 - item.ProgressMade)
            {
                return(new WorkCompletedResult(item));
            }

            // Okay, not a great roll, let's call it a setback
            if (roll < 3)
            {
                return(new SetbackResult(Priority.Normal));
            }

            // Nothing much to see here - just a bit of progress
            return(new ProgressMadeResult(item));
        }
        private BehaviorResult <CrewContext> ProcessCrewWorkOnItem(CrewContext context, WorkItem ticket)
        {
            var result = GetWorkOnItemResult(context, ticket);

            result.Switch(
                completed =>
            {
                ticket.Status = WorkItemStatus.ReadyForReview;
                AddMessage(context, $"{context.CrewMember.FullName} finishes work on {ticket.Title}");
            },
                progress =>
            {
                ticket.ProgressMade++;
                AddMessage(context, $"{context.CrewMember.FullName} made steady progress on {ticket.Title}");
            },
                setback =>
            {
                if (setback.Severity > Priority.Normal)
                {
                    ticket.ProgressMade -= 1;
                    AddMessage(context, $"{context.CrewMember.FullName} encountered a setback on {ticket.Title}");
                }
                else
                {
                    ticket.ProgressMade -= 1;
                    AddMessage(context, $"{context.CrewMember.FullName} encountered a setback on {ticket.Title}");
                }
            }
                );

            return(MatchedResult(context));
        }
        public override BehaviorResult <CrewContext> Evaluate(CrewContext context)
        {
            var ticket = context.AssignedItems.FirstOrDefault(wi => wi.Status == WorkItemStatus.InProgress);

            if (ticket == null)
            {
                return(SkippedResult(context));
            }

            return(ProcessCrewWorkOnItem(context, ticket));
        }
Ejemplo n.º 4
0
        public override BehaviorResult <CrewContext> Evaluate(CrewContext context)
        {
            var ticket = context.AssignedItems.FirstOrDefault(wi => wi.Status == WorkItemStatus.ReadyForWork);

            if (ticket == null)
            {
                return(SkippedResult(context));
            }

            ticket.Status = WorkItemStatus.InProgress;

            AddMessage(context, $"{context.CrewMember.FullName} begins work on {ticket.Title}");

            return(MatchedResult(context));
        }
Ejemplo n.º 5
0
        public override BehaviorResult <CrewContext> Evaluate(CrewContext context)
        {
            var item = context.UnassignedItems.FirstOrDefault(wi => wi.Status == WorkItemStatus.New ||
                                                              wi.Status == WorkItemStatus.ReadyForWork);

            if (item == null)
            {
                return(SkippedResult(context));
            }

            item.AssignedCrewId = context.CrewMember.Id;

            if (item.Status == WorkItemStatus.New)
            {
                item.Status = WorkItemStatus.ReadyForWork;
                AddMessage(context, $"{context.CrewMember.FullName} marks {item.Title} as ready to work");
            }

            AddMessage(context, $"{context.CrewMember.FullName} assigns {item.Title} to themselves");

            return(MatchedResult(context));
        }
Ejemplo n.º 6
0
 // Using dependency injection to inject in the Crew Controller
 public CrewController(CrewContext context)
 {
     _context = context;
 }
Ejemplo n.º 7
0
        public override BehaviorResult <CrewContext> Evaluate(CrewContext context)
        {
            AddMessage(context, $"{context.CrewMember.FullName} idles.");

            return(MatchedResult(context));
        }