aboutsummaryrefslogtreecommitdiff
path: root/tprint
diff options
context:
space:
mode:
authorGregor Kleen <gkleen@yggdrasil.li>2015-10-17 21:23:45 +0200
committerGregor Kleen <gkleen@yggdrasil.li>2015-10-17 21:23:45 +0200
commite65e1eaac335a4738abb9e8ee8da7a229f96c2c0 (patch)
tree8711caffd49f24ee8136523e0aefc76e37d8666a /tprint
parent005dc408dc09c3b479398ebe3e92efa2cd54846e (diff)
downloadthermoprint-e65e1eaac335a4738abb9e8ee8da7a229f96c2c0.tar
thermoprint-e65e1eaac335a4738abb9e8ee8da7a229f96c2c0.tar.gz
thermoprint-e65e1eaac335a4738abb9e8ee8da7a229f96c2c0.tar.bz2
thermoprint-e65e1eaac335a4738abb9e8ee8da7a229f96c2c0.tar.xz
thermoprint-e65e1eaac335a4738abb9e8ee8da7a229f96c2c0.zip
Drafts
Diffstat (limited to 'tprint')
-rw-r--r--tprint/src/Main.hs222
-rw-r--r--tprint/tprint.cabal1
-rw-r--r--tprint/tprint.nix4
3 files changed, 184 insertions, 43 deletions
diff --git a/tprint/src/Main.hs b/tprint/src/Main.hs
index 565295b..0f88a86 100644
--- a/tprint/src/Main.hs
+++ b/tprint/src/Main.hs
@@ -1,72 +1,178 @@
1{-# LANGUAGE RecordWildCards #-} 1{-# LANGUAGE RecordWildCards, RankNTypes #-}
2 2
3import Thermoprint 3import Thermoprint
4import Thermoprint.Api 4import Thermoprint.Api
5 5
6import qualified BBCode (parse) 6import qualified BBCode (parse, make)
7 7
8import Options.Applicative 8import Options.Applicative
9 9
10import Data.Either 10import Data.Either
11import Data.Maybe
11import Control.Monad 12import Control.Monad
12import Control.Monad.Trans.Either 13import Control.Monad.Trans.Either
13 14
14import System.IO 15import System.IO
16import qualified System.IO as IO
15import System.Exit 17import System.Exit
18import System.Environment
16 19
17import Data.Proxy 20import Data.Proxy
21import Servant.API
18import Servant.Client 22import Servant.Client
19 23
24import Data.Int (Int64)
25
20thermoprintApi :: Proxy ThermoprintApi 26thermoprintApi :: Proxy ThermoprintApi
21thermoprintApi = Proxy 27thermoprintApi = Proxy
22 28
23data Options = Options 29data TPrint = TPrint TPrintMode TPrintOptions
24 { baseUrl :: BaseUrl 30
25 , printerId :: Integer 31data TPrintOptions = TPrintOptions
26 , dryRun :: Bool 32 { baseUrl :: BaseUrl
27 } 33 }
28 34
29options :: Parser Options 35data TPrintMode = Print PrintOptions
30options = Options 36 | PrintDraft PrintDraftOptions
31 <$> option baseUrlReader ( 37 | Query QueryOptions
32 long "url" 38 | Add AddOptions
33 <> short 'u' 39 | Get GetOptions
34 <> metavar "URL" 40 | Write WriteOptions
35 <> help "The base url of the api" 41 | Del DelOptions
36 <> value (BaseUrl Http "localhost" 8080) 42
37 <> showDefaultWith showBaseUrl 43data PrintOptions = PrintOptions
38 ) 44 { printerId :: Integer
39 <*> option auto ( 45 , dryRun :: Bool
40 long "printer" 46 }
41 <> short 'p' 47
42 <> metavar "INT" 48data PrintDraftOptions = PrintDraftOptions
43 <> help "The number of the printer to use" 49 { printOptions :: PrintOptions
44 <> value 0 50 , pDraftId :: Int64
45 <> showDefault 51 , deleteAfter :: Bool
46 ) 52 }
47 <*> flag False True ( 53
48 long "dry-run" 54data QueryOptions = QueryOptions
49 <> short 'd' 55
50 <> help "Instead of sending data to printer output the parsed stream to stderr" 56data AddOptions = AddOptions
51 <> showDefault 57 { title :: String
52 ) 58 }
53 where 59
54 baseUrlReader = str >>= either readerError return . parseBaseUrl 60data GetOptions = GetOptions
61 { gDraftId :: Int64
62 , getTitle :: Bool
63 }
64
65data WriteOptions = WriteOptions
66 { wDraftId :: Int64
67 , newTitle :: Maybe String
68 }
69
70data DelOptions = DelOptions
71 { dDraftId :: Int64
72 }
73
55 74
56main :: IO () 75main :: IO ()
57main = execParser opts >>= main' 76main = do
77 envUrl <- lookupEnv "TPRINT"
78 let
79 defaultUrl = fromMaybe (BaseUrl Http "localhost" 8080) (envUrl >>= either (const Nothing) Just . parseBaseUrl)
80 execParser (opts defaultUrl) >>= main'
58 where 81 where
59 opts = info (helper <*> options) ( 82 opts url = info (helper <*> opts' url) (
60 fullDesc 83 fullDesc
61 <> header "tprint - A cli tool for interfacing with the REST api as provided by thermoprint-servant" 84 <> header "tprint - A cli tool for interfacing with the REST api as provided by thermoprint-servant"
62 ) 85 )
86 opts' url = TPrint
87 <$> modeSwitch
88 <*> commonOpts url
89 commonOpts url = TPrintOptions
90 <$> option baseUrlReader (
91 long "url"
92 <> short 'u'
93 <> metavar "URL"
94 <> help "The base url of the api. Also reads TPRINT from environment."
95 <> value url
96 <> showDefaultWith showBaseUrl
97 )
98 baseUrlReader = str >>= either readerError return . parseBaseUrl
99 modeSwitch = subparser $ mconcat $ map (\(n, f, h) -> command n $ info (helper <*> f) $ progDesc h)
100 [ ("print", print, "Read bbcode from stdin and send it to be printed")
101 , ("print-draft", printD, "Send a draft to be printed")
102 , ("query", query, "List drafts")
103 , ("add", add, "Read bbcode from stdin and add it as a draft")
104 , ("get", get, "Get a draft and print it as bbcode to stdout")
105 , ("write", write, "Read bbcode from stdin and overwrite an existing draft")
106 , ("del", del, "Delete a draft")
107 ]
108 draftN s = option auto (
109 long "draft"
110 <> short 'n'
111 <> metavar "INT"
112 <> help s
113 )
114 print = Print <$> print'
115 print' = PrintOptions
116 <$> option auto (
117 long "printer"
118 <> short 'p'
119 <> metavar "INT"
120 <> help "The number of the printer to use"
121 <> value 0
122 <> showDefault
123 )
124 <*> flag False True (
125 long "dry-run"
126 <> short 'd'
127 <> help "Instead of sending data to printer output the parsed stream to stderr"
128 <> showDefault
129 )
130 printD = (PrintDraft <$>) $ PrintDraftOptions
131 <$> print'
132 <*> draftN "The number of the draft to print"
133 <*> flag False True (
134 long "delete"
135 <> help "Delete the draft after printing"
136 )
137 query = (Query <$>) $ pure QueryOptions
138 add = (Add <$>) $ AddOptions
139 <$> strArgument (
140 metavar "TITLE"
141 <> help "The human readable title for the new draft"
142 )
143 get = (Get <$>) $ GetOptions
144 <$> draftN "The number of the draft to retrieve"
145 <*> flag False True (
146 long "title"
147 <> short 't'
148 <> help "Get title instead of content"
149 )
150 write = (Write <$>) $ WriteOptions
151 <$> draftN "The number of the draft to overwrite"
152 <*> optional ( strArgument (
153 metavar "TITLE"
154 <> help "The human readable title for the updated draft (defaults to retrieving the old one before overwriting)"
155 )
156 )
157 del = (Del <$>) $ DelOptions
158 <$> draftN "The number of the draft to delete"
159
160either' :: (a -> String) -> EitherT a IO b -> IO b
161either' f a = either (die . f) return =<< runEitherT a
63 162
64 main' Options{..} = do 163main' (TPrint mode TPrintOptions{..}) = do
65 let 164 let
66 print :: Integer -> Block String -> EitherT ServantError IO () 165 -- print :: Integer -> Block String -> EitherT ServantError IO ()
67 print = client thermoprintApi baseUrl 166 -- queryDrafts :: EitherT ServantError IO [(Integer, String)]
167 -- addDraft :: (String, Block String) -> EitherT ServantError IO Int64
168 -- getDraft :: Int64 -> EitherT ServantError IO (String, Block String)
169 -- writeDraft :: Int64 -> (String, Block String) -> EitherT ServantError IO Int64
170 -- delDraft :: Int64 -> EitherT ServantError IO ()
171 (print :<|> queryDrafts :<|> addDraft :<|> getDraft :<|> writeDraft :<|> delDraft) = client thermoprintApi baseUrl
172 case mode of
173 Print PrintOptions{..} -> do
68 input <- BBCode.parse `liftM` getContents 174 input <- BBCode.parse `liftM` getContents
69 input' <- either (\err -> hPutStrLn stderr ("Parse error: " ++ err) >> exitFailure) return input 175 input' <- either (die . ("Parse error: " ++)) return input
70 case dryRun of 176 case dryRun of
71 False -> do 177 False -> do
72 res <- runEitherT $ print printerId input' 178 res <- runEitherT $ print printerId input'
@@ -75,3 +181,37 @@ main = execParser opts >>= main'
75 Right _ -> exitSuccess 181 Right _ -> exitSuccess
76 True -> do 182 True -> do
77 hPutStrLn stderr $ show input' 183 hPutStrLn stderr $ show input'
184 PrintDraft PrintDraftOptions{..} -> do
185 let PrintOptions{..} = printOptions
186 (_, input) <- either' (\e -> "Error while retrieving draft: " ++ show e) $ getDraft pDraftId
187 case dryRun of
188 False -> do
189 res <- runEitherT $ print printerId input
190 case res of
191 Left err -> hPutStrLn stderr $ show err
192 Right _ -> when deleteAfter $ either' (\e -> "Error while deleting draft: " ++ show e) $ delDraft pDraftId
193 True -> do
194 hPutStrLn stderr $ show input
195 Query QueryOptions -> do
196 drafts <- either' (\e -> "Error while retrieving drafts: " ++ show e) queryDrafts
197 mapM_ (\(n, t) -> putStrLn $ "[" ++ show n ++ "]\n" ++ (unlines $ map (\s -> " " ++ s) $ lines t)) drafts
198 when (null drafts) $ hPutStrLn stderr "No drafts"
199 Add AddOptions{..} -> do
200 input <- BBCode.parse `liftM` getContents
201 input' <- either (die . ("Parse error: " ++)) return input
202 n <- either' (\e -> "Error while saving draft: " ++ show e) $ addDraft (title, input')
203 IO.print n
204 Get GetOptions{..} -> do
205 (title, draft) <- either' (\e -> "Error while retrieving draft: " ++ show e) $ getDraft gDraftId
206 case getTitle of
207 False -> putStr $ BBCode.make draft
208 True -> putStrLn title
209 Write WriteOptions{..} -> do
210 input <- BBCode.parse `liftM` getContents
211 input' <- either (die . ("Parse error: " ++)) return input
212 title <- case newTitle of
213 Just new -> return new
214 Nothing -> fst <$> (either' (\e -> "Error while retrieving draft: " ++ show e) $ getDraft wDraftId)
215 either' (\e -> "Error while overwriting draft: " ++ show e) $ writeDraft wDraftId (title, input')
216 Del DelOptions{..} -> either' (\e -> "Error while deleting draft: " ++ show e) $ delDraft dDraftId
217 _ -> undefined
diff --git a/tprint/tprint.cabal b/tprint/tprint.cabal
index a5d2a61..54cb47d 100644
--- a/tprint/tprint.cabal
+++ b/tprint/tprint.cabal
@@ -27,5 +27,6 @@ executable tprint
27 , thermoprint-servant 27 , thermoprint-servant
28 , bbcode 28 , bbcode
29 , optparse-applicative >=0.11.0 && <1 29 , optparse-applicative >=0.11.0 && <1
30 , servant >=0.4.4 && <1
30 , servant-client >=0.4.4 && <1 31 , servant-client >=0.4.4 && <1
31 , either >=4.4.1 && <5 \ No newline at end of file 32 , either >=4.4.1 && <5 \ No newline at end of file
diff --git a/tprint/tprint.nix b/tprint/tprint.nix
index cce38c4..492a643 100644
--- a/tprint/tprint.nix
+++ b/tprint/tprint.nix
@@ -2,7 +2,7 @@
2, stdenv 2, stdenv
3, base 3, base
4, thermoprint-servant, thermoprint, bbcode 4, thermoprint-servant, thermoprint, bbcode
5, optparse-applicative, servant-client 5, optparse-applicative, servant-client, servant
6}: 6}:
7mkDerivation { 7mkDerivation {
8 pname = "tprint"; 8 pname = "tprint";
@@ -12,7 +12,7 @@ mkDerivation {
12 isExecutable = true; 12 isExecutable = true;
13 executableHaskellDepends = [ base 13 executableHaskellDepends = [ base
14 thermoprint thermoprint-servant bbcode 14 thermoprint thermoprint-servant bbcode
15 optparse-applicative servant-client 15 optparse-applicative servant-client servant
16 ]; 16 ];
17 homepage = "git://git.yggdrasil.li/thermoprint"; 17 homepage = "git://git.yggdrasil.li/thermoprint";
18 description = "A cli-tool for interfacing with thermoprint-servant"; 18 description = "A cli-tool for interfacing with thermoprint-servant";