module Main where
import Penny
-- | This type contains settings for all the reports, as well as
-- default settings for the global options. Some of these can be
-- overridden on the command line.
defaults :: Runtime -> Defaults
defaults rt = Defaults
{ caseSensitive = False
-- ^ Whether the matcher is case sensitive by default
, matcher = Within
-- ^ Which matcher to use. Your choices:
-- Within
-- Exact
-- TDFA (regular expressions, POSIX semantics)
-- PCRE (regular expressions, PCRE semantics)
, colorToFile = False
-- ^ Use colors when standard output is not a terminal?
, defaultScheme = Just schemeDark
-- ^ Default color scheme. If Nothing, there is no default color
-- scheme. If there is no default color scheme and the user does
-- not pick one on the command line, no colors will be used.
, additionalSchemes = [schemeDark, schemeLight, schemePlain]
-- ^ Additional color schemes the user can pick from on the
-- command line.
, sorter = [(Date, Ascending)]
-- ^ Postings are sorted in this order by default. For example, if
-- the first pair is (Date, Ascending), then postings are first
-- sorted by date in ascending order. If the second pair is
-- (Payee, Ascending), then postings with the same date are then
-- sorted by payee.
--
-- If this list is empty, then by default postings are left in the
-- same order as they appear in the ledger files.
, balanceFormat = const defaultQtyFormat
-- ^ How to format balances in the balance report. Change this
-- function if, for example, you want to allow for digit
-- grouping. The default function does not perform digit grouping.
, balanceShowZeroBalances = False
-- ^ Show zero balances in the balance report? If True, show them;
-- if False, hide them.
, balanceOrder = Ascending
-- ^ Whether to sort the accounts in ascending or descending order
-- by account name in the balance report. Your choices: Ascending
-- or Descending.
, convertShowZeroBalances = False
-- ^ Show zero balances in the convert report? If True, show them;
-- if False, hide them.
, convertTarget = AutoTarget
-- ^ The commodity to which to convert the commodities in the
-- convert report. Your choices:
--
-- AutoTarget - selects a target commodity automatically, based on
-- which commodity is the most common target commodity in the
-- prices in your ledger files. If there is a tie for most common
-- target commodity, the target that appears later in your ledger
-- files is used.
--
-- ManualTarget CMDTY_NAME - always use the given commodity.
, convertOrder = Ascending
-- ^ Sort the convert report in ascending or descending order.
, convertSortBy = SortByName
-- ^ Sort by account or by quantity in the convert report. Your
-- choices:
--
-- SortByQty
-- SortByName
, convertFormat = const defaultQtyFormat
-- ^ How to format balances in the convert report. For instance,
-- this function might perform digit grouping. The default
-- function does not perform any digit grouping.
, postingsFields = fields
-- ^ Fields to show by default in the postings report.
, postingsWidth = widthFromRuntime rt
-- ^ The postings report is roughly this wide by default. Use
-- @widthFromRuntime rt@ if you want to use the current width of
-- your terminal.
, postingsShowZeroBalances = False
-- ^ Show zero balances in the postings report? If True, show
-- them; if False, hide them.
, postingsDateFormat = yearMonthDay
-- ^ How to format dates in the postings report.
, postingsQtyFormat = qtyAsIs
-- ^ How to format quantities in the balance report. This function
-- is used when showing the quantity for the posting itself, and
-- not the quantity for the totals columns (for that, see
-- postingsBalanceFormat.) For example this function might perform
-- digit grouping.
, postingsBalanceFormat = balanceAsIs
-- ^ How to format balance totals in the postings report.
, postingsSubAccountLength = 2
-- ^ Account names in the postings report are shortened if
-- necessary in order to help the report fit within the allotted
-- width (see postingsWidth). Account names are only shortened as
-- much as is necessary for them to fit; however, each sub-account
-- name will not be shortened any more than the amount given here.
--
-- This number should be a non-negative integer.
, postingsPayeeAllocation = 40
-- ^ postingsPayeeAllocation and postingsAccountAllocation
-- determine how much space is allotted to the payee and account
-- fields in the postings report. These fields are variable
-- width. After space for most other fields is allotted, space is
-- allotted for these two fields. The two fields divide the space
-- proportionally depending on postingsPayeeAllocation and
-- postingsAccountAllocation. For example, if
-- postingsPayeeAllocation is 60 and postingsAccountAllocation is
-- 40, then the payee field gets 60 percent of the leftover space
-- and the account field gets 40 percent of the leftover space.
--
-- Both postingsPayeeAllocation and postingsAccountAllocation
-- must be positive integers; if either one is less than 1, your
-- program will crash at runtime.
, postingsAccountAllocation = 60
-- ^ See postingsPayeeAllocation above for an explanation
, postingsSpacers = spacers
-- ^ Determines the number of spaces that appears to the right of
-- each named field; for example, sPayee indicates how many spaces
-- will appear to the right of the payee field. Each field of the
-- Spacers should be a non-negative integer (although currently
-- the absolute value of the field is taken.)
}
-- | Controls which fields appear in the report by default.
fields :: Fields Bool
fields = Fields
{ fGlobalTransaction = False
, fRevGlobalTransaction = False
, fGlobalPosting = False
, fRevGlobalPosting = False
, fFileTransaction = False
, fRevFileTransaction = False
, fFilePosting = False
, fRevFilePosting = False
, fFiltered = False
, fRevFiltered = False
, fSorted = False
, fRevSorted = False
, fVisible = False
, fRevVisible = False
, fLineNum = False
, fDate = True
, fFlag = False
, fNumber = False
, fPayee = True
, fAccount = True
, fPostingDrCr = True
, fPostingCmdty = True
, fPostingQty = True
, fTotalDrCr = True
, fTotalCmdty = True
, fTotalQty = True
, fTags = False
, fMemo = False
, fFilename = False
}
-- | Controls how many spaces appear to the right of each named field.
spacers :: Spacers Int
spacers = Spacers
{ sGlobalTransaction = 1
, sRevGlobalTransaction = 1
, sGlobalPosting = 1
, sRevGlobalPosting = 1
, sFileTransaction = 1
, sRevFileTransaction = 1
, sFilePosting = 1
, sRevFilePosting = 1
, sFiltered = 1
, sRevFiltered = 1
, sSorted = 1
, sRevSorted = 1
, sVisible = 1
, sRevVisible = 1
, sLineNum = 1
, sDate = 1
, sFlag = 1
, sNumber = 1
, sPayee = 4
, sAccount = 1
, sPostingDrCr = 1
, sPostingCmdty = 1
, sPostingQty = 1
, sTotalDrCr = 1
, sTotalCmdty = 1
}
-- | The light color scheme. You can change various values below to
-- affect the color scheme.
schemeLight :: Scheme
schemeLight = Scheme "light" "for light background terminals"
lightLabels
lightLabels :: Labels (EvenAndOdd TextSpec)
lightLabels = Labels
{ debit = EvenAndOdd { eoEven = lightDebit lightEvenTextSpec
, eoOdd = lightDebit lightOddTextSpec }
, credit = EvenAndOdd { eoEven = lightCredit lightEvenTextSpec
, eoOdd = lightCredit lightOddTextSpec }
, zero = EvenAndOdd { eoEven = lightZero lightEvenTextSpec
, eoOdd = lightZero lightOddTextSpec }
, other = EvenAndOdd { eoEven = lightEvenTextSpec
, eoOdd = lightOddTextSpec }
}
lightEvenTextSpec :: TextSpec
lightEvenTextSpec = defaultTextSpec
lightOddTextSpec :: TextSpec
lightOddTextSpec = switchBackground color8_b_default
color256_b_255 lightEvenTextSpec
lightDebit :: TextSpec -> TextSpec
lightDebit = switchForeground color8_f_magenta color256_f_52
lightCredit :: TextSpec -> TextSpec
lightCredit = switchForeground color8_f_cyan color256_f_21
lightZero :: TextSpec -> TextSpec
lightZero = switchForeground color8_f_black color256_f_0
-- | The dark color scheme. You can change various values below to
-- affect the color scheme.
schemeDark :: Scheme
schemeDark = Scheme "dark" "for dark background terminals"
darkLabels
darkLabels :: Labels (EvenAndOdd TextSpec)
darkLabels = Labels
{ debit = EvenAndOdd { eoEven = darkDebit darkEvenTextSpec
, eoOdd = darkDebit darkOddTextSpec }
, credit = EvenAndOdd { eoEven = darkCredit darkEvenTextSpec
, eoOdd = darkCredit darkOddTextSpec }
, zero = EvenAndOdd { eoEven = darkZero darkEvenTextSpec
, eoOdd = darkZero darkOddTextSpec }
, other = EvenAndOdd { eoEven = darkEvenTextSpec
, eoOdd = darkOddTextSpec }
}
darkEvenTextSpec :: TextSpec
darkEvenTextSpec = defaultTextSpec
darkOddTextSpec :: TextSpec
darkOddTextSpec = switchBackground color8_b_default
color256_b_235 darkEvenTextSpec
darkDebit :: TextSpec -> TextSpec
darkDebit = switchForeground color8_f_magenta color256_f_208
darkCredit :: TextSpec -> TextSpec
darkCredit = switchForeground color8_f_cyan color256_f_45
darkZero :: TextSpec -> TextSpec
darkZero = switchForeground color8_f_white color256_f_15
-- | Plain scheme has no colors at all.
schemePlain :: Scheme
schemePlain = Scheme "plain" "uses default terminal colors"
plainLabels
plainLabels :: Labels (EvenAndOdd TextSpec)
plainLabels = Labels
{ debit = EvenAndOdd defaultTextSpec defaultTextSpec
, credit = EvenAndOdd defaultTextSpec defaultTextSpec
, zero = EvenAndOdd defaultTextSpec defaultTextSpec
, other = EvenAndOdd defaultTextSpec defaultTextSpec
}
main :: IO ()
main = runPenny defaults