1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
//! 错误类型与 `Result` 别名。
//!
//! 本模块是整个 `ooxml-core` crate 的错误处理中枢。它做三件事:
//!
//! 1. **统一错误类型** [`enum@Error`]:使用 `thiserror` 派生,将底层 `std::io::Error` /
//! `zip::result::ZipError` / 自定义字符串错误统一成一个枚举,方便上层 `?` 传播。
//! 2. **统一 Result 别名** [`Result<T>`]:所有公共 API(除特别声明)均返回该别名,
//! 调用方不必书写冗长的 `Result<T, ooxml_core::Error>`。
//! 3. **便捷构造器**:在 `Error` 上提供 `opc(...)` / `oxml(...)` / `not_implemented(...)`
//! 等关联函数,使错误抛出更可读,并隐含语义归类。
//!
//! # 设计原则
//!
//! - **零 `panic!`**:库路径上禁止 `unwrap` / `expect` / `panic!`。所有失败一律
//! 转化为 [`enum@Error`] 的一个变体,由调用方决定如何处理。
//! - **错误消息规范**:消息小写开头、句末无标点(与 Rust 标准库惯例一致);
//! 需要上下文时使用 `format!` 拼接具体元素名 / 路径,例如
//! `"relationships parse: missing Id"`。
//! - **可扩展**:新增错误类别时优先扩展 `enum Error` 变体,而非全部塞进
//! [`Error::Other`]。后者仅用于临时过渡。
//!
//! # 与 python-pptx 的对应
//!
//! `python-pptx` 抛出 `python_pptx.PptxException` 及若干子异常(`PackageNotFoundError` /
//! `XPathOverflowError` 等)。本库以单一枚举 + 字符串消息统一表达,对调用方而言
//! 仅需 match 顶层 `Error` 即可。
//!
//! # 示例
//!
//! ```no_run
//! use ooxml_core::{Error, Result};
//!
//! fn read_slide() -> Result<()> {
//! let p = std::fs::File::open("missing.pptx")?; // io::Error 自动转 Error::Io
//! Ok(())
//! }
//!
//! fn parse_attr() -> Result<()> {
//! Err(Error::oxml("missing required <p:ph> element"))
//! }
//! ```
use io;
use Error;
/// 库统一 `Result` 别名。
///
/// 简化签名书写,所有公共 API(除特别声明)均使用该别名,等价于
/// `std::result::Result<T, ooxml_core::Error>`。
///
/// # 示例
///
/// ```no_run
/// use ooxml_core::Result;
///
/// fn read_something() -> Result<String> { Ok(String::new()) }
/// ```
pub type Result<T> = Result;
/// 库错误。所有外部接口(除特别声明外)均返回 [`Result<T>`]。
///
/// 变体按"来源"分类,调用方可以基于 `match` 决定重试 / 跳过 / 报告策略。
/// 错误消息遵循 **小写开头、句末无标点** 的 Rust 标准库风格。