diff options
author | T <t@tjp.lol> | 2025-08-13 13:04:05 -0600 |
---|---|---|
committer | T <t@tjp.lol> | 2025-08-13 13:42:43 -0600 |
commit | 389b72e55b04ccfc02b04eb81cb8f7bb7a5c8b59 (patch) | |
tree | be3015b2c7db90cddfc85d3e77ddc76213485494 /internal/reports | |
parent | 29c6581e08d0fe98433eff218de7701b51a6861c (diff) |
history filtering
Diffstat (limited to 'internal/reports')
-rw-r--r-- | internal/reports/daterange.go | 37 | ||||
-rw-r--r-- | internal/reports/daterange_test.go | 45 |
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) |