use serde_json::{Number, Value};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum ScalarKind {
String,
Number,
Integer,
Boolean,
}
impl ScalarKind {
pub(crate) fn from_name(name: &str) -> Option<Self> {
match name {
"string" => Some(Self::String),
"number" => Some(Self::Number),
"integer" => Some(Self::Integer),
"boolean" => Some(Self::Boolean),
_ => None,
}
}
}
#[derive(Debug, Clone, Default, PartialEq)]
pub(crate) struct ScalarMatcher {
pub(crate) kind: Option<ScalarKind>,
pub(crate) const_value: Option<Value>,
pub(crate) enum_values: Vec<Value>,
pub(crate) minimum: Option<Number>,
pub(crate) maximum: Option<Number>,
pub(crate) exclusive_minimum: Option<Number>,
pub(crate) exclusive_maximum: Option<Number>,
pub(crate) multiple_of: Option<Number>,
pub(crate) min_length: Option<u64>,
pub(crate) max_length: Option<u64>,
pub(crate) pattern: Option<String>,
pub(crate) format: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn scalar_kind_classifies_only_supported_scalar_types() {
assert_eq!(ScalarKind::from_name("string"), Some(ScalarKind::String));
assert_eq!(ScalarKind::from_name("integer"), Some(ScalarKind::Integer));
assert_eq!(ScalarKind::from_name("object"), None);
assert_eq!(ScalarKind::from_name("null"), None);
}
}