internal Calendar GetCalendar() { var rules = new CalendarRules(); foreach (var r in Rules) { if (!DayRuleParser.TryParseInternal(r.Pattern, out var description, out var yearMatchers, out var monthMatchers, out var dayOfMonthMatchers, out var dayOfWeekMatchers, out var workingPeriods)) { throw new SerializationException($"Day pattern '{r.Pattern}' is invalid"); } if (!string.IsNullOrEmpty(description)) { throw new SerializationException( $"Day pattern '{r.Pattern}' is invalid in this context: you cannot provide a day description"); } if (workingPeriods is not null) { throw new SerializationException( $"Day pattern '{r.Pattern}' is invalid in this context: you cannot provide a working period list"); } rules.Add(Enum.Parse <DayRulePolicy>(r.Policy), r.Description, yearMatchers, monthMatchers, dayOfMonthMatchers, dayOfWeekMatchers, r.WorkingPeriods?.Select(_ => new TimePeriod(Time.Parse(_.Begin), Time.Parse(_.End)))); } return(new Calendar(Name, rules, Description, LongDescription)); }
public Calendar(string name, CalendarRules calendarRules, string description = null, string longDescription = null) { Name = name ?? throw new ArgumentNullException(nameof(name)); Description = description; LongDescription = longDescription; CalendarRules = calendarRules ?? throw new ArgumentNullException(nameof(calendarRules)); }
public bool TryGetDayInfo(DateTime date, out DayInfo dayInfo) { dayInfo = null; if (CalendarRules == null || !CalendarRules.Any()) { return(false); // no rules => nothing to do } foreach (var rule in CalendarRules) { if (!rule.Rule.TryGetDayInfo(date, out var curInfo)) { continue; // something to evaluate } dayInfo = curInfo; // register the most recent found if (rule.Policy == DayRulePolicy.Accept) { break; } } return(dayInfo != null); }
/// <summary> /// Add the rules from the calendar to the collection of rules /// </summary> /// <param name="calendar"></param> public void AddRules(Calendar calendar) => CalendarRules.Add(calendar);
/// <summary> /// Add rules to the collection of rules /// </summary> /// <param name="rules"></param> // ReSharper disable once UnusedMember.Global public void AddRules(CalendarRules rules) => CalendarRules.AddRange(rules);