File: Main.hs

package info (click to toggle)
haskell-encoding 0.10.2-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 3,388 kB
  • sloc: haskell: 4,372; ansic: 11; makefile: 2
file content (60 lines) | stat: -rw-r--r-- 1,828 bytes parent folder | download | duplicates (2)
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")