| 102 | } |
| 103 | |
| 104 | func (p *DateTimePlugin) handleRelative(now time.Time, value string) (string, error) { |
| 105 | debugf("DateTime: handling relative time value=%q", value) |
| 106 | |
| 107 | if value == "" { |
| 108 | return "", errors.New(i18n.T("template_datetime_error_relative_requires_value")) |
| 109 | } |
| 110 | |
| 111 | // Try standard duration first (hours, minutes) |
| 112 | if duration, err := time.ParseDuration(value); err == nil { |
| 113 | result := now.Add(duration).Format(time.RFC3339) |
| 114 | debugf("DateTime: relative duration=%q result=%q", duration, result) |
| 115 | return result, nil |
| 116 | } |
| 117 | |
| 118 | // Handle date units |
| 119 | if len(value) < 2 { |
| 120 | return "", errors.New(i18n.T("template_datetime_error_invalid_relative_format")) |
| 121 | } |
| 122 | |
| 123 | unit := value[len(value)-1:] |
| 124 | numStr := value[:len(value)-1] |
| 125 | |
| 126 | num, err := strconv.Atoi(numStr) |
| 127 | if err != nil { |
| 128 | return "", fmt.Errorf(i18n.T("template_datetime_error_invalid_number"), value) |
| 129 | } |
| 130 | |
| 131 | var result string |
| 132 | switch unit { |
| 133 | case "d": |
| 134 | result = now.AddDate(0, 0, num).Format("2006-01-02") |
| 135 | case "w": |
| 136 | result = now.AddDate(0, 0, num*7).Format("2006-01-02") |
| 137 | case "m": |
| 138 | result = now.AddDate(0, num, 0).Format("2006-01-02") |
| 139 | case "y": |
| 140 | result = now.AddDate(num, 0, 0).Format("2006-01-02") |
| 141 | default: |
| 142 | return "", fmt.Errorf(i18n.T("template_datetime_error_invalid_unit"), unit) |
| 143 | } |
| 144 | |
| 145 | debugf("DateTime: relative unit=%q num=%d result=%q", unit, num, result) |
| 146 | return result, nil |
| 147 | } |