packages feed

haste-0.1: src/Main.hs

-----------------------------------------------------------------------------
---- |
---- Module      : Main
---- Copyright   : David Siegel
---- License     : BSD3-style (see LICENSE)
---- 
---- Maintainer  : David Siegel <djsiegel@gmail.com>
---- Stability   : experimental
---- Portability : ?
----
---- A universal pastebin tool in Haskell.
----
-------------------------------------------------------------------------------

module Main where

import System.Exit
import System.Environment (getArgs)
import Data.Maybe (fromMaybe, listToMaybe)
import Control.Monad (when)

import Haste.Types
import Haste.Monad (runHaste)
import Haste.Options (getOptions, helpText)
import Haste.PasteProviders (defaultProvider)
import qualified Haste.LanguageDetection as LD

-- | Starts the show.
main :: IO ()
main = do
  -- Parse options.
  (options, args) <- fmap getOptions getArgs

  when (optHelp options) $ do
    putStrLn helpText
    exitSuccess

  let language = decideLanguage options args
  let provider = decideProvider options args
  content <- decideContent options args

  let env = HasteEnvironment { envContent = content
                             , envLanguage = decideLanguage options args
                             } 
  result <- runHaste env (paste provider content)
  putStrLn result

-- | If a filename is given, we use its contents; else use STDIN.
decideContent :: HasteOptions -> Args -> IO String
decideContent _ []         = getContents
decideContent _ (file : _) = readFile file

decideLanguage :: HasteOptions -> Args -> Language
-- If a language is passed as an option, use it.
decideLanguage (optLanguage -> Just lang) _        = lang
-- Else, attempt to guess language from file argument.
decideLanguage _ (file : _) = fromMaybe Text (LD.fromFilePath file)
-- Else use Text.
decideLanguage _ _          = Text

decideProvider :: HasteOptions -> Args -> SomePasteProvider
-- If a provider was specified, use it.
decideProvider (optProvider -> Just p) _ = p
-- Else, we suggest one based on language.
decideProvider options args =
  case LD.preferredProviders (decideLanguage options args) of
    p : _ -> p
    _     -> defaultProvider