1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
7pub enum OutputFormat {
8 Json,
10 Text,
12 Html,
14 Pdf,
16 Markdown,
18 MarkdownWithHtml,
20 MarkdownWithImages,
22}
23
24#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
26pub enum TableMethod {
27 Default,
29 Cluster,
31}
32
33#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
35pub enum ReadingOrder {
36 Off,
38 XyCut,
40}
41
42#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
44pub enum ImageOutput {
45 Off,
47 Embedded,
49 External,
51}
52
53#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
55pub enum ImageFormat {
56 Png,
58 Jpeg,
60}
61
62#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
64pub enum HybridBackend {
65 Off,
67 DoclingFast,
69}
70
71#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
73pub enum HybridMode {
74 Auto,
76 Full,
78}
79
80#[derive(Debug, Clone, Serialize, Deserialize)]
82pub struct ProcessingConfig {
83 pub output_dir: Option<String>,
85 pub password: Option<String>,
87 pub formats: Vec<OutputFormat>,
89 pub quiet: bool,
91 pub filter_config: super::filter::FilterConfig,
93 pub sanitize: bool,
95 pub keep_line_breaks: bool,
97 pub replace_invalid_chars: String,
99 pub use_struct_tree: bool,
101 pub table_method: TableMethod,
103 pub reading_order: ReadingOrder,
105 pub markdown_page_separator: Option<String>,
107 pub text_page_separator: Option<String>,
109 pub html_page_separator: Option<String>,
111 pub image_output: ImageOutput,
113 pub image_format: ImageFormat,
115 pub image_dir: Option<String>,
117 pub pages: Option<String>,
119 pub include_header_footer: bool,
121 pub hybrid: HybridBackend,
123 pub hybrid_mode: HybridMode,
125 pub hybrid_url: Option<String>,
127 pub hybrid_timeout: u64,
129 pub hybrid_fallback: bool,
131}
132
133impl Default for ProcessingConfig {
134 fn default() -> Self {
135 Self {
136 output_dir: None,
137 password: None,
138 formats: vec![OutputFormat::Json],
139 quiet: false,
140 filter_config: super::filter::FilterConfig::default(),
141 sanitize: false,
142 keep_line_breaks: false,
143 replace_invalid_chars: " ".to_string(),
144 use_struct_tree: false,
145 table_method: TableMethod::Default,
146 reading_order: ReadingOrder::XyCut,
147 markdown_page_separator: None,
148 text_page_separator: None,
149 html_page_separator: None,
150 image_output: ImageOutput::External,
151 image_format: ImageFormat::Png,
152 image_dir: None,
153 pages: None,
154 include_header_footer: false,
155 hybrid: HybridBackend::Off,
156 hybrid_mode: HybridMode::Auto,
157 hybrid_url: None,
158 hybrid_timeout: 30000,
159 hybrid_fallback: false,
160 }
161 }
162}
163
164#[cfg(test)]
165mod tests {
166 use super::*;
167
168 #[test]
169 fn test_default_config() {
170 let config = ProcessingConfig::default();
171 assert_eq!(config.formats, vec![OutputFormat::Json]);
172 assert!(!config.quiet);
173 assert!(!config.sanitize);
174 assert_eq!(config.reading_order, ReadingOrder::XyCut);
175 assert_eq!(config.table_method, TableMethod::Default);
176 assert_eq!(config.image_output, ImageOutput::External);
177 assert_eq!(config.image_format, ImageFormat::Png);
178 assert_eq!(config.hybrid, HybridBackend::Off);
179 assert_eq!(config.hybrid_timeout, 30000);
180 }
181}