use super::super::super::{FieldMetadata, ValidationNumber, ValidationRule, ValidationValue};
impl FieldMetadata {
#[must_use]
pub fn validate(mut self, rule: ValidationRule) -> Self {
self.upsert_validation(rule);
self
}
#[must_use]
pub fn non_empty(self) -> Self {
self.validate(ValidationRule::NonEmpty)
}
#[must_use]
pub fn min(self, min: impl Into<ValidationNumber>) -> Self {
self.validate(ValidationRule::Min(min.into()))
}
#[must_use]
pub fn max(self, max: impl Into<ValidationNumber>) -> Self {
self.validate(ValidationRule::Max(max.into()))
}
#[must_use]
pub fn min_length(self, min: usize) -> Self {
self.validate(ValidationRule::MinLength(min))
}
#[must_use]
pub fn max_length(self, max: usize) -> Self {
self.validate(ValidationRule::MaxLength(max))
}
#[must_use]
pub fn min_items(self, min: usize) -> Self {
self.validate(ValidationRule::MinItems(min))
}
#[must_use]
pub fn max_items(self, max: usize) -> Self {
self.validate(ValidationRule::MaxItems(max))
}
#[must_use]
pub fn min_properties(self, min: usize) -> Self {
self.validate(ValidationRule::MinProperties(min))
}
#[must_use]
pub fn max_properties(self, max: usize) -> Self {
self.validate(ValidationRule::MaxProperties(max))
}
#[must_use]
pub fn multiple_of(self, factor: impl Into<ValidationNumber>) -> Self {
self.validate(ValidationRule::MultipleOf(factor.into()))
}
#[must_use]
pub fn pattern(self, pattern: impl Into<String>) -> Self {
self.validate(ValidationRule::Pattern(pattern.into()))
}
#[must_use]
pub fn unique_items(self) -> Self {
self.validate(ValidationRule::UniqueItems)
}
#[must_use]
pub fn one_of<I, V>(self, values: I) -> Self
where
I: IntoIterator<Item = V>,
V: Into<ValidationValue>,
{
self.validate(ValidationRule::OneOf(
values.into_iter().map(Into::into).collect(),
))
}
#[must_use]
pub fn hostname(self) -> Self {
self.validate(ValidationRule::Hostname)
}
#[must_use]
pub fn url(self) -> Self {
self.validate(ValidationRule::Url)
}
#[must_use]
pub fn email(self) -> Self {
self.validate(ValidationRule::Email)
}
#[must_use]
pub fn ip_addr(self) -> Self {
self.validate(ValidationRule::IpAddr)
}
#[must_use]
pub fn socket_addr(self) -> Self {
self.validate(ValidationRule::SocketAddr)
}
#[must_use]
pub fn absolute_path(self) -> Self {
self.validate(ValidationRule::AbsolutePath)
}
pub(in crate::metadata) fn upsert_validation(&mut self, rule: ValidationRule) {
if let Some(existing) = self
.validations
.iter_mut()
.find(|existing| existing.code() == rule.code())
{
*existing = rule;
} else {
self.validations.push(rule);
}
}
}