Skip to main content

easypdf_markdown/
markdown_export_report.rs

1//! Markdown 转换报告。
2
3use crate::MarkdownWarning;
4
5/// PDF 到 Markdown 转换的统计与警告。
6#[derive(Clone, Debug, Default, PartialEq, Eq)]
7pub struct MarkdownExportReport {
8    pages_read: usize,
9    blocks_written: usize,
10    bytes_written: usize,
11    warnings: Vec<MarkdownWarning>,
12}
13
14impl MarkdownExportReport {
15    pub(crate) fn new(
16        pages_read: usize,
17        blocks_written: usize,
18        bytes_written: usize,
19        warnings: Vec<MarkdownWarning>,
20    ) -> Self {
21        Self {
22            pages_read,
23            blocks_written,
24            bytes_written,
25            warnings,
26        }
27    }
28
29    /// 返回已处理页面数。
30    #[must_use]
31    pub const fn pages_read(&self) -> usize {
32        self.pages_read
33    }
34
35    /// 返回已输出语义块数。
36    #[must_use]
37    pub const fn blocks_written(&self) -> usize {
38        self.blocks_written
39    }
40
41    /// 返回最终 Markdown 字节数。
42    #[must_use]
43    pub const fn bytes_written(&self) -> usize {
44        self.bytes_written
45    }
46
47    /// 返回转换警告。
48    #[must_use]
49    pub fn warnings(&self) -> &[MarkdownWarning] {
50        &self.warnings
51    }
52}
53
54#[cfg(test)]
55#[allow(clippy::uninlined_format_args, clippy::float_cmp)]
56mod tests {
57    use super::*;
58    use crate::MarkdownWarning;
59
60    #[test]
61    fn default_is_empty() {
62        let report = MarkdownExportReport::default();
63        assert_eq!(report.pages_read(), 0);
64        assert_eq!(report.blocks_written(), 0);
65        assert_eq!(report.bytes_written(), 0);
66        assert!(report.warnings().is_empty());
67    }
68
69    #[test]
70    fn new_sets_all_fields() {
71        let warnings = vec![MarkdownWarning::ProcessorFailed {
72            message: "test failure".to_string(),
73        }];
74        let report = MarkdownExportReport::new(5, 100, 4096, warnings);
75        assert_eq!(report.pages_read(), 5);
76        assert_eq!(report.blocks_written(), 100);
77        assert_eq!(report.bytes_written(), 4096);
78        assert_eq!(report.warnings().len(), 1);
79    }
80
81    #[test]
82    fn clone_preserves_values() {
83        let report = MarkdownExportReport::new(1, 2, 3, vec![]);
84        let cloned = report.clone();
85        assert_eq!(report, cloned);
86    }
87
88    #[test]
89    fn partial_eq_works() {
90        let a = MarkdownExportReport::new(1, 2, 3, vec![]);
91        let b = MarkdownExportReport::new(1, 2, 3, vec![]);
92        let c = MarkdownExportReport::new(1, 2, 4, vec![]);
93        assert_eq!(a, b);
94        assert_ne!(a, c);
95    }
96
97    #[test]
98    fn debug_format() {
99        let report = MarkdownExportReport::new(1, 2, 3, vec![]);
100        let dbg = format!("{:?}", report);
101        assert!(dbg.contains("MarkdownExportReport"));
102    }
103}