journal: also allow one-line commodity directives
This commit is contained in:
		
							parent
							
								
									b583cb327d
								
							
						
					
					
						commit
						ddefec412f
					
				| @ -377,13 +377,38 @@ parserErrorAt :: SourcePos -> String -> ErroringJournalParser a | ||||
| parserErrorAt pos s = do | ||||
|   throwError $ show pos ++ ":\n" ++ s | ||||
| 
 | ||||
| -- | Parse a commodity directive, containing 0 or more format subdirectives. | ||||
| -- | Parse a one-line or multi-line commodity directive. | ||||
| -- | ||||
| -- >>> Right _ <- rejp commoditydirectivep "commodity $1.00" | ||||
| -- >>> Right _ <- rejp commoditydirectivep "commodity $\n  format $1.00" | ||||
| -- >>> Right _ <- rejp commoditydirectivep "commodity $\n\n" -- a commodity with no format | ||||
| -- >>> Right _ <- rejp commoditydirectivep "commodity $1.00\n  format $1.00" -- both, what happens ? | ||||
| commoditydirectivep :: ErroringJournalParser JournalUpdate | ||||
| commoditydirectivep = do | ||||
| commoditydirectivep = try commoditydirectiveonelinep <|> commoditydirectivemultilinep | ||||
| 
 | ||||
| -- | Parse a one-line commodity directive. | ||||
| -- | ||||
| -- >>> Right _ <- rejp commoditydirectiveonelinep "commodity $1.00" | ||||
| -- >>> Right _ <- rejp commoditydirectiveonelinep "commodity $1.00 ; blah\n" | ||||
| commoditydirectiveonelinep :: ErroringJournalParser JournalUpdate | ||||
| commoditydirectiveonelinep = do | ||||
|   string "commodity" | ||||
|   many1 spacenonewline | ||||
|   Amount{acommodity,astyle} <- amountp | ||||
|   many spacenonewline | ||||
|   _ <- followingcommentp <|> (eolof >> return "") | ||||
|   let comm = Commodity{csymbol=acommodity, cformat=Just astyle} | ||||
|   return $ ExceptT $ return $ Right $ \j -> j{jcommodities=M.insert acommodity comm $ jcommodities j} | ||||
| 
 | ||||
| -- | Parse a multi-line commodity directive, containing 0 or more format subdirectives. | ||||
| -- | ||||
| -- >>> Right _ <- rejp commoditydirectivemultilinep "commodity $ ; blah \n  format $1.00 ; blah" | ||||
| commoditydirectivemultilinep :: ErroringJournalParser JournalUpdate | ||||
| commoditydirectivemultilinep = do | ||||
|   string "commodity" | ||||
|   many1 spacenonewline | ||||
|   sym <- commoditysymbolp | ||||
|   _ <- followingcommentp | ||||
|   _ <- followingcommentp <|> (eolof >> return "") | ||||
|   mformat <- lastMay <$> many (indented $ formatdirectivep sym) | ||||
|   let comm = Commodity{csymbol=sym, cformat=mformat} | ||||
|   return $ ExceptT $ return $ Right $ \j -> j{jcommodities=M.insert sym comm $ jcommodities j} | ||||
| @ -398,7 +423,7 @@ formatdirectivep expectedsym = do | ||||
|   many1 spacenonewline | ||||
|   pos <- getPosition | ||||
|   Amount{acommodity,astyle} <- amountp | ||||
|   _ <- followingcommentp | ||||
|   _ <- followingcommentp <|> (eolof >> return "") | ||||
|   if acommodity==expectedsym | ||||
|     then return astyle | ||||
|     else parserErrorAt pos $ | ||||
|  | ||||
| @ -6,6 +6,21 @@ hledger -f- bal -V -N | ||||
| <<< | ||||
| ; use a commodity directive to ensure B is displayed with two decimal | ||||
| ; places, or the price directive plus -V would make it four | ||||
| commodity 1.00 B | ||||
| 
 | ||||
| P 2015/1/1 A 1.0001 B | ||||
| 
 | ||||
| 2015/1/1 | ||||
|     (a)  1.00 A | ||||
|     (b)  1.00 B | ||||
| >>> | ||||
|               1.00 B  a | ||||
|               1.00 B  b | ||||
| >>>=0 | ||||
| 
 | ||||
| # 2. A multi-line commodity directive also works. | ||||
| hledger -f- bal -V -N | ||||
| <<< | ||||
| commodity B | ||||
|   format 1.00 B | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user