use tracing::warn;
#[derive(Copy, Clone, Debug, Default)]
pub struct Features {
pub wasmcloud_messaging_v3: bool,
pub workload_identity_interface: bool,
pub rpc_interface: bool,
}
impl Features {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn enable_wasmcloud_messaging_v3(mut self) -> Self {
self.wasmcloud_messaging_v3 = true;
self
}
#[must_use]
pub fn enable_workload_identity_interface(mut self) -> Self {
self.workload_identity_interface = true;
self
}
#[must_use]
pub fn enable_rpc_interface(mut self) -> Self {
self.rpc_interface = true;
self
}
}
impl std::ops::BitOr for Features {
type Output = Self;
fn bitor(self, rhs: Self) -> Self::Output {
Self {
wasmcloud_messaging_v3: self.wasmcloud_messaging_v3 || rhs.wasmcloud_messaging_v3,
workload_identity_interface: self.workload_identity_interface
|| rhs.workload_identity_interface,
rpc_interface: self.rpc_interface || rhs.rpc_interface,
}
}
}
impl std::iter::Sum for Features {
fn sum<I: Iterator<Item = Self>>(mut iter: I) -> Self {
let first = iter.next().unwrap_or_default();
iter.fold(first, |a, b| a | b)
}
}
impl From<&str> for Features {
fn from(s: &str) -> Self {
match &*s.to_ascii_lowercase() {
"wasmcloud-messaging-v3" | "wasmcloud_messaging_v3" => {
Self::new().enable_wasmcloud_messaging_v3()
}
"workload-identity-interface" | "workload_identity_interface" => {
Self::new().enable_workload_identity_interface()
}
"rpc-interface" | "rpc_interface" => Self::new().enable_rpc_interface(),
_ => {
warn!(%s, "unknown feature flag");
Self::new()
}
}
}
}