
Decode.pudu
Pudu55 lines2.2 KB
1/** @Domain.Reference.Decode.Module — compiler reference output as entries */2module PuduLangMcp.Domain.Reference.Decode34import Std.Json as Json5import Std.Option as Option6import PuduLangMcp.Domain.Reference.Entry as Entry7import PuduLangMcp.Utils.JsonAccess as Access8910export fn exportsOf(apiJson: Str) -> Result[Set[Str], Str] {11 let value = match Json.decode(apiJson) {12 case Ok(decoded) => decoded13 case Err(problem) => { return Err("api output is not JSON: " + Json.explain(&problem)) }14 }15 let items = match Access.member(&value, "exports") {16 case Some(Json.List(found)) => found17 case _ => { return Err("api output has no exports") }18 }19 var names: Set[Str] = setOf([])20 for item in items {21 names = names.insert(Option.unwrapOr(Access.text(&item, "module"), "") + "." + Option.unwrapOr(Access.text(&item, "name"), ""))22 }23 Ok(names)24}252627export fn entriesOf(docJson: Str, exports: &Set[Str]) -> Result[Array[Entry.Entry], Str] {28 let value = match Json.decode(docJson) {29 case Ok(decoded) => decoded30 case Err(problem) => { return Err("doc output is not JSON: " + Json.explain(&problem)) }31 }32 let items = match Access.member(&value, "entries") {33 case Some(Json.List(found)) => found34 case _ => { return Err("doc output has no entries") }35 }36 var seen: Set[Str] = setOf([])37 var entries: Array[Entry.Entry] = []38 for item in items {39 let moduleName = Option.unwrapOr(Access.text(&item, "module"), "")40 let name = Option.unwrapOr(Access.text(&item, "name"), "")41 let kind = Option.unwrapOr(Access.text(&item, "kind"), "")42 let signature = Option.unwrapOr(Access.text(&item, "signature"), "")43 let key = moduleName + "." + name + " " + kind + " " + signature44 if exports.contains(moduleName + "." + name) && !seen.contains(key) {45 seen = seen.insert(key)46 let doc = match Access.member(&item, "doc") {47 case Some(Json.List(lines)) => lines.map(|line: Json.Json| Option.unwrapOr(Json.asText(&line), "")).join("\n")48 case _ => ""49 }50 entries = entries.push(Entry.Entry{moduleName: moduleName, kind: kind, name: name, signature: signature, doc: doc})51 }52 }53 Ok(entries)54}55