xcffib-0.2.0: generator/xcffibgen.hs
{-
- Copyright 2014 Tycho Andersen
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-}
module Main where
import Data.XCB.Types
import Data.XCB.Python.Parse
import Options.Applicative
import System.Directory
import System.FilePath
data Xcffibgen = Xcffibgen { input :: String
, output :: String
}
options :: Parser Xcffibgen
options = Xcffibgen
<$> strOption
( long "input"
<> metavar "DIR"
<> help "Input directory containing xcb xml files.")
<*> strOption
( long "output"
<> metavar "DIR"
<> help "Output directory for generated python.")
-- Headers we can't emit right now. Obviously we want to get rid of this :-)
badHeaders :: [String]
badHeaders = [ "xkb"
, "xprint"
]
run :: Xcffibgen -> IO ()
run (Xcffibgen inp out) = do
headers <- parseXHeaders inp
let headers' = filter (flip notElem badHeaders . xheader_header) headers
createDirectoryIfMissing True out
sequence_ $ map processFile $ xform headers'
where
processFile (fname, suite) = do
putStrLn fname
let fname' = out </> fname ++ ".py"
contents = renderPy suite
writeFile fname' contents
main :: IO ()
main = execParser opts >>= run
where
opts = info (helper <*> options)
( fullDesc
<> progDesc "Generate XCB bindings for python."
<> header "xcffib - the cffi-based XCB generator")