{- |
Module      : Text.Pandoc.Class.CommonState
Copyright   : Copyright (C) 2016-2020 Jesse Rosenthal, John MacFarlane
License     : GNU GPL, version 2 or above

Maintainer  : Jesse Rosenthal <jrosenthal@jhu.edu>
Stability   : alpha
Portability : portable

Common state shared by all pandoc-specific operations, including
those in readers, writers, and Lua filters.
-}

module Text.Pandoc.Class.CommonState
  ( CommonState(..)
  , defaultCommonState
  )
where

import Data.Default (Default (def))
import Data.Text (Text)
import Text.Pandoc.BCP47 (Lang)
import Text.Pandoc.MediaBag (MediaBag)
import Text.Pandoc.Logging (LogMessage, Verbosity (WARNING))
import Text.Pandoc.Translations (Translations)

-- | 'CommonState' represents state that is used by all
-- instances of 'PandocMonad'.  Normally users should not
-- need to interact with it directly; instead, auxiliary
-- functions like 'setVerbosity' and 'withMediaBag' should be used.
data CommonState = CommonState
  { stLog          :: [LogMessage]
    -- ^ A list of log messages in reverse order
  , stUserDataDir  :: Maybe FilePath
    -- ^ Directory to search for data files
  , stSourceURL    :: Maybe Text
    -- ^ Absolute URL + dir of 1st source file
  , stRequestHeaders :: [(Text, Text)]
    -- ^ Headers to add for HTTP requests
  , stMediaBag     :: MediaBag
    -- ^ Media parsed from binary containers
  , stTranslations :: Maybe (Lang, Maybe Translations)
    -- ^ Translations for localization
  , stInputFiles   :: [FilePath]
    -- ^ List of input files from command line
  , stOutputFile   :: Maybe FilePath
    -- ^ Output file from command line
  , stResourcePath :: [FilePath]
    -- ^ Path to search for resources like
    -- included images
  , stVerbosity    :: Verbosity
    -- ^ Verbosity level
  , stTrace        :: Bool
    -- ^ Controls whether tracing messages are
    -- issued.
  }

-- | The default @'CommonState'@. All fields are initialized as the
-- monoid identity of their resprective type, except for:
--
--   * @'stResourcePath'@, which is set to @["."]@,
--   * @'stTrace'@, which is set to @'False'@, and
--   * @'stVerbosity'@, which is set to @WARNING@.
defaultCommonState :: CommonState
defaultCommonState = CommonState
  { stLog = []
  , stUserDataDir = Nothing
  , stSourceURL = Nothing
  , stRequestHeaders = []
  , stMediaBag = mempty
  , stTranslations = Nothing
  , stInputFiles = []
  , stOutputFile = Nothing
  , stResourcePath = ["."]
  , stVerbosity = WARNING
  , stTrace = False
  }

instance Default CommonState where
  def = defaultCommonState