use failure::Error;
use serde::de::DeserializeOwned;
use serde::Serialize;
mod local;
mod zk;
pub use self::local::LocalAuthority;
pub use self::zk::ZookeeperAuthority;
pub const CONTROLLER_KEY: &str = "/controller";
pub const STATE_KEY: &str = "/state";
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
pub struct Epoch(i64);
pub enum ElectionResult {
Won(Epoch),
Lost { epoch: Epoch, payload: Vec<u8> },
}
pub trait Authority: Send + Sync {
fn become_leader(&self, payload_data: Vec<u8>) -> Result<Option<Epoch>, Error>;
fn surrender_leadership(&self) -> Result<(), Error>;
fn get_leader(&self) -> Result<(Epoch, Vec<u8>), Error>;
fn try_get_leader(&self) -> Result<Option<(Epoch, Vec<u8>)>, Error>;
fn await_new_epoch(&self, current_epoch: Epoch) -> Result<Option<(Epoch, Vec<u8>)>, Error>;
fn try_read(&self, key: &str) -> Result<Option<Vec<u8>>, Error>;
fn read_modify_write<F, P, E>(&self, key: &str, f: F) -> Result<Result<P, E>, Error>
where
F: FnMut(Option<P>) -> Result<P, E>,
P: Serialize + DeserializeOwned;
}