Pudu programming language
Menu
Package

@chrismichaelps / pudu-lang-mcp

Model Context Protocol server for Pudu language documentation and compiler tools

0.1.1Apache-2.01

InstallClose

Decode.pudu

Pudu55 lines2.2 KB

GitHub ↗
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 Access89/// The qualified names `pudu api --json` reports as public.10export 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}2526/// The exported declarations in `pudu doc --json` output, each once.27export 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