hbs2/miscellaneous/suckless-conf/bf6/Main.hs

75 lines
1.8 KiB
Haskell

{-# Language AllowAmbiguousTypes #-}
{-# Language UndecidableInstances #-}
module Main where
import Data.Config.Suckless.Script
import Data.Config.Suckless.Script.File as SF
import Safe
import System.Environment
import System.IO qualified as IO
import UnliftIO
main :: IO ()
main = do
cli <- getArgs <&> unlines . fmap unwords . splitForms
>>= either (error.show) pure . parseTop
let dict = makeDict do
internalEntries
SF.entries
entry $ bindMatch "--help" $ nil_ \case
HelpEntryBound what -> helpEntry what
[StringLike s] -> helpList False (Just s)
_ -> helpList False Nothing
entry $ bindMatch "debug:cli:show" $ nil_ \case
_ -> display cli
hidden do
entry $ bindMatch "#!" $ nil_ $ const do
pure ()
case cli of
[ListVal (SymbolVal "#!" :_)] -> do
pure ()
[ListVal [SymbolVal "--run", StringLike fn]] -> do
what <- liftIO $ readFile fn
>>= either (error.show) pure . parseTop
run dict what >>= eatNil display
[ListVal [SymbolVal "stdin"]] -> do
what <- liftIO getContents
>>= either (error.show) pure . parseTop
run dict what >>= eatNil display
[ListVal (SymbolVal "file" : s@(StringLike fn : args))] -> do
what <- liftIO (IO.readFile fn)
>>= either (error.show) pure . parseTop
runM dict do
bindCliArgs s
void $ evalTop what
[] -> do
eof <- liftIO IO.isEOF
if eof then
void $ run dict [mkForm "help" []]
else do
what <- liftIO getContents
>>= either (error.show) pure . parseTop
run dict what >>= eatNil display
_ -> do
run dict cli >>= eatNil display