{-# LANGUAGE TemplateHaskell #-}
module Hledger.Read.InputOptions (
InputOpts(..)
, HasInputOpts(..)
, definputopts
, forecastPeriod
) where
import Control.Applicative ((<|>))
import Data.Time (Day, addDays)
import Hledger.Data.Types
import Hledger.Data.Journal (journalEndDate)
import Hledger.Data.Dates (nulldate, nulldatespan)
import Hledger.Data.Balancing (BalancingOpts(..), HasBalancingOpts(..), defbalancingopts)
import Hledger.Utils (dbg2, makeHledgerClassyLenses)
data InputOpts = InputOpts {
InputOpts -> Maybe StorageFormat
mformat_ :: Maybe StorageFormat
,InputOpts -> Maybe StorageFormat
mrules_file_ :: Maybe FilePath
,InputOpts -> [StorageFormat]
aliases_ :: [String]
,InputOpts -> Bool
anon_ :: Bool
,InputOpts -> Bool
new_ :: Bool
,InputOpts -> Bool
new_save_ :: Bool
,InputOpts -> StorageFormat
pivot_ :: String
,InputOpts -> Maybe DateSpan
forecast_ :: Maybe DateSpan
,InputOpts -> DateSpan
reportspan_ :: DateSpan
,InputOpts -> Bool
auto_ :: Bool
,InputOpts -> Bool
infer_equity_ :: Bool
,InputOpts -> BalancingOpts
balancingopts_ :: BalancingOpts
,InputOpts -> Bool
strict_ :: Bool
,InputOpts -> Day
_ioDay :: Day
} deriving (Int -> InputOpts -> ShowS
[InputOpts] -> ShowS
InputOpts -> StorageFormat
(Int -> InputOpts -> ShowS)
-> (InputOpts -> StorageFormat)
-> ([InputOpts] -> ShowS)
-> Show InputOpts
forall a.
(Int -> a -> ShowS)
-> (a -> StorageFormat) -> ([a] -> ShowS) -> Show a
showList :: [InputOpts] -> ShowS
$cshowList :: [InputOpts] -> ShowS
show :: InputOpts -> StorageFormat
$cshow :: InputOpts -> StorageFormat
showsPrec :: Int -> InputOpts -> ShowS
$cshowsPrec :: Int -> InputOpts -> ShowS
Show)
definputopts :: InputOpts
definputopts :: InputOpts
definputopts = InputOpts :: Maybe StorageFormat
-> Maybe StorageFormat
-> [StorageFormat]
-> Bool
-> Bool
-> Bool
-> StorageFormat
-> Maybe DateSpan
-> DateSpan
-> Bool
-> Bool
-> BalancingOpts
-> Bool
-> Day
-> InputOpts
InputOpts
{ mformat_ :: Maybe StorageFormat
mformat_ = Maybe StorageFormat
forall a. Maybe a
Nothing
, mrules_file_ :: Maybe StorageFormat
mrules_file_ = Maybe StorageFormat
forall a. Maybe a
Nothing
, aliases_ :: [StorageFormat]
aliases_ = []
, anon_ :: Bool
anon_ = Bool
False
, new_ :: Bool
new_ = Bool
False
, new_save_ :: Bool
new_save_ = Bool
True
, pivot_ :: StorageFormat
pivot_ = StorageFormat
""
, forecast_ :: Maybe DateSpan
forecast_ = Maybe DateSpan
forall a. Maybe a
Nothing
, reportspan_ :: DateSpan
reportspan_ = DateSpan
nulldatespan
, auto_ :: Bool
auto_ = Bool
False
, infer_equity_ :: Bool
infer_equity_ = Bool
False
, balancingopts_ :: BalancingOpts
balancingopts_ = BalancingOpts
defbalancingopts
, strict_ :: Bool
strict_ = Bool
False
, _ioDay :: Day
_ioDay = Day
nulldate
}
forecastPeriod :: InputOpts -> Journal -> Maybe DateSpan
forecastPeriod :: InputOpts -> Journal -> Maybe DateSpan
forecastPeriod InputOpts
iopts Journal
j = do
DateSpan Maybe Day
requestedStart Maybe Day
requestedEnd <- InputOpts -> Maybe DateSpan
forecast_ InputOpts
iopts
let forecastStart :: Maybe Day
forecastStart = Maybe Day
requestedStart Maybe Day -> Maybe Day -> Maybe Day
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Maybe Day -> Maybe Day -> Maybe Day
forall a. Ord a => a -> a -> a
max Maybe Day
mjournalend Maybe Day
reportStart Maybe Day -> Maybe Day -> Maybe Day
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Day -> Maybe Day
forall a. a -> Maybe a
Just (InputOpts -> Day
_ioDay InputOpts
iopts)
forecastEnd :: Maybe Day
forecastEnd = Maybe Day
requestedEnd Maybe Day -> Maybe Day -> Maybe Day
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Maybe Day
reportEnd Maybe Day -> Maybe Day -> Maybe Day
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Day -> Maybe Day
forall a. a -> Maybe a
Just (Integer -> Day -> Day
addDays Integer
180 (Day -> Day) -> Day -> Day
forall a b. (a -> b) -> a -> b
$ InputOpts -> Day
_ioDay InputOpts
iopts)
mjournalend :: Maybe Day
mjournalend = StorageFormat -> Maybe Day -> Maybe Day
forall a. Show a => StorageFormat -> a -> a
dbg2 StorageFormat
"journalEndDate" (Maybe Day -> Maybe Day) -> Maybe Day -> Maybe Day
forall a b. (a -> b) -> a -> b
$ Bool -> Journal -> Maybe Day
journalEndDate Bool
False Journal
j
DateSpan Maybe Day
reportStart Maybe Day
reportEnd = InputOpts -> DateSpan
reportspan_ InputOpts
iopts
DateSpan -> Maybe DateSpan
forall (m :: * -> *) a. Monad m => a -> m a
return (DateSpan -> Maybe DateSpan)
-> (DateSpan -> DateSpan) -> DateSpan -> Maybe DateSpan
forall b c a. (b -> c) -> (a -> b) -> a -> c
. StorageFormat -> DateSpan -> DateSpan
forall a. Show a => StorageFormat -> a -> a
dbg2 StorageFormat
"forecastspan" (DateSpan -> Maybe DateSpan) -> DateSpan -> Maybe DateSpan
forall a b. (a -> b) -> a -> b
$ Maybe Day -> Maybe Day -> DateSpan
DateSpan Maybe Day
forecastStart Maybe Day
forecastEnd
makeHledgerClassyLenses ''InputOpts
instance HasBalancingOpts InputOpts where
balancingOpts :: (BalancingOpts -> f BalancingOpts) -> InputOpts -> f InputOpts
balancingOpts = (BalancingOpts -> f BalancingOpts) -> InputOpts -> f InputOpts
forall c. HasInputOpts c => Lens' c BalancingOpts
balancingopts