From 0c86cb5623df1053d302175505ad834a623ed0a4 Mon Sep 17 00:00:00 2001 From: Alexander Foremny Date: Tue, 13 Feb 2024 02:29:24 +0100 Subject: add `repl` command --- app/Main.hs | 76 +++++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 62 insertions(+), 14 deletions(-) (limited to 'app') diff --git a/app/Main.hs b/app/Main.hs index 5574afa..5bb783e 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -3,28 +3,76 @@ module Main ) where +import Control.Applicative ((<**>)) +import Control.Monad.Trans (liftIO) import Data.Aeson qualified as J import Data.ByteString.Lazy.Char8 qualified as LB +import Data.String (IsString (fromString)) +import Options.Applicative qualified as A import Store qualified as Q +import System.Console.Repline qualified as R import System.Directory (setCurrentDirectory) import Text.Printf (printf) +data Args = Args + { cmd :: Cmd + } + +args :: A.Parser Args +args = + Args <$> cmd_ + +data Cmd + = Repl + +cmd_ :: A.Parser Cmd +cmd_ = + A.hsubparser . mconcat $ + [ A.command "repl" . A.info replCmd $ + A.progDesc "Interactively execute statements" + ] + +replCmd :: A.Parser Cmd +replCmd = + pure Repl + main :: IO () main = do - setCurrentDirectory "./data" - - mapM_ - ( \q -> do - printf "> %s\n" (show q) - query' q - ) - [ "SELECT * FROM c", - "SELECT * FROM j", - "SELECT c.id, j.id, is_j FROM c LEFT JOIN j ON j.id == c.j_id", - "SELECT c.id, j.id FROM c RIGHT JOIN j ON j.id == c.j_id", - "SELECT c.id, j.id FROM c FULL JOIN j ON j.id == c.j_id", - "SELECT c.id, j FROM c EMBED j ON j.id == c.j_id" - ] + A.execParser (A.info (args <**> A.helper) A.idm) >>= \case + Args {cmd = Repl} -> do + setCurrentDirectory "./data" + + {- + mapM_ + ( \q -> do + printf "> %s\n" (show q) + query' q + ) + [ "SELECT * FROM c", + "SELECT * FROM j", + "SELECT c.id, j.id, is_j FROM c LEFT JOIN j ON j.id == c.j_id", + "SELECT c.id, j.id FROM c RIGHT JOIN j ON j.id == c.j_id", + "SELECT c.id, j.id FROM c FULL JOIN j ON j.id == c.j_id", + "SELECT c.id, j FROM c EMBED j ON j.id == c.j_id" + ] + -} + + -- TODO Catch `ParseError` exception + -- + -- @topic repl + + -- TODO Add query auto-completion + -- + -- @topic repl + R.evalRepl + (const . pure $ ">>> ") + (liftIO . query' . fromString) + ([]) + (Just ':') + (Just "paste") + (R.Word (\_ -> pure ["SELECT"])) + (pure ()) + (pure R.Exit) query' :: Q.Query -> IO () query' q = mapM_ (LB.putStrLn . J.encode) =<< Q.query q -- cgit v1.2.3