chore: Cleanup REPL loop
This commit is contained in:
parent
976646fb67
commit
787c9e606d
24
Main.lean
24
Main.lean
|
@ -10,22 +10,25 @@ open Pantograph.Protocol
|
|||
|
||||
/-- Parse a command either in `{ "cmd": ..., "payload": ... }` form or `cmd { ... }` form. -/
|
||||
def parseCommand (s: String): Except String Command := do
|
||||
let s := s.trim
|
||||
match s.get? 0 with
|
||||
| .some '{' => -- Parse in Json mode
|
||||
match s.trim.get? 0 with
|
||||
| .some '{' =>
|
||||
-- Parse in Json mode
|
||||
Lean.fromJson? (← Lean.Json.parse s)
|
||||
| .some _ => -- Parse in line mode
|
||||
| .some _ =>
|
||||
-- Parse in line mode
|
||||
let offset := s.posOf ' ' |> s.offsetOfPos
|
||||
if offset = s.length then
|
||||
return { cmd := s.take offset, payload := Lean.Json.null }
|
||||
else
|
||||
let payload ← s.drop offset |> Lean.Json.parse
|
||||
return { cmd := s.take offset, payload := payload }
|
||||
| .none => throw "Command is empty"
|
||||
| .none =>
|
||||
throw "Command is empty"
|
||||
|
||||
partial def loop : MainM Unit := do repeat do
|
||||
let state ← get
|
||||
let command ← (← IO.getStdin).getLine
|
||||
-- Halt the program if empty line is given
|
||||
if command.trim.length = 0 then break
|
||||
match parseCommand command with
|
||||
| .error error =>
|
||||
|
@ -47,20 +50,17 @@ partial def loop : MainM Unit := do repeat do
|
|||
|
||||
unsafe def main (args: List String): IO Unit := do
|
||||
-- NOTE: A more sophisticated scheme of command line argument handling is needed.
|
||||
-- Separate imports and options
|
||||
if args == ["--version"] then do
|
||||
IO.println s!"{Pantograph.version}"
|
||||
return
|
||||
|
||||
Pantograph.initSearch ""
|
||||
|
||||
let coreContext ← args.filterMap (λ s => if s.startsWith "--" then .some <| s.drop 2 else .none)
|
||||
|>.toArray |> Pantograph.createCoreContext
|
||||
let imports:= args.filter (λ s => ¬ (s.startsWith "--"))
|
||||
-- Separate imports and options
|
||||
let (options, imports) := args.partition (·.startsWith "--")
|
||||
let coreContext ← options.map (·.drop 2) |>.toArray |> Pantograph.createCoreContext
|
||||
let coreState ← Pantograph.createCoreState imports.toArray
|
||||
let context: Context := {
|
||||
imports
|
||||
}
|
||||
let context: Context := {}
|
||||
try
|
||||
let coreM := loop.run context |>.run' {}
|
||||
IO.println "ready."
|
||||
|
|
|
@ -4,7 +4,6 @@ import Pantograph
|
|||
namespace Pantograph.Repl
|
||||
|
||||
structure Context where
|
||||
imports: List String
|
||||
|
||||
/-- Stores state of the REPL -/
|
||||
structure State where
|
||||
|
|
|
@ -235,9 +235,7 @@ def test_frontend_process_sorry : Test :=
|
|||
|
||||
def runTest (env: Lean.Environment) (steps: Test): IO LSpec.TestSeq := do
|
||||
-- Setup the environment for execution
|
||||
let context: Context := {
|
||||
imports := ["Init"]
|
||||
}
|
||||
let context: Context := {}
|
||||
let commands: MainM LSpec.TestSeq :=
|
||||
steps.foldlM (λ suite step => do
|
||||
let result ← step
|
||||
|
|
Loading…
Reference in New Issue