(path *PathBuffer, str string, s *Schema, res *ValidateResult)
| 202 | } |
| 203 | |
| 204 | func validateFormat(path *PathBuffer, str string, s *Schema, res *ValidateResult) { |
| 205 | switch s.Format { |
| 206 | case "date-time": |
| 207 | found := false |
| 208 | for _, format := range []string{time.RFC3339, time.RFC3339Nano} { |
| 209 | if _, err := time.Parse(format, str); err == nil { |
| 210 | found = true |
| 211 | break |
| 212 | } |
| 213 | } |
| 214 | if !found { |
| 215 | res.Add(path, str, validation.MsgExpectedRFC3339DateTime) |
| 216 | } |
| 217 | case "date-time-http": |
| 218 | if _, err := time.Parse(time.RFC1123, str); err != nil { |
| 219 | res.Add(path, str, validation.MsgExpectedRFC1123DateTime) |
| 220 | } |
| 221 | case "date": |
| 222 | if _, err := time.Parse(time.DateOnly, str); err != nil { |
| 223 | res.Add(path, str, validation.MsgExpectedRFC3339Date) |
| 224 | } |
| 225 | case "duration": |
| 226 | if _, err := time.ParseDuration(str); err != nil { |
| 227 | res.Add(path, str, ErrorFormatter(validation.MsgExpectedDuration, err)) |
| 228 | } |
| 229 | case "time": |
| 230 | found := false |
| 231 | for _, format := range []string{time.TimeOnly, "15:04:05Z07:00"} { |
| 232 | if _, err := time.Parse(format, str); err == nil { |
| 233 | found = true |
| 234 | break |
| 235 | } |
| 236 | } |
| 237 | if !found { |
| 238 | res.Add(path, str, validation.MsgExpectedRFC3339Time) |
| 239 | } |
| 240 | case "email", "idn-email": |
| 241 | if _, err := mail.ParseAddress(str); err != nil { |
| 242 | res.Add(path, str, ErrorFormatter(validation.MsgExpectedRFC5322Email, err)) |
| 243 | } |
| 244 | case "idn-hostname", "hostname": |
| 245 | if len(str) >= 256 || !rxHostname.MatchString(str) { |
| 246 | res.Add(path, str, validation.MsgExpectedRFC5890Hostname) |
| 247 | } |
| 248 | case "ipv4", "ipv6", "ip": |
| 249 | addr, err := netip.ParseAddr(str) |
| 250 | |
| 251 | switch s.Format { |
| 252 | case "ipv4": |
| 253 | if err != nil || !addr.Is4() { |
| 254 | res.Add(path, str, validation.MsgExpectedRFC2673IPv4) |
| 255 | } |
| 256 | case "ipv6": |
| 257 | if err != nil || !addr.Is6() || addr.Is4In6() { |
| 258 | res.Add(path, str, validation.MsgExpectedRFC2373IPv6) |
| 259 | } |
| 260 | default: // case "ip". |
| 261 | if err != nil { |
no test coverage detected
searching dependent graphs…