#[derive(Debug, Clone, PartialEq, Eq)]
pub enum TruncateStrategy {
Middle {
min_head_items: usize,
min_tail_items: usize,
ellipsis: String,
},
Start {
min_tail_items: usize,
ellipsis: String,
},
End {
min_head_items: usize,
ellipsis: String,
},
ShortenNames {
max_abbrev_len: usize,
preserve_tail_items: usize,
ellipsis: String,
},
None,
}
impl Default for TruncateStrategy {
fn default() -> Self {
Self::middle()
}
}
impl TruncateStrategy {
#[must_use]
pub fn middle() -> Self {
Self::Middle {
min_head_items: 1,
min_tail_items: 2,
ellipsis: String::from("..."),
}
}
#[must_use]
pub fn middle_with(
min_head_items: usize,
min_tail_items: usize,
ellipsis: impl Into<String>,
) -> Self {
Self::Middle {
min_head_items,
min_tail_items,
ellipsis: ellipsis.into(),
}
}
#[must_use]
pub fn start() -> Self {
Self::Start {
min_tail_items: 2,
ellipsis: String::from("..."),
}
}
#[must_use]
pub fn start_with(min_tail_items: usize, ellipsis: impl Into<String>) -> Self {
Self::Start {
min_tail_items,
ellipsis: ellipsis.into(),
}
}
#[must_use]
pub fn end() -> Self {
Self::End {
min_head_items: 1,
ellipsis: String::from("..."),
}
}
#[must_use]
pub fn end_with(min_head_items: usize, ellipsis: impl Into<String>) -> Self {
Self::End {
min_head_items,
ellipsis: ellipsis.into(),
}
}
#[must_use]
pub fn shorten_names() -> Self {
Self::ShortenNames {
max_abbrev_len: 1,
preserve_tail_items: 2,
ellipsis: String::from("..."),
}
}
#[must_use]
pub fn shorten_names_with(
max_abbrev_len: usize,
preserve_tail_items: usize,
ellipsis: impl Into<String>,
) -> Self {
Self::ShortenNames {
max_abbrev_len,
preserve_tail_items,
ellipsis: ellipsis.into(),
}
}
#[must_use]
pub fn none() -> Self {
Self::None
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_strategy_defaults() {
let strategy = TruncateStrategy::default();
assert_eq!(
strategy,
TruncateStrategy::Middle {
min_head_items: 1,
min_tail_items: 2,
ellipsis: String::from("..."),
}
);
assert_eq!(TruncateStrategy::none(), TruncateStrategy::None);
}
}