shikensu-0.2.0: src/Shikensu/Metadata.hs
{-| Metadata functions.
-}
module Shikensu.Metadata
( transposeMetadata
, transposeToMetadata
) where
import Flow
import Shikensu.Types
import qualified Data.Aeson as Aeson (FromJSON, Result(..), ToJSON, fromJSON, toJSON)
import qualified Data.HashMap.Strict as HashMap (empty)
{-| Transpose metadata.
Transpose our metadata object to a given type
which implements the Aeson.FromJSON instance.
> data Example =
> Example { some :: Text }
> deriving (Generic, FromJSON)
>
> hashMap = HashMap.fromList [ ("some", "metadata") ]
> defaultEx = Example { some = "default" }
> example = transposeMetadata hashMap defaultEx :: Example
-}
transposeMetadata :: Aeson.FromJSON a => Metadata -> a -> a
transposeMetadata hashMap fallback =
let
result = hashMap
|> Aeson.toJSON
|> Aeson.fromJSON :: Aeson.FromJSON b => Aeson.Result b
in
case result of
Aeson.Success x -> x
Aeson.Error _ -> fallback
{-| Inverse of `transposeMetadata`.
-}
transposeToMetadata :: (Aeson.ToJSON a) => a -> Metadata
transposeToMetadata generic =
let
result = generic
|> Aeson.toJSON
|> Aeson.fromJSON :: Aeson.FromJSON b => Aeson.Result b
in
case result of
Aeson.Success x -> x
Aeson.Error _ -> HashMap.empty