Skip to main content

relay_actions/actions/identity/
export.rs

1use crate::{
2    actions::Action,
3    cache::CacheManager,
4    sinks::progress::ProgressSink,
5    storage::{Identity, Storage},
6};
7use relay_lib::prelude::Address;
8
9pub struct Export {
10    pub addresses: Vec<Address>,
11}
12
13impl Action for Export {
14    type Output = (Vec<Identity>, String);
15
16    fn execute(
17        &self,
18        storage: &mut Storage,
19        _cache: &mut CacheManager,
20        progress: &mut dyn ProgressSink,
21    ) -> Self::Output {
22        let identities = self
23            .addresses
24            .iter()
25            .map(|address| {
26                storage.root.get_identity(address).unwrap_or_else(|| {
27                    progress.abort("No identity found for the given address");
28                })
29            })
30            .cloned()
31            .collect();
32
33        let exported = storage
34            .root
35            .export(progress, &self.addresses)
36            .unwrap_or_else(|e| {
37                progress.error(&format!("{:#?}", e));
38                progress.abort("Failed to export identities");
39            });
40
41        progress.done();
42
43        (identities, exported)
44    }
45}