packages feed

compdoc-dhall-decoder-0.3.0.0: src/Text/Compdoc/Dhall.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}

module Text.Compdoc.Dhall where

import Composite.Aeson
import Composite.Record
import Data.Either.Validation
import Data.Text as T
import Data.Typeable
import Data.Void
import qualified Dhall as D
import Text.Compdoc
import Text.Pandoc

-- | Decode a Compdoc value.
compdocDecoder :: WriterOptions -> JsonFormat Void (Record a) -> D.InputNormalizer -> D.Decoder (Compdoc a)
compdocDecoder wopts f opts =
  D.Decoder
    { D.extract = extractDoc,
      D.expected = expectedDoc
    }
  where
    docDecoder :: D.Decoder Text
    docDecoder = D.autoWith opts

    extractDoc expression =
      case D.extract docDecoder expression of
        Success x -> case readMarkdown' def {readerExtensions = pandocExtensions} wopts f x of
          Left exception -> D.extractError (T.pack $ show exception)
          Right l -> Success l
        Failure e -> Failure e
    expectedDoc = D.expected docDecoder