Skip to content

Commit

Permalink
Merge pull request #106 from dahlia/target-option
Browse files Browse the repository at this point in the history
-t/--target option
  • Loading branch information
dahlia committed Mar 8, 2017
2 parents 03c012d + f0d91da commit be1dbe3
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 11 deletions.
1 change: 1 addition & 0 deletions README.md
Expand Up @@ -61,6 +61,7 @@ For more infomration, use `--help` option:

Common flags:
-o --output-dir=DIR The directory to place object files
-t --target=TARGET The target language. Available targets: python
-? --help Display help message
-V --version Print version information
--numeric-version Print just the version number
Expand Down
33 changes: 22 additions & 11 deletions src/Nirum/Cli.hs
Expand Up @@ -18,6 +18,7 @@ import System.Console.CmdArgs.Implicit ( Data
, name
, program
, summary
, typ
, typDir
, (&=)
)
Expand All @@ -42,6 +43,7 @@ import Nirum.Package ( PackageError ( ImportError
)
, scanModules
)
import Nirum.Package.Metadata (TargetName)
import Nirum.Package.ModuleSet ( ImportError ( CircularImportError
, MissingImportError
, MissingModulePathError
Expand All @@ -50,11 +52,13 @@ import Nirum.Package.ModuleSet ( ImportError ( CircularImportError
import Nirum.Targets ( BuildError (CompileError, PackageError, TargetNameError)
, BuildResult
, buildPackage
, targetNames
)
import Nirum.Version (versionString)

data NirumCli = NirumCli { sourcePath :: FilePath
, objectPath :: FilePath
, targetName :: TargetName
} deriving (Show, Data, Typeable)

parseErrortoPrettyMessage :: ParseError (Token T.Text) Dec
Expand Down Expand Up @@ -124,21 +128,28 @@ importErrorsToPrettyMessage importErrors =
map (T.append "- ") (importErrorsToMessageList importErrors)

nirumCli :: NirumCli
nirumCli = NirumCli { objectPath = def &= explicit
&= name "o" &= name "output-dir" &= typDir
&= help "The directory to place object files"
, sourcePath = def &= argPos 1 &= typDir
}
&= program "nirum"
&= summary ("Nirum Compiler " ++ versionString)
nirumCli = NirumCli
{ objectPath = def &= explicit
&= name "o" &= name "output-dir" &= typDir
&= help "The directory to place object files"
, targetName = "python" &= explicit
&= name "t" &= name "target" &= typ "TARGET"
&= help ("The target language. Available targets: " ++
T.unpack targetNamesText)
, sourcePath = def &= argPos 1 &= typDir
} &= program "nirum" &= summary ("Nirum Compiler " ++ versionString)

targetNamesText :: T.Text
targetNamesText = T.intercalate ", " $ S.toAscList targetNames

main' :: IO ()
main' = do
NirumCli src outDir <- cmdArgs nirumCli
result <- buildPackage "python" src
NirumCli src outDir target <- cmdArgs nirumCli
result <- buildPackage target src
case result of
Left (TargetNameError targetName) ->
putStrLn [qq|Couldn't find "$targetName" target.|]
Left (TargetNameError targetName') ->
putStrLn [qq|$targetName': No such target.
Available targets: $targetNamesText|]
Left (PackageError (ParseError modulePath error')) -> do
{- FIXME: find more efficient way to determine filename from
the given module path -}
Expand Down
5 changes: 5 additions & 0 deletions src/Nirum/Targets.hs
Expand Up @@ -11,13 +11,15 @@ module Nirum.Targets ( BuildError (CompileError, PackageError, TargetNameError)
)
, TargetName
, buildPackage
, targetNames
) where

import Data.Either (partitionEithers)
import Data.Maybe (fromMaybe)
import Data.Proxy (Proxy)

import Data.ByteString (ByteString)
import Data.Set (Set)
import qualified Data.Map.Strict as M
import Data.Text (Text)

Expand Down Expand Up @@ -47,6 +49,9 @@ packageBuilders :: M.Map TargetName
(FilePath -> IO (Either BuildError BuildResult))
packageBuilders = M.fromList $(targetProxyMapQ [e|buildPackage'|])

targetNames :: Set TargetName
targetNames = M.keysSet packageBuilders

buildPackage :: TargetName -> FilePath -> IO (Either BuildError BuildResult)
buildPackage targetName' =
fromMaybe (\ _ -> return $ Left $ TargetNameError targetName') $
Expand Down

0 comments on commit be1dbe3

Please sign in to comment.