diff --git a/src/MfGames.Nitride.Temporal.Schedules/MfGames.Nitride.Temporal.Schedules.csproj b/src/MfGames.Nitride.Temporal.Schedules/MfGames.Nitride.Temporal.Schedules.csproj
index d62aeda..c150daf 100644
--- a/src/MfGames.Nitride.Temporal.Schedules/MfGames.Nitride.Temporal.Schedules.csproj
+++ b/src/MfGames.Nitride.Temporal.Schedules/MfGames.Nitride.Temporal.Schedules.csproj
@@ -10,15 +10,17 @@
-
-
-
-
+
+
+
+
+
+
-
-
+
+
diff --git a/src/MfGames.Nitride.Temporal.Schedules/NumericalPathSchedule.cs b/src/MfGames.Nitride.Temporal.Schedules/NumericalPathSchedule.cs
index bfcaea5..112f2f5 100644
--- a/src/MfGames.Nitride.Temporal.Schedules/NumericalPathSchedule.cs
+++ b/src/MfGames.Nitride.Temporal.Schedules/NumericalPathSchedule.cs
@@ -6,6 +6,8 @@ using MfGames.Nitride.Generators;
using NodaTime;
+using TimeSpanParserUtil;
+
using Zio;
namespace MfGames.Nitride.Temporal.Schedules;
@@ -48,10 +50,26 @@ public partial class NumericalPathSchedule : ISchedule
public Regex? PathRegex { get; set; }
///
- /// Gets or sets the period between each matching entity. More precisely,
- /// the schedule will be TimeSpan * (CaptureGroup + CaptureOffset).
+ /// Gets or sets the period between each matching entity. The period is
+ /// amount of time between each item based on the number. So the first will
+ /// be on the ScheduleDate, the second SchedulePeriod later, the third
+ /// SchedulePeriod after the second, etc. More precisely, the date for
+ /// any item TimeSpan * ((int)CaptureGroup + (int)CaptureOffset).
///
- public SchedulePeriod SchedulePeriod { get; set; }
+ public string? SchedulePeriod { get; set; }
+
+ ///
+ /// Gets or sets the schedule period as a TimeSpan object. This is converted
+ /// from SchedulePeriod using https://github.com/pengowray/TimeSpanParser.
+ /// If the value is null, then this will be instant (TimeSpan.Zero).
+ ///
+ public virtual TimeSpan SchedulePeriodTimeSpan
+ {
+ get => this.SchedulePeriod == null
+ ? TimeSpan.Zero
+ : TimeSpanParser.Parse(this.SchedulePeriod);
+ set => this.SchedulePeriod = value.ToString();
+ }
///
/// Gets or sets when the first item is scheduled.
@@ -81,20 +99,10 @@ public partial class NumericalPathSchedule : ISchedule
+ this.CaptureOffset;
// Figure out the time from the start.
- TimeSpan span = this.SchedulePeriod switch
- {
- SchedulePeriod.Instant => TimeSpan.Zero,
- SchedulePeriod.Day => TimeSpan.FromDays(1),
- SchedulePeriod.Week => TimeSpan.FromDays(7),
- _ => throw new InvalidOperationException(
- "Cannot parse schedule period from "
- + this.SchedulePeriod
- + "."),
- };
DateTime start = this.ScheduleStart
?? throw new NullReferenceException(
"Cannot use a schedule without a start date.");
- DateTime when = start + span * number;
+ DateTime when = start + this.SchedulePeriodTimeSpan * number;
Instant instant = timekeeper.CreateInstant(when);
// If the time hasn't past, then we don't apply it.
diff --git a/src/MfGames.Nitride.Temporal.Schedules/README.md b/src/MfGames.Nitride.Temporal.Schedules/README.md
index 478d8ff..5f7338f 100644
--- a/src/MfGames.Nitride.Temporal.Schedules/README.md
+++ b/src/MfGames.Nitride.Temporal.Schedules/README.md
@@ -85,7 +85,8 @@ var schedules = new List
{
PathRegex = "chapter-(\d+),
ScheduleStart = DateTime.Parse("2023-01-01"),
- SchedulePeriod = SchedulePeriod.Week,
+ SchedulePeriod = "1 week",
+ // Alternatively, SchedulePeriodTimeSpan = TimeSpan.FromDays(7),
},
}
@@ -106,11 +107,11 @@ chapter will be set to 2023-01-08, and the third at 2023-01-15.
- `DateTime ScheduleStart`
- The date that the schedule starts.
- No default.
-- `SchedulePeriod SchedulePeriod`
- - Values:
- - Instant (meaning everything at once, default)
- - Week
- - Day
+- `string SchedulePeriod`
+ - Parsed using https://github.com/pengowray/TimeSpanParser
+ - Supports any `TimeSpan` value, also "2 weeks" and Humanizer formatted values
+- `TimeSpan SchedulePeriodTimeSpan`
+ - Parsed from `SchedulePeriod`
- `int CaptureGroup`
- The numerical index of the capture group.
- Defaults to `1` because the first match in Regex is 1.
diff --git a/src/MfGames.Nitride.Temporal.Schedules/SchedulePeriod.cs b/src/MfGames.Nitride.Temporal.Schedules/SchedulePeriod.cs
deleted file mode 100644
index d3686fd..0000000
--- a/src/MfGames.Nitride.Temporal.Schedules/SchedulePeriod.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-namespace MfGames.Nitride.Temporal.Schedules;
-
-public enum SchedulePeriod
-{
- ///
- /// Indicates that all the matching schedule periods are instant (zero time).
- ///
- Instant,
-
- ///
- /// Indicates that the entities will be scheduled a day apart.
- ///
- Day,
-
- ///
- /// Indicates that the entities will be scheduled seven days apart.
- ///
- Week,
-}
diff --git a/tests/MfGames.Nitride.Temporal.Schedules.Tests/NumericalPathScheduleTests.cs b/tests/MfGames.Nitride.Temporal.Schedules.Tests/NumericalPathScheduleTests.cs
index 76e6826..58cab07 100644
--- a/tests/MfGames.Nitride.Temporal.Schedules.Tests/NumericalPathScheduleTests.cs
+++ b/tests/MfGames.Nitride.Temporal.Schedules.Tests/NumericalPathScheduleTests.cs
@@ -211,7 +211,7 @@ public class NumericalPathScheduleTests : TemporalSchedulesTestBase
{
public TestSchedule()
{
- this.SchedulePeriod = SchedulePeriod.Week;
+ this.SchedulePeriod = "1 week";
}
public string? Access { get; set; }