Fetch User Keys - simple tool for fetching SSH keys from various sources
1// SPDX-FileCopyrightText: 2024 Łukasz Niemier <#@hauleth.dev>
2//
3// SPDX-License-Identifier: EUPL-1.2
4
5use crate::output::Output;
6use crate::sources::*;
7
8use rayon::prelude::*;
9
10#[derive(Debug, serde::Deserialize)]
11pub struct Entry {
12 pub name: String,
13 pub keys: Box<[Box<Source>]>,
14}
15
16impl Entry {
17 pub fn fetch(&self) -> (String, Vec<ssh_key::PublicKey>) {
18 let mut stream: Vec<_> = self.keys.par_iter().map(|k| k.fetch()).flatten().collect();
19
20 // Deduplicate keys, no need for duplicated entries
21 stream.sort();
22 stream.dedup_by(|a, b| a.key_data() == b.key_data());
23
24 (self.name.clone(), stream)
25 }
26}
27
28#[derive(Debug, serde::Deserialize)]
29pub struct Config {
30 #[serde(rename = "entry")]
31 pub entries: Box<[Entry]>,
32}
33
34impl Config {
35 pub fn fetch(&self) -> Result<Output, ()> {
36 let keys = self.entries.par_iter().map(Entry::fetch).collect();
37
38 Ok(Output { keys })
39 }
40}