packages feed

mdoc-0.1.0.0: src/Mdoc/Dump/Main.hs

-- |
--
-- Module      : Mdoc.Dump.Main
-- Copyright   : (c) 2026 Patrick Brisbin
-- License     : AGPL-3
-- Maintainer  : pbrisbin@gmail.com
-- Stability   : experimental
-- Portability : POSIX
module Mdoc.Dump.Main
  ( main
  )
where

import Mdoc.Prelude

import Mdoc
import Mdoc.Detect
import Mdoc.Dump.Diff
import Mdoc.Dump.Options
import Mdoc.Input
import Mdoc.Parse (exitParseError)
import Mdoc.Pretty (Ann (..), Color (..), putDoc, renderPlain)
import Mdoc.UpdateMdocdate
import Prettyprinter
import System.Exit (exitFailure)
import System.IO (stderr, stdout)

main :: IO ()
main = do
  options <- parseOptions

  let
    color = fromMaybe ColorAuto options.color

    postProcess mdoc =
      if options.updateMdocdate
        then updateMdocdate mdoc
        else pure mdoc

  forInputs_ options.input $ \input -> do
    case input.parsed of
      SkipParse reason ->
        when options.debug
          $ putDoc color stderr
          $ annotate AnnFile (pretty input.name)
          <> ":"
          <+> "refusing to parse"
          <+> prettyUnparsable reason
      ParseError err -> exitParseError err
      Parsed mdoc -> do
        mdoc' <- postProcess mdoc
        putDoc color stdout $ prettyMdoc mdoc'

        -- NB. The --check option operates on mdoc before any --update-mdocdate
        -- changes. Unclear what the least surprising behavior is here.
        when options.check $ do
          let
            src = input.source
            txt = renderPlain $ prettyMdoc mdoc
            diffs = getDifferences src txt

          case diffs of
            NoDifferences ->
              putDoc color stdout $ prettyDifferences input.name diffs
            Differences {} -> do
              putDoc color stderr $ prettyDifferences input.name diffs
              exitFailure