use serde::{Deserialize, Serialize};
use crate::message::{Attrs, Path};
#[derive(Debug, Default, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct Open {
pub filename: Path,
pub pflags: PFlags,
pub attrs: Attrs,
}
bitflags::bitflags! {
#[repr(transparent)]
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct PFlags: u32 {
const READ = 0x00000001;
const WRITE = 0x00000002;
const APPEND = 0x00000004;
const CREATE = 0x00000008;
const TRUNCATE = 0x00000010;
const EXCLUDE = 0x00000020;
}
}
#[cfg(test)]
mod test {
use crate::message::{
test_utils::{encode_decode, fail_decode},
Attrs, Path,
};
use crate::wire::Error;
use super::{Open, PFlags};
const OPEN_VALID: &[u8] = b"\0\0\0\x08filename\0\0\0\x09\0\0\0\x01\0\0\0\0\0\x0a\x77\x35";
#[test]
fn encode_success() {
encode_decode(
Open {
filename: Path("filename".to_owned()),
pflags: PFlags::READ | PFlags::CREATE,
attrs: Attrs {
size: Some(0xa7735),
..Default::default()
},
},
OPEN_VALID,
);
}
#[test]
fn decode_failure() {
for i in 0..OPEN_VALID.len() {
assert_eq!(fail_decode::<Open>(&OPEN_VALID[..i]), Error::NotEnoughData);
}
}
}