jwt_lab/mutate.rs
1use crate::{types::Jwt, Error, Result};
2use serde_json::Value;
3
4impl Jwt {
5 /// Set a claim value using a JSON pointer path
6 ///
7 /// # Arguments
8 ///
9 /// * `path` - JSON pointer path (e.g., "/sub", "/user/name")
10 /// * `value` - The value to set
11 ///
12 /// # Returns
13 ///
14 /// Returns `Ok(())` if the value was set successfully, or an error if the path is invalid
15 ///
16 /// # Errors
17 ///
18 /// - `Error::Claims` if the path is invalid or traverses a non-object
19 ///
20 /// # Examples
21 ///
22 /// ```rust
23 /// use jwt_lab::{Jwt, Algorithm, Header, Claims};
24 /// use serde_json::json;
25 ///
26 /// # fn main() -> Result<(), Box<dyn std::error::Error>> {
27 /// let mut jwt = Jwt {
28 /// header: Header { alg: Algorithm::HS256, typ: None, kid: None, extra: Default::default() },
29 /// claims: Claims(serde_json::Map::new()),
30 /// signature_b64: String::new(),
31 /// raw_header_b64: String::new(),
32 /// raw_payload_b64: String::new(),
33 /// };
34 ///
35 /// jwt.set("/sub", json!("user123"))?;
36 /// jwt.set("/user/name", json!("John Doe"))?;
37 /// # Ok(()) }
38 /// ```
39 pub fn set(&mut self, path: &str, value: Value) -> Result<()> {
40 let mut cur = &mut self.claims.0;
41 let segments: Vec<_> = path.trim_start_matches('/').split('/').filter(|s| !s.is_empty()).collect();
42 if segments.is_empty() { return Err(Error::Claims("invalid json pointer".into())); }
43 for i in 0..segments.len() {
44 let k = segments[i];
45 if i == segments.len() - 1 {
46 cur.insert(k.to_string(), value.clone());
47 } else {
48 cur = cur.entry(k.to_string())
49 .or_insert_with(|| Value::Object(Default::default()))
50 .as_object_mut()
51 .ok_or_else(|| Error::Claims("path traverses non-object".into()))?;
52 }
53 }
54 Ok(())
55 }
56}