packages feed

etc-0.4.1.0: src/System/Etc/Internal/Spec/YAML/TH.hs

{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell   #-}
module System.Etc.Internal.Spec.YAML.TH where

import RIO

import Data.Proxy (Proxy)

import Language.Haskell.TH        (ExpQ, runIO)
import Language.Haskell.TH.Syntax (Lift)

import qualified Data.Aeson as JSON

import System.Etc.Internal.Spec.Types (ConfigSpec)
import System.Etc.Internal.Spec.YAML  (readConfigSpec)

readConfigSpecTH_ :: (Lift k) => Proxy k -> (Text -> IO (ConfigSpec k)) -> Text -> ExpQ
readConfigSpecTH_ _ readSpec filepath = do
  configSpec <- runIO $ readSpec filepath
  [| configSpec |]

readConfigSpecTH :: (Lift k, JSON.FromJSON k) => Proxy k -> Text -> ExpQ
readConfigSpecTH = flip readConfigSpecTH_ readConfigSpec