module Tn.Journal where
import Tn.Paths
import qualified Data.ByteString as B
import Data.Text (Text, pack)
import qualified Data.Text.Encoding as T
import Data.Time (UTCTime, getCurrentTime)
import Data.Vector (Vector)
import qualified Data.Vector as V
import Data.Yaml
import GHC.Generics
import System.Directory
import System.IO
import System.Pager (printOrPage)
type Journal = Vector Entry
data Entry = Entry { entryTime :: UTCTime
, entryText :: Text
}
deriving (Eq, Show, Generic)
instance ToJSON Entry
instance FromJSON Entry
mkEntry :: String -> IO Entry
mkEntry s =
Entry <$> getCurrentTime
<*> pure (pack s)
addEntry :: Journal -> Entry -> Journal
addEntry = V.snoc
readStdin :: IO (Either ParseException Journal)
readStdin =
do contents <- B.hGetContents stdin
return $ decodeEither' contents
readStdin' :: IO Journal
readStdin' =
readStdin
>>= \case
Left x -> fail (show x)
Right x -> return x
readJournalFile :: FilePath -> IO Journal
readJournalFile fp =
do fp' <- makeAbsolute fp
res <- decodeFileEither fp'
case res of
Left x -> fail (show x)
Right x -> return x
readJournal :: IO Journal
readJournal =
do createNeededFiles
jp <- journalPath
readJournalFile jp
printJournal :: Journal
-> Bool
-> IO ()
printJournal j p
| p = printOrPage $ T.decodeUtf8 (encode j)
| otherwise = B.hPut stdout (encode j)
writeJournalFile :: Journal -> FilePath -> IO ()
writeJournalFile j f = encodeFile f j
writeJournal :: Journal -> IO ()
writeJournal j =
do createNeededFiles
jp <- journalPath
writeJournalFile j jp