summaryrefslogtreecommitdiff
path: root/internal/reports
diff options
context:
space:
mode:
authorT <t@tjp.lol>2025-08-13 13:04:05 -0600
committerT <t@tjp.lol>2025-08-13 13:42:43 -0600
commit389b72e55b04ccfc02b04eb81cb8f7bb7a5c8b59 (patch)
treebe3015b2c7db90cddfc85d3e77ddc76213485494 /internal/reports
parent29c6581e08d0fe98433eff218de7701b51a6861c (diff)
history filtering
Diffstat (limited to 'internal/reports')
-rw-r--r--internal/reports/daterange.go37
-rw-r--r--internal/reports/daterange_test.go45
2 files changed, 79 insertions, 3 deletions
diff --git a/internal/reports/daterange.go b/internal/reports/daterange.go
index adeb48b..040023e 100644
--- a/internal/reports/daterange.go
+++ b/internal/reports/daterange.go
@@ -67,16 +67,22 @@ func ParseDateRange(dateStr string) (DateRange, error) {
return dateRange, nil
}
+ // Check for "since YYYY-MM-DD" format
+ if strings.HasPrefix(lowerDateStr, "since ") {
+ return parseSinceDateRange(dateStr)
+ }
+
// Check for custom date range format: "YYYY-MM-DD to YYYY-MM-DD"
- if strings.Contains(dateStr, " to ") {
+ if strings.Contains(lowerDateStr, " to ") {
return parseCustomDateRange(dateStr)
}
- return DateRange{}, fmt.Errorf("unsupported date range: %s (supported: 'this week', 'this month', 'last week', 'last month', month names like 'february', 'month year' like 'july 2023', or 'YYYY-MM-DD to YYYY-MM-DD')", dateStr)
+ return DateRange{}, fmt.Errorf("unsupported date range: %s (supported: 'this week', 'this month', 'last week', 'last month', month names like 'february', 'month year' like 'july 2023', 'since YYYY-MM-DD', or 'YYYY-MM-DD to YYYY-MM-DD')", dateStr)
}
func parseCustomDateRange(dateStr string) (DateRange, error) {
- parts := strings.Split(dateStr, " to ")
+ lowerDateStr := strings.ToLower(dateStr)
+ parts := strings.Split(lowerDateStr, " to ")
if len(parts) != 2 {
return DateRange{}, fmt.Errorf("invalid date range format: expected 'YYYY-MM-DD to YYYY-MM-DD'")
}
@@ -248,3 +254,28 @@ func getMonthRange(year int, month time.Month) DateRange {
}
}
+func parseSinceDateRange(dateStr string) (DateRange, error) {
+ // Remove "since " prefix (case-insensitive)
+ lowerDateStr := strings.ToLower(dateStr)
+ if !strings.HasPrefix(lowerDateStr, "since ") {
+ return DateRange{}, fmt.Errorf("invalid since format: expected 'since YYYY-MM-DD'")
+ }
+
+ dateOnly := strings.TrimSpace(dateStr[6:]) // Remove "since " prefix
+
+ // Parse start date
+ startDate, err := time.Parse("2006-01-02", dateOnly)
+ if err != nil {
+ return DateRange{}, fmt.Errorf("invalid start date '%s' in since format: expected YYYY-MM-DD format", dateOnly)
+ }
+
+ // Convert to UTC and set start time to beginning of day (00:00:00)
+ startUTC := time.Date(startDate.Year(), startDate.Month(), startDate.Day(), 0, 0, 0, 0, time.UTC)
+
+ // No end date for "since" format - return zero time for End to indicate open-ended
+ return DateRange{
+ Start: startUTC,
+ End: time.Time{}, // Zero time indicates no end date
+ }, nil
+}
+
diff --git a/internal/reports/daterange_test.go b/internal/reports/daterange_test.go
index 69b0e4a..97678b6 100644
--- a/internal/reports/daterange_test.go
+++ b/internal/reports/daterange_test.go
@@ -192,6 +192,46 @@ func TestParseDateRange(t *testing.T) {
input: "july abcd",
wantErr: true,
},
+ {
+ name: "since format",
+ input: "since 2024-07-01",
+ wantErr: false,
+ validate: func(t *testing.T, dr DateRange) {
+ // Should start on July 1, 2024 with no end date
+ expectedStart := time.Date(2024, time.July, 1, 0, 0, 0, 0, time.UTC)
+ if !dr.Start.Equal(expectedStart) {
+ t.Errorf("Start = %v, want %v", dr.Start, expectedStart)
+ }
+ if !dr.End.IsZero() {
+ t.Errorf("End = %v, want zero time (no end date)", dr.End)
+ }
+ },
+ },
+ {
+ name: "since format case insensitive",
+ input: "SINCE 2024-12-25",
+ wantErr: false,
+ validate: func(t *testing.T, dr DateRange) {
+ // Should start on December 25, 2024 with no end date
+ expectedStart := time.Date(2024, time.December, 25, 0, 0, 0, 0, time.UTC)
+ if !dr.Start.Equal(expectedStart) {
+ t.Errorf("Start = %v, want %v", dr.Start, expectedStart)
+ }
+ if !dr.End.IsZero() {
+ t.Errorf("End = %v, want zero time (no end date)", dr.End)
+ }
+ },
+ },
+ {
+ name: "since format invalid date",
+ input: "since 2024-13-01",
+ wantErr: true,
+ },
+ {
+ name: "since format missing date",
+ input: "since",
+ wantErr: true,
+ },
}
for _, tt := range tests {
@@ -223,6 +263,11 @@ func TestParseDateRange(t *testing.T) {
return dateRange, nil
}
+ // Check for "since YYYY-MM-DD" format
+ if strings.HasPrefix(lowerDateStr, "since ") {
+ return parseSinceDateRange(dateStr)
+ }
+
// Check for custom date range format: "YYYY-MM-DD to YYYY-MM-DD"
if strings.Contains(dateStr, " to ") {
return parseCustomDateRange(dateStr)