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}