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