service_authenticator/
helper.rs1use crate::service_account::ServiceAccountKey;
8
9use std::io;
10use std::path::Path;
11
12pub fn parse_service_key(secret: &[u8]) -> io::Result<ServiceAccountKey> {
14 serde_json::from_slice(secret).map_err(|e| {
15 io::Error::new(
16 io::ErrorKind::InvalidData,
17 format!("Bad service account key: {}", e),
18 )
19 })
20}
21pub async fn read_service_account_key<P: AsRef<Path>>(path: P) -> io::Result<ServiceAccountKey> {
24 let key = tokio::fs::read(path).await?;
25 serde_json::from_slice(&key).map_err(|e| {
26 io::Error::new(
27 io::ErrorKind::InvalidData,
28 format!("Bad service account key: {}", e),
29 )
30 })
31}
32pub(crate) fn join<T>(
33 pieces: &[T],
34 separator: &str,
35) -> String
36where
37 T: AsRef<str>,
38{
39 let mut iter = pieces.iter();
40 let first = match iter.next() {
41 Some(p) => p,
42 None => return String::new(),
43 };
44 let num_separators = pieces.len() - 1;
45 let pieces_size: usize = pieces.iter().map(|p| p.as_ref().len()).sum();
46 let size = pieces_size + separator.len() * num_separators;
47 let mut result = String::with_capacity(size);
48 result.push_str(first.as_ref());
49 for p in iter {
50 result.push_str(separator);
51 result.push_str(p.as_ref());
52 }
53 debug_assert_eq!(size, result.len());
54 result
55}