module Penny.Cabin.Posts (
defaultPostsReport
, customPostsReport
, O.T(..)
, O.ReportWidth(..)
, O.ymd, O.qtyAsIs, O.balanceAsIs, O.defaultWidth
, O.columnsVarToWidth, O.defaultOptions, O.widthFromRuntime
, O.defaultFields
) where
import Control.Applicative ((<$>))
import qualified Control.Monad.Exception.Synchronous as Ex
import qualified Data.Text as X
import qualified Data.Text.Lazy as XL
import qualified Penny.Cabin.Chunk as Chk
import qualified Penny.Cabin.Interface as I
import qualified Penny.Cabin.Posts.Options as O
import qualified Penny.Cabin.Posts.Meta as M
import Penny.Cabin.Posts.Chunk (makeChunk)
import Penny.Cabin.Posts.Parser (parseOptions)
import Penny.Cabin.Posts.Help (help)
import qualified Penny.Copper as C
import qualified Penny.Lincoln as L
import qualified Penny.Liberty as Ly
import qualified Penny.Shield as S
import System.Console.MultiArg.Prim (Parser)
import Text.Matchers.Text (CaseSensitive)
defaultPostsReport ::
C.DefaultTimeZone
-> C.RadGroup
-> I.Report
defaultPostsReport dtz rg = makeReport f where
f = parseReportOpts (\rt -> O.defaultOptions dtz rg rt)
customPostsReport ::
(S.Runtime -> O.T)
-> I.Report
customPostsReport = makeReport . parseReportOpts
makeReport ::
Parser I.ReportFunc
-> I.Report
makeReport f =
I.Report { I.help = help
, I.name = "posts"
, I.parseReport = f }
type Factory = CaseSensitive -> X.Text
-> Ex.Exceptional X.Text (X.Text -> Bool)
parseReportOpts ::
(S.Runtime -> O.T)
-> Parser (S.Runtime
-> CaseSensitive
-> Factory
-> [L.Box Ly.LibertyMeta]
-> a
-> Ex.Exceptional X.Text XL.Text)
parseReportOpts frt = do
getOpts <- parseOptions
let f rt cs fty bs _ = do
let optsDefault = frt rt
optsInit = optsDefault { O.sensitive = cs
, O.factory = fty }
optsParsed <- case getOpts rt optsInit of
Ex.Exception e -> Ex.throw . X.pack . show $ e
Ex.Success g -> return g
makeReportTxt optsParsed bs
return f
makeReportTxt ::
O.T
-> [L.Box Ly.LibertyMeta]
-> Ex.Exceptional X.Text XL.Text
makeReportTxt op bs = fmap mkText postMetaBoxes
where
e = X.pack "posts report: filter expression parse failure"
postMetaBoxes = Ex.fromMaybe e (filterAndAssignMeta op bs)
mkText = Chk.chunksToText (O.colorPref op) . makeChunk op
filterAndAssignMeta ::
O.T
-> [L.Box Ly.LibertyMeta]
-> Maybe [L.Box M.PostMeta]
filterAndAssignMeta op bs =
M.addMetadata (O.showZeroBalances op)
<$> M.filterBoxes (O.tokens op) (O.postFilter op) bs