1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct Jwk {
8 pub kty: String,
10 pub kid: String,
12 #[serde(rename = "use")]
14 pub use_: String,
15 #[serde(skip_serializing_if = "Option::is_none")]
17 pub alg: Option<String>,
18 #[serde(skip_serializing_if = "Option::is_none")]
20 pub n: Option<String>,
21 #[serde(skip_serializing_if = "Option::is_none")]
23 pub e: Option<String>,
24 #[serde(skip_serializing_if = "Option::is_none")]
26 pub x: Option<String>,
27 #[serde(skip_serializing_if = "Option::is_none")]
29 pub y: Option<String>,
30 #[serde(skip_serializing_if = "Option::is_none")]
32 pub crv: Option<String>,
33}
34
35#[derive(Debug, Clone, Serialize, Deserialize)]
37pub struct Jwks {
38 pub keys: Vec<Jwk>,
40}
41
42impl Jwks {
43 pub fn find_key(&self, kid: &str) -> Option<&Jwk> {
45 self.keys.iter().find(|k| k.kid == kid)
46 }
47
48 pub fn find_keys_by_alg(&self, alg: &str) -> Vec<&Jwk> {
50 self.keys.iter().filter(|k| k.alg.as_deref() == Some(alg)).collect()
51 }
52
53 pub fn find_keys_by_use(&self, use_: &str) -> Vec<&Jwk> {
55 self.keys.iter().filter(|k| k.use_ == use_).collect()
56 }
57}