encoding-0.10.3: app/Main.hs
module Main (main) where
import Data.Encoding.Preprocessor.Mapping
import Data.Encoding.Preprocessor.XMLMappingBuilder
import Data.List (intercalate)
import qualified Data.Map as M
import Distribution.Simple.PreProcess
import Distribution.Verbosity (normal)
import Options.Applicative
import System.Directory (listDirectory)
import System.FilePath (replaceExtension, takeExtension, (</>))
import Utils (filesWithExtensions, validateExtensions, withDirectory)
data Input = Input
{ inputDir :: FilePath
, extensions :: [String]
} deriving (Show)
extensionMap :: M.Map String PreProcessor
extensionMap = M.fromList
[ (".mapping", mappingPreprocessor)
, (".mapping2", mappingPreprocessor)
, (".xml", xmlPreprocessor)
]
input :: Parser Input
input = Input
<$> strArgument (metavar "INPUT_DIR" <> help "Directory with mapping files")
<*> some
( strOption
( short 'e'
<> metavar "EXTENSIONS"
<> help ("Supported extensions: " ++ intercalate ", " (M.keys extensionMap))
)
)
generateEncodings :: Input -> IO ()
generateEncodings Input { inputDir = inputDir, extensions = extensions } = do
validateExtensions extensions (M.keys extensionMap)
withDirectory inputDir
( \dir -> do
directoryFiles <- listDirectory dir
let files = filesWithExtensions directoryFiles extensions
mapM_
( \fileName ->
runSimplePreProcessor
(getPreProcessor fileName)
(dir </> fileName)
(dir </> (replaceExtension fileName ".hs"))
normal
)
files
)
where
getPreProcessor filePath = extensionMap M.! (takeExtension filePath)
main :: IO ()
main = generateEncodings =<< execParser opts
where
opts = info (input <**> helper) (fullDesc <> progDesc "Generate encodings")