module Text.Pandoc.Dhall where

import Data.Either.Validation
import qualified Dhall as D
import Text.Pandoc
import Data.Text as T

-- | Decode a Pandoc value.
pandocDecoder :: (ReaderOptions -> Text -> PandocPure Pandoc) -> ReaderOptions -> D.InputNormalizer -> D.Decoder Pandoc
pandocDecoder :: (ReaderOptions -> Text -> PandocPure Pandoc)
-> ReaderOptions -> InputNormalizer -> Decoder Pandoc
pandocDecoder ReaderOptions -> Text -> PandocPure Pandoc
f ReaderOptions
ropts InputNormalizer
opts =
      Decoder :: forall a.
(Expr Src Void -> Extractor Src Void a)
-> Expector (Expr Src Void) -> Decoder a
D.Decoder
            { extract :: Expr Src Void -> Extractor Src Void Pandoc
D.extract = Expr Src Void -> Extractor Src Void Pandoc
extractDoc
            , expected :: Expector (Expr Src Void)
D.expected = Expector (Expr Src Void)
expectedDoc
            }
      where
        docDecoder :: D.Decoder Text
        docDecoder :: Decoder Text
docDecoder = InputNormalizer -> Decoder Text
forall a. FromDhall a => InputNormalizer -> Decoder a
D.autoWith InputNormalizer
opts

        extractDoc :: Expr Src Void -> Extractor Src Void Pandoc
extractDoc Expr Src Void
expression =
          case Decoder Text -> Expr Src Void -> Extractor Src Void Text
forall a. Decoder a -> Expr Src Void -> Extractor Src Void a
D.extract Decoder Text
docDecoder Expr Src Void
expression of
              Success Text
x -> case PandocPure Pandoc -> Either PandocError Pandoc
forall a. PandocPure a -> Either PandocError a
runPure (ReaderOptions -> Text -> PandocPure Pandoc
f ReaderOptions
ropts Text
x) of
                Left PandocError
exception   -> Text -> Extractor Src Void Pandoc
forall s a b. Text -> Extractor s a b
D.extractError (String -> Text
T.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ PandocError -> String
forall a. Show a => a -> String
show PandocError
exception)
                Right Pandoc
path       -> Pandoc -> Extractor Src Void Pandoc
forall e a. a -> Validation e a
Success Pandoc
path
              Failure ExtractErrors Src Void
e        -> ExtractErrors Src Void -> Extractor Src Void Pandoc
forall e a. e -> Validation e a
Failure ExtractErrors Src Void
e

        expectedDoc :: Expector (Expr Src Void)
expectedDoc = Decoder Text -> Expector (Expr Src Void)
forall a. Decoder a -> Expector (Expr Src Void)
D.expected Decoder Text
docDecoder