use aranya_daemon_api::{AddSeedMode, CreateSeedMode, SEED_IKM_SIZE};
use tracing::error;
use crate::{error::InvalidArg, ConfigError, Result};
#[derive(Clone, Debug)]
pub struct CreateTeamQuicSyncConfig {
mode: CreateSeedMode,
}
impl CreateTeamQuicSyncConfig {
pub fn builder() -> CreateTeamQuicSyncConfigBuilder {
CreateTeamQuicSyncConfigBuilder::default()
}
}
#[derive(Clone, Debug)]
pub struct AddTeamQuicSyncConfig {
mode: AddSeedMode,
}
impl AddTeamQuicSyncConfig {
pub fn builder() -> AddTeamQuicSyncConfigBuilder {
AddTeamQuicSyncConfigBuilder::default()
}
}
#[derive(Debug, Default)]
pub struct CreateTeamQuicSyncConfigBuilder {
mode: CreateSeedMode,
}
impl CreateTeamQuicSyncConfigBuilder {
#[doc(hidden)]
pub fn mode(mut self, mode: CreateSeedMode) -> Self {
self.mode = mode;
self
}
pub fn gen_seed(mut self) -> Self {
self.mode = CreateSeedMode::Generate;
self
}
pub fn seed_ikm(mut self, ikm: [u8; SEED_IKM_SIZE]) -> Self {
self.mode = CreateSeedMode::IKM(ikm.into());
self
}
pub fn build(self) -> Result<CreateTeamQuicSyncConfig> {
Ok(CreateTeamQuicSyncConfig { mode: self.mode })
}
}
#[derive(Debug, Default)]
pub struct AddTeamQuicSyncConfigBuilder {
mode: Option<AddSeedMode>,
}
impl AddTeamQuicSyncConfigBuilder {
#[doc(hidden)]
pub fn mode(mut self, mode: AddSeedMode) -> Self {
self.mode = Some(mode);
self
}
pub fn seed_ikm(mut self, ikm: [u8; SEED_IKM_SIZE]) -> Self {
self.mode = Some(AddSeedMode::IKM(ikm.into()));
self
}
pub fn wrapped_seed(mut self, wrapped_seed: &[u8]) -> Result<Self> {
let wrapped = postcard::from_bytes(wrapped_seed).map_err(|err| {
error!(error = %err, "could not deserialize wrapped_seed");
ConfigError::InvalidArg(InvalidArg::new("wrapped_seed", "could not deserialize"))
})?;
self.mode = Some(AddSeedMode::Wrapped(wrapped));
Ok(self)
}
pub fn build(self) -> Result<AddTeamQuicSyncConfig> {
let Some(mode) = self.mode else {
return Err(ConfigError::InvalidArg(InvalidArg::new(
"mode",
"`mode` must be set in order to build an `AddQuicSyncConfig`",
))
.into());
};
Ok(AddTeamQuicSyncConfig { mode })
}
}
impl From<CreateTeamQuicSyncConfig> for aranya_daemon_api::CreateTeamQuicSyncConfig {
fn from(value: CreateTeamQuicSyncConfig) -> Self {
aranya_daemon_api::CreateTeamQuicSyncConfig {
seed_mode: value.mode,
}
}
}
impl From<AddTeamQuicSyncConfig> for aranya_daemon_api::AddTeamQuicSyncConfig {
fn from(value: AddTeamQuicSyncConfig) -> Self {
aranya_daemon_api::AddTeamQuicSyncConfig {
seed_mode: value.mode,
}
}
}