packages feed

puffytools-0.0.0.1: ptk/Ptk/Journal/AddEntry.hs

{- |
Module       : Ptk.Journal.AddEntry
Description  : `ptk journal add_entry` command tree
Copyright    : 2014, Peter Harpending
License      : BSD3
Maintainer   : Peter Harpending <pharpend2@gmail.com>
Stability    : experimental
Portability  : Linux

-}

module Ptk.Journal.AddEntry (journalAETree, journalAddEntryTree, journalAddEntryHelp) where

import           Data.Monoid
import           Data.Text (Text, pack, unpack)
import           PuffyTools.Journal
import           PuffyTools.Slug
import           System.Console.Argument 
import           System.Console.Command hiding (name)
import           System.Console.Program (showUsage)
import qualified Data.Vector as V

journalAddEntryHelp :: Action IO
journalAddEntryHelp = io $ showUsage journalAddEntryTree

-- |Same as add_entry
journalAETree = Node aeCommand []
  where
    aeCommand = Command "ae" "Same as add_entry" aeAction

-- |This is basically the tree of things that get parsed when the
-- luser runs "ptk journal AddEntry"
journalAddEntryTree :: Commands IO
journalAddEntryTree = Node addEntryCommand []
  where
    addEntryCommand = Command
                        "add_entry"
                        "Add an entry to journal with a given slug. The second argument is the entry text."
                        aeAction

aeAction :: Action IO
aeAction = withNonOption slugType $ \slg -> withNonOption string (runAE slg)

slugType :: Type Slug
slugType = Type {parser = \s -> mkSlugEither (pack s)
                ,name = "slug"
                ,defaultValue = Nothing}

-- |Run the `ptk journal add_entry` command
runAE :: Slug -> String -> Action IO
runAE slug entryStr = io $ do
  unlessJournal (unSlug slug) $ do
    fail $ "Journal does not exist: " <> (unpack $ unSlug slug)
  jl <- readJournalDef slug
  ety <- mkEntry (pack entryStr)
  let nj = jl { journalEntries = journalEntries jl <> V.singleton ety }
  writeJournal nj