58 lines
1.6 KiB
Plaintext
58 lines
1.6 KiB
Plaintext
import Lean
|
|
import DocGen4.Process
|
|
import DocGen4.Output.Base
|
|
import Std.Data.RBMap
|
|
|
|
namespace DocGen4.Output
|
|
|
|
open Lean Std
|
|
|
|
structure JsonDeclaration where
|
|
name : String
|
|
doc : String
|
|
docLink : String
|
|
sourceLink : String
|
|
deriving FromJson, ToJson
|
|
|
|
structure JsonInstance where
|
|
name : String
|
|
className : String
|
|
typeNames : Array String
|
|
deriving FromJson, ToJson
|
|
|
|
structure JsonModule where
|
|
name : String
|
|
declarations : List JsonDeclaration
|
|
instances : Array JsonInstance
|
|
imports : Array String
|
|
deriving FromJson, ToJson
|
|
|
|
def DocInfo.toJson (module : Name) (info : Process.DocInfo) : HtmlM JsonDeclaration := do
|
|
let name := info.getName.toString
|
|
let doc := info.getDocString.getD ""
|
|
let docLink ← declNameToLink info.getName
|
|
let sourceLink ← getSourceUrl module info.getDeclarationRange
|
|
pure { name, doc, docLink, sourceLink }
|
|
|
|
def Process.Module.toJson (module : Process.Module) : HtmlM Json := do
|
|
let mut jsonDecls := []
|
|
let mut instances := #[]
|
|
let declInfo := Process.filterMapDocInfo module.members
|
|
for decl in declInfo do
|
|
jsonDecls := (←DocInfo.toJson module.name decl) :: jsonDecls
|
|
if let .instanceInfo i := decl then
|
|
instances := instances.push {
|
|
name := i.name.toString,
|
|
className := i.className.toString
|
|
typeNames := i.typeNames.map Name.toString
|
|
}
|
|
let jsonMod : JsonModule := {
|
|
name := module.name.toString,
|
|
declarations := jsonDecls,
|
|
instances,
|
|
imports := module.imports.map Name.toString
|
|
}
|
|
pure <| ToJson.toJson jsonMod
|
|
|
|
end DocGen4.Output
|