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}