|
9 | 9 | module JSONCompat where |
10 | 10 |
|
11 | 11 | import Data.Aeson.Key (fromString) |
12 | | -import Data.Aeson.Types (FromJSON (..), KeyValue ((.=)), Object, Parser, ToJSON (..), (.!=), (.:), (.:?)) |
| 12 | +import Data.Aeson.Types (FromJSON (..), KeyValue ((.=)), Object, Parser, ToJSON (..), explicitParseFieldMaybe, parserCatchError, (.!=), (.:)) |
13 | 13 | import Data.Char (isUpper, toLower, toUpper) |
14 | 14 | import Data.Default (Default (..)) |
| 15 | +import Debug.Trace |
15 | 16 | import GHC.Records (HasField (..)) |
16 | 17 | import GHC.TypeLits (KnownSymbol (..), SSymbol, fromSSymbol) |
17 | 18 |
|
@@ -52,7 +53,15 @@ omitDefault = Getter $ \(fld :: SSymbol fld) obj -> |
52 | 53 |
|
53 | 54 | parseFieldOrDefault :: forall obj fld a. (HasField fld obj a, Default obj, KnownSymbol fld, FromJSON a) => Object -> Parser a |
54 | 55 | parseFieldOrDefault obj = |
55 | | - obj .:? fromString (camelToKebab (fromSSymbol (symbolSing @fld))) .!= getField @fld (def :: obj) |
| 56 | + explicitParseFieldMaybe tracingParser obj (fromString (camelToKebab (fromSSymbol (symbolSing @fld)))) |
| 57 | + .!= defVal |
| 58 | + where |
| 59 | + defVal = getField @fld (def :: obj) |
| 60 | + tracingParser v = |
| 61 | + parseJSON v |
| 62 | + `parserCatchError` ( \path msg -> |
| 63 | + trace ("Using default value for: " ++ show path ++ " , error: " ++ msg) (pure defVal) |
| 64 | + ) |
56 | 65 |
|
57 | 66 | parseField :: forall obj fld a. (HasField fld obj a, KnownSymbol fld, FromJSON a) => Object -> Parser a |
58 | 67 | parseField obj = obj .: fromString (camelToKebab (fromSSymbol (symbolSing @fld))) |
0 commit comments