packages feed

tn-0.1.0.1: Main.hs

-- Tn.Main - main module for Tn.
-- Copyright 2014 Peter Harpending.
-- 
-- This program is free software: you can redistribute it and/or
-- modify it under the terms of the GNU General Public License as
-- published by the Free Software Foundation, either version 3 of the
-- License, or (at your option) any later version.
-- 
-- This program is distributed in the hope that it will be useful, but
-- WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-- General Public License for more details.
-- 
-- You should have received a copy of the GNU General Public License
-- along with this program.  If not, see
-- <http://www.gnu.org/licenses/>.

module Main where

import System.Directory
import System.Environment

import Tn.IO
import Tn.Journal

-- |The main function. Runs the program.
main :: IO ()
main = getArgs >>= parseArgs

-- |Print help.
usage :: String -> IO ()       
usage = putStrLn . documentation

-- |Get documentation for a command.
documentation :: String -> String
documentation "main"          = "Usage: tn (list-entries|list-journals|new-entry|new-journal)\nSee `tn <command> usage` for more specific usage."
documentation "list-entries"  = "Usage: tn list-entries JOURNAL"
documentation "list-journals" = "Usage: tn list-journals"
documentation "new-journal"   = "Usage: tn new-journal NAME [force]"
documentation "new-entry"     = "Usage: tn new-entry JOURNAL"

-- |Parses the command line arguments
parseArgs :: [String] -> IO ()
parseArgs (cmd:rest)
  | "list-entries"  == cmd  = listEntries rest
  | "le"            == cmd  = listEntries rest
  | "list-journals" == cmd  = listJournals rest
  | "lj"            == cmd  = listJournals rest
  | "new-journal"   == cmd  = newJournal rest
  | "nj"            == cmd  = newJournal rest
  | "new-entry"     == cmd  = newEntry rest
  | "ne"            == cmd  = newEntry rest
  | otherwise               = usage "main"
parseArgs _                 = usage "main"

-- |List the entries
-- listEntires :: [String] -> IO ()                                
listEntries ("usage":_)     = usage "list-entries"
listEntries ("--usage":_)   = usage "list-entries"
listEntries ("help":_)      = usage "list-entries"
listEntries ("--help":_)    = usage "list-entries"
listEntries (journalNom:_)  = do
  jpath <- getJournalPathFromName journalNom
  journal <- readJournalFromFile jpath
  let entriesl  = (entries journal)
      entriess  = map show entriesl
  mapM_ putStrLn entriess
listEntries _               = usage "list-entries"

-- |List the journals
listJournals :: [String] -> IO ()                                
listJournals ("usage":_)    = usage "list-journals"
listJournals ("--usage":_)  = usage "list-journals"
listJournals ("help":_)     = usage "list-journals"
listJournals ("--help":_)   = usage "list-journals"
listJournals _              = do
  home <- getHomeDirectory
  let fullpath = home ++ "/.tn.d/journals/"
  dirContents <- (getDirectoryContents fullpath)
  mapM_ putStrLn $ map (init . init . init) $ drop 2 dirContents

-- |Make a new entry (impure).
newEntry :: [String] -> IO ()
newEntry ("usage":_)                = usage "new-entry"
newEntry ("--usage":_)              = usage "new-entry"
newEntry ("help":_)                 = usage "new-entry"
newEntry ("--help":_)               = usage "new-entry"
newEntry (journalNom:entryPath:_)   = do
  jpath       <- getJournalPathFromName journalNom
  journal     <- readJournalFromFile jpath
  newJournal  <- getNewEntry journal entryPath
  writeJournal newJournal
newEntry _                  = usage "new-entry"

-- |Make a new journal (impure).
newJournal :: [String] -> IO ()
newJournal ("usage":_)        = usage "new-journal"
newJournal ("--usage":_)      = usage "new-journal"
newJournal ("help":_)         = usage "new-journal"
newJournal ("--help":_)       = usage "new-journal"
newJournal (nom:"force":_)    = writeNewJournal nom True
newJournal (nom:"--force":_)  = writeNewJournal nom True
newJournal (nom:_)            = writeNewJournal nom False