message: "No frequency part found in recurrence rule, but it is required. This prevents the rest of the rule being checked".to_string(),
message: format!("UNTIL part at index {part_index} is a date, but the associated DTSTART property is a date-time"),
message: format!("UNTIL part at index {part_index} is a date-time, but the associated DTSTART property is a date"),
message: format!("UNTIL part at index {part_index} must be a local time if the associated DTSTART property is a local time"),
message: format!("UNTIL part at index {part_index} must be a UTC time if the associated DTSTART property is a UTC time or a local time with a timezone"),
message: format!("Invalid BYSECOND part at index {part_index}, seconds must be between 0 and 60"),
message: format!("BYSECOND part at index {part_index} is not valid when the associated DTSTART property has a DATE value type"),
message: format!("Invalid BYMINUTE part at index {part_index}, minutes must be between 0 and 59"),
message: format!("BYMINUTE part at index {part_index} is not valid when the associated DTSTART property has a DATE value type"),
message: format!("Invalid BYHOUR part at index {part_index}, hours must be between 0 and 23"),
message: format!("BYHOUR part at index {part_index} is not valid when the associated DTSTART property has a DATE value type"),
message: format!("BYDAY part at index {part_index} has a day with an offset, but the frequency is YEARLY and a BYWEEKNO part is specified"),
message: format!("BYDAY part at index {part_index} has a day with an offset, but the frequency is not MONTHLY or YEARLY"),
message: format!("Invalid BYMONTHDAY part at index {part_index}, days must be between 1 and 31, or -31 and -1"),
message: format!("BYMONTHDAY part at index {part_index} is not valid for a WEEKLY frequency"),
message: format!("Invalid BYYEARDAY part at index {part_index}, days must be between 1 and 366, or -366 and -1"),
message: format!("BYYEARDAY part at index {part_index} is not valid for a DAILY, WEEKLY or MONTHLY frequency"),
message: format!("Invalid BYWEEKNO part at index {part_index}, weeks must be between 1 and 53, or -53 and -1"),
let has_non_default_interval = rule.parts.iter().any(|part| matches!(part, RecurRulePart::Interval(interval) if *interval > 1));
message: format!("Invalid BYSETPOS part at index {part_index}, set positions must be between 1 and 366, or -366 and -1"),
message: format!("BYSETPOS part at index {part_index} is not valid without another BYxxx rule part"),