packages feed

mdoc-0.1.1.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 (..), putDoc, renderPlain)
import Mdoc.UpdateMdocdate
import Prettyprinter
import System.Exit (exitFailure)
import System.IO (stderr, stdout)

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

  let 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 options.color stderr
          $ annotate AnnFile (pretty input.name)
            <> ":"
            <+> "refusing to parse"
            <+> prettyUnparsable reason
      ParseError err -> exitParseError err
      Parsed mdoc -> do
        mdoc' <- postProcess mdoc
        putDoc options.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 options.color stdout $ prettyDifferences input.name diffs
            Differences {} -> do
              putDoc options.color stderr $ prettyDifferences input.name diffs
              exitFailure