Пример #1
0
        public override Result <string> Execute(Match regexMatch)
        {
            Result <object> updateTaskDuration(Status status)
            {
                int index = int.Parse(regexMatch.Groups["index"].Value) - 1;

                if (status.Day.Tasks == null || status.Day.Tasks.Count <= index)
                {
                    return(Results.Failure <object>($"There is no task at index {index + 1} in today's sheet."));
                }
                TimeSpan duration;

                if (regexMatch.Groups["time"].Success)
                {
                    if (!int.TryParse(regexMatch.Groups["hours"].Value, out var hours))
                    {
                        hours = 0;
                    }
                    bool fraction    = regexMatch.Groups["fraction"].Success;
                    var  absDuration = TimeSpan.FromHours(hours);
                    if (fraction)
                    {
                        absDuration += TimeSpan.FromMinutes(30);
                    }
                    duration = regexMatch.Groups["minus"].Success ? absDuration.Negate() : absDuration;
                }
                else
                {
                    duration = status.UnregisteredTime.TaskAssignable();
                }
                return(repository.SaveTodaySheet(status.Day.AddToTaskDuration(index, duration)));
            }

            return(repository.GetStatus()
                   .Bind(updateTaskDuration)
                   .Bind(_ => todaysSheet.Execute(null)));
        }