packages feed

tinyXml-0.1.0.0: Validate.hs

{-# LANGUAGE DataKinds         #-}
{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE DeriveAnyClass    #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeOperators     #-}

import Text.Xml.Tiny
import Control.Monad
import qualified Data.ByteString.Char8 as BS

import Options.Generic
import System.Directory
import System.FilePath
import System.IO
import System.Environment

import Text.Printf

data Options =
  Options { reprint :: Bool <?> "Reprint the XML document" }
  deriving (Generic, Show, ParseRecord)

data Args = Args Options [String] deriving (Generic, Show)

instance ParseRecord Args where parseRecord = Args <$> parseRecord <*> parseRecord

main = do
  Args args paths <- getRecord "Validate XML"
  hSetBuffering stdout LineBuffering
  forM_ paths $ \p -> do
    contents <- BS.readFile p
    case parse contents of
      Left e -> print e
      Right node -> do
        putStrLn "OK"
        when (unHelpful $ reprint args) $ do
          let destPath = p <.> "reprint"
          existsAlready <- doesFileExist destPath
          if existsAlready
            then putStrLn $ "Overwriting " ++ destPath
            else putStrLn $ "Reprinting to " ++ destPath
          BS.writeFile destPath (rerender node)