diff --git a/hledger-lib/Hledger/Data/FormatStrings.hs b/hledger-lib/Hledger/Data/OutputFormat.hs similarity index 87% rename from hledger-lib/Hledger/Data/FormatStrings.hs rename to hledger-lib/Hledger/Data/OutputFormat.hs index 8bb04abe1..bd24cc4e9 100644 --- a/hledger-lib/Hledger/Data/FormatStrings.hs +++ b/hledger-lib/Hledger/Data/OutputFormat.hs @@ -1,8 +1,8 @@ -module Hledger.Data.FormatStrings ( - parseFormatString - , formatStrings +module Hledger.Data.OutputFormat ( + parseStringFormat + , formatsp , formatValue - , FormatString(..) + , OutputFormat(..) , HledgerFormatField(..) , tests ) where @@ -25,8 +25,8 @@ formatValue leftJustified min max value = printf formatS value max' = maybe "" (\i -> "." ++ (show i)) max formatS = "%" ++ l ++ min' ++ max' ++ "s" -parseFormatString :: String -> Either String [FormatString] -parseFormatString input = case (runParser formatStrings () "(unknown)") input of +parseStringFormat :: String -> Either String [OutputFormat] +parseStringFormat input = case (runParser formatsp () "(unknown)") input of Left y -> Left $ show y Right x -> Right x @@ -43,7 +43,7 @@ field = do <|> try (string "total" >> return TotalField) <|> try (many1 digit >>= (\s -> return $ FieldNo $ read s)) -formatField :: GenParser Char st FormatString +formatField :: GenParser Char st OutputFormat formatField = do char '%' leftJustified <- optionMaybe (char '-') @@ -58,7 +58,7 @@ formatField = do Just text -> Just m where ((m,_):_) = readDec text _ -> Nothing -formatLiteral :: GenParser Char st FormatString +formatLiteral :: GenParser Char st OutputFormat formatLiteral = do s <- many1 c return $ FormatLiteral s @@ -67,23 +67,23 @@ formatLiteral = do c = (satisfy isPrintableButNotPercentage "printable character") <|> try (string "%%" >> return '%') -formatStr :: GenParser Char st FormatString -formatStr = +formatp :: GenParser Char st OutputFormat +formatp = formatField <|> formatLiteral -formatStrings :: GenParser Char st [FormatString] -formatStrings = many formatStr +formatsp :: GenParser Char st [OutputFormat] +formatsp = many formatp -testFormat :: FormatString -> String -> String -> Assertion +testFormat :: OutputFormat -> String -> String -> Assertion testFormat fs value expected = assertEqual name expected actual where (name, actual) = case fs of FormatLiteral l -> ("literal", formatValue False Nothing Nothing l) FormatField leftJustify min max _ -> ("field", formatValue leftJustify min max value) -testParser :: String -> [FormatString] -> Assertion -testParser s expected = case (parseFormatString s) of +testParser :: String -> [OutputFormat] -> Assertion +testParser s expected = case (parseStringFormat s) of Left error -> assertFailure $ show error Right actual -> assertEqual ("Input: " ++ s) expected actual diff --git a/hledger-lib/Hledger/Data/Types.hs b/hledger-lib/Hledger/Data/Types.hs index 271fbfdcc..a9bc53feb 100644 --- a/hledger-lib/Hledger/Data/Types.hs +++ b/hledger-lib/Hledger/Data/Types.hs @@ -195,7 +195,7 @@ data HledgerFormatField = | FieldNo Int deriving (Show, Eq) -data FormatString = +data OutputFormat = FormatLiteral String | FormatField Bool -- Left justified ? (Maybe Int) -- Min width diff --git a/hledger-lib/hledger-lib.cabal b/hledger-lib/hledger-lib.cabal index b3df015f7..2c0390f2b 100644 --- a/hledger-lib/hledger-lib.cabal +++ b/hledger-lib/hledger-lib.cabal @@ -39,7 +39,7 @@ library Hledger.Data.Amount Hledger.Data.Commodity Hledger.Data.Dates - Hledger.Data.FormatStrings + Hledger.Data.OutputFormat Hledger.Data.Journal Hledger.Data.Ledger Hledger.Data.Posting diff --git a/hledger/Hledger/Cli/Balance.hs b/hledger/Hledger/Cli/Balance.hs index af24425be..4480ff040 100644 --- a/hledger/Hledger/Cli/Balance.hs +++ b/hledger/Hledger/Cli/Balance.hs @@ -250,7 +250,7 @@ import Text.Tabular.AsciiArt import Hledger import Prelude hiding (putStr) import Hledger.Utils.UTF8IOCompat (putStr) -import Hledger.Data.FormatStrings +import Hledger.Data.OutputFormat import Hledger.Cli.Options @@ -309,7 +309,7 @@ This implementation turned out to be a bit convoluted but implements the followi b USD -1 ; Account 'b' has two amounts. The account name is printed on the last line. -} -- | Render one balance report line item as plain text suitable for console output. -balanceReportItemAsText :: ReportOpts -> [FormatString] -> BalanceReportItem -> [String] +balanceReportItemAsText :: ReportOpts -> [OutputFormat] -> BalanceReportItem -> [String] balanceReportItemAsText opts format (_, accountName, depth, Mixed amounts) = -- 'amounts' could contain several quantities of the same commodity with different price. -- In order to combine them into single value (which is expected) we take the first price and @@ -325,7 +325,7 @@ balanceReportItemAsText opts format (_, accountName, depth, Mixed amounts) = multiline [a] = [formatBalanceReportItem opts (Just accountName) depth a format] multiline (a:as) = (formatBalanceReportItem opts Nothing depth a format) : multiline as -formatBalanceReportItem :: ReportOpts -> Maybe AccountName -> Int -> Amount -> [FormatString] -> String +formatBalanceReportItem :: ReportOpts -> Maybe AccountName -> Int -> Amount -> [OutputFormat] -> String formatBalanceReportItem _ _ _ _ [] = "" formatBalanceReportItem opts accountName depth amount (fmt:fmts) = s ++ (formatBalanceReportItem opts accountName depth amount fmts) diff --git a/hledger/Hledger/Cli/Options.hs b/hledger/Hledger/Cli/Options.hs index 1146ec2cf..82bd146c4 100644 --- a/hledger/Hledger/Cli/Options.hs +++ b/hledger/Hledger/Cli/Options.hs @@ -104,7 +104,7 @@ import Text.ParserCombinators.Parsec as P import Text.Printf import Hledger -import Hledger.Data.FormatStrings as Format +import Hledger.Data.OutputFormat as OutputFormat import Hledger.Cli.Version -- @@ -638,12 +638,12 @@ balancetypeopt rawopts -- | Parse the format option if provided, possibly returning an error, -- otherwise get the default value. -formatFromOpts :: ReportOpts -> Either String [FormatString] -formatFromOpts = maybe (Right defaultBalanceFormatString) parseFormatString . format_ +formatFromOpts :: ReportOpts -> Either String [OutputFormat] +formatFromOpts = maybe (Right defaultBalanceFormat) parseStringFormat . format_ -- | Default line format for balance report: "%20(total) %2(depth_spacer)%-(account)" -defaultBalanceFormatString :: [FormatString] -defaultBalanceFormatString = [ +defaultBalanceFormat :: [OutputFormat] +defaultBalanceFormat = [ FormatField False (Just 20) Nothing TotalField , FormatLiteral " " , FormatField True (Just 2) Nothing DepthSpacerField