use serde::{Deserialize, Serialize};
use crate::SchemaContract;
pub const RESERVED_PARAM_KEYS: &[&str] = &[
"page",
"per_page",
"target_provider_id",
"timeout_seconds",
"id",
];
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ParamFieldDescriptor {
pub key: String,
pub schema: SchemaContract,
#[serde(default)]
pub required: bool,
}
impl ParamFieldDescriptor {
pub fn new(key: impl Into<String>, schema: SchemaContract) -> Self {
Self {
key: key.into(),
schema,
required: false,
}
}
#[must_use]
pub fn required(mut self) -> Self {
self.required = true;
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn param_field_descriptor_defaults_required_false_on_wire() {
let json = serde_json::json!({ "key": "plugin_config_id", "schema": { "type": "string" } });
let field: ParamFieldDescriptor = serde_json::from_value(json).expect("deserialize");
assert!(!field.required);
assert_eq!(field.schema, crate::SchemaContract::String);
}
#[test]
fn reserved_keys_cover_the_b5_id_key() {
assert!(RESERVED_PARAM_KEYS.contains(&"id"));
assert!(RESERVED_PARAM_KEYS.contains(&"page"));
assert!(RESERVED_PARAM_KEYS.contains(&"per_page"));
assert!(RESERVED_PARAM_KEYS.contains(&"target_provider_id"));
assert!(RESERVED_PARAM_KEYS.contains(&"timeout_seconds"));
}
}