use thiserror::Error;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ServerRole {
All,
Api,
Transfer,
}
impl ServerRole {
pub fn parse(value: &str) -> Result<Self, ServerRoleParseError> {
match value {
"all" => Ok(Self::All),
"api" => Ok(Self::Api),
"transfer" => Ok(Self::Transfer),
_ => Err(ServerRoleParseError),
}
}
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::All => "all",
Self::Api => "api",
Self::Transfer => "transfer",
}
}
#[must_use]
pub const fn serves_api(self) -> bool {
matches!(self, Self::All | Self::Api)
}
#[must_use]
pub const fn serves_transfer(self) -> bool {
matches!(self, Self::All | Self::Transfer)
}
#[must_use]
pub const fn uses_reconstruction_cache(self) -> bool {
self.serves_api()
}
}
#[derive(Debug, Clone, Copy, Error, PartialEq, Eq)]
#[error("invalid server role")]
pub struct ServerRoleParseError;
#[cfg(test)]
mod tests {
use super::ServerRole;
#[test]
fn parses_supported_roles() {
assert_eq!(ServerRole::parse("all"), Ok(ServerRole::All));
assert_eq!(ServerRole::parse("api"), Ok(ServerRole::Api));
assert_eq!(ServerRole::parse("transfer"), Ok(ServerRole::Transfer));
}
#[test]
fn api_role_only_serves_control_plane_routes() {
assert!(ServerRole::Api.serves_api());
assert!(!ServerRole::Api.serves_transfer());
assert!(ServerRole::Api.uses_reconstruction_cache());
}
#[test]
fn transfer_role_only_serves_transfer_routes() {
assert!(!ServerRole::Transfer.serves_api());
assert!(ServerRole::Transfer.serves_transfer());
assert!(!ServerRole::Transfer.uses_reconstruction_cache());
}
}