intelli_shell/process/
export.rs

1use 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}