Pantograph/Main.lean

59 lines
1.4 KiB
Plaintext

import Lean.Data.Json
import Pantograph.Commands
namespace Pantograph
structure State where
environments: Array String
-- State monad
abbrev T (m: Type → Type) := StateT State m
abbrev Subroutine := T (Except String) Lean.Json
structure Command where
cmd: String
payload: Lean.Json
deriving Lean.FromJson
--def create_environment (args: Create): Subroutine := do
-- let state ← get
end Pantograph
open Pantograph
def execute (command: String): T (ExceptT String IO) Lean.Json := do
let state ← get
let obj ← Lean.Json.parse command
let command: Command ← Lean.fromJson? obj
match command.cmd with
| "create" =>
let create: Commands.Create ← Lean.fromJson? command.payload
return Lean.toJson create.imports
| "catalog" =>
let catalog: Commands.Catalog ← Lean.fromJson? command.payload
return "catalog stub"
| cmd => throw s!"Unknown verb: {cmd}"
-- Main IO functions
unsafe def getLines : IO String := do
match (← (← IO.getStdin).getLine) with
| "" => pure ""
| "\n" => pure "\n"
| line => pure <| line ++ (← getLines)
unsafe def loop : T IO Unit := do
let state ← get
let command ← getLines
if command == "" then return ()
let ret ← execute command
match ret with
| .error e => IO.println s!"Could not parse json: {e}"
| .ok obj => IO.println <| toString <| obj
unsafe def main : IO Unit :=
StateT.run' loop ⟨#[]⟩