hledger/hledger-lib/Hledger/Data/RawOptions.hs

131 lines
4.6 KiB
Haskell
Raw Normal View History

2014-03-26 04:10:30 +04:00
{-|
hledger's cmdargs modes parse command-line arguments to an
intermediate format, RawOpts (an association list), rather than a
fixed ADT like CliOpts. This allows the modes and flags to be reused
more easily by hledger commands/scripts in this and other packages.
-}
module Hledger.Data.RawOptions (
RawOpts,
setopt,
setboolopt,
appendopts,
2014-03-26 04:10:30 +04:00
inRawOpts,
boolopt,
choiceopt,
collectopts,
2014-03-26 04:10:30 +04:00
stringopt,
maybestringopt,
listofstringopt,
intopt,
posintopt,
csv: merge lucamolteni's cassava/custom separators (squashed) (#829) commit 5ba464de761b298e50d57a8b7d14bc28adb30d5d Author: Luca Molteni <volothamp@gmail.com> Date: Fri Sep 7 17:54:12 2018 +0200 Fix CI 2 commit f060ae9449f4b61a915b0ed4629fc1ba9b66fb4a Author: Luca Molteni <volothamp@gmail.com> Date: Fri Sep 7 17:30:08 2018 +0200 Fix CI build commit af0719a33b9b72ad244ae80198d881a1f7145e9d Author: Luca Molteni <volothamp@gmail.com> Date: Fri Sep 7 17:19:01 2018 +0200 Fix rebase commit 1a24ddfa54dfb4ff1326e1a51005ffa82d3dc3c8 Author: Luca Molteni <volothamp@gmail.com> Date: Fri Aug 10 16:25:24 2018 +0200 Fixed some GHC warnings commit 1ac43398a359b5925ef71f53347698f1c6c510ef Author: Luca Molteni <volothamp@gmail.com> Date: Fri Aug 10 16:14:49 2018 +0200 Fix .cabal commit 422456b925d8aa4ab3e869f51e98c2b1c3dcde0a Author: Luca Molteni <volothamp@gmail.com> Date: Sun Jul 1 22:56:20 2018 +0200 Removed to-do list commit 1118b762e4fd15c4fe7ba48ba86676706ea3a5a5 Author: Luca Molteni <volothamp@gmail.com> Date: Sun Jul 1 22:53:28 2018 +0200 Better test commit 1146ed0941655668bf7684f18aa15c5f4b9b20c2 Author: Luca Molteni <volothamp@gmail.com> Date: Sun Jul 1 15:32:28 2018 +0200 Fix parsing commit 4fc2374b2b81802990da30c96756aab54d77399c Author: Luca Molteni <volothamp@gmail.com> Date: Thu Jun 21 22:11:11 2018 +0200 Parsing of separator commit f7a61737f1ad4460ba20ca9b2e86eb21468abb33 Author: Luca Molteni <volothamp@gmail.com> Date: Thu Jun 21 14:29:23 2018 +0200 Almost separator in options commit ac8841cf3b9c80914bc3271ad9b9ff4ae9ba48a7 Author: Luca Molteni <volothamp@gmail.com> Date: Thu Jun 21 14:16:59 2018 +0200 Separator in parseCSV commit 92a8b9f6ba77ea4237f769641e03029ac88542ea Author: Luca Molteni <volothamp@gmail.com> Date: Thu Jun 21 13:30:41 2018 +0200 separator option commit ec417a81ae625647cf35e61776cdf02bdb2c6aea Author: Luca Molteni <volothamp@gmail.com> Date: Thu Jun 21 10:45:26 2018 +0200 Removed one qualified import commit 8b2f386c2f780adcd34cff3de7edceacc1d325a7 Author: Luca Molteni <volothamp@gmail.com> Date: Wed Jun 20 14:01:12 2018 +0200 Removed string conversions commit a14d0e099e28a286bb81770cfc9cb8f5c7e5cf1f Author: Luca Molteni <volothamp@gmail.com> Date: Wed Jun 20 10:23:20 2018 +0200 custom delimiter in cassava commit 694d48e2bc1ada0037b90367c017f3082f68ed45 Author: Luca Molteni <volothamp@gmail.com> Date: Sun Jun 10 17:51:54 2018 +0200 Use Text.getContents - remove UTF-8 compatibility library commit a7ada2cc60033ebdd796ca34cc2ec69a4f387843 Author: Luca Molteni <volothamp@gmail.com> Date: Sun Jun 10 17:49:34 2018 +0200 todo list commit 58ec47d3987909f6bace50e3e647e30dadd5bf03 Author: Luca Molteni <volothamp@gmail.com> Date: Sun Jun 10 17:45:22 2018 +0200 CSV test now has unicode characters commit b7851e94c3f1683b63ec7250a12bcde3b7bed691 Author: Luca Molteni <volothamp@gmail.com> Date: Sun Jun 10 16:59:39 2018 +0200 Use decode from Text commit 79f59fd28ccaca08fcd718fcd8d00b1c1d65d7e1 Author: Luca Molteni <volothamp@gmail.com> Date: Sun Jun 10 13:28:57 2018 +0200 Use Text and Lazy Bytestring commit 470c9bcb8dc00669beb4ef0303a1e7d9f7aecc89 Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 15:30:22 2018 +0200 Use megaparsec error commit f978848ba249ef4f67b855bea5d4e549290c205c Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 15:22:07 2018 +0200 Renamed qualify and remove Parsec commit 152587fde204c43a55798d212e43f37cd3038c2e Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 15:12:36 2018 +0200 Use cassava mega parsec commit cf281577a3d3a071196484a6fc8485f2ea1f7d67 Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 14:01:47 2018 +0200 Removed Data.Vector commit 1272e8e758369d8cc5778029a705b277355a5029 Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 12:16:18 2018 +0200 Removed Parsec ParseError commit ae07f043135a19307fd65b281ade37a74c76acb2 Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 12:06:14 2018 +0200 Type sinonim for ParsecError commit 8e15b253c11bd1c0c35a7641aeb18aa54e0ba9b0 Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 11:16:08 2018 +0200 Replaced with typeclasses commit 1ed46f9c175603611325f3d377004e4b85f29377 Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 11:01:33 2018 +0200 Replaced Text/CSV with Cassava commit 362f4111b5854145703174b976fc7acbd71b8783 Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 10:34:37 2018 +0200 Use cassava parsin instead of Text/CSV commit 83e678e371618687cf7c15a4e2cfa67f570b6b64 Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 08:22:51 2018 +0200 Text CSV error messages commit f922df71d274beeacab9fb2530b16c97f005cc08 Author: Luca Molteni <volothamp@gmail.com> Date: Fri Jun 8 21:45:20 2018 +0200 Better types commit edd130781c84790a53bff2283e6041eb8232e7cf Author: Luca Molteni <volothamp@gmail.com> Date: Fri Jun 8 21:34:59 2018 +0200 Conversion to Text CSV type commit 0799383214483018ad2d977a3c8022414959c2b2 Author: Luca Molteni <volothamp@gmail.com> Date: Fri Jun 8 16:06:21 2018 +0200 First function with cassava commit e92aeb151ff527b383ff3d0ced7764e81b71af82 Author: Luca Molteni <volothamp@gmail.com> Date: Fri Jun 8 13:47:34 2018 +0200 Added cassava as dependency commit 5ea005c558a3939af7e5f0cd735a9b4da931228e Author: Luca Molteni <volothamp@gmail.com> Date: Fri Jun 8 13:18:47 2018 +0200 Better .gitignore for multi idea modules
2018-09-07 20:12:13 +03:00
maybeintopt,
maybeposintopt,
maybecharopt,
overRawOpts
2014-03-26 04:10:30 +04:00
)
where
import Data.Maybe (fromMaybe, isJust, mapMaybe)
import Data.Default (Default(..))
import Safe (headMay, lastMay, readDef)
2014-03-26 04:10:30 +04:00
import Hledger.Utils
-- | The result of running cmdargs: an association list of option names to string values.
newtype RawOpts = RawOpts { unRawOpts :: [(String,String)] }
deriving (Show)
instance Default RawOpts where def = RawOpts []
overRawOpts f = RawOpts . f . unRawOpts
2014-03-26 04:10:30 +04:00
setopt :: String -> String -> RawOpts -> RawOpts
setopt name val = overRawOpts (++ [(name, val)])
2014-03-26 04:10:30 +04:00
setboolopt :: String -> RawOpts -> RawOpts
setboolopt name = overRawOpts (++ [(name,"")])
2014-03-26 04:10:30 +04:00
appendopts :: [(String,String)] -> RawOpts -> RawOpts
appendopts new = overRawOpts $ \old -> concat [old,new]
2014-03-26 04:10:30 +04:00
-- | Is the named option present ?
inRawOpts :: String -> RawOpts -> Bool
inRawOpts name = isJust . lookup name . unRawOpts
2014-03-26 04:10:30 +04:00
boolopt :: String -> RawOpts -> Bool
boolopt = inRawOpts
2019-11-24 00:03:26 +03:00
-- | From a list of RawOpts, get the last one (ie the right-most on the command line)
-- for which the given predicate returns a Just value.
-- Useful for exclusive choice flags like --daily|--weekly|--quarterly...
--
-- >>> import Safe (readMay)
-- >>> choiceopt Just (RawOpts [("a",""), ("b",""), ("c","")])
-- Just "c"
-- >>> choiceopt (const Nothing) (RawOpts [("a","")])
-- Nothing
2019-11-19 22:43:19 +03:00
-- >>> choiceopt readMay (RawOpts [("LT",""),("EQ",""),("Neither","")]) :: Maybe Ordering
-- Just EQ
choiceopt :: (String -> Maybe a) -- ^ "parser" that returns 'Just' value for valid choice
-> RawOpts -- ^ actual options where to look for flag
-> Maybe a -- ^ exclusive choice among those returned as 'Just' from "parser"
choiceopt f = lastMay . collectopts (f . fst)
-- | Collects processed and filtered list of options preserving their order
--
-- >>> collectopts (const Nothing) (RawOpts [("x","")])
-- []
-- >>> collectopts Just (RawOpts [("a",""),("b","")])
-- [("a",""),("b","")]
collectopts :: ((String, String) -> Maybe a) -> RawOpts -> [a]
collectopts f = mapMaybe f . unRawOpts
2014-03-26 04:10:30 +04:00
maybestringopt :: String -> RawOpts -> Maybe String
maybestringopt name = lookup name . reverse . unRawOpts
2014-03-26 04:10:30 +04:00
stringopt :: String -> RawOpts -> String
stringopt name = fromMaybe "" . maybestringopt name
csv: merge lucamolteni's cassava/custom separators (squashed) (#829) commit 5ba464de761b298e50d57a8b7d14bc28adb30d5d Author: Luca Molteni <volothamp@gmail.com> Date: Fri Sep 7 17:54:12 2018 +0200 Fix CI 2 commit f060ae9449f4b61a915b0ed4629fc1ba9b66fb4a Author: Luca Molteni <volothamp@gmail.com> Date: Fri Sep 7 17:30:08 2018 +0200 Fix CI build commit af0719a33b9b72ad244ae80198d881a1f7145e9d Author: Luca Molteni <volothamp@gmail.com> Date: Fri Sep 7 17:19:01 2018 +0200 Fix rebase commit 1a24ddfa54dfb4ff1326e1a51005ffa82d3dc3c8 Author: Luca Molteni <volothamp@gmail.com> Date: Fri Aug 10 16:25:24 2018 +0200 Fixed some GHC warnings commit 1ac43398a359b5925ef71f53347698f1c6c510ef Author: Luca Molteni <volothamp@gmail.com> Date: Fri Aug 10 16:14:49 2018 +0200 Fix .cabal commit 422456b925d8aa4ab3e869f51e98c2b1c3dcde0a Author: Luca Molteni <volothamp@gmail.com> Date: Sun Jul 1 22:56:20 2018 +0200 Removed to-do list commit 1118b762e4fd15c4fe7ba48ba86676706ea3a5a5 Author: Luca Molteni <volothamp@gmail.com> Date: Sun Jul 1 22:53:28 2018 +0200 Better test commit 1146ed0941655668bf7684f18aa15c5f4b9b20c2 Author: Luca Molteni <volothamp@gmail.com> Date: Sun Jul 1 15:32:28 2018 +0200 Fix parsing commit 4fc2374b2b81802990da30c96756aab54d77399c Author: Luca Molteni <volothamp@gmail.com> Date: Thu Jun 21 22:11:11 2018 +0200 Parsing of separator commit f7a61737f1ad4460ba20ca9b2e86eb21468abb33 Author: Luca Molteni <volothamp@gmail.com> Date: Thu Jun 21 14:29:23 2018 +0200 Almost separator in options commit ac8841cf3b9c80914bc3271ad9b9ff4ae9ba48a7 Author: Luca Molteni <volothamp@gmail.com> Date: Thu Jun 21 14:16:59 2018 +0200 Separator in parseCSV commit 92a8b9f6ba77ea4237f769641e03029ac88542ea Author: Luca Molteni <volothamp@gmail.com> Date: Thu Jun 21 13:30:41 2018 +0200 separator option commit ec417a81ae625647cf35e61776cdf02bdb2c6aea Author: Luca Molteni <volothamp@gmail.com> Date: Thu Jun 21 10:45:26 2018 +0200 Removed one qualified import commit 8b2f386c2f780adcd34cff3de7edceacc1d325a7 Author: Luca Molteni <volothamp@gmail.com> Date: Wed Jun 20 14:01:12 2018 +0200 Removed string conversions commit a14d0e099e28a286bb81770cfc9cb8f5c7e5cf1f Author: Luca Molteni <volothamp@gmail.com> Date: Wed Jun 20 10:23:20 2018 +0200 custom delimiter in cassava commit 694d48e2bc1ada0037b90367c017f3082f68ed45 Author: Luca Molteni <volothamp@gmail.com> Date: Sun Jun 10 17:51:54 2018 +0200 Use Text.getContents - remove UTF-8 compatibility library commit a7ada2cc60033ebdd796ca34cc2ec69a4f387843 Author: Luca Molteni <volothamp@gmail.com> Date: Sun Jun 10 17:49:34 2018 +0200 todo list commit 58ec47d3987909f6bace50e3e647e30dadd5bf03 Author: Luca Molteni <volothamp@gmail.com> Date: Sun Jun 10 17:45:22 2018 +0200 CSV test now has unicode characters commit b7851e94c3f1683b63ec7250a12bcde3b7bed691 Author: Luca Molteni <volothamp@gmail.com> Date: Sun Jun 10 16:59:39 2018 +0200 Use decode from Text commit 79f59fd28ccaca08fcd718fcd8d00b1c1d65d7e1 Author: Luca Molteni <volothamp@gmail.com> Date: Sun Jun 10 13:28:57 2018 +0200 Use Text and Lazy Bytestring commit 470c9bcb8dc00669beb4ef0303a1e7d9f7aecc89 Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 15:30:22 2018 +0200 Use megaparsec error commit f978848ba249ef4f67b855bea5d4e549290c205c Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 15:22:07 2018 +0200 Renamed qualify and remove Parsec commit 152587fde204c43a55798d212e43f37cd3038c2e Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 15:12:36 2018 +0200 Use cassava mega parsec commit cf281577a3d3a071196484a6fc8485f2ea1f7d67 Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 14:01:47 2018 +0200 Removed Data.Vector commit 1272e8e758369d8cc5778029a705b277355a5029 Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 12:16:18 2018 +0200 Removed Parsec ParseError commit ae07f043135a19307fd65b281ade37a74c76acb2 Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 12:06:14 2018 +0200 Type sinonim for ParsecError commit 8e15b253c11bd1c0c35a7641aeb18aa54e0ba9b0 Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 11:16:08 2018 +0200 Replaced with typeclasses commit 1ed46f9c175603611325f3d377004e4b85f29377 Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 11:01:33 2018 +0200 Replaced Text/CSV with Cassava commit 362f4111b5854145703174b976fc7acbd71b8783 Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 10:34:37 2018 +0200 Use cassava parsin instead of Text/CSV commit 83e678e371618687cf7c15a4e2cfa67f570b6b64 Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 08:22:51 2018 +0200 Text CSV error messages commit f922df71d274beeacab9fb2530b16c97f005cc08 Author: Luca Molteni <volothamp@gmail.com> Date: Fri Jun 8 21:45:20 2018 +0200 Better types commit edd130781c84790a53bff2283e6041eb8232e7cf Author: Luca Molteni <volothamp@gmail.com> Date: Fri Jun 8 21:34:59 2018 +0200 Conversion to Text CSV type commit 0799383214483018ad2d977a3c8022414959c2b2 Author: Luca Molteni <volothamp@gmail.com> Date: Fri Jun 8 16:06:21 2018 +0200 First function with cassava commit e92aeb151ff527b383ff3d0ced7764e81b71af82 Author: Luca Molteni <volothamp@gmail.com> Date: Fri Jun 8 13:47:34 2018 +0200 Added cassava as dependency commit 5ea005c558a3939af7e5f0cd735a9b4da931228e Author: Luca Molteni <volothamp@gmail.com> Date: Fri Jun 8 13:18:47 2018 +0200 Better .gitignore for multi idea modules
2018-09-07 20:12:13 +03:00
maybecharopt :: String -> RawOpts -> Maybe Char
maybecharopt name (RawOpts rawopts) = lookup name rawopts >>= headMay
csv: merge lucamolteni's cassava/custom separators (squashed) (#829) commit 5ba464de761b298e50d57a8b7d14bc28adb30d5d Author: Luca Molteni <volothamp@gmail.com> Date: Fri Sep 7 17:54:12 2018 +0200 Fix CI 2 commit f060ae9449f4b61a915b0ed4629fc1ba9b66fb4a Author: Luca Molteni <volothamp@gmail.com> Date: Fri Sep 7 17:30:08 2018 +0200 Fix CI build commit af0719a33b9b72ad244ae80198d881a1f7145e9d Author: Luca Molteni <volothamp@gmail.com> Date: Fri Sep 7 17:19:01 2018 +0200 Fix rebase commit 1a24ddfa54dfb4ff1326e1a51005ffa82d3dc3c8 Author: Luca Molteni <volothamp@gmail.com> Date: Fri Aug 10 16:25:24 2018 +0200 Fixed some GHC warnings commit 1ac43398a359b5925ef71f53347698f1c6c510ef Author: Luca Molteni <volothamp@gmail.com> Date: Fri Aug 10 16:14:49 2018 +0200 Fix .cabal commit 422456b925d8aa4ab3e869f51e98c2b1c3dcde0a Author: Luca Molteni <volothamp@gmail.com> Date: Sun Jul 1 22:56:20 2018 +0200 Removed to-do list commit 1118b762e4fd15c4fe7ba48ba86676706ea3a5a5 Author: Luca Molteni <volothamp@gmail.com> Date: Sun Jul 1 22:53:28 2018 +0200 Better test commit 1146ed0941655668bf7684f18aa15c5f4b9b20c2 Author: Luca Molteni <volothamp@gmail.com> Date: Sun Jul 1 15:32:28 2018 +0200 Fix parsing commit 4fc2374b2b81802990da30c96756aab54d77399c Author: Luca Molteni <volothamp@gmail.com> Date: Thu Jun 21 22:11:11 2018 +0200 Parsing of separator commit f7a61737f1ad4460ba20ca9b2e86eb21468abb33 Author: Luca Molteni <volothamp@gmail.com> Date: Thu Jun 21 14:29:23 2018 +0200 Almost separator in options commit ac8841cf3b9c80914bc3271ad9b9ff4ae9ba48a7 Author: Luca Molteni <volothamp@gmail.com> Date: Thu Jun 21 14:16:59 2018 +0200 Separator in parseCSV commit 92a8b9f6ba77ea4237f769641e03029ac88542ea Author: Luca Molteni <volothamp@gmail.com> Date: Thu Jun 21 13:30:41 2018 +0200 separator option commit ec417a81ae625647cf35e61776cdf02bdb2c6aea Author: Luca Molteni <volothamp@gmail.com> Date: Thu Jun 21 10:45:26 2018 +0200 Removed one qualified import commit 8b2f386c2f780adcd34cff3de7edceacc1d325a7 Author: Luca Molteni <volothamp@gmail.com> Date: Wed Jun 20 14:01:12 2018 +0200 Removed string conversions commit a14d0e099e28a286bb81770cfc9cb8f5c7e5cf1f Author: Luca Molteni <volothamp@gmail.com> Date: Wed Jun 20 10:23:20 2018 +0200 custom delimiter in cassava commit 694d48e2bc1ada0037b90367c017f3082f68ed45 Author: Luca Molteni <volothamp@gmail.com> Date: Sun Jun 10 17:51:54 2018 +0200 Use Text.getContents - remove UTF-8 compatibility library commit a7ada2cc60033ebdd796ca34cc2ec69a4f387843 Author: Luca Molteni <volothamp@gmail.com> Date: Sun Jun 10 17:49:34 2018 +0200 todo list commit 58ec47d3987909f6bace50e3e647e30dadd5bf03 Author: Luca Molteni <volothamp@gmail.com> Date: Sun Jun 10 17:45:22 2018 +0200 CSV test now has unicode characters commit b7851e94c3f1683b63ec7250a12bcde3b7bed691 Author: Luca Molteni <volothamp@gmail.com> Date: Sun Jun 10 16:59:39 2018 +0200 Use decode from Text commit 79f59fd28ccaca08fcd718fcd8d00b1c1d65d7e1 Author: Luca Molteni <volothamp@gmail.com> Date: Sun Jun 10 13:28:57 2018 +0200 Use Text and Lazy Bytestring commit 470c9bcb8dc00669beb4ef0303a1e7d9f7aecc89 Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 15:30:22 2018 +0200 Use megaparsec error commit f978848ba249ef4f67b855bea5d4e549290c205c Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 15:22:07 2018 +0200 Renamed qualify and remove Parsec commit 152587fde204c43a55798d212e43f37cd3038c2e Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 15:12:36 2018 +0200 Use cassava mega parsec commit cf281577a3d3a071196484a6fc8485f2ea1f7d67 Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 14:01:47 2018 +0200 Removed Data.Vector commit 1272e8e758369d8cc5778029a705b277355a5029 Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 12:16:18 2018 +0200 Removed Parsec ParseError commit ae07f043135a19307fd65b281ade37a74c76acb2 Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 12:06:14 2018 +0200 Type sinonim for ParsecError commit 8e15b253c11bd1c0c35a7641aeb18aa54e0ba9b0 Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 11:16:08 2018 +0200 Replaced with typeclasses commit 1ed46f9c175603611325f3d377004e4b85f29377 Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 11:01:33 2018 +0200 Replaced Text/CSV with Cassava commit 362f4111b5854145703174b976fc7acbd71b8783 Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 10:34:37 2018 +0200 Use cassava parsin instead of Text/CSV commit 83e678e371618687cf7c15a4e2cfa67f570b6b64 Author: Luca Molteni <volothamp@gmail.com> Date: Sat Jun 9 08:22:51 2018 +0200 Text CSV error messages commit f922df71d274beeacab9fb2530b16c97f005cc08 Author: Luca Molteni <volothamp@gmail.com> Date: Fri Jun 8 21:45:20 2018 +0200 Better types commit edd130781c84790a53bff2283e6041eb8232e7cf Author: Luca Molteni <volothamp@gmail.com> Date: Fri Jun 8 21:34:59 2018 +0200 Conversion to Text CSV type commit 0799383214483018ad2d977a3c8022414959c2b2 Author: Luca Molteni <volothamp@gmail.com> Date: Fri Jun 8 16:06:21 2018 +0200 First function with cassava commit e92aeb151ff527b383ff3d0ced7764e81b71af82 Author: Luca Molteni <volothamp@gmail.com> Date: Fri Jun 8 13:47:34 2018 +0200 Added cassava as dependency commit 5ea005c558a3939af7e5f0cd735a9b4da931228e Author: Luca Molteni <volothamp@gmail.com> Date: Fri Jun 8 13:18:47 2018 +0200 Better .gitignore for multi idea modules
2018-09-07 20:12:13 +03:00
2014-03-26 04:10:30 +04:00
listofstringopt :: String -> RawOpts -> [String]
listofstringopt name (RawOpts rawopts) = [v | (k,v) <- rawopts, k==name]
2014-03-26 04:10:30 +04:00
-- | Reads the named option's Int argument, if it is present.
-- An argument that is too small or too large will raise an error.
2014-03-26 04:10:30 +04:00
maybeintopt :: String -> RawOpts -> Maybe Int
maybeintopt = maybeclippedintopt minBound maxBound
2014-03-26 04:10:30 +04:00
-- | Reads the named option's natural-number argument, if it is present.
-- An argument that is negative or too large will raise an error.
maybeposintopt :: String -> RawOpts -> Maybe Int
maybeposintopt = maybeclippedintopt 0 maxBound
-- | Reads the named option's Int argument. If not present it will
-- return 0. An argument that is too small or too large will raise an error.
2014-03-26 04:10:30 +04:00
intopt :: String -> RawOpts -> Int
intopt name = fromMaybe 0 . maybeintopt name
-- | Reads the named option's natural-number argument. If not present it will
-- return 0. An argument that is negative or too large will raise an error.
posintopt :: String -> RawOpts -> Int
posintopt name = fromMaybe 0 . maybeposintopt name
-- | Reads the named option's Int argument, if it is present. An argument
-- that does not fit within the given bounds will raise an error.
maybeclippedintopt :: Int -> Int -> String -> RawOpts -> Maybe Int
maybeclippedintopt minVal maxVal name =
fmap (intOrError . readOrError) . maybestringopt name
where
readOrError s = readDef (usageError $ "could not parse " ++ name ++ " number: " ++ s) s
intOrError n | n >= toInteger minVal && n <= toInteger maxVal = fromInteger n
| otherwise = usageError $ "argument to " ++ name
++ " must lie in the range "
++ show minVal ++ " to " ++ show maxVal
++ ", but is " ++ show n