use std::ops::{BitOr, BitOrAssign};
#[allow(non_upper_case_globals, non_snake_case)]
pub const BufferRequest: Feature = Feature(1);
#[allow(non_upper_case_globals, non_snake_case)]
pub const BufferResponse: Feature = Feature(2);
#[allow(non_upper_case_globals, non_snake_case)]
pub const Trailers: Feature = Feature(4);
#[derive(Debug, PartialEq, Clone, Copy)]
pub struct Feature(i32);
impl From<Feature> for i32 {
fn from(val: Feature) -> Self {
val.0
}
}
impl BitOr for Feature {
type Output = Feature;
fn bitor(self, rhs: Self) -> Feature {
Feature(self.0 | rhs.0)
}
}
impl BitOrAssign for Feature {
fn bitor_assign(&mut self, rhs: Self) {
self.0 |= rhs.0;
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn feature_buffer_request() {
assert_eq!(BufferRequest.0, 1);
}
#[test]
fn feature_buffer_response() {
assert_eq!(BufferResponse.0, 2);
}
#[test]
fn feature_trailers() {
assert_eq!(Trailers.0, 4);
}
#[test]
fn feature_combine_with_bitor() {
let combined = BufferRequest | BufferResponse;
assert_eq!(combined, Feature(3));
}
#[test]
fn feature_combine_with_bitorassign() {
let mut f = BufferRequest;
f |= BufferResponse;
assert_eq!(f, Feature(3));
}
#[test]
fn feature_combine_all() {
let combined = BufferRequest | BufferResponse | Trailers;
assert_eq!(combined, Feature(7));
}
#[test]
fn feature_debug_output() {
let f = Feature(42);
let debug_str = format!("{:?}", f);
assert!(debug_str.contains("42"));
}
#[test]
fn feature_partial_eq() {
assert_eq!(Feature(5), Feature(5));
assert_ne!(Feature(1), Feature(2));
}
#[test]
fn feature_into_i32() {
let f = Feature(123);
let val: i32 = f.into();
assert_eq!(val, 123);
}
}