You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lean4game/server/leanserver/GameServer/Game.lean

66 lines
1.6 KiB
Plaintext

import Lean
2 years ago
import GameServer.EnvExtensions
2 years ago
open Lean
2 years ago
structure GameServerState :=
(env : Lean.Environment)
abbrev GameServerM := StateT GameServerState Server.Watchdog.ServerM
instance : MonadEnv GameServerM := {
getEnv := do return (← get).env
modifyEnv := fun f => do
let s ← get
set {s with env := f s.env}
}
namespace Game
open Server
open Watchdog
open Lsp
open JsonRpc
2 years ago
open IO
2 years ago
structure LevelInfo where
index : Nat
title : String
tactics: Array TacticDocEntry
lemmas: Array LemmaDocEntry
deriving ToJson
2 years ago
structure LoadLevelParams where
number : Nat
deriving ToJson, FromJson
2 years ago
partial def handleServerEvent (ev : ServerEvent) : GameServerM Bool := do
match ev with
| ServerEvent.clientMsg msg =>
match msg with
| Message.request id "info" _ =>
2 years ago
let s ← get
let c ← read
let levels := levelsExt.getState s.env
let game := {← gameExt.get with nb_levels := levels.size }
c.hOut.writeLspResponse ⟨id, game⟩
return true
| Message.request id "loadLevel" params =>
let p ← parseParams LoadLevelParams (toJson params)
let idx := p.number
2 years ago
let s ← get
let c ← read
let levels := levelsExt.getState s.env
let some lvl := levels.find? idx | throwServerError s!"Cannot find level {idx}"
let levelInfo : LevelInfo :=
{ index := lvl.index,
title := lvl.title,
tactics := lvl.tactics,
lemmas := lvl.lemmas }
c.hOut.writeLspResponse ⟨id, ToJson.toJson levelInfo⟩
return true
| _ => return false
| _ => return false
end Game