slack_blocks/
val_helpr.rs1use 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}