jwt-lab 0.1.1

JWT crate for Rust: decode, verify, sign, mutate, JWK/JWKS, algorithm selection, time validation, and secure APIs.
Documentation
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(())
    }
}