1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
use anyhow::bail;
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Certs {
    pub keys: Vec<Cert>,
}

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Cert {
    pub kid: String,
    pub e: String,
    pub alg: String,
    pub kty: String,
    pub n: String,
}

pub fn find_cert(certs: Vec<Cert>, alg: &str, kid: &str) -> anyhow::Result<Cert> {
    match certs.iter().find(|cert| cert.alg == alg && cert.kid == kid) {
        Some(cert) => Ok(cert.clone()),
        None => bail!("alg {}, kid = {} not found in google certs", alg, kid),
    }
}