use alloc::vec::Vec;
use libfcp_core::{
EndpointIdentity, FederationConfiguration, FederationId, FederationMember,
SignedFederationConfiguration, SigningIdentity,
};
use crate::Error;
pub struct FederationServer {
signer: SigningIdentity,
configuration: FederationConfiguration,
}
impl FederationServer {
pub fn new(federation: FederationId, signer: SigningIdentity) -> Result<Self, Error> {
let authority = signer.endpoint();
let configuration = FederationConfiguration::new(federation, authority, 0, Vec::new())?;
Ok(Self {
signer,
configuration,
})
}
pub fn authority(&self) -> EndpointIdentity {
self.configuration.authority
}
pub fn federation(&self) -> FederationId {
self.configuration.federation
}
pub fn epoch(&self) -> u64 {
self.configuration.epoch
}
pub fn replace_members(
&mut self,
epoch: u64,
members: Vec<FederationMember>,
) -> Result<(), Error> {
if epoch <= self.configuration.epoch {
return Err(Error::NonIncreasingEpoch);
}
self.configuration = FederationConfiguration::new(
self.configuration.federation,
self.configuration.authority,
epoch,
members,
)?;
Ok(())
}
pub fn publish(&self) -> Result<SignedFederationConfiguration, Error> {
Ok(SignedFederationConfiguration::sign(
self.configuration.clone(),
&self.signer,
)?)
}
}