{-| This library provides a solution for applying a default value to 'Maybe' fields of 'FromJSON' instances. You should know a little bit about the __higher-kinded data__(HKD), here is an [article](https://reasonablypolymorphic.com/blog/higher-kinded-data/) on this topic. === Examples See "Logging.Config.Type" in [log4hs](http://hackage.haskell.org/package/log4hs) package for more information on how to use this library in a real project. >>> :set -XDeriveGeneric >>> :set -XFlexibleInstances >>> :set -XFlexibleContexts >>> :set -XStandaloneDeriving >>> import Data.Functor.Identity >>> import GHC.Generics >>> import Data.Aeson >>> import Data.Aeson.Default >>> :{ data NameH f = Name { first :: String , middle :: f String , last_ :: String } deriving Generic instance FromJSON (NameH Maybe) instance Default NameH where constrDef _ = Name "Jorah" (Identity ".") "Gao" deriving instance Show (NameH Identity) data PersonH f = Person { name :: NameH f , age :: f Int } deriving Generic instance FromJSON (PersonH Maybe) instance Default PersonH where constrDef _ = Person (constrDef "Name") (Identity 28) deriving instance Show (PersonH Identity) :} >>> decode "{\"first\":\"jorah\", \"last_\": \"gao\"}" :: Maybe (NameH Identity) Just (Name {first = "jorah", middle = Identity ".", last_ = "gao"}) >>> decode "{\"first\":\"jorah\", \"middle\": \"*\", \"last_\": \"gao\"}" :: Maybe (NameH Identity) Just (Name {first = "jorah", middle = Identity "*", last_ = "gao"}) >>> :set -XDeriveGeneric >>> :set -XFlexibleInstances >>> :set -XFlexibleContexts >>> :set -XStandaloneDeriving >>> :set -XTypeFamilies >>> import Data.Functor.Identity >>> import GHC.Generics >>> import Data.Aeson >>> import Data.Aeson.Default >>> import Data.Aeson.Default.HKD >>> :{ data ShapeH f = Square { side :: HKD Double f } | Circle { redius :: HKD Double f } deriving Generic instance FromJSON (ShapeH Maybe) instance Default ShapeH where constrDef "Square" = Square 1.0 constrDef "Circle" = Circle 1.0 deriving instance Show (ShapeH Identity) data BoxH f = Box { base :: HKD (ShapeH f) f , height :: HKD Double f } deriving Generic instance FromJSON (BoxH Maybe) instance Default BoxH where constrDef _ = Box (constrDef "Square") 1.0 deriving instance Show (BoxH Identity) :} >>> decode "{}" :: Maybe (BoxH Identity) Just (Box {base = Square {side = 1.0}, height = 1.0}) >>> decode "{\"base\": {\"tag\": \"Square\"}}" :: Maybe (BoxH Identity) Just (Box {base = Square {side = 1.0}, height = 1.0}) >>> decode "{\"base\": {\"tag\": \"Circle\"}}" :: Maybe (BoxH Identity) Just (Box {base = Circle {redius = 1.0}, height = 1.0}) >>> decode "{\"base\": {\"tag\": \"Square\", \"side\": 10.0}}" :: Maybe (BoxH Identity) Just (Box {base = Square {side = 10.0}, height = 1.0}) >>> decode "{\"height\": 10.0}" :: Maybe (BoxH Identity) Just (Box {base = Square {side = 1.0}, height = 10.0}) -} module Data.Aeson.Default ( module Data.Aeson.Default.Class ) where import Data.Aeson.Default.Class