#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TextFieldLineLimits {
SingleLine,
MultiLine {
min_lines: usize,
max_lines: usize,
},
}
impl TextFieldLineLimits {
pub const DEFAULT: Self = Self::MultiLine {
min_lines: 1,
max_lines: usize::MAX,
};
#[inline]
pub fn is_single_line(&self) -> bool {
matches!(self, Self::SingleLine)
}
#[inline]
pub fn is_multi_line(&self) -> bool {
matches!(self, Self::MultiLine { .. })
}
pub fn min_lines(&self) -> usize {
match self {
Self::SingleLine => 1,
Self::MultiLine { min_lines, .. } => *min_lines,
}
}
pub fn max_lines(&self) -> usize {
match self {
Self::SingleLine => 1,
Self::MultiLine { max_lines, .. } => *max_lines,
}
}
}
impl Default for TextFieldLineLimits {
fn default() -> Self {
Self::DEFAULT
}
}
pub fn filter_for_single_line(text: &str) -> String {
text.replace('\n', " ")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn single_line_properties() {
let limits = TextFieldLineLimits::SingleLine;
assert!(limits.is_single_line());
assert!(!limits.is_multi_line());
assert_eq!(limits.min_lines(), 1);
assert_eq!(limits.max_lines(), 1);
}
#[test]
fn multi_line_default_properties() {
let limits = TextFieldLineLimits::default();
assert!(!limits.is_single_line());
assert!(limits.is_multi_line());
assert_eq!(limits.min_lines(), 1);
assert_eq!(limits.max_lines(), usize::MAX);
}
#[test]
fn multi_line_constrained_properties() {
let limits = TextFieldLineLimits::MultiLine {
min_lines: 3,
max_lines: 10,
};
assert!(!limits.is_single_line());
assert!(limits.is_multi_line());
assert_eq!(limits.min_lines(), 3);
assert_eq!(limits.max_lines(), 10);
}
#[test]
fn filter_replaces_newlines() {
assert_eq!(filter_for_single_line("hello\nworld"), "hello world");
assert_eq!(filter_for_single_line("a\n\nb"), "a b");
assert_eq!(filter_for_single_line("no newlines"), "no newlines");
assert_eq!(filter_for_single_line("\n\n\n"), " ");
}
}