
JsonAccess.pudu
Pudu64 lines1.8 KB
1/** @Utils.JsonAccess.Helper — typed member access over JSON values */2module PuduLangMcp.Utils.JsonAccess34import Std.Json as Json5import Std.Option as Option678export fn member(value: &Json.Json, name: Str) -> Option[Json.Json] {9 Json.field(value, name)10}111213export fn text(value: &Json.Json, name: Str) -> Option[Str] {14 let held = Json.field(value, name) ?15 Json.asText(&held)16}171819export fn integer(value: &Json.Json, name: Str) -> Option[Int] {20 let held = Json.field(value, name) ?21 Json.asInt(&held)22}232425export fn boolean(value: &Json.Json, name: Str) -> Option[Bool] {26 let held = Json.field(value, name) ?27 Json.asBool(&held)28}293031export fn members(value: &Json.Json) -> Array[(Str, Json.Json)] {32 Option.unwrapOr(Json.asObject(value), [])33}343536export fn kindOf(value: &Json.Json) -> Str {37 match value {38 case Json.Null => "null"39 case Json.Boolean(_) => "boolean"40 case Json.Number(_) => "integer"41 case Json.Fractional(_) => "number"42 case Json.Text(_) => "string"43 case Json.List(_) => "array"44 case Json.Object(_) => "object"45 }46}474849export fn texts(values: &Array[Str]) -> Json.Json {50 Json.list(&values.map(|value: Str| Json.Text(value)))51}525354export fn pathText(value: &Json.Json, steps: &Array[Str]) -> Option[Str] {55 let held = Json.path(value, steps) ?56 Json.asText(&held)57}585960export fn pathInt(value: &Json.Json, steps: &Array[Str]) -> Option[Int] {61 let held = Json.path(value, steps) ?62 Json.asInt(&held)63}64