| 1341 | } |
| 1342 | |
| 1343 | func parseSinceFlag(raw string, now func() time.Time) (time.Time, error) { |
| 1344 | value := strings.TrimSpace(raw) |
| 1345 | if value == "" { |
| 1346 | return time.Time{}, nil |
| 1347 | } |
| 1348 | |
| 1349 | for _, layout := range []string{time.RFC3339Nano, time.RFC3339} { |
| 1350 | if parsed, err := time.Parse(layout, value); err == nil { |
| 1351 | return parsed.UTC(), nil |
| 1352 | } |
| 1353 | } |
| 1354 | |
| 1355 | duration, err := time.ParseDuration(value) |
| 1356 | if err != nil { |
| 1357 | return time.Time{}, fmt.Errorf("cli: invalid since value %q", value) |
| 1358 | } |
| 1359 | if duration < 0 { |
| 1360 | return time.Time{}, fmt.Errorf("cli: relative since must be positive: %q", value) |
| 1361 | } |
| 1362 | |
| 1363 | current := time.Now().UTC() |
| 1364 | if now != nil { |
| 1365 | current = now().UTC() |
| 1366 | } |
| 1367 | return current.Add(-duration), nil |
| 1368 | } |