{-# LANGUAGE OverloadedStrings #-}
module Main (main) where

import qualified Apigen.Language.Haskell as Haskell
import           Data.List               (intercalate)
import qualified Data.Text               as Text
import qualified Data.Text.IO            as Text
import           Language.Cimple.IO      (parseFiles)
import           System.Environment      (getArgs)


langs :: [String]
langs = ["go", "hs", "js", "kt", "py"]


main :: IO ()
main = do
    args <- getArgs
    case args of
        [] ->
            fail $ "Usage: apigen <" <> langFlags <> "> [FILE]..."
        ('-':lang):_ | lang `notElem` langs ->
            fail $ "Invalid language. Supported: " <> langFlags
        _lang:srcs -> do
            asts <- parseFiles srcs >>= getRight
            mapM_ (\(file, text) -> do
                Text.putStrLn $ "-- " <> Text.pack file
                Text.putStrLn text) $ map Haskell.generate asts
    where
        getRight (Left err) = fail err
        getRight (Right ok) = return ok

        langFlags = intercalate "|" . map ("-"<>) $ langs