bookshelf-doc/DocGen4/LeanInk/Process.lean

41 lines
1.2 KiB
Plaintext

/-
Copyright (c) 2022 Henrik Böving. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Henrik Böving
-/
import Lean.Data.Json
namespace DocGen4.Output.LeanInk
open Lean
open IO
def runInk (inkPath : System.FilePath) (sourceFilePath : System.FilePath) : IO Json := do
let arguments := #[
"analyze", sourceFilePath.toString,
"--lake", "lakefile.lean",
"--x-enable-type-info",
"--x-enable-docStrings",
"--x-enable-semantic-token"
]
let inkProcess ← Process.spawn {
stdin := Process.Stdio.null
stdout := Process.Stdio.piped
stderr := Process.Stdio.piped
cmd := inkPath.toString
args := arguments
}
match (←inkProcess.wait) with
| 0 =>
let outputFilePath := sourceFilePath.withExtension "lean.leanInk"
let output ← FS.readFile outputFilePath
FS.removeFile outputFilePath
match Json.parse output with
| .ok out => pure out
| .error err =>
throw $ IO.userError s!"LeanInk returned invalid JSON for file: {sourceFilePath}:\n{err}"
| code =>
throw $ IO.userError s!"LeanInk exited with code {code} for file: {sourceFilePath}:\n{←inkProcess.stderr.readToEnd}"
end DocGen4.Output.LeanInk