{-# 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 FilePath
mrules_file_ :: Maybe FilePath
,InputOpts -> [FilePath]
aliases_ :: [String]
,InputOpts -> Bool
anon_ :: Bool
,InputOpts -> Bool
new_ :: Bool
,InputOpts -> Bool
new_save_ :: Bool
,InputOpts -> FilePath
pivot_ :: String
,InputOpts -> Maybe DateSpan
forecast_ :: Maybe DateSpan
,InputOpts -> Bool
posting_account_tags_ :: Bool
,InputOpts -> Bool
verbose_tags_ :: Bool
,InputOpts -> DateSpan
reportspan_ :: DateSpan
,InputOpts -> Bool
auto_ :: Bool
,InputOpts -> Bool
infer_equity_ :: Bool
,InputOpts -> Bool
infer_costs_ :: Bool
,InputOpts -> BalancingOpts
balancingopts_ :: BalancingOpts
,InputOpts -> Bool
strict_ :: Bool
,InputOpts -> Bool
_defer :: Bool
,InputOpts -> Day
_ioDay :: Day
} deriving (InputOpts -> InputOpts -> Bool
(InputOpts -> InputOpts -> Bool)
-> (InputOpts -> InputOpts -> Bool) -> Eq InputOpts
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: InputOpts -> InputOpts -> Bool
== :: InputOpts -> InputOpts -> Bool
$c/= :: InputOpts -> InputOpts -> Bool
/= :: InputOpts -> InputOpts -> Bool
Eq, Eq InputOpts
Eq InputOpts =>
(InputOpts -> InputOpts -> Ordering)
-> (InputOpts -> InputOpts -> Bool)
-> (InputOpts -> InputOpts -> Bool)
-> (InputOpts -> InputOpts -> Bool)
-> (InputOpts -> InputOpts -> Bool)
-> (InputOpts -> InputOpts -> InputOpts)
-> (InputOpts -> InputOpts -> InputOpts)
-> Ord InputOpts
InputOpts -> InputOpts -> Bool
InputOpts -> InputOpts -> Ordering
InputOpts -> InputOpts -> InputOpts
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: InputOpts -> InputOpts -> Ordering
compare :: InputOpts -> InputOpts -> Ordering
$c< :: InputOpts -> InputOpts -> Bool
< :: InputOpts -> InputOpts -> Bool
$c<= :: InputOpts -> InputOpts -> Bool
<= :: InputOpts -> InputOpts -> Bool
$c> :: InputOpts -> InputOpts -> Bool
> :: InputOpts -> InputOpts -> Bool
$c>= :: InputOpts -> InputOpts -> Bool
>= :: InputOpts -> InputOpts -> Bool
$cmax :: InputOpts -> InputOpts -> InputOpts
max :: InputOpts -> InputOpts -> InputOpts
$cmin :: InputOpts -> InputOpts -> InputOpts
min :: InputOpts -> InputOpts -> InputOpts
Ord, Int -> InputOpts -> ShowS
[InputOpts] -> ShowS
InputOpts -> FilePath
(Int -> InputOpts -> ShowS)
-> (InputOpts -> FilePath)
-> ([InputOpts] -> ShowS)
-> Show InputOpts
forall a.
(Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> InputOpts -> ShowS
showsPrec :: Int -> InputOpts -> ShowS
$cshow :: InputOpts -> FilePath
show :: InputOpts -> FilePath
$cshowList :: [InputOpts] -> ShowS
showList :: [InputOpts] -> ShowS
Show)
definputopts :: InputOpts
definputopts :: InputOpts
definputopts = InputOpts
{ mformat_ :: Maybe StorageFormat
mformat_ = Maybe StorageFormat
forall a. Maybe a
Nothing
, mrules_file_ :: Maybe FilePath
mrules_file_ = Maybe FilePath
forall a. Maybe a
Nothing
, aliases_ :: [FilePath]
aliases_ = []
, anon_ :: Bool
anon_ = Bool
False
, new_ :: Bool
new_ = Bool
False
, new_save_ :: Bool
new_save_ = Bool
True
, pivot_ :: FilePath
pivot_ = FilePath
""
, forecast_ :: Maybe DateSpan
forecast_ = Maybe DateSpan
forall a. Maybe a
Nothing
, posting_account_tags_ :: Bool
posting_account_tags_ = Bool
False
, verbose_tags_ :: Bool
verbose_tags_ = Bool
False
, reportspan_ :: DateSpan
reportspan_ = DateSpan
nulldatespan
, auto_ :: Bool
auto_ = Bool
False
, infer_equity_ :: Bool
infer_equity_ = Bool
False
, infer_costs_ :: Bool
infer_costs_ = Bool
False
, balancingopts_ :: BalancingOpts
balancingopts_ = BalancingOpts
defbalancingopts
, strict_ :: Bool
strict_ = Bool
False
, _defer :: Bool
_defer = 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 EFDay
requestedStart Maybe EFDay
requestedEnd <- InputOpts -> Maybe DateSpan
forecast_ InputOpts
iopts
let forecastStart :: Maybe Day
forecastStart = EFDay -> Day
fromEFDay (EFDay -> Day) -> Maybe EFDay -> Maybe Day
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe EFDay
requestedStart Maybe Day -> Maybe Day -> Maybe Day
forall a. Maybe a -> Maybe a -> Maybe a
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 (EFDay -> Day
fromEFDay (EFDay -> Day) -> Maybe EFDay -> Maybe Day
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe EFDay
reportStart) Maybe Day -> Maybe Day -> Maybe Day
forall a. Maybe a -> Maybe a -> Maybe a
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 = EFDay -> Day
fromEFDay (EFDay -> Day) -> Maybe EFDay -> Maybe Day
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe EFDay
requestedEnd Maybe Day -> Maybe Day -> Maybe Day
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> EFDay -> Day
fromEFDay (EFDay -> Day) -> Maybe EFDay -> Maybe Day
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe EFDay
reportEnd Maybe Day -> Maybe Day -> Maybe Day
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Day -> Maybe Day
forall a. a -> Maybe a
Just (Day -> Maybe Day) -> Day -> Maybe Day
forall a b. (a -> b) -> a -> b
$ 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 = FilePath -> Maybe Day -> Maybe Day
forall a. Show a => FilePath -> a -> a
dbg2 FilePath
"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 EFDay
reportStart Maybe EFDay
reportEnd = InputOpts -> DateSpan
reportspan_ InputOpts
iopts
DateSpan -> Maybe DateSpan
forall a. a -> Maybe a
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
. FilePath -> DateSpan -> DateSpan
forall a. Show a => FilePath -> a -> a
dbg2 FilePath
"forecastspan" (DateSpan -> Maybe DateSpan) -> DateSpan -> Maybe DateSpan
forall a b. (a -> b) -> a -> b
$ Maybe EFDay -> Maybe EFDay -> DateSpan
DateSpan (Day -> EFDay
Exact (Day -> EFDay) -> Maybe Day -> Maybe EFDay
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Day
forecastStart) (Day -> EFDay
Exact (Day -> EFDay) -> Maybe Day -> Maybe EFDay
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Day
forecastEnd)
makeHledgerClassyLenses ''InputOpts
instance HasBalancingOpts InputOpts where
balancingOpts :: Lens' InputOpts BalancingOpts
balancingOpts = (BalancingOpts -> f BalancingOpts) -> InputOpts -> f InputOpts
forall c. HasInputOpts c => Lens' c BalancingOpts
Lens' InputOpts BalancingOpts
balancingopts