;csv: refactor transactionFromCsvRecord, extract those helpers
This commit is contained in:
parent
6f08eed719
commit
f2767477ab
@ -742,35 +742,40 @@ type CsvRecord = [String]
|
|||||||
showRules rules record =
|
showRules rules record =
|
||||||
unlines $ catMaybes [ (("the "++fld++" rule is: ")++) <$> getEffectiveAssignment rules record fld | fld <- journalfieldnames]
|
unlines $ catMaybes [ (("the "++fld++" rule is: ")++) <$> getEffectiveAssignment rules record fld | fld <- journalfieldnames]
|
||||||
|
|
||||||
|
-- | Look up the value (template) of a csv rule by rule keyword.
|
||||||
|
csvRule :: CsvRules -> DirectiveName -> Maybe FieldTemplate
|
||||||
|
csvRule rules = (`getDirective` rules)
|
||||||
|
|
||||||
|
-- | Look up the final value assigned to a csv rule by rule keyword, taking
|
||||||
|
-- into account the current record and conditional rules.
|
||||||
|
-- Generally rules with keywords ("directives") don't have interpolated
|
||||||
|
-- values, but for now it's possible.
|
||||||
|
csvRuleValue :: CsvRules -> CsvRecord -> DirectiveName -> Maybe String
|
||||||
|
csvRuleValue rules record = fmap (renderTemplate rules record) . csvRule rules
|
||||||
|
|
||||||
|
-- | Look up the value template assigned to a hledger field by field
|
||||||
|
-- list/field assignment rules, taking into account the current record and
|
||||||
|
-- conditional rules.
|
||||||
|
hledgerField :: CsvRules -> CsvRecord -> HledgerFieldName -> Maybe FieldTemplate
|
||||||
|
hledgerField = getEffectiveAssignment
|
||||||
|
|
||||||
|
-- | Look up the final value assigned to a hledger field, with csv field
|
||||||
|
-- references interpolated.
|
||||||
|
hledgerFieldValue :: CsvRules -> CsvRecord -> HledgerFieldName -> Maybe String
|
||||||
|
hledgerFieldValue rules record = fmap (renderTemplate rules record) . hledgerField rules record
|
||||||
|
|
||||||
|
s `withDefault` def = if null s then def else s
|
||||||
|
|
||||||
-- warning: 200 line beast ahead
|
-- warning: 200 line beast ahead
|
||||||
transactionFromCsvRecord :: SourcePos -> CsvRules -> CsvRecord -> Transaction
|
transactionFromCsvRecord :: SourcePos -> CsvRules -> CsvRecord -> Transaction
|
||||||
transactionFromCsvRecord sourcepos rules record = t
|
transactionFromCsvRecord sourcepos rules record = t
|
||||||
where
|
where
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
-- 1. Some helpers
|
-- 1. Some helpers
|
||||||
|
rule = csvRule rules :: DirectiveName -> Maybe FieldTemplate
|
||||||
-- Look up the value (template) of a csv rule by rule keyword.
|
ruleval = csvRuleValue rules record :: DirectiveName -> Maybe String
|
||||||
rule :: DirectiveName -> Maybe FieldTemplate
|
field = hledgerField rules record :: HledgerFieldName -> Maybe FieldTemplate
|
||||||
rule = (`getDirective` rules)
|
fieldval = hledgerFieldValue rules record :: HledgerFieldName -> Maybe String
|
||||||
|
|
||||||
-- Look up the final value assigned to a csv rule by rule keyword.
|
|
||||||
-- Generally rules with keywords don't have interpolated values,
|
|
||||||
-- but for now it's possible. Cf default-account below.
|
|
||||||
ruleval :: DirectiveName -> Maybe String
|
|
||||||
ruleval = fmap (renderTemplate rules record) . field
|
|
||||||
|
|
||||||
-- Look up the value template assigned to a hledger field by field
|
|
||||||
-- list/field assignment rules, taking into account the current record and
|
|
||||||
-- conditional rules.
|
|
||||||
field :: HledgerFieldName -> Maybe FieldTemplate
|
|
||||||
field = getEffectiveAssignment rules record
|
|
||||||
|
|
||||||
-- Look up the final value assigned to a hledger field, with csv field
|
|
||||||
-- references interpolated.
|
|
||||||
fieldval :: HledgerFieldName -> Maybe String
|
|
||||||
fieldval = fmap (renderTemplate rules record) . field
|
|
||||||
|
|
||||||
s `or` def = if null s then def else s
|
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
-- 2. Gather the values needed for the transaction itself, by evaluating
|
-- 2. Gather the values needed for the transaction itself, by evaluating
|
||||||
@ -826,7 +831,7 @@ transactionFromCsvRecord sourcepos rules record = t
|
|||||||
mkPosting number accountFld amountFld amountInFld amountOutFld balanceFld commentFld =
|
mkPosting number accountFld amountFld amountInFld amountOutFld balanceFld commentFld =
|
||||||
let mdefaultcurrency = rule "default-currency"
|
let mdefaultcurrency = rule "default-currency"
|
||||||
currency = fromMaybe (fromMaybe "" mdefaultcurrency) $
|
currency = fromMaybe (fromMaybe "" mdefaultcurrency) $
|
||||||
fieldval ("currency"++number) `or` fieldval "currency"
|
fieldval ("currency"++number) `withDefault` fieldval "currency"
|
||||||
mamount = chooseAmount rules record currency amountFld amountInFld amountOutFld
|
mamount = chooseAmount rules record currency amountFld amountInFld amountOutFld
|
||||||
mbalance :: Maybe (Amount, GenericSourcePos) =
|
mbalance :: Maybe (Amount, GenericSourcePos) =
|
||||||
fieldval balanceFld >>= parsebalance currency number
|
fieldval balanceFld >>= parsebalance currency number
|
||||||
@ -851,7 +856,7 @@ transactionFromCsvRecord sourcepos rules record = t
|
|||||||
maccount = T.pack <$> (fieldval accountFld
|
maccount = T.pack <$> (fieldval accountFld
|
||||||
-- XXX what's this needed for ? Test & document, or drop.
|
-- XXX what's this needed for ? Test & document, or drop.
|
||||||
-- Also, this the only place we interpolate in a keyword rule, I think.
|
-- Also, this the only place we interpolate in a keyword rule, I think.
|
||||||
`or` ruleval ("default-account" ++ number))
|
`withDefault` ruleval ("default-account" ++ number))
|
||||||
-- figure out the account name to use for this posting, if any, and
|
-- figure out the account name to use for this posting, if any, and
|
||||||
-- whether it is the default unknown account, which may be improved
|
-- whether it is the default unknown account, which may be improved
|
||||||
-- later, or an explicitly set account, which may not.
|
-- later, or an explicitly set account, which may not.
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user