use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::jwk::{Jwk, Jwks};
#[derive(Debug, Serialize, Deserialize, Default, Clone)]
pub struct ClientRegistrationRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub redirect_uris: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response_types: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub grant_types: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub application_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub contacts: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub logo_uri: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_uri: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub policy_uri: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tos_uri: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub jwks_uri: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub jwks: Option<Jwks>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sector_identifier_uri: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub subject_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub token_endpoint_auth_method: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub token_endpoint_auth_signing_alg: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_max_age: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub require_auth_time: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_acr_values: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub initiate_login_uri: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_uris: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id_token_signed_response_alg: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id_token_encrypted_response_alg: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id_token_encrypted_response_enc: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub userinfo_signed_response_alg: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub userinfo_encrypted_response_alg: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub userinfo_encrypted_response_enc: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_object_signing_alg: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_object_encryption_alg: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_object_encryption_enc: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub authorization_signed_response_alg: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub authorization_encrypted_response_alg: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub authorization_encrypted_response_enc: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tls_client_certificate_bound_access_tokens: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub dpop_bound_access_tokens: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub post_logout_redirect_uris: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub backchannel_token_delivery_mode: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub backchannel_client_notification_endpoint: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub backchannel_authentication_request_signing_alg: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub backchannel_user_code_parameter: Option<bool>,
#[serde(flatten, skip_serializing_if = "HashMap::is_empty")]
pub additional_fields: HashMap<String, Value>,
}
impl ClientRegistrationRequest {
pub fn new() -> Self {
Self::default()
}
pub fn redirect_uris(mut self, uris: Vec<String>) -> Self {
self.redirect_uris = Some(uris);
self
}
pub fn add_redirect_uri(mut self, uri: impl Into<String>) -> Self {
self.redirect_uris
.get_or_insert_with(Vec::new)
.push(uri.into());
self
}
pub fn response_types(mut self, types: Vec<String>) -> Self {
self.response_types = Some(types);
self
}
pub fn grant_types(mut self, types: Vec<String>) -> Self {
self.grant_types = Some(types);
self
}
pub fn client_name(mut self, name: impl Into<String>) -> Self {
self.client_name = Some(name.into());
self
}
pub fn token_endpoint_auth_method(mut self, method: impl Into<String>) -> Self {
self.token_endpoint_auth_method = Some(method.into());
self
}
pub fn application_type(mut self, app_type: impl Into<String>) -> Self {
self.application_type = Some(app_type.into());
self
}
pub fn contacts(mut self, contacts: Vec<String>) -> Self {
self.contacts = Some(contacts);
self
}
pub fn jwks_uri(mut self, uri: impl Into<String>) -> Self {
self.jwks_uri = Some(uri.into());
self
}
pub fn jwks(mut self, keys: &[Jwk]) -> Self {
self.jwks = Some(Jwks { keys: keys.into() });
self
}
pub fn id_token_signed_response_alg(mut self, alg: impl Into<String>) -> Self {
self.id_token_signed_response_alg = Some(alg.into());
self
}
pub fn post_logout_redirect_uris(mut self, uris: Vec<String>) -> Self {
self.post_logout_redirect_uris = Some(uris);
self
}
pub fn tls_client_certificate_bound_access_tokens(mut self, enabled: bool) -> Self {
self.tls_client_certificate_bound_access_tokens = Some(enabled);
self
}
pub fn dpop_bound_access_tokens(mut self, enabled: bool) -> Self {
self.dpop_bound_access_tokens = Some(enabled);
self
}
pub fn additional_field(mut self, key: impl Into<String>, value: Value) -> Self {
self.additional_fields.insert(key.into(), value);
self
}
}
#[derive(Debug, Serialize, Deserialize, Default, Clone)]
pub struct ClientRegistrationResponse {
pub client_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_secret: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub registration_access_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub registration_client_uri: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_id_issued_at: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_secret_expires_at: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub token_endpoint_auth_method: Option<String>,
#[serde(flatten)]
pub metadata: HashMap<String, Value>,
}