cat_dev/fsemul/pcfs/sata/proto/
close_folder.rs

1//! Definitions for the `CloseFolder` packet type, and it's response types.
2//!
3//! This closes an already existing open folder given just a handle.
4
5use crate::errors::NetworkParseError;
6use bytes::{Buf, BufMut, Bytes, BytesMut};
7use valuable::{Fields, NamedField, NamedValues, StructDef, Structable, Valuable, Value, Visit};
8
9/// A packet to close a particular folder given a file descriptor.
10#[derive(Clone, Debug, PartialEq, Eq)]
11pub struct SataCloseFolderPacketBody {
12	file_descriptor: i32,
13}
14
15impl SataCloseFolderPacketBody {
16	/// Create a new close folder packet.
17	#[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}