1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
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")
|