packages feed

schedule-planner-0.1.0.0: src/Main.hs

{-|
Module      : $Header$
Description : Interface for schedule-planner
Copyright   : (c) Justus Adam, 2015
License     : LGPL-3
Maintainer  : development@justusadam.com
Stability   : experimental
Portability : POSIX

main function and outside communication for this software.
This module takes care of reading all input and checking for correctness
as well as providing useful feedback upon encountering errors.
-}
module Main (main, CallOptions) where

import           Control.Applicative        (pure, (<*>))
import           Control.Monad              (liftM, when)
import           Options                    (Options, defineOption,
                                             defineOptions, optionDefault,
                                             optionDescription, optionLongFlags,
                                             optionShortFlags, optionType_bool,
                                             optionType_maybe,
                                             optionType_string, runCommand)
import           SchedulePlanner.App
import           SchedulePlanner.Calculator
import           SchedulePlanner.Serialize


-- |Temporary constant, should be in call args eventually
outputFormatDefault = "print"


-- |Legacy hard coded name of inputfile
stdFileName   = "testsuite/test.json"


data CallOptions = CallOptions {
    outputFile   :: Maybe String,
    inputFile    :: String,
    outputFormat :: String,
    server       :: Bool,
    verbocity    :: Bool
  } deriving (Show)

instance Options CallOptions where
  defineOptions = pure CallOptions
    <*> defineOption (optionType_maybe optionType_string) (\o -> o {
        optionLongFlags   = ["output-file"],
        optionShortFlags  = "o",
        optionDescription = "print output to this file instead of stdout",
        optionDefault     = Nothing
      })
    <*> defineOption optionType_string (\o -> o {
        optionDefault     = stdFileName,
        optionLongFlags   = ["input-file"],
        optionShortFlags  = "i",
        optionDescription = "read input from this file"
      })
    <*> defineOption optionType_string (\o -> o {
        optionDefault     = outputFormatDefault,
        optionLongFlags   = ["output-format"],
        optionShortFlags  = "f",
        optionDescription = "set the output format"
      })
    <*> defineOption optionType_bool (\o -> o {
        optionDefault     = False,
        optionLongFlags   = ["serve"],
        optionDescription = "Placeholder with no effect yet"
    })
    <*> defineOption optionType_bool (\o -> o {
        optionDefault     = False,
        optionLongFlags   = ["verbose"],
        optionShortFlags  = "v",
        optionDescription = "Print extra information"
    })


{-|
  main function. Handles reading command line arguments, the json input
  and starts execution.
-}
main :: IO()
main = runCommand $ \opts args -> do
  rawInput <- readFile (inputFile opts)

  reportAndPrint (outputFormat opts) (verbocity opts) rawInput