Skip to main content

parse_and_build/
parse_and_build.rs

1// SPDX-License-Identifier: MIT OR Apache-2.0
2// Copyright (c) 2026 oxml-json. All rights reserved.
3
4//! Reading a JSON-RPC request and building its reply.
5//!
6//! Run with:
7//!
8//! ```text
9//! cargo run --example parse_and_build
10//! ```
11
12use oxml_json::{Json, parse};
13
14fn main() {
15    let request = r#"{"jsonrpc":"2.0","id":7,"method":"initialize","params":{"trace":"off"}}"#;
16
17    let value = parse(request).expect("the request is valid JSON");
18
19    // `get` walks objects; it returns `None` for a missing key and for
20    // a value that is not an object, so chains do not need a type check
21    // at every step.
22    assert_eq!(
23        value.get("method").and_then(Json::as_str),
24        Some("initialize")
25    );
26    assert_eq!(
27        value
28            .get("params")
29            .and_then(|p| p.get("trace"))
30            .and_then(Json::as_str),
31        Some("off")
32    );
33
34    // Building a reply. Object keys come back out in sorted order,
35    // which makes serialised output comparable in a test without
36    // parsing it again.
37    let reply = Json::object(vec![
38        ("jsonrpc", Json::str("2.0")),
39        ("id", value.get("id").cloned().unwrap_or(Json::Null)),
40        (
41            "result",
42            Json::object(vec![("capabilities", Json::object(vec![]))]),
43        ),
44    ]);
45
46    println!("{}", reply.to_json());
47
48    // Malformed input is an error with a message, not a panic and not
49    // a silent default.
50    let bad = parse("{\"unterminated\": ");
51    println!("malformed input: {}", bad.unwrap_err());
52}