use std::fmt;
#[cfg(test)]
use quickcheck::{Arbitrary, Gen};
use crate::types::Bitfield;
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct KeyServerPreferences(Bitfield);
assert_send_and_sync!(KeyServerPreferences);
impl fmt::Debug for KeyServerPreferences {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let mut need_comma = false;
if self.no_modify() {
f.write_str("no modify")?;
need_comma = true;
}
for i in self.0.iter() {
match i {
KEYSERVER_PREFERENCE_NO_MODIFY => (),
i => {
if need_comma { f.write_str(", ")?; }
write!(f, "#{}", i)?;
need_comma = true;
},
}
}
let padding = self.0.padding_len();
if padding > 0 {
if need_comma { f.write_str(", ")?; }
write!(f, "+padding({} bytes)", padding)?;
}
Ok(())
}
}
impl KeyServerPreferences {
pub fn new<B: AsRef<[u8]>>(bits: B) -> Self {
KeyServerPreferences(bits.as_ref().to_vec().into())
}
pub fn empty() -> Self {
Self::new(&[])
}
pub(crate) fn as_slice(&self) -> &[u8] {
self.0.as_slice()
}
pub fn normalized_eq(&self, other: &Self) -> bool {
self.0.normalized_eq(&other.0)
}
pub fn get(&self, bit: usize) -> bool {
self.0.get(bit)
}
pub fn set(self, bit: usize) -> Self {
Self(self.0.set(bit))
}
pub fn clear(self, bit: usize) -> Self {
Self(self.0.clear(bit))
}
pub fn no_modify(&self) -> bool {
self.get(KEYSERVER_PREFERENCE_NO_MODIFY)
}
pub fn set_no_modify(self) -> Self {
self.set(KEYSERVER_PREFERENCE_NO_MODIFY)
}
pub fn clear_no_modify(self) -> Self {
self.clear(KEYSERVER_PREFERENCE_NO_MODIFY)
}
}
const KEYSERVER_PREFERENCE_NO_MODIFY: usize = 7;
#[cfg(test)]
impl Arbitrary for KeyServerPreferences {
fn arbitrary<G: Gen>(g: &mut G) -> Self {
Self::new(Vec::arbitrary(g))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn basics() -> crate::Result<()> {
let p = KeyServerPreferences::empty();
assert_eq!(p.no_modify(), false);
let p = KeyServerPreferences::new(&[]);
assert_eq!(p.no_modify(), false);
let p = KeyServerPreferences::new(&[0xff]);
assert_eq!(p.no_modify(), true);
Ok(())
}
quickcheck! {
fn roundtrip(val: KeyServerPreferences) -> bool {
let mut q = KeyServerPreferences::new(val.as_slice());
assert_eq!(val, q);
assert!(val.normalized_eq(&q));
q.0.raw.push(0);
assert!(val != q);
assert!(val.normalized_eq(&q));
q.0.raw.push(0);
assert!(val != q);
assert!(val.normalized_eq(&q));
true
}
}
}