use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct ServicesProfileConfig {
#[serde(default)]
pub port_offset: u16,
#[serde(default)]
pub sources: Vec<ServicesSource>,
#[serde(default)]
pub cache_dir: Option<String>,
#[serde(default)]
pub on_fetch_failure: FetchFailurePolicy,
}
impl ServicesProfileConfig {
#[must_use]
pub const fn is_identity(&self) -> bool {
self.port_offset == 0 && self.sources.is_empty()
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct ServicesSource {
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub https: Option<HttpsServicesSource>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub oci: Option<OciServicesSource>,
}
impl ServicesSource {
#[must_use]
pub const fn verification(&self) -> Option<&BundleVerification> {
if let Some(https) = self.https.as_ref() {
return Some(&https.verify);
}
if let Some(oci) = self.oci.as_ref() {
return Some(&oci.verify);
}
None
}
#[must_use]
pub fn auth_secret(&self) -> Option<&str> {
self.https
.as_ref()
.and_then(|s| s.auth_secret.as_deref())
.or_else(|| self.oci.as_ref().and_then(|s| s.auth_secret.as_deref()))
}
#[must_use]
pub const fn is_exactly_one(&self) -> bool {
self.https.is_some() ^ self.oci.is_some()
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct HttpsServicesSource {
pub url: String,
#[serde(default)]
pub auth_secret: Option<String>,
#[serde(default)]
pub verify: BundleVerification,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct OciServicesSource {
pub reference: String,
#[serde(default)]
pub auth_secret: Option<String>,
#[serde(default)]
pub verify: BundleVerification,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct BundleVerification {
#[serde(default)]
pub sha256: Option<String>,
#[serde(default)]
pub ed25519_public_keys: Vec<String>,
}
impl BundleVerification {
#[must_use]
pub const fn is_empty(&self) -> bool {
self.sha256.is_none() && self.ed25519_public_keys.is_empty()
}
}
#[derive(
Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema,
)]
#[serde(rename_all = "snake_case", deny_unknown_fields)]
pub enum FetchFailurePolicy {
FailClosed,
#[default]
UseLastGood,
UseBundled,
}