packages feed

hgithub-0.1.0: bin/hgithub.hs

{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
module Main where

import Data.Version (showVersion)
import Control.Applicative ((<$>))
import Paths_hgithub (version)
import System.Console.CmdArgs.Implicit
import System.Directory (doesFileExist)
import System.Exit

import Network.GitHub

main :: IO ()
main = (processCmd =<<) $ cmdArgs $
  modes
    [ cmdRepositoryList
    , cmdRepositoryCreate
    ]
  &= summary versionString
  &= program "hgithub"

versionString :: String
versionString =
  "hgithub " ++ showVersion version ++ " Copyright (c) 2012 Vo Minh Thu."

data Cmd =
    CmdRepositoryList
  | CmdRepositoryCreate
  { cmdRepositoryCreateName :: String
  , cmdRepositoryCreateDescription :: Maybe String
  }
  deriving (Data, Typeable)

cmdRepositoryList :: Cmd
cmdRepositoryList = CmdRepositoryList
  &= help "List repositories you have access to."
  &= explicit
  &= name "list-repositories"

cmdRepositoryCreate :: Cmd
cmdRepositoryCreate = CmdRepositoryCreate
  { cmdRepositoryCreateName = def
    &= typ "NAME"
    &= explicit
    &= name "name"
    &= help "Repository name."
  , cmdRepositoryCreateDescription = def
    &= typ "STRING"
    &= explicit
    &= name "description"
    &= help "Repository description."
  } &= help "Create a new repository."
    &= explicit
    &= name "create-repository"

processCmd :: Cmd -> IO ()
processCmd CmdRepositoryList{..} = do
  usernamePassword <- readUsernamePassword "github-username-password.txt"
  mrepos <- repositoryList usernamePassword
  case mrepos of
    Nothing -> putStrLn "Some error occured."
    Just repos -> mapM_ print repos

processCmd CmdRepositoryCreate{..} = do
  usernamePassword <- readUsernamePassword "github-username-password.txt"
  mrepo <- repositoryCreate usernamePassword
    cmdRepositoryCreateName
    cmdRepositoryCreateDescription
  case mrepo of
    Nothing -> putStrLn "Some error occured."
    Just repo -> print repo

readUsernamePassword :: FilePath -> IO String
readUsernamePassword filename = do
  b <- doesFileExist filename
  if b
    then (head . lines) <$> readFile filename
    else do
      putStrLn $ "API key file `" ++ filename ++ "` not found."
      exitWith (ExitFailure 1)