1use crate::ExportDjotDto;
4use crate::ExportDocxDto;
5use crate::ExportDocxResultDto;
6use crate::ExportEpubDto;
7use crate::ExportEpubResultDto;
8use crate::ExportHtmlDto;
9use crate::ExportLatexDto;
10use crate::ExportLatexResultDto;
11use crate::ExportMarkdownDto;
12use crate::ExportOdtDto;
13use crate::ExportOdtResultDto;
14use crate::ExportPdfDto;
15use crate::ExportPdfResultDto;
16use crate::ExportPlainTextDto;
17use crate::ImportDjotDto;
18use crate::ImportDjotResultDto;
19use crate::ImportHtmlDto;
20use crate::ImportHtmlResultDto;
21use crate::ImportMarkdownDto;
22use crate::ImportMarkdownResultDto;
23use crate::ImportPlainTextDto;
24use crate::units_of_work::export_djot_uow::ExportDjotUnitOfWorkFactory;
25use crate::units_of_work::export_docx_uow::ExportDocxUnitOfWorkFactory;
26use crate::units_of_work::export_epub_uow::ExportEpubUnitOfWorkFactory;
27use crate::units_of_work::export_html_uow::ExportHtmlUnitOfWorkFactory;
28use crate::units_of_work::export_latex_uow::ExportLatexUnitOfWorkFactory;
29use crate::units_of_work::export_markdown_uow::ExportMarkdownUnitOfWorkFactory;
30use crate::units_of_work::export_odt_uow::ExportOdtUnitOfWorkFactory;
31#[cfg(feature = "pdf")]
32use crate::units_of_work::export_pdf_uow::ExportPdfUnitOfWorkFactory;
33use crate::units_of_work::export_plain_text_uow::ExportPlainTextUnitOfWorkFactory;
34use crate::units_of_work::import_djot_uow::ImportDjotUnitOfWorkFactory;
35use crate::units_of_work::import_html_uow::ImportHtmlUnitOfWorkFactory;
36use crate::units_of_work::import_markdown_uow::ImportMarkdownUnitOfWorkFactory;
37use crate::units_of_work::import_plain_text_uow::ImportPlainTextUnitOfWorkFactory;
38use crate::use_cases::export_djot_uc::ExportDjotUseCase;
39use crate::use_cases::export_docx_uc::ExportDocxUseCase;
40use crate::use_cases::export_epub_uc::ExportEpubUseCase;
41use crate::use_cases::export_html_uc::ExportHtmlUseCase;
42use crate::use_cases::export_latex_uc::ExportLatexUseCase;
43use crate::use_cases::export_markdown_uc::ExportMarkdownUseCase;
44use crate::use_cases::export_odt_uc::ExportOdtUseCase;
45#[cfg(feature = "pdf")]
46use crate::use_cases::export_pdf_uc::ExportPdfUseCase;
47use crate::use_cases::export_plain_text_uc::ExportPlainTextUseCase;
48use crate::use_cases::import_djot_uc::ImportDjotUseCase;
49use crate::use_cases::import_html_uc::ImportHtmlUseCase;
50use crate::use_cases::import_markdown_uc::ImportMarkdownUseCase;
51use crate::use_cases::import_plain_text_uc::ImportPlainTextUseCase;
52use anyhow::Result;
53use common::event::{Event, Origin};
54use common::parser_tools::DjotExportOptions;
55
56use common::event::DocumentIoEvent::ExportDjot;
57use common::event::DocumentIoEvent::ExportHtml;
58use common::event::DocumentIoEvent::ExportLatex;
59use common::event::DocumentIoEvent::ExportMarkdown;
60use common::event::DocumentIoEvent::ExportPlainText;
61use common::event::DocumentIoEvent::ImportDjot;
62use common::event::DocumentIoEvent::ImportPlainText;
63
64use common::long_operation::{LongOperation, LongOperationManager, OperationProgress};
65use common::{database::db_context::DbContext, event::EventHub};
66use std::sync::Arc;
67
68pub fn import_plain_text(
69 db_context: &DbContext,
70 event_hub: &Arc<EventHub>,
71 dto: &ImportPlainTextDto,
72) -> Result<()> {
73 let uow_context = ImportPlainTextUnitOfWorkFactory::new(db_context, event_hub);
74 let mut uc = ImportPlainTextUseCase::new(Box::new(uow_context));
75 uc.execute(dto)?;
76 event_hub.send_event(Event {
78 origin: Origin::DocumentIo(ImportPlainText),
79 ids: vec![],
80 data: None,
81 });
82 Ok(())
83}
84
85pub fn export_plain_text(
86 db_context: &DbContext,
87 event_hub: &Arc<EventHub>,
88) -> Result<ExportPlainTextDto> {
89 export_plain_text_with(
90 db_context,
91 event_hub,
92 common::parser_tools::PlainTextExportOptions::addressable(),
93 )
94}
95
96pub fn export_plain_text_with(
102 db_context: &DbContext,
103 event_hub: &Arc<EventHub>,
104 options: common::parser_tools::PlainTextExportOptions,
105) -> Result<ExportPlainTextDto> {
106 let uow_context = ExportPlainTextUnitOfWorkFactory::new(db_context);
107 let mut uc = ExportPlainTextUseCase::new(Box::new(uow_context));
108 let return_dto = uc.execute(options)?;
109 event_hub.send_event(Event {
111 origin: Origin::DocumentIo(ExportPlainText),
112 ids: vec![],
113 data: None,
114 });
115 Ok(return_dto)
116}
117
118pub fn import_markdown(
119 db_context: &DbContext,
120 event_hub: &Arc<EventHub>,
121 long_operation_manager: &mut LongOperationManager,
122 dto: &ImportMarkdownDto,
123) -> Result<String> {
124 let uow_context = ImportMarkdownUnitOfWorkFactory::new(db_context, event_hub);
125 let uc = ImportMarkdownUseCase::new(Box::new(uow_context), dto);
126 let operation_id = long_operation_manager.start_operation(uc);
127 Ok(operation_id)
128}
129
130pub fn get_import_markdown_progress(
131 long_operation_manager: &LongOperationManager,
132 operation_id: &str,
133) -> Option<OperationProgress> {
134 long_operation_manager.get_operation_progress(operation_id)
135}
136
137pub fn get_import_markdown_result(
138 long_operation_manager: &LongOperationManager,
139 operation_id: &str,
140) -> Result<Option<ImportMarkdownResultDto>> {
141 let result_json = long_operation_manager.get_operation_result(operation_id);
143
144 if result_json.is_none() {
146 return Ok(None);
147 }
148 let result_dto: ImportMarkdownResultDto = serde_json::from_str(&result_json.unwrap())?;
150
151 Ok(Some(result_dto))
152}
153
154pub fn export_markdown(
155 db_context: &DbContext,
156 event_hub: &Arc<EventHub>,
157) -> Result<ExportMarkdownDto> {
158 export_markdown_with(
159 db_context,
160 event_hub,
161 common::parser_tools::MarkdownExportOptions::default(),
162 )
163}
164
165pub fn export_markdown_with(
169 db_context: &DbContext,
170 event_hub: &Arc<EventHub>,
171 options: common::parser_tools::MarkdownExportOptions,
172) -> Result<ExportMarkdownDto> {
173 let uow_context = ExportMarkdownUnitOfWorkFactory::new(db_context);
174 let mut uc = ExportMarkdownUseCase::new(Box::new(uow_context), options);
175 let return_dto = uc.execute()?;
176 event_hub.send_event(Event {
178 origin: Origin::DocumentIo(ExportMarkdown),
179 ids: vec![],
180 data: None,
181 });
182 Ok(return_dto)
183}
184
185pub fn import_djot(
186 db_context: &DbContext,
187 event_hub: &Arc<EventHub>,
188 long_operation_manager: &mut LongOperationManager,
189 dto: &ImportDjotDto,
190) -> Result<String> {
191 let uow_context = ImportDjotUnitOfWorkFactory::new(db_context, event_hub);
192 let uc = ImportDjotUseCase::new(Box::new(uow_context), dto);
193 let operation_id = long_operation_manager.start_operation(uc);
194 Ok(operation_id)
195}
196
197pub fn import_djot_sync(
212 db_context: &DbContext,
213 event_hub: &Arc<EventHub>,
214 dto: &ImportDjotDto,
215) -> Result<ImportDjotResultDto> {
216 let uow_context = ImportDjotUnitOfWorkFactory::new(db_context, event_hub);
217 let uc = ImportDjotUseCase::new(Box::new(uow_context), dto);
218 let result = uc.execute(
219 Box::new(|_progress| {}),
220 Arc::new(std::sync::atomic::AtomicBool::new(false)),
221 )?;
222 event_hub.send_event(Event {
223 origin: Origin::DocumentIo(ImportDjot),
224 ids: vec![],
225 data: None,
226 });
227 Ok(result)
228}
229
230pub fn get_import_djot_progress(
231 long_operation_manager: &LongOperationManager,
232 operation_id: &str,
233) -> Option<OperationProgress> {
234 long_operation_manager.get_operation_progress(operation_id)
235}
236
237pub fn get_import_djot_result(
238 long_operation_manager: &LongOperationManager,
239 operation_id: &str,
240) -> Result<Option<ImportDjotResultDto>> {
241 let result_json = long_operation_manager.get_operation_result(operation_id);
242 if result_json.is_none() {
243 return Ok(None);
244 }
245 let result_dto: ImportDjotResultDto = serde_json::from_str(&result_json.unwrap())?;
246 Ok(Some(result_dto))
247}
248
249pub fn export_djot(
250 db_context: &DbContext,
251 event_hub: &Arc<EventHub>,
252 options: &DjotExportOptions,
253) -> Result<ExportDjotDto> {
254 let uow_context = ExportDjotUnitOfWorkFactory::new(db_context);
255 let mut uc = ExportDjotUseCase::new(Box::new(uow_context));
256 let return_dto = uc.execute(options)?;
257 event_hub.send_event(Event {
258 origin: Origin::DocumentIo(ExportDjot),
259 ids: vec![],
260 data: None,
261 });
262 Ok(return_dto)
263}
264
265pub fn import_html(
266 db_context: &DbContext,
267 event_hub: &Arc<EventHub>,
268 long_operation_manager: &mut LongOperationManager,
269 dto: &ImportHtmlDto,
270) -> Result<String> {
271 let uow_context = ImportHtmlUnitOfWorkFactory::new(db_context, event_hub);
272 let uc = ImportHtmlUseCase::new(Box::new(uow_context), dto);
273 let operation_id = long_operation_manager.start_operation(uc);
274 Ok(operation_id)
275}
276
277pub fn get_import_html_progress(
278 long_operation_manager: &LongOperationManager,
279 operation_id: &str,
280) -> Option<OperationProgress> {
281 long_operation_manager.get_operation_progress(operation_id)
282}
283
284pub fn get_import_html_result(
285 long_operation_manager: &LongOperationManager,
286 operation_id: &str,
287) -> Result<Option<ImportHtmlResultDto>> {
288 let result_json = long_operation_manager.get_operation_result(operation_id);
290
291 if result_json.is_none() {
293 return Ok(None);
294 }
295 let result_dto: ImportHtmlResultDto = serde_json::from_str(&result_json.unwrap())?;
297
298 Ok(Some(result_dto))
299}
300
301pub fn export_html(db_context: &DbContext, event_hub: &Arc<EventHub>) -> Result<ExportHtmlDto> {
302 export_html_with_options(db_context, event_hub, Default::default())
303}
304
305pub fn export_html_with_options(
307 db_context: &DbContext,
308 event_hub: &Arc<EventHub>,
309 options: common::parser_tools::HtmlExportOptions,
310) -> Result<ExportHtmlDto> {
311 let uow_context = ExportHtmlUnitOfWorkFactory::new(db_context);
312 let mut uc = ExportHtmlUseCase::new(Box::new(uow_context), options);
313 let return_dto = uc.execute()?;
314 event_hub.send_event(Event {
316 origin: Origin::DocumentIo(ExportHtml),
317 ids: vec![],
318 data: None,
319 });
320 Ok(return_dto)
321}
322
323pub fn export_latex(
324 db_context: &DbContext,
325 event_hub: &Arc<EventHub>,
326 dto: &ExportLatexDto,
327) -> Result<ExportLatexResultDto> {
328 let uow_context = ExportLatexUnitOfWorkFactory::new(db_context);
329 let mut uc = ExportLatexUseCase::new(Box::new(uow_context));
330 let return_dto = uc.execute(dto)?;
331 event_hub.send_event(Event {
333 origin: Origin::DocumentIo(ExportLatex),
334 ids: vec![],
335 data: None,
336 });
337 Ok(return_dto)
338}
339
340pub fn export_docx(
341 db_context: &DbContext,
342 _event_hub: &Arc<EventHub>,
343 long_operation_manager: &mut LongOperationManager,
344 dto: &ExportDocxDto,
345) -> Result<String> {
346 let uow_context = ExportDocxUnitOfWorkFactory::new(db_context);
347 let uc = ExportDocxUseCase::new(Box::new(uow_context), dto);
348 let operation_id = long_operation_manager.start_operation(uc);
349 Ok(operation_id)
350}
351
352#[doc(hidden)]
359pub fn build_docx_document(db_context: &DbContext, dto: &ExportDocxDto) -> Result<docx_rs::Docx> {
360 let uow_context = ExportDocxUnitOfWorkFactory::new(db_context);
361 let uc = ExportDocxUseCase::new(Box::new(uow_context), dto);
362 let (docx, _paragraph_count) = uc.build_document()?;
363 Ok(docx)
364}
365
366#[doc(hidden)]
374pub fn build_docx_xml_document(
375 db_context: &DbContext,
376 dto: &ExportDocxDto,
377) -> Result<docx_rs::XMLDocx> {
378 let uow_context = ExportDocxUnitOfWorkFactory::new(db_context);
379 let uc = ExportDocxUseCase::new(Box::new(uow_context), dto);
380 uc.build_document_xml()
381}
382
383pub fn get_export_docx_progress(
384 long_operation_manager: &LongOperationManager,
385 operation_id: &str,
386) -> Option<OperationProgress> {
387 long_operation_manager.get_operation_progress(operation_id)
388}
389
390pub fn get_export_docx_result(
391 long_operation_manager: &LongOperationManager,
392 operation_id: &str,
393) -> Result<Option<ExportDocxResultDto>> {
394 let result_json = long_operation_manager.get_operation_result(operation_id);
396
397 if result_json.is_none() {
399 return Ok(None);
400 }
401 let result_dto: ExportDocxResultDto = serde_json::from_str(&result_json.unwrap())?;
403
404 Ok(Some(result_dto))
405}
406
407pub fn export_epub(
408 db_context: &DbContext,
409 _event_hub: &Arc<EventHub>,
410 long_operation_manager: &mut LongOperationManager,
411 dto: &ExportEpubDto,
412) -> Result<String> {
413 let uow_context = ExportEpubUnitOfWorkFactory::new(db_context);
414 let uc = ExportEpubUseCase::new(Box::new(uow_context), dto);
415 let operation_id = long_operation_manager.start_operation(uc);
416 Ok(operation_id)
417}
418
419#[doc(hidden)]
425pub fn build_epub_document(db_context: &DbContext, dto: &ExportEpubDto) -> Result<Vec<u8>> {
426 let uow_context = ExportEpubUnitOfWorkFactory::new(db_context);
427 let uc = ExportEpubUseCase::new(Box::new(uow_context), dto);
428 let (epub_bytes, _chapter_count) = uc.build_document()?;
429 Ok(epub_bytes)
430}
431
432pub fn get_export_epub_progress(
433 long_operation_manager: &LongOperationManager,
434 operation_id: &str,
435) -> Option<OperationProgress> {
436 long_operation_manager.get_operation_progress(operation_id)
437}
438
439pub fn get_export_epub_result(
440 long_operation_manager: &LongOperationManager,
441 operation_id: &str,
442) -> Result<Option<ExportEpubResultDto>> {
443 let result_json = long_operation_manager.get_operation_result(operation_id);
445
446 if result_json.is_none() {
448 return Ok(None);
449 }
450 let result_dto: ExportEpubResultDto = serde_json::from_str(&result_json.unwrap())?;
452
453 Ok(Some(result_dto))
454}
455
456pub fn export_odt(
457 db_context: &DbContext,
458 _event_hub: &Arc<EventHub>,
459 long_operation_manager: &mut LongOperationManager,
460 dto: &ExportOdtDto,
461) -> Result<String> {
462 let uow_context = ExportOdtUnitOfWorkFactory::new(db_context);
463 let uc = ExportOdtUseCase::new(Box::new(uow_context), dto);
464 let operation_id = long_operation_manager.start_operation(uc);
465 Ok(operation_id)
466}
467
468#[doc(hidden)]
474pub fn build_odt_document(db_context: &DbContext, dto: &ExportOdtDto) -> Result<Vec<u8>> {
475 let uow_context = ExportOdtUnitOfWorkFactory::new(db_context);
476 let uc = ExportOdtUseCase::new(Box::new(uow_context), dto);
477 let (odt_bytes, _paragraph_count) = uc.build_document()?;
478 Ok(odt_bytes)
479}
480
481pub fn get_export_odt_progress(
482 long_operation_manager: &LongOperationManager,
483 operation_id: &str,
484) -> Option<OperationProgress> {
485 long_operation_manager.get_operation_progress(operation_id)
486}
487
488pub fn get_export_odt_result(
489 long_operation_manager: &LongOperationManager,
490 operation_id: &str,
491) -> Result<Option<ExportOdtResultDto>> {
492 let result_json = long_operation_manager.get_operation_result(operation_id);
493 if result_json.is_none() {
494 return Ok(None);
495 }
496 let result_dto: ExportOdtResultDto = serde_json::from_str(&result_json.unwrap())?;
497 Ok(Some(result_dto))
498}
499
500#[cfg(feature = "pdf")]
512pub fn export_pdf(
513 db_context: &DbContext,
514 _event_hub: &Arc<EventHub>,
515 long_operation_manager: &mut LongOperationManager,
516 dto: &ExportPdfDto,
517) -> Result<String> {
518 let uow_context = ExportPdfUnitOfWorkFactory::new(db_context);
519 let uc = ExportPdfUseCase::new(Box::new(uow_context), dto);
520 let operation_id = long_operation_manager.start_operation(uc);
521 Ok(operation_id)
522}
523
524#[cfg(not(feature = "pdf"))]
525pub fn export_pdf(
526 _db_context: &DbContext,
527 _event_hub: &Arc<EventHub>,
528 _long_operation_manager: &mut LongOperationManager,
529 _dto: &ExportPdfDto,
530) -> Result<String> {
531 Err(anyhow::anyhow!(
532 "PDF export requires the `pdf` cargo feature on the `text-document-io` crate"
533 ))
534}
535
536#[cfg(feature = "pdf")]
542#[doc(hidden)]
543pub fn build_pdf_document(db_context: &DbContext, dto: &ExportPdfDto) -> Result<Vec<u8>> {
544 let uow_context = ExportPdfUnitOfWorkFactory::new(db_context);
545 let uc = ExportPdfUseCase::new(Box::new(uow_context), dto);
546 let (pdf_bytes, _page_count) = uc.build_document()?;
547 Ok(pdf_bytes)
548}
549
550#[cfg(feature = "pdf")]
551pub fn get_export_pdf_progress(
552 long_operation_manager: &LongOperationManager,
553 operation_id: &str,
554) -> Option<OperationProgress> {
555 long_operation_manager.get_operation_progress(operation_id)
556}
557
558#[cfg(not(feature = "pdf"))]
559pub fn get_export_pdf_progress(
560 _long_operation_manager: &LongOperationManager,
561 _operation_id: &str,
562) -> Option<OperationProgress> {
563 None
564}
565
566#[cfg(feature = "pdf")]
567pub fn get_export_pdf_result(
568 long_operation_manager: &LongOperationManager,
569 operation_id: &str,
570) -> Result<Option<ExportPdfResultDto>> {
571 let result_json = long_operation_manager.get_operation_result(operation_id);
573
574 if result_json.is_none() {
576 return Ok(None);
577 }
578 let result_dto: ExportPdfResultDto = serde_json::from_str(&result_json.unwrap())?;
580
581 Ok(Some(result_dto))
582}
583
584#[cfg(not(feature = "pdf"))]
585pub fn get_export_pdf_result(
586 _long_operation_manager: &LongOperationManager,
587 _operation_id: &str,
588) -> Result<Option<ExportPdfResultDto>> {
589 Ok(None)
590}