intelli_shell/process/
export.rs1use color_eyre::Result;
2use tokio_util::sync::CancellationToken;
3
4use super::{Process, ProcessOutput};
5use crate::{
6 cli::ExportItemsProcess,
7 component::{
8 Component,
9 pick::{ImportExportPickerComponent, ImportExportPickerComponentMode},
10 },
11 config::Config,
12 errors::AppError,
13 format_error,
14 process::InteractiveProcess,
15 service::IntelliShellService,
16};
17
18impl Process for ExportItemsProcess {
19 async fn execute(
20 self,
21 config: Config,
22 service: IntelliShellService,
23 _cancellation_token: CancellationToken,
24 ) -> color_eyre::Result<ProcessOutput> {
25 let items = match service.prepare_items_export(self.filter.clone()).await {
26 Ok(s) => s,
27 Err(AppError::UserFacing(err)) => {
28 return Ok(ProcessOutput::fail().stderr(format_error!(config.theme, "{err}")));
29 }
30 Err(AppError::Unexpected(report)) => return Err(report),
31 };
32 match service.export_items(items, self, config.gist).await {
33 Ok(stats) => Ok(stats.into_output(&config.theme)),
34 Err(AppError::UserFacing(err)) => Ok(ProcessOutput::fail().stderr(format_error!(config.theme, "{err}"))),
35 Err(AppError::Unexpected(report)) => Err(report),
36 }
37 }
38}
39impl InteractiveProcess for ExportItemsProcess {
40 fn into_component(
41 self,
42 config: Config,
43 service: IntelliShellService,
44 inline: bool,
45 cancellation_token: CancellationToken,
46 ) -> Result<Box<dyn Component>> {
47 Ok(Box::new(ImportExportPickerComponent::new(
48 service,
49 config,
50 inline,
51 ImportExportPickerComponentMode::Export { input: self },
52 cancellation_token,
53 )))
54 }
55}