我正在尝试构建一个 CLI 食品日记应用程序。
这是我希望解析用户输入的数据类型。
data JournalCommand =
JournalSearch Query DataTypes Ingridents BrandOwnder PageNumber
| JournalReport Query DataTypes Ingridents BrandOwnder PageNumber ResultNumber
| JournalDisplay FromDate ToDate ResultNumber
| JournalStoreSearch Query DataTypes Ingridents BrandOwnder PageNumber ResultNumber StoreFlag
| JournalStoreCustom CustomEntry OnDate StoreFlag
| JournalDelete FromDate ToDate ResultNumber
| JournalEdit CustomEntry ResultNumber
deriving (Show, Eq)
而且因为有很多重叠,所以我总共有 8 个Parser a
类型的函数。
像这样的功能
-- | Search Query
aQueryParser :: Parser String
aQueryParser = strOption
( long "search"
<> short 's'
<> help "Search for a term in the database"
)
如果最终有这样的功能的想法
runJournal :: JournalCommand -> MT SomeError IO ()
runJournal = \case
JournalSearch q d i b p
-> runSearch q d i b p
JournalReport q d i b p r
-> runSearchAndReport q d i b p r
...
...
MT
可以处理error
+的单子转换器在哪里IO
?还不确定。
问题是:如何设置parseArgs
功能
parseArgs :: IO JournalCommand
parseArgs = execParser ...
和parser
功能
parser :: Parser JournalCommand
parser = ...
这样我就可以解析用户输入JournalCommand
,然后将数据返回给相关函数。
我知道我可以fmap
这样的数据类型
data JournalDisplay { jdFromDate :: UTCTime
, jdToDate :: UTCTime
, jdResultNumber :: Maybe Int
}
作为
JournalDisplay
<$>
fromDateParser
<*>
toDateParser
<*>
optional resultNumberParser
但是我不确定如何使用我的原始数据结构来做到这一点。
我想我需要一个这样的列表[Mod CommandFields JournalCommand]
,我可以subparser
通过连接列表来传递给函数Mod
。我不完全确定。