165 lines
4.0 KiB
Haskell
165 lines
4.0 KiB
Haskell
module Main where
|
|
|
|
import Data.Text as T
|
|
import Data.Text.IO as T
|
|
|
|
-- import Data.Time.Clock
|
|
import Data.Time.LocalTime
|
|
import NCDeck
|
|
import Options.Applicative
|
|
import System.IO
|
|
|
|
data Options = Options
|
|
{ hostname :: Text
|
|
, username :: Text
|
|
, cmd :: Command
|
|
}
|
|
|
|
data Command
|
|
= ListBoards
|
|
| ListStacks
|
|
{ boardId :: Word
|
|
}
|
|
| ListCards
|
|
{ boardId :: Word
|
|
, stackId :: Word
|
|
}
|
|
| CreateCard
|
|
{ boardId :: Word
|
|
, stackId :: Word
|
|
, title :: Text
|
|
, description :: Text
|
|
, date :: LocalTime
|
|
, weeklyRepeats :: Word
|
|
}
|
|
|
|
run :: Options -> IO ()
|
|
run (Options {..}) = do
|
|
hSetBuffering stdout NoBuffering
|
|
hSetEcho stdin False
|
|
T.putStr "Please enter the password: "
|
|
password <- T.getLine
|
|
T.putStrLn $ T.replicate (T.length password) "*"
|
|
case cmd of
|
|
ListBoards -> do
|
|
boards <- listBoards hostname username password
|
|
mapM_ print boards
|
|
ListStacks {..} -> do
|
|
stacks <- listStacks hostname username password boardId
|
|
mapM_ print stacks
|
|
ListCards {..} -> do
|
|
cards <- listCards hostname username password boardId stackId
|
|
mapM_ print cards
|
|
CreateCard {..} -> do
|
|
createCard hostname username password boardId stackId title description date weeklyRepeats
|
|
|
|
parseListStacks :: Parser Command
|
|
parseListStacks =
|
|
ListStacks
|
|
<$> option
|
|
auto
|
|
( long "board-id"
|
|
<> short 'b'
|
|
<> metavar "BOARD_ID"
|
|
<> help "the id of the kanban board"
|
|
)
|
|
|
|
parseListCards :: Parser Command
|
|
parseListCards =
|
|
ListCards
|
|
<$> option
|
|
auto
|
|
( long "board-id"
|
|
<> short 'b'
|
|
<> metavar "BOARD_ID"
|
|
<> help "the id of the kanban board"
|
|
)
|
|
<*> option
|
|
auto
|
|
( long "stack-id"
|
|
<> short 's'
|
|
<> metavar "STACK_ID"
|
|
<> help "the id of the kanban stack"
|
|
)
|
|
|
|
parseCreateCard :: Parser Command
|
|
parseCreateCard =
|
|
CreateCard
|
|
<$> option
|
|
auto
|
|
( long "board-id"
|
|
<> short 'b'
|
|
<> metavar "BOARD_ID"
|
|
<> help "the id of the kanban board"
|
|
)
|
|
<*> option
|
|
auto
|
|
( long "stack-id"
|
|
<> short 's'
|
|
<> metavar "STACK_ID"
|
|
<> help "the id of the kanban stack"
|
|
)
|
|
<*> strOption
|
|
( long "title"
|
|
<> short 't'
|
|
<> metavar "TITLE"
|
|
<> help "the card's title; the card's date can be included using the placeholders %YY, %MM and %DD"
|
|
)
|
|
<*> strOption
|
|
( long "description"
|
|
<> short 'd'
|
|
<> metavar "DESC"
|
|
<> value ""
|
|
<> showDefault
|
|
<> help "the card's description"
|
|
)
|
|
<*> option
|
|
auto
|
|
( long "date" -- FIXME: make this optional?
|
|
<> short 'e'
|
|
<> metavar "DATE"
|
|
<> help "the card's date, format: YYYY-MM-DD hh:mm:ss"
|
|
)
|
|
<*> option
|
|
auto
|
|
( long "weekly-repeats"
|
|
<> short 'w'
|
|
<> metavar "COUNT"
|
|
<> value 0
|
|
<> showDefault
|
|
<> help "repeat the card weekly COUNT times"
|
|
)
|
|
|
|
parseOptions :: Parser Options
|
|
parseOptions =
|
|
Options
|
|
<$> strOption
|
|
( long "hostname"
|
|
<> short 'o'
|
|
<> metavar "HOSTNAME"
|
|
<> help "the hostname of the Nextcloud instance"
|
|
)
|
|
<*> strOption
|
|
( long "username"
|
|
<> short 'u'
|
|
<> metavar "USERNAME"
|
|
<> help "the Nextcloud username"
|
|
)
|
|
<*> hsubparser
|
|
( command "list-boards" (info (pure ListBoards) (progDesc "list all stacks"))
|
|
<> command "list-stacks" (info parseListStacks (progDesc "list all stacks"))
|
|
<> command "list-cards" (info parseListCards (progDesc "list all cards"))
|
|
<> command "create-card" (info parseCreateCard (progDesc "create a new card"))
|
|
)
|
|
|
|
main :: IO ()
|
|
main = run =<< execParser opts
|
|
where
|
|
opts =
|
|
info
|
|
(parseOptions <**> helper)
|
|
( fullDesc
|
|
<> progDesc "Manage a Nextcloud Deck"
|
|
<> header "ncdeck - Manage a Nextcloud Deck"
|
|
)
|