use serde::Deserialize;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum IdentitySource {
#[default]
OxenServer,
AuthProvider,
}
impl IdentitySource {
pub fn supplies_names(&self) -> bool {
matches!(self, IdentitySource::OxenServer)
}
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct IdentityPolicy {
#[serde(default)]
repo_uuids_assigned_by: IdentitySource,
}
impl IdentityPolicy {
pub fn repo_uuids_assigned_by(&self) -> IdentitySource {
self.repo_uuids_assigned_by
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn defaults_to_the_server_assigning_uuids() {
assert_eq!(
IdentityPolicy::default().repo_uuids_assigned_by(),
IdentitySource::OxenServer
);
}
#[test]
fn parses_both_sources() {
let auth_provider: IdentityPolicy =
toml::from_str(r#"repo_uuids_assigned_by = "auth-provider""#)
.expect("a known source parses");
let oxen_server: IdentityPolicy =
toml::from_str(r#"repo_uuids_assigned_by = "oxen-server""#)
.expect("a known source parses");
assert_eq!(
auth_provider.repo_uuids_assigned_by(),
IdentitySource::AuthProvider
);
assert_eq!(
oxen_server.repo_uuids_assigned_by(),
IdentitySource::OxenServer
);
}
#[test]
fn rejects_an_unknown_source() {
assert!(toml::from_str::<IdentityPolicy>(r#"repo_uuids_assigned_by = "hub""#).is_err());
}
#[test]
fn rejects_an_unknown_key() {
assert!(
toml::from_str::<IdentityPolicy>(r#"repo_uuids_assigned_byy = "oxen-server""#).is_err()
);
}
}