verify_string/verifier/
length.rs

1use std::ops::RangeBounds;
2use derive_builder::Builder;
3use dyn_clone::DynClone;
4use crate::verifier::Verifier;
5
6/// Range-based string length verification
7#[derive(Debug, Clone, Builder)]
8pub struct LengthVerifier<T>
9where T: Iterator<Item=usize> + RangeBounds<usize> + DynClone + Clone + Send + Sync {
10    range: T
11}
12
13impl<T> LengthVerifier<T>
14where T: Iterator<Item=usize> + RangeBounds<usize> + DynClone + Clone + Send + Sync {
15    pub fn new(range: T) -> Self {
16        Self {
17            range
18        }
19    }
20}
21
22impl<T> Verifier for LengthVerifier<T>
23where T: Iterator<Item=usize> + RangeBounds<usize> + DynClone + Clone + Send + Sync {
24
25    fn verify(&self, name: &str) -> Result<(), anyhow::Error> {
26        let len = name.chars().count();
27
28        if self.range.contains(&len) {
29            Ok(())
30        } else {
31            Err(anyhow::anyhow!("Length is out of range: {}", len))
32        }
33    }
34}