preserves/implementations/rust/preserves/src/value/packed/constants.rs

87 lines
2.1 KiB
Rust
Raw Normal View History

2023-10-26 22:46:27 +00:00
//! Definitions of the tags used in the binary encoding.
2023-07-21 16:15:30 +00:00
use std::convert::{From, TryFrom};
use std::io;
2019-09-15 15:16:17 +00:00
2023-10-26 22:46:27 +00:00
/// Rust representation of tags used in the binary encoding.
2019-09-15 15:16:17 +00:00
#[derive(Debug, PartialEq, Eq)]
2021-01-06 16:42:02 +00:00
pub enum Tag {
False,
True,
End,
Annotation,
Embedded,
Ieee754,
2021-01-06 16:42:02 +00:00
SignedInteger,
String,
ByteString,
Symbol,
Record,
Sequence,
Set,
Dictionary,
2019-09-15 15:16:17 +00:00
}
2023-10-26 22:46:27 +00:00
/// Error value representing failure to decode a byte into a [Tag].
2019-09-15 15:16:17 +00:00
#[derive(Debug, PartialEq, Eq)]
2023-10-26 22:46:27 +00:00
pub struct InvalidTag(pub u8);
2019-09-15 15:16:17 +00:00
impl From<InvalidTag> for io::Error {
2021-01-06 16:42:02 +00:00
fn from(v: InvalidTag) -> Self {
2023-07-21 16:15:30 +00:00
io::Error::new(
io::ErrorKind::InvalidData,
format!("Invalid Preserves tag {}", v.0),
)
}
}
2021-01-06 16:42:02 +00:00
impl From<InvalidTag> for crate::error::Error {
fn from(v: InvalidTag) -> Self {
crate::error::Error::Io(v.into())
}
}
2021-01-06 16:42:02 +00:00
impl TryFrom<u8> for Tag {
type Error = InvalidTag;
2019-09-15 15:16:17 +00:00
fn try_from(v: u8) -> Result<Self, Self::Error> {
2021-01-06 16:42:02 +00:00
match v {
0x80 => Ok(Self::False),
0x81 => Ok(Self::True),
0x84 => Ok(Self::End),
0x85 => Ok(Self::Annotation),
0x86 => Ok(Self::Embedded),
0x87 => Ok(Self::Ieee754),
2021-01-06 16:42:02 +00:00
0xb0 => Ok(Self::SignedInteger),
0xb1 => Ok(Self::String),
0xb2 => Ok(Self::ByteString),
0xb3 => Ok(Self::Symbol),
0xb4 => Ok(Self::Record),
0xb5 => Ok(Self::Sequence),
0xb6 => Ok(Self::Set),
0xb7 => Ok(Self::Dictionary),
2023-07-21 16:15:30 +00:00
_ => Err(InvalidTag(v)),
2019-09-15 15:16:17 +00:00
}
}
}
2021-01-06 16:42:02 +00:00
impl From<Tag> for u8 {
fn from(v: Tag) -> Self {
2019-09-15 15:16:17 +00:00
match v {
2021-01-06 16:42:02 +00:00
Tag::False => 0x80,
Tag::True => 0x81,
Tag::End => 0x84,
Tag::Annotation => 0x85,
Tag::Embedded => 0x86,
Tag::Ieee754 => 0x87,
2021-01-06 16:42:02 +00:00
Tag::SignedInteger => 0xb0,
Tag::String => 0xb1,
Tag::ByteString => 0xb2,
Tag::Symbol => 0xb3,
Tag::Record => 0xb4,
Tag::Sequence => 0xb5,
Tag::Set => 0xb6,
Tag::Dictionary => 0xb7,
2019-09-15 15:16:17 +00:00
}
}
}