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