packages feed

craft-0.0.0.1: src/Craft/Config/Json.hs

{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE GADTs                     #-}
module Craft.Config.Json where

import           Control.Lens
import           Data.Aeson
import           Data.Aeson.Encode.Pretty (encodePretty)

import           Craft
import           Craft.Config
import qualified Data.ByteString.Char8    as B8
import qualified Data.ByteString.Lazy     as BSL


data JsonFormat a = (FromJSON a, ToJSON a) => JsonFormat { _jsonfmt :: a }


instance (FromJSON a, ToJSON a) => ConfigFormat (JsonFormat a) where
  showConfig = B8.unpack . BSL.toStrict . encodePretty . _jsonfmt
  parseConfig fp s =
    case eitherDecodeStrict (B8.pack s) of
      Left err -> $craftError $ "Failed to parse "++show fp++" : "++err
      Right x  -> return $ JsonFormat x


get :: (FromJSON a, ToJSON a) => Path Abs FileP -> Craft (Maybe (Config (JsonFormat a)))
get = Craft.Config.get


config :: (FromJSON a, ToJSON a) => Path Abs FileP -> a -> Config (JsonFormat a)
config fp = Craft.Config.config fp . JsonFormat


makeLenses ''JsonFormat