slack_blocks/
val_helpr.rs

1//! TODO: rename mod to validation
2
3use std::borrow::Cow;
4
5use validator::ValidationError;
6
7pub(crate) type ValidationResult = Result<(), validator::ValidationErrors>;
8pub(crate) type ValidatorResult = Result<(), validator::ValidationError>;
9
10pub(crate) fn error<StrIsh: AsRef<str>>(kind: &'static str,
11                                        msg: StrIsh)
12                                        -> ValidationError {
13  let mut error = ValidationError::new(kind);
14  error.add_param(Cow::from("message"), &msg.as_ref());
15
16  error
17}
18
19pub(crate) fn below_len(context: &'static str,
20                        max_len: u16,
21                        text: impl Long)
22                        -> ValidatorResult {
23  let len = text.len();
24
25  if len >= max_len.into() {
26    Err(error(context,
27              format!("{} has a max length of {}, got {}",
28                      context, max_len, len)))
29  } else {
30    Ok(())
31  }
32}
33
34pub(crate) fn len(context: &'static str,
35                  range: impl std::ops::RangeBounds<usize> + std::fmt::Debug,
36                  text: impl Long)
37                  -> ValidatorResult {
38  let len = text.len();
39
40  if !range.contains(&len) {
41    Err(error(context,
42              format!("{} must be within range {:#?}, got {}",
43                      context, range, len)))
44  } else {
45    Ok(())
46  }
47}
48
49pub(crate) trait Long {
50  fn len(&self) -> usize;
51}
52
53impl Long for &crate::text::Text {
54  fn len(&self) -> usize {
55    self.as_ref().len()
56  }
57}
58
59impl Long for &str {
60  fn len(&self) -> usize {
61    str::len(self)
62  }
63}
64
65impl<'a> Long for &Cow<'a, str> {
66  fn len(&self) -> usize {
67    str::len(self)
68  }
69}
70
71impl<T> Long for &[T] {
72  fn len(&self) -> usize {
73    self.as_ref().len()
74  }
75}