Skip to content

Instantly share code, notes, and snippets.

@MgaMPKAy
Last active August 29, 2015 14:02
Show Gist options
  • Save MgaMPKAy/640bfd5113a4e95b9f78 to your computer and use it in GitHub Desktop.
Save MgaMPKAy/640bfd5113a4e95b9f78 to your computer and use it in GitHub Desktop.
import Options.Applicative
import Data.Monoid
type PackageDB = String
type Package = String
type Dir = String
type Archive = String
data Options = Options [PackageDB] Command deriving (Show)
data Command = Install [Package]
| LocalInstall [Package]
| Uninstall [Package]
| List ListCommand
| Find FindCommand String
| Pack PackCommand
| QueryInstall [Package]
deriving (Show)
data ListCommand = ListInstalled | ListPackages | ListAll deriving (Show)
data FindCommand = FindFile | FindPackage deriving (Show)
data PackCommand = Gen Archive String | New Dir String deriving (Show)
parseInstall = Install <$> some (argument str (metavar "PACKAGE"))
parseLocalInstall = LocalInstall <$> some (argument str (metavar "LOCAL-PACKAGE"))
parseUninstall = Uninstall <$> some (argument str (metavar "PACKAGE"))
parsePack = Pack <$> (subparser $
command "gen" (parseGen `withInfo` "Generate a new package from archive")
<> command "new" (parseNew `withInfo` "Create a new package from dir"))
where
parseNew = New <$> argument str (metavar "DIR")
<*> argument str (metavar "NEW-PACKAGE")
parseGen = Gen <$> argument str (metavar "ARCHIVE")
<*> argument str (metavar "NEW-PACKAGE")
parseList = List <$> ((subparser $
command "package" (pure ListPackages `withInfo` "List all packages")
<> command "installed" (pure ListInstalled `withInfo` "List installed packages"))
<|> (pure ListAll))
parseFind = Find <$> cmd <*> target
where
cmd = subparser $ command "file" (pure FindFile `withInfo` "Find file")
<> command "package" (pure FindPackage `withInfo` "Find package")
target = argument str (metavar "TARGET")
parseQueryInstall = QueryInstall <$> some (argument str (metavar "PACKAGE"))
withInfo parser desc = (helper <*> parser) `info` progDesc desc
parseCommand = subparser $
command "install" (parseInstall `withInfo` "Install matched packages")
<> command "local-install" (parseLocalInstall `withInfo` "Install local packages")
<> command "uninstall" (parseUninstall `withInfo` "Uninstall matched packages")
<> command "list" (parseList `withInfo` "List packages")
<> command "find" (parseFind `withInfo` "Find package and files")
<> command "pack" (parsePack `withInfo` "Pack a new pacakge")
<> command "query-install" (parseQueryInstall `withInfo` "Install packages interactively")
parsePackageDB = strOption (long "package-db"
<> short 'd'
<> help "Change pacakge database"
<> metavar "PACKAGE-DB")
parseOption = Options <$> many parsePackageDB <*> parseCommand
parser = info parseOption (fullDesc <> progDesc "My package manager")
setting = ParserPrefs ".." False True True 80
main = customExecParser setting parser >>= print
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment