hledger/bin/hledger-print-location.hs
Simon Michael 32ccbba805 bin: switch to "runghc", drop "env -S" (#1453)
env -S isn't a thing on linux of course. Go back to using standard
env, which means using a stack options line, which means not using
"ghc". This new setup is probably simpler anyway. I've just had to
give up on the goal of having each script's required packages being
defined in one place; now (to they extent they are required) they
must be defined both in the script header and in compile.sh.
2021-01-12 10:55:00 -08:00

53 lines
1.7 KiB
Haskell
Executable File

#!/usr/bin/env stack
-- stack runghc --verbosity info --package hledger
-- See hledger-check-fancyassertions.hs
--package string-qq
{-
Quick script that adds file/line number tags to print output.
cf https://www.reddit.com/r/plaintextaccounting/comments/ddzn8o/finding_corresponding_journal_files_from_hledger/
$ hledger print-location -f examples/sample.journal desc:eat
2008/06/03 * eat & shop
; location: /Users/simon/src/hledger/examples/sample.journal:30
expenses:food $1
expenses:supplies $1
assets:cash
-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
import Data.String.QQ (s)
import Data.Text (pack)
import Text.Printf
import Hledger.Cli
------------------------------------------------------------------------------
cmdmode = hledgerCommandMode
[s| print-location
Like print, but adds tags showing the file path and location of transactions.
_FLAGS
|]
[]
[generalflagsgroup1]
[]
([], Just $ argsFlag "[QUERY]")
------------------------------------------------------------------------------
main :: IO ()
main = do
opts <- getHledgerCliOpts cmdmode
withJournalDo opts $ \j ->
print' opts j{jtxns = map addLocationTag $ jtxns j}
addLocationTag :: Transaction -> Transaction
addLocationTag t = t{tcomment = tcomment t `commentAddTagNextLine` loctag}
where
loctag = ("location", pack $ showGenericSourcePosLine $ tsourcepos t)
-- Like showGenericSourcePos in Hledger.Data.Transaction, but show just the starting line number.
showGenericSourcePosLine :: GenericSourcePos -> String
showGenericSourcePosLine (GenericSourcePos f line _) = printf "%s:%d" f line
showGenericSourcePosLine (JournalSourcePos f (startline, _)) = printf "%s:%d" f startline