content: {-# LANGUAGE CPP                 #-}
  {-# LANGUAGE LambdaCase          #-}
  {-# LANGUAGE ScopedTypeVariables #-}
  
  module Data.Yaml.TH
    ( -- * Decoding
      yamlQQ
  #if MIN_VERSION_template_haskell(2,9,0)
    , decodeFile
  #endif
      -- * Re-exports from "Data.Yaml"
    , Value (..)
    , Parser
    , Object
    , Array
    , object
    , array
    , (.=)
    , (.:)
    , (.:?)
    , (.!=)
    , FromJSON (..)
    ) where
  
  import           Data.Text.Encoding
  import qualified Data.Text as T
  import           Language.Haskell.TH
  import           Language.Haskell.TH.Syntax
  import           Language.Haskell.TH.Quote
  
  import           Data.Yaml hiding (decodeFile)
  
  -- | Decode a YAML file at compile time. Only available on GHC version @7.8.1@
  -- or higher.
  --
  -- @since 0.8.19.0
  --
  -- ==== __Examples__
  --
  -- @
  -- {-\# LANGUAGE TemplateHaskell \#-}
  --
  -- config :: Config
  -- config = $$('decodeFile' "config.yaml")
  -- @
  decodeFile :: forall a. (Lift a, FromJSON a) => FilePath -> Q (TExp a)
  decodeFile path = do
    addDependentFile path
    x <- runIO $ decodeFileThrow path
    fmap TExp (lift (x :: a))
  
  yamlExp :: String -> Q Exp
  yamlExp input = do
    val <- runIO $ decodeThrow $ encodeUtf8 $ T.pack input
    lift (val :: Value)
  
  -- | A @QuasiQuoter@ for YAML.
  --
  -- @since 0.8.28.0
  --
  -- ==== __Examples__
  --
  -- @
  -- {-\# LANGUAGE QuasiQuotes \#-}
  -- import Data.Yaml.TH
  --
  -- value :: Value
  -- value = [yamlQQ|
  -- name: John Doe
  -- age: 23
  -- |]
  -- @
  yamlQQ :: QuasiQuoter
  yamlQQ = QuasiQuoter {
    quoteExp  = yamlExp
  , quotePat  = notDefined "quotePat"
  , quoteType = notDefined "quoteType"
  , quoteDec  = notDefined "quoteDec"
  } where
      notDefined name _ = fail (name ++ " is not defined for yamlQQ")
  