cat_dev/fsemul/pcfs/sata/proto/
close_folder.rs1use crate::errors::NetworkParseError;
6use bytes::{Buf, BufMut, Bytes, BytesMut};
7use valuable::{Fields, NamedField, NamedValues, StructDef, Structable, Valuable, Value, Visit};
8
9#[derive(Clone, Debug, PartialEq, Eq)]
11pub struct SataCloseFolderPacketBody {
12 file_descriptor: i32,
13}
14
15impl SataCloseFolderPacketBody {
16 #[must_use]
18 pub const fn new(fd: i32) -> Self {
19 Self {
20 file_descriptor: fd,
21 }
22 }
23
24 #[must_use]
25 pub const fn file_descriptor(&self) -> i32 {
26 self.file_descriptor
27 }
28
29 pub const fn set_file_descriptor(&mut self, new_fd: i32) {
30 self.file_descriptor = new_fd;
31 }
32}
33
34impl TryFrom<Bytes> for SataCloseFolderPacketBody {
35 type Error = NetworkParseError;
36
37 fn try_from(mut value: Bytes) -> Result<Self, Self::Error> {
38 if value.len() < 0x4 {
39 return Err(NetworkParseError::FieldNotLongEnough(
40 "SataCloseFolder",
41 "Body",
42 0x4,
43 value.len(),
44 value,
45 ));
46 }
47 if value.len() > 0x4 {
48 return Err(NetworkParseError::UnexpectedTrailer(
49 "SataCloseFolder",
50 value.slice(0x4..),
51 ));
52 }
53
54 let fd = value.get_i32();
55
56 Ok(Self {
57 file_descriptor: fd,
58 })
59 }
60}
61
62impl From<&SataCloseFolderPacketBody> for Bytes {
63 fn from(value: &SataCloseFolderPacketBody) -> Self {
64 let mut body = BytesMut::with_capacity(4);
65 body.put_i32(value.file_descriptor);
66 body.freeze()
67 }
68}
69
70impl From<SataCloseFolderPacketBody> for Bytes {
71 fn from(value: SataCloseFolderPacketBody) -> Self {
72 Self::from(&value)
73 }
74}
75
76const SATA_CLOSE_FOLDER_PACKET_BODY_FIELDS: &[NamedField<'static>] = &[NamedField::new("fd")];
77
78impl Structable for SataCloseFolderPacketBody {
79 fn definition(&self) -> StructDef<'_> {
80 StructDef::new_static(
81 "SataCloseFolderPacketBody",
82 Fields::Named(SATA_CLOSE_FOLDER_PACKET_BODY_FIELDS),
83 )
84 }
85}
86
87impl Valuable for SataCloseFolderPacketBody {
88 fn as_value(&self) -> Value<'_> {
89 Value::Structable(self)
90 }
91
92 fn visit(&self, visitor: &mut dyn Visit) {
93 visitor.visit_named_fields(&NamedValues::new(
94 SATA_CLOSE_FOLDER_PACKET_BODY_FIELDS,
95 &[Valuable::as_value(&self.file_descriptor)],
96 ));
97 }
98}