rkg_utils/header/mii/
nose.rs1use std::convert::Infallible;
2
3use crate::byte_handler::{ByteHandlerError, FromByteHandler};
4
5#[derive(Clone, Copy)]
8pub struct Nose {
9 y: u8,
11 size: u8,
13 nose_type: NoseType,
15}
16
17impl Nose {
18 pub fn new(y: u8, size: u8, nose_type: NoseType) -> Result<Self, NoseError> {
31 if size > 8 {
32 return Err(NoseError::SizeInvalid);
33 }
34 if y > 18 {
35 return Err(NoseError::YInvalid);
36 }
37
38 Ok(Self { y, size, nose_type })
39 }
40
41 pub fn y(&self) -> u8 {
43 self.y
44 }
45
46 pub fn size(&self) -> u8 {
48 self.size
49 }
50
51 pub fn nose_type(&self) -> NoseType {
53 self.nose_type
54 }
55
56 pub fn set_y(&mut self, y: u8) -> Result<(), NoseError> {
62 if y > 18 {
63 return Err(NoseError::YInvalid);
64 }
65 self.y = y;
66 Ok(())
67 }
68
69 pub fn set_size(&mut self, size: u8) -> Result<(), NoseError> {
75 if size > 8 {
76 return Err(NoseError::SizeInvalid);
77 }
78 self.size = size;
79 Ok(())
80 }
81
82 pub fn set_nose_type(&mut self, nose_type: NoseType) {
84 self.nose_type = nose_type;
85 }
86}
87
88impl FromByteHandler for Nose {
94 type Err = NoseError;
95 fn from_byte_handler<T>(handler: T) -> Result<Self, Self::Err>
96 where
97 T: TryInto<crate::byte_handler::ByteHandler>,
98 Self::Err: From<T::Error>,
99 {
100 let handler = handler.try_into()?;
101
102 let nose_type =
103 NoseType::try_from(handler.copy_byte(0) >> 4).map_err(|_| NoseError::TypeInvalid)?;
104 let size = handler.copy_byte(0) & 0x0F;
105 let y = handler.copy_byte(1) >> 3;
106
107 Self::new(y, size, nose_type)
108 }
109}
110
111#[derive(thiserror::Error, Debug)]
113pub enum NoseError {
114 #[error("Type is invalid")]
116 TypeInvalid,
117 #[error("Size is invalid")]
119 SizeInvalid,
120 #[error("Y position is invalid")]
122 YInvalid,
123 #[error("ByteHandler Error: {0}")]
125 ByteHandlerError(#[from] ByteHandlerError),
126 #[error("")]
128 Infallible(#[from] Infallible),
129}
130
131#[derive(Clone, Copy, Debug, PartialEq)]
133pub enum NoseType {
134 Normal,
135 Rounded,
136 Dot,
137 Arrow,
138 Roman,
140 Triangle,
141 Button,
142 RoundedInverted,
143 Potato,
144 Grecian,
146 Snub,
148 Aquiline,
150}
151
152impl TryFrom<u8> for NoseType {
156 type Error = ();
157 fn try_from(value: u8) -> Result<Self, Self::Error> {
158 match value {
159 0x01 => Ok(Self::Normal),
160 0x0A => Ok(Self::Rounded),
161 0x02 => Ok(Self::Dot),
162 0x03 => Ok(Self::Arrow),
163 0x06 => Ok(Self::Roman),
164 0x00 => Ok(Self::Triangle),
165 0x05 => Ok(Self::Button),
166 0x04 => Ok(Self::RoundedInverted),
167 0x08 => Ok(Self::Potato),
168 0x09 => Ok(Self::Grecian),
169 0x07 => Ok(Self::Snub),
170 0x0B => Ok(Self::Aquiline),
171 _ => Err(()),
172 }
173 }
174}
175
176impl From<NoseType> for u8 {
178 fn from(value: NoseType) -> Self {
179 match value {
180 NoseType::Normal => 0x01,
181 NoseType::Rounded => 0x0A,
182 NoseType::Dot => 0x02,
183 NoseType::Arrow => 0x03,
184 NoseType::Roman => 0x06,
185 NoseType::Triangle => 0x00,
186 NoseType::Button => 0x05,
187 NoseType::RoundedInverted => 0x04,
188 NoseType::Potato => 0x08,
189 NoseType::Grecian => 0x09,
190 NoseType::Snub => 0x07,
191 NoseType::Aquiline => 0x0B,
192 }
193 }
194}