nonempty_tools/
lib.rs

1use std::fmt;
2
3// ============================================================================
4// 模块声明
5// ============================================================================
6
7mod vec;
8mod slice;
9mod string;
10mod vecdeque;
11
12// ============================================================================
13// 重新导出
14// ============================================================================
15
16pub use vec::NonEmptyVec;
17pub use slice::{NonEmptySliceRef, NonEmptySliceRefMut};
18pub use string::{NonEmptyString, NonEmptyStr};
19pub use vecdeque::NonEmptyVecDeque;
20
21// ============================================================================
22// 错误类型
23// ============================================================================
24
25/// 尝试从空集合创建非空类型时的错误
26#[derive(Debug, Clone, Copy, PartialEq, Eq)]
27pub struct EmptyError;
28
29impl fmt::Display for EmptyError {
30    #[inline]
31    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
32        write!(f, "cannot create non-empty collection from empty input")
33    }
34}
35
36impl std::error::Error for EmptyError {}
37
38// ============================================================================
39// 集成测试
40// ============================================================================
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn test_empty_error_display() {
48        let err = EmptyError;
49        assert_eq!(
50            err.to_string(),
51            "cannot create non-empty collection from empty input"
52        );
53    }
54
55    #[test]
56    fn test_nonempty_vec_to_slice_ref() {
57        let nev = NonEmptyVec::new(1, vec![2, 3]);
58        let slice_ref = NonEmptySliceRef::new(nev.as_slice()).unwrap();
59        assert_eq!(slice_ref.len(), 3);
60        assert_eq!(slice_ref.first(), &1);
61    }
62
63    #[test]
64    fn test_nonempty_vec_to_slice_ref_mut() {
65        let mut nev = NonEmptyVec::new(1, vec![2, 3]);
66        let slice_ref_mut = NonEmptySliceRefMut::new(nev.as_mut_slice()).unwrap();
67        assert_eq!(slice_ref_mut.len(), 3);
68        assert_eq!(slice_ref_mut.first(), &1);
69    }
70}