|
11 | 11 | import Prelude |
12 | 12 |
|
13 | 13 | import Control.Exception (Exception (..), catch, throw) |
14 | | -import Control.Monad (filterM) |
| 14 | +import Control.Monad (filterM, msum) |
15 | 15 | import Data.Aeson |
16 | 16 | import Data.Aeson.Types (typeMismatch) |
17 | 17 | import Data.ByteString.Char8 qualified as BSC |
@@ -147,18 +147,28 @@ newtype UTCTimeYaml = UTCTimeYaml |
147 | 147 |
|
148 | 148 | instance FromJSON UTCTimeYaml where |
149 | 149 | parseJSON = |
150 | | - withText "UTCTime" $ |
151 | | - maybe (fail "Unable to parse UTCTime") (pure . UTCTimeYaml) |
152 | | - . parseTimeM True defaultTimeLocale utcTimeYamlFormat |
153 | | - . cs |
| 150 | + withText "UTCTime" $ \t -> |
| 151 | + let s = cs t |
| 152 | + in case msum [parseTimeM True defaultTimeLocale fmt s | fmt <- utcTimeParseFormats] of |
| 153 | + Nothing -> fail "Unable to parse UTCTime" |
| 154 | + Just utc -> pure $ UTCTimeYaml utc |
154 | 155 |
|
155 | 156 | instance ToJSON UTCTimeYaml where |
156 | | - toJSON = toJSON . formatTime defaultTimeLocale utcTimeYamlFormat . unUTCTimeYaml |
157 | | - toEncoding = toEncoding . formatTime defaultTimeLocale utcTimeYamlFormat . unUTCTimeYaml |
158 | | - |
159 | | --- Keeps things as the old Show/Read-based format, e.g "2009-04-15 10:02:06 UTC" |
160 | | -utcTimeYamlFormat :: String |
161 | | -utcTimeYamlFormat = "%F %T%Q UTC" |
| 157 | + toJSON = toJSON . formatTime defaultTimeLocale utcTimeWriteFormat . unUTCTimeYaml |
| 158 | + toEncoding = toEncoding . formatTime defaultTimeLocale utcTimeWriteFormat . unUTCTimeYaml |
| 159 | + |
| 160 | +-- | Canonical output format: the old Show/Read-based format, |
| 161 | +-- e.g "2009-04-15 10:02:06.123456 UTC" |
| 162 | +utcTimeWriteFormat :: String |
| 163 | +utcTimeWriteFormat = "%F %T%Q UTC" |
| 164 | + |
| 165 | +-- | Accepted input formats, tried in order. Lenient parsing accepts |
| 166 | +-- timestamps with or without fractional seconds. |
| 167 | +utcTimeParseFormats :: [String] |
| 168 | +utcTimeParseFormats = |
| 169 | + [ "%F %T%Q UTC" -- "2009-04-15 10:02:06.123456 UTC" (with fractional seconds) |
| 170 | + , "%F %T UTC" -- "2009-04-15 10:02:06 UTC" (without fractional seconds) |
| 171 | + ] |
162 | 172 |
|
163 | 173 | newtype DependsYaml = DependsYaml |
164 | 174 | { unDependsYaml :: [Text] |
|
0 commit comments