1use std::{collections::HashSet, fs, path::Path};
18
19use crate::{
20 accounts_dir::{
21 DiskKeyFileManager, KeyDirectory, KeyFileManager, RootDiskDirectory,
22 },
23 Error,
24};
25use cfxkey::Address;
26use dir;
27
28pub fn import_account(
30 path: &Path, dst: &dyn KeyDirectory,
31) -> Result<Address, Error> {
32 let key_manager = DiskKeyFileManager::default();
33 let existing_accounts = dst
34 .load()?
35 .into_iter()
36 .map(|a| a.address)
37 .collect::<HashSet<_>>();
38 let filename = path
39 .file_name()
40 .and_then(|n| n.to_str())
41 .map(|f| f.to_owned());
42 let account = fs::File::open(&path)
43 .map_err(Into::into)
44 .and_then(|file| key_manager.read(filename, file))?;
45
46 let address = account.address.clone();
47 if !existing_accounts.contains(&address) {
48 dst.insert(account)?;
49 }
50 Ok(address)
51}
52
53pub fn import_accounts(
55 src: &dyn KeyDirectory, dst: &dyn KeyDirectory,
56) -> Result<Vec<Address>, Error> {
57 let accounts = src.load()?;
58 let existing_accounts = dst
59 .load()?
60 .into_iter()
61 .map(|a| a.address)
62 .collect::<HashSet<_>>();
63
64 accounts
65 .into_iter()
66 .filter(|a| !existing_accounts.contains(&a.address))
67 .map(|a| {
68 let address = a.address.clone();
69 dst.insert(a)?;
70 Ok(address)
71 })
72 .collect()
73}
74
75pub fn read_geth_accounts(testnet: bool) -> Vec<Address> {
78 RootDiskDirectory::at(dir::geth(testnet))
79 .load()
80 .map(|d| d.into_iter().map(|a| a.address).collect())
81 .unwrap_or_else(|_| Vec::new())
82}
83
84pub fn import_geth_accounts(
86 dst: &dyn KeyDirectory, desired: HashSet<Address>, testnet: bool,
87) -> Result<Vec<Address>, Error> {
88 let src = RootDiskDirectory::at(dir::geth(testnet));
89 let accounts = src.load()?;
90 let existing_accounts = dst
91 .load()?
92 .into_iter()
93 .map(|a| a.address)
94 .collect::<HashSet<_>>();
95
96 accounts
97 .into_iter()
98 .filter(|a| !existing_accounts.contains(&a.address))
99 .filter(|a| desired.contains(&a.address))
100 .map(|a| {
101 let address = a.address.clone();
102 dst.insert(a)?;
103 Ok(address)
104 })
105 .collect()
106}