imp: errors: uniqueleafnames: more precise error message
This commit is contained in:
		
							parent
							
								
									1c67d0860e
								
							
						
					
					
						commit
						e172e5dd56
					
				| @ -17,7 +17,7 @@ import Hledger.Data.Errors (makePostingErrorExcerpt) | |||||||
| import Hledger.Data.Journal (journalPostings, journalAccountNamesUsed) | import Hledger.Data.Journal (journalPostings, journalAccountNamesUsed) | ||||||
| import Hledger.Data.Posting (isVirtual) | import Hledger.Data.Posting (isVirtual) | ||||||
| import Hledger.Data.Types | import Hledger.Data.Types | ||||||
| import Hledger.Utils (chomp) | import Hledger.Utils (chomp, textChomp) | ||||||
| 
 | 
 | ||||||
| -- | Check that all the journal's postings are to accounts with a unique leaf name. | -- | Check that all the journal's postings are to accounts with a unique leaf name. | ||||||
| -- Otherwise, return an error message for the first offending posting. | -- Otherwise, return an error message for the first offending posting. | ||||||
| @ -26,9 +26,33 @@ journalCheckUniqueleafnames j = do | |||||||
|   -- find all duplicate leafnames, and the full account names they appear in |   -- find all duplicate leafnames, and the full account names they appear in | ||||||
|   case finddupes $ journalLeafAndFullAccountNames j of |   case finddupes $ journalLeafAndFullAccountNames j of | ||||||
|     [] -> Right () |     [] -> Right () | ||||||
|     dupes -> |     -- pick the first duplicated leafname and show the transactions of | ||||||
|       -- report the first posting that references one of them (and its position), for now |     -- the first two postings using it, highlighting the second as the error. | ||||||
|       mapM_ (checkposting dupes) $ journalPostings j |     (leaf,fulls):_ -> | ||||||
|  |       case filter ((`elem` fulls).paccount) $ journalPostings j of | ||||||
|  |         ps@(p:p2:_) -> Left $ chomp $ printf | ||||||
|  |           ("%s:%d:\n%s\nChecking for unique account leaf names is enabled, and\n" | ||||||
|  |           ++"account leaf name %s is not unique.\n" | ||||||
|  |           ++"It appears in these account names, which are used in %d places:\n%s" | ||||||
|  |           ++"\nConsider changing these account names so their last parts are different." | ||||||
|  |           ) | ||||||
|  |           f l ex (show leaf) (length ps) accts | ||||||
|  |           where | ||||||
|  |             -- t = fromMaybe nulltransaction ptransaction  -- XXX sloppy | ||||||
|  |             (_,_,_,ex1) = makePostingErrorExcerpt p (\_ _ _ -> Nothing) | ||||||
|  |             (f,l,_,ex2) = makePostingErrorExcerpt p2 finderrcols | ||||||
|  |             -- separate the two excerpts by a space-beginning line to help flycheck-hledger parse them | ||||||
|  |             ex = T.unlines [textChomp ex1, T.pack " ...", textChomp ex2] | ||||||
|  |             finderrcols p _ _ = Just (col, Just col2) | ||||||
|  |               where | ||||||
|  |                 a = paccount p | ||||||
|  |                 alen = T.length a | ||||||
|  |                 llen = T.length $ accountLeafName a | ||||||
|  |                 col = 5 + (if isVirtual p then 1 else 0) + alen - llen | ||||||
|  |                 col2 = col + llen - 1 | ||||||
|  |             accts = T.unlines fulls  -- $ map (("\""<>).(<>"\"")) fulls | ||||||
|  | 
 | ||||||
|  |         _ -> Right ()  -- shouldn't happen | ||||||
| 
 | 
 | ||||||
| finddupes :: (Ord leaf, Eq full) => [(leaf, full)] -> [(leaf, [full])] | finddupes :: (Ord leaf, Eq full) => [(leaf, full)] -> [(leaf, [full])] | ||||||
| finddupes leafandfullnames = zip dupLeafs dupAccountNames | finddupes leafandfullnames = zip dupLeafs dupAccountNames | ||||||
| @ -42,26 +66,3 @@ finddupes leafandfullnames = zip dupLeafs dupAccountNames | |||||||
| journalLeafAndFullAccountNames :: Journal -> [(Text, AccountName)] | journalLeafAndFullAccountNames :: Journal -> [(Text, AccountName)] | ||||||
| journalLeafAndFullAccountNames = map leafAndAccountName . journalAccountNamesUsed | journalLeafAndFullAccountNames = map leafAndAccountName . journalAccountNamesUsed | ||||||
|   where leafAndAccountName a = (accountLeafName a, a) |   where leafAndAccountName a = (accountLeafName a, a) | ||||||
| 
 |  | ||||||
| checkposting :: [(Text,[AccountName])] -> Posting -> Either String () |  | ||||||
| checkposting leafandfullnames p@Posting{paccount=a} = |  | ||||||
|   case [lf | lf@(_,fs) <- leafandfullnames, a `elem` fs] of |  | ||||||
|     []             -> Right () |  | ||||||
|     (leaf,fulls):_ -> Left $ chomp $ printf |  | ||||||
|       ("%s:%d:\n%s\nChecking for unique account leaf names is enabled, and\n" |  | ||||||
|       ++"account leaf name %s is not unique.\n" |  | ||||||
|       ++"It appears in these account names:\n%s" |  | ||||||
|       ++"\nConsider changing these account names so their last parts are different." |  | ||||||
|       ) |  | ||||||
|       f l ex (show leaf) accts |  | ||||||
|       where |  | ||||||
|         -- t = fromMaybe nulltransaction ptransaction  -- XXX sloppy |  | ||||||
|         (f,l,_mcols,ex) = makePostingErrorExcerpt p finderrcols |  | ||||||
|           where |  | ||||||
|             finderrcols p _ _ = Just (col, Just col2) |  | ||||||
|               where |  | ||||||
|                 alen = T.length $ paccount p |  | ||||||
|                 llen = T.length $ accountLeafName a |  | ||||||
|                 col = 5 + (if isVirtual p then 1 else 0) + alen - llen |  | ||||||
|                 col2 = col + llen - 1 |  | ||||||
|         accts = T.unlines fulls  -- $ map (("\""<>).(<>"\"")) fulls |  | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user