prost-reflect-validate 0.2.9

protoc-gen-validate's validation using prost-reflect
Documentation
use crate::registry::FieldValidationFn;
use prost_reflect::FieldDescriptor;
use prost_validate::errors::r#bool;
use prost_validate::Error;
use prost_validate_types::field_rules::Type;
use prost_validate_types::FieldRules;
use std::sync::Arc;

pub(crate) fn make_validate_bool(
    field: &FieldDescriptor,
    rules: &FieldRules,
) -> Vec<FieldValidationFn<bool>> {
    let mut fns: Vec<FieldValidationFn<bool>> = Vec::new();
    if !matches!(rules.r#type, Some(Type::Bool(_))) {
        return fns;
    }
    let rules = match rules.r#type {
        Some(Type::Bool(rules)) => rules,
        _ => return fns,
    };
    if let Some(v) = rules.r#const {
        let name = field.full_name().to_string();
        fns.push(Arc::new(move |val, _| {
            let val = val.unwrap_or(false);
            if val != v {
                return Err(Error::new(name.clone(), r#bool::Error::Const(v)));
            }
            Ok(true)
        }))
    }
    fns
}