{"name":"serde_demo.nu","source":"// examples/serde_demo.nu — round-trip a user struct through JSON via\n// the stdlib/ext/serde.nu Serialize trait + a hand-written from_json\n// helper. Demonstrates the recommended shape; mirror it for your\n// own types.\n//\n// Build:\n//   ./nurl.sh examples/serde_demo.nu /tmp/serde_demo\n//   /tmp/serde_demo\n\n$ `stdlib/ext/serde.nu`\n\n// ── A typical leaf struct ──────────────────────────────────────────\n\n: Point { i x i y }\n\n// to_json: build a JObj, set each field via `to_json` recursively.\n% JsonSerialize Point {\n    @ to_json Point p → Json {\n        : Json j ( json_obj_new )\n        ( json_obj_set j `x` ( to_json . p x ) )\n        ( json_obj_set j `y` ( to_json . p y ) )\n        ^ j\n    }\n}\n\n// from_json: destructure a JObj, decode each field via the matching\n// `from_json_<T>` helper, propagate errors via try-propagation.\n@ point_from_json Json j → !Point ParseErr {\n    : ?Json jxo ( json_obj_get j `x` )\n    : ?Json jyo ( json_obj_get j `y` )\n    ?? jxo {\n        T jx → {\n            ?? jyo {\n                T jy → {\n                    : !i ParseErr xr ( from_json_i jx )\n                    : !i ParseErr yr ( from_json_i jy )\n                    ?? xr {\n                        T xv → {\n                            ?? yr {\n                                T yv → ^ @ !Point ParseErr { T @ Point { xv yv } }\n                                F e → ^ @ !Point ParseErr { F e }\n                            }\n                        }\n                        F e → ^ @ !Point ParseErr { F e }\n                    }\n                }\n                F → ^ @ !Point ParseErr { F @ ParseErr { BadFormat } }\n            }\n        }\n        F → ^ @ !Point ParseErr { F @ ParseErr { BadFormat } }\n    }\n}\n\n@ main → v {\n    : Point p @ Point { 3 4 }\n\n    // Encode side: trait dispatch routes ( to_json p ) to our Point impl.\n    : Json j ( to_json p )\n    : String s ( json_stringify j )\n    ( nurl_print `encoded:  ` ) ( nurl_print ( string_data s ) ) ( nurl_print `\\n` )\n\n    // Round-trip: parse the JSON text back, decode into a Point, compare.\n    : !Json JsonError pr ( json_parse ( string_data s ) )\n    ?? pr {\n        T j2 → {\n            : !Point ParseErr p2r ( point_from_json j2 )\n            ?? p2r {\n                T p2 → {\n                    ( nurl_print `decoded:  Point { ` )\n                    ( nurl_print_int . p2 x )\n                    ( nurl_print ` ` )\n                    ( nurl_print_int . p2 y )\n                    ( nurl_print ` }\\n` )\n                }\n                F _ → ( nurl_print `decode FAIL\\n` )\n            }\n            ( json_free j2 )\n        }\n        F _ → ( nurl_print `parse FAIL\\n` )\n    }\n\n    ( string_free s )\n    ( json_free j )\n}\n","bytes":2816}