#![deny(missing_docs)]
#![deny(rustdoc::broken_intra_doc_links)]
pub mod form_request;
pub mod rule;
pub mod validator;
pub use form_request::{field, FormRequest, Validated};
pub use rule::{Outcome, Rule};
pub use validator::{RuleSet, ValidationErrors, Validator};
use serde_json::Value;
pub fn lookup<'a>(root: &'a Value, path: &str) -> Option<&'a Value> {
let mut cursor = root;
for segment in path.split('.') {
cursor = match cursor {
Value::Object(map) => map.get(segment)?,
Value::Array(items) => items.get(segment.parse::<usize>().ok()?)?,
_ => return None,
};
}
Some(cursor)
}
pub use async_trait::async_trait;
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn lookup_walks_objects_and_arrays() {
let value = json!({ "items": [{ "sku": "a" }] });
assert_eq!(lookup(&value, "items.0.sku"), Some(&json!("a")));
assert_eq!(lookup(&value, "items.1.sku"), None);
assert_eq!(lookup(&value, "missing"), None);
assert_eq!(lookup(&value, "items.0.sku.deeper"), None);
}
}