Skip to content

Commit

Permalink
changed trait to require length
Browse files Browse the repository at this point in the history
  • Loading branch information
pintariching committed Jul 11, 2022
1 parent ee04dd0 commit a77bdc9
Show file tree
Hide file tree
Showing 2 changed files with 170 additions and 122 deletions.
235 changes: 150 additions & 85 deletions validator/src/validation/length.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,8 @@ pub fn validate_length<T: ValidateLength>(
max: Option<u64>,
equal: Option<u64>,
) -> bool {
value.validate_length(min, max, equal)
}
let length = value.length();

fn validate_length_for_trait(
length: u64,
min: Option<u64>,
max: Option<u64>,
equal: Option<u64>,
) -> bool {
if let Some(eq) = equal {
return length == eq;
} else {
Expand All @@ -43,125 +36,198 @@ fn validate_length_for_trait(
}

pub trait ValidateLength {
fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool;
//fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool;
fn length(&self) -> u64;
}

impl ValidateLength for String {
fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
validate_length_for_trait(self.chars().count() as u64, min, max, equal)
// fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
// validate_length_for_trait(self.chars().count() as u64, min, max, equal)
// }

fn length(&self) -> u64 {
self.chars().count() as u64
}
}

impl<'a> ValidateLength for &'a String {
fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
validate_length_for_trait(self.chars().count() as u64, min, max, equal)
// fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
// validate_length_for_trait(self.chars().count() as u64, min, max, equal)
// }

fn length(&self) -> u64 {
self.chars().count() as u64
}
}

impl<'a> ValidateLength for &'a str {
fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
validate_length_for_trait(self.chars().count() as u64, min, max, equal)
// fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
// validate_length_for_trait(self.chars().count() as u64, min, max, equal)
// }

fn length(&self) -> u64 {
self.chars().count() as u64
}
}

impl<'a> ValidateLength for Cow<'a, str> {
fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
validate_length_for_trait(self.chars().count() as u64, min, max, equal)
// fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
// validate_length_for_trait(self.chars().count() as u64, min, max, equal)
// }

fn length(&self) -> u64 {
self.chars().count() as u64
}
}

impl<T> ValidateLength for Vec<T> {
fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
validate_length_for_trait(self.len() as u64, min, max, equal)
// fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
// validate_length_for_trait(self.len() as u64, min, max, equal)
// }

fn length(&self) -> u64 {
self.len() as u64
}
}

impl<'a, T> ValidateLength for &'a Vec<T> {
fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
validate_length_for_trait(self.len() as u64, min, max, equal)
// fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
// validate_length_for_trait(self.len() as u64, min, max, equal)
// }

fn length(&self) -> u64 {
self.len() as u64
}
}

impl<T> ValidateLength for &[T] {
fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
validate_length_for_trait(self.len() as u64, min, max, equal)
// fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
// validate_length_for_trait(self.len() as u64, min, max, equal)
// }

fn length(&self) -> u64 {
self.len() as u64
}
}

impl<T, const N: usize> ValidateLength for [T; N] {
fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
validate_length_for_trait(N as u64, min, max, equal)
// fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
// validate_length_for_trait(N as u64, min, max, equal)
// }

fn length(&self) -> u64 {
N as u64
}
}

impl<T, const N: usize> ValidateLength for &[T; N] {
fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
validate_length_for_trait(N as u64, min, max, equal)
// fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
// validate_length_for_trait(N as u64, min, max, equal)
// }

fn length(&self) -> u64 {
N as u64
}
}

impl<'a, K, V, S> ValidateLength for &'a HashMap<K, V, S> {
fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
validate_length_for_trait(self.len() as u64, min, max, equal)
// fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
// validate_length_for_trait(self.len() as u64, min, max, equal)
// }

fn length(&self) -> u64 {
self.len() as u64
}
}

impl<K, V, S> ValidateLength for HashMap<K, V, S> {
fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
validate_length_for_trait(self.len() as u64, min, max, equal)
// fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
// validate_length_for_trait(self.len() as u64, min, max, equal)
// }

fn length(&self) -> u64 {
self.len() as u64
}
}

impl<'a, T, S> ValidateLength for &'a HashSet<T, S> {
fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
validate_length_for_trait(self.len() as u64, min, max, equal)
// fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
// validate_length_for_trait(self.len() as u64, min, max, equal)
// }

fn length(&self) -> u64 {
self.len() as u64
}
}

impl<'a, K, V> ValidateLength for &'a BTreeMap<K, V> {
fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
validate_length_for_trait(self.len() as u64, min, max, equal)
// fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
// validate_length_for_trait(self.len() as u64, min, max, equal)
// }

fn length(&self) -> u64 {
self.len() as u64
}
}

impl<'a, T> ValidateLength for &'a BTreeSet<T> {
fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
validate_length_for_trait(self.len() as u64, min, max, equal)
// fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
// validate_length_for_trait(self.len() as u64, min, max, equal)
// }

fn length(&self) -> u64 {
self.len() as u64
}
}

impl<T> ValidateLength for BTreeSet<T> {
fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
validate_length_for_trait(self.len() as u64, min, max, equal)
// fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
// validate_length_for_trait(self.len() as u64, min, max, equal)
// }

fn length(&self) -> u64 {
self.len() as u64
}
}

#[cfg(feature = "indexmap")]
impl<'a, K, V> ValidateLength for &'a IndexMap<K, V> {
fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
validate_length_for_trait(self.len() as u64, min, max, equal)
// fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
// validate_length_for_trait(self.len() as u64, min, max, equal)
// }

fn length(&self) -> u64 {
self.len() as u64
}
}

#[cfg(feature = "indexmap")]
impl<'a, T> ValidateLength for &'a IndexSet<T> {
fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
validate_length_for_trait(self.len() as u64, min, max, equal)
// fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
// validate_length_for_trait(self.len() as u64, min, max, equal)
// }

fn length(&self) -> u64 {
self.len() as u64
}
}

#[cfg(feature = "indexmap")]
impl<T> ValidateLength for IndexSet<T> {
fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
validate_length_for_trait(self.len() as u64, min, max, equal)
// fn validate_length(&self, min: Option<u64>, max: Option<u64>, equal: Option<u64>) -> bool {
// validate_length_for_trait(self.len() as u64, min, max, equal)
// }

fn length(&self) -> u64 {
self.len() as u64
}
}

#[cfg(test)]
mod tests {
use std::borrow::Cow;

use crate::{validate_length, validation::length::ValidateLength};
use crate::{validate_length};

#[test]
fn test_validate_length_equal_overrides_min_max() {
Expand Down Expand Up @@ -202,43 +268,42 @@ mod tests {
assert!(validate_length("日本", None, None, Some(2)));
}


#[test]
fn test_validate_length_trait_equal_overrides_min_max() {
assert!(String::from("hello").validate_length(Some(1), Some(2), Some(5)));
}

#[test]
fn test_validate_length_trait_string_min_max() {
assert!(String::from("hello").validate_length(Some(1), Some(10), None));
}

#[test]
fn test_validate_length_trait_string_min_only() {
assert!(!String::from("hello").validate_length(Some(10), None, None));
}

#[test]
fn test_validate_length_trait_string_max_only() {
assert!(!String::from("hello").validate_length(None, Some(1), None));
}

#[test]
fn test_validate_length_trait_cow() {
let test: Cow<'static, str> = "hello".into();
assert!(test.validate_length(None, None, Some(5)));

let test: Cow<'static, str> = String::from("hello").into();
assert!(test.validate_length(None, None, Some(5)));
}

#[test]
fn test_validate_length_trait_vec() {
assert!(vec![1, 2, 3].validate_length(None, None, Some(3)));
}

#[test]
fn test_validate_length_trait_unicode_chars() {
assert!(String::from("日本").validate_length(None, None, Some(2)));
}
// #[test]
// fn test_validate_length_trait_equal_overrides_min_max() {
// assert!(String::from("hello").validate_length(Some(1), Some(2), Some(5)));
// }

// #[test]
// fn test_validate_length_trait_string_min_max() {
// assert!(String::from("hello").validate_length(Some(1), Some(10), None));
// }

// #[test]
// fn test_validate_length_trait_string_min_only() {
// assert!(!String::from("hello").validate_length(Some(10), None, None));
// }

// #[test]
// fn test_validate_length_trait_string_max_only() {
// assert!(!String::from("hello").validate_length(None, Some(1), None));
// }

// #[test]
// fn test_validate_length_trait_cow() {
// let test: Cow<'static, str> = "hello".into();
// assert!(test.validate_length(None, None, Some(5)));

// let test: Cow<'static, str> = String::from("hello").into();
// assert!(test.validate_length(None, None, Some(5)));
// }

// #[test]
// fn test_validate_length_trait_vec() {
// assert!(vec![1, 2, 3].validate_length(None, None, Some(3)));
// }

// #[test]
// fn test_validate_length_trait_unicode_chars() {
// assert!(String::from("日本").validate_length(None, None, Some(2)));
// }
}
Loading

0 comments on commit a77bdc9

Please sign in to comment.