----------------------------------------------------------------------------- ---- | ---- Module : Main ---- Copyright : David Siegel ---- License : BSD3-style (see LICENSE) ---- ---- Maintainer : David Siegel ---- 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