use doido_core::Result;
use serde::de::DeserializeOwned;
use serde_json::{Map, Value};
#[derive(Debug, Clone)]
pub struct Params {
value: Value,
}
impl Params {
pub fn new(value: Value) -> Self {
Self { value }
}
pub fn require(&self, key: &str) -> Result<Params> {
match self.value.get(key) {
Some(v) => Ok(Params::new(v.clone())),
None => Err(doido_core::anyhow::anyhow!(
"param `{key}` is required but missing"
)),
}
}
pub fn permit(&self, allowed: &[&str]) -> Params {
let mut out = Map::new();
if let Value::Object(map) = &self.value {
for &key in allowed {
if let Some(v) = map.get(key) {
out.insert(key.to_string(), v.clone());
}
}
}
Params::new(Value::Object(out))
}
pub fn get(&self, key: &str) -> Option<&Value> {
self.value.get(key)
}
pub fn deserialize<T: DeserializeOwned>(&self) -> Result<T> {
serde_json::from_value(self.value.clone())
.map_err(|e| doido_core::anyhow::anyhow!("params deserialization failed: {e}"))
}
pub fn into_value(self) -> Value {
self.value
}
}