dev:csv: refactor/document isBlockActive, matcherMatches
This commit is contained in:
parent
1010e3dee6
commit
a47dce073d
@ -770,23 +770,28 @@ getEffectiveAssignment rules record f = lastMay assignments
|
|||||||
isBlockActive :: CsvRules -> CsvRecord -> ConditionalBlock -> Bool
|
isBlockActive :: CsvRules -> CsvRecord -> ConditionalBlock -> Bool
|
||||||
isBlockActive rules record CB{..} = any (all matcherMatches) $ groupedMatchers cbMatchers
|
isBlockActive rules record CB{..} = any (all matcherMatches) $ groupedMatchers cbMatchers
|
||||||
where
|
where
|
||||||
-- does this individual matcher match the current csv record ?
|
-- Does this individual matcher match the current csv record ?
|
||||||
|
-- A matcher's target can be a specific CSV field, or the "whole record".
|
||||||
|
--
|
||||||
|
-- In the former case, note that the field reference must be either numeric or
|
||||||
|
-- a csv field name declared by a `fields` rule; anything else will raise an error
|
||||||
|
-- (to avoid confusion when a hledger field name doesn't work, see #2289).
|
||||||
|
--
|
||||||
|
-- In the latter case, the matched value will be a synthetic CSV record.
|
||||||
|
-- Note this will not necessarily be the same as the original CSV record:
|
||||||
|
-- the field separator will be comma, and quotes enclosing field values,
|
||||||
|
-- and any whitespace outside those quotes, will be removed.
|
||||||
|
-- (This means that a field containing a comma will now look like two fields.)
|
||||||
|
--
|
||||||
matcherMatches :: Matcher -> Bool
|
matcherMatches :: Matcher -> Bool
|
||||||
matcherMatches (RecordMatcher prefix pat) = maybeNegate prefix origbool
|
matcherMatches m =
|
||||||
|
case m of
|
||||||
|
RecordMatcher prefix pat -> maybeNegate prefix $ match pat val
|
||||||
|
where val = T.intercalate "," record
|
||||||
|
FieldMatcher prefix csvfieldref pat -> maybeNegate prefix $ match pat val
|
||||||
|
where val = replaceCsvFieldReference rules record csvfieldref
|
||||||
where
|
where
|
||||||
-- A synthetic whole CSV record to match against. Note, this can be
|
match pat val = regexMatchText (dbg7 "regex" pat) (dbg7 "value" val)
|
||||||
-- different from the original CSV data:
|
|
||||||
-- - any whitespace surrounding field values is preserved
|
|
||||||
-- - any quotes enclosing field values are removed
|
|
||||||
-- - and the field separator is always comma
|
|
||||||
-- which means that a field containing a comma will look like two fields.
|
|
||||||
wholecsvline = dbg7 "wholecsvline" $ T.intercalate "," record
|
|
||||||
origbool = regexMatchText (dbg7 "regex" pat) wholecsvline
|
|
||||||
matcherMatches (FieldMatcher prefix csvfieldref pat) = maybeNegate prefix origbool
|
|
||||||
where
|
|
||||||
-- the value of the referenced CSV field to match against.
|
|
||||||
csvfieldvalue = dbg7 "csvfieldvalue" $ replaceCsvFieldReference rules record csvfieldref
|
|
||||||
origbool = regexMatchText (dbg7 "regex" pat) csvfieldvalue
|
|
||||||
|
|
||||||
-- | Group matchers into associative pairs based on prefix, e.g.:
|
-- | Group matchers into associative pairs based on prefix, e.g.:
|
||||||
-- A
|
-- A
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user