packages feed

java-bridge-0.20130602: hs2j/Main.hss

{-# LANGUAGE Haskell2010
 #-}

module Main where

import Options
import Haskell2Java

import Foreign.Java.Bindings

import System.Console.GetOpt
import System.Environment (getArgs, getProgName)

import Data.Maybe
import Data.NamedRecord
import Data.List
import Data.List.Split
import Data.Word

import Text.Printf

versionInfo = "Java <-> Haskell Bindings Generator"

-- | The flags (needed for the options list / GetOpt).
data Flag = Help
          | Version
          | Classpath [String]
          | SearchDepth Word32
          | TargetDirectory String
          | CompleteSE6
          | Verbose

-- | The Command line options as fed to the GetOpt parser.
options = [
    Option "h" ["help"] (NoArg Help)
        "Print this help text.",

    Option "V" ["version"] (NoArg Version)
        "Print version information.",

    Option "c" ["classpath"] (ReqArg readClasspath "")
        "The Java classpath to be used.",

    Option "d" ["search-depth"] (ReqArg readSearchDepth "")
        "The maximum search depth for dependent Java classes.",

    Option "v" ["--verbose"] (NoArg Verbose)
        "Verbose output, prints extra diagnostic information.",

    Option "X" [] (NoArg CompleteSE6)
        "Completely translate Java SE 6"

 ] where
    readClasspath = Classpath . splitOneOf ":;,"
    readSearchDepth = SearchDepth . read

parseArgs :: IO (Either (Options, [String]) [String])
-- ^ Parse command line arguments with the help of the GetOpt library.
parseArgs = do
    (opts, args, errs) <- getArgs >>= return . getOpt Permute options
    if null errs
        then return $ Left  (parseOpts newOptions opts, args)
        else return $ Right errs
  where
    parseOpts opts [] = opts
    parseOpts opts (x:xs) = flip parseOpts xs $
        case x of
            Help ->          opts `set` optShowHelp    := True
            Version ->       opts `set` optShowVersion := True
            Verbose ->       opts `set` optVerbose     := True
            CompleteSE6 ->   opts `set` optCompleteSE6 := True
            Classpath cp ->  opts `set` optClasspath   := cp
            SearchDepth d -> opts `set` optSearchDepth := d

main :: IO ()
-- ^ main: parseArgs and either 'run' or show errors.
main = parseArgs >>= either (uncurry run) (mapM_ putStr)

run :: Options -> [String] -> IO ()
-- ^ The actual main function.
run opts args
    | opts `get` optShowHelp = do
        progName <- getProgName
        putStrLn (usageInfo """
            #{versionInfo}
            
            Usage: #{progName} [options] command [files...]
            
            Use `#{progName} help' for information about commands.
            """ options)

    | opts `get` optShowVersion = putStrLn versionInfo

    | otherwise = getProgName >>= \progName -> putStr """
        No command given. Use `#{progName} help' for help.
        """