shh-0.2.0.3: app/shh-app.hs
{-# LANGUAGE LambdaCase #-}
module Main where
import Shh
import System.IO
import System.Environment
import System.IO.Temp
import System.Directory
import Data.Hashable (hash)
import Data.List.Split (splitOn)
defaultShell = "\
\{-# LANGUAGE TemplateHaskell #-}\n\
\module Shell where\n\
\import Shh\n\
\$(loadEnv SearchPath)\n\
\ "
defaultInitGhci = "\
\:seti -XNoOverloadedLists\n\
\import Shh\n\
\import Shh.Prompt\n\
\:set prompt-function promptFormat \"\\n\\ESC[1;32m[%u@%h:%w]λ \\ESC[0m\"\n\
\:set prompt-cont \"| \"\n\
\ "
defaultWrapper = "\
\#! /usr/bin/env sh\n\
\exec \"$@\"\n\
\ "
debug = putStrLn
writeIfMissing :: FilePath -> String -> IO ()
writeIfMissing fp s = do
doesFileExist fp >>= \case
True -> pure ()
False -> writeFile fp s
main :: IO ()
main = do
a <- getArgs
shhDir <- lookupEnv "SHH_DIR" >>= \case
Nothing -> lookupEnv "HOME" >>= \case
Nothing -> error "Please specify HOME or SHH_DIR environment variables"
Just h -> pure $ h <> "/.shh"
Just s -> pure s
let
wrapped :: (Unit a, ExecArgs a) => a
wrapped = exe (shhDir <> "/wrapper")
debug $ "Shh home is: " <> shhDir
createDirectoryIfMissing False shhDir
withCurrentDirectory shhDir $ do
writeIfMissing "init.ghci" defaultInitGhci
writeIfMissing "wrapper" defaultWrapper
setPermissions "wrapper" $
setOwnerExecutable True $
setOwnerReadable True $
setOwnerWritable True $
emptyPermissions
writeIfMissing "Shell.hs" defaultShell
wrapped "ghci" "-ghci-script" (shhDir <> "/init.ghci") (shhDir <> "/Shell.hs")