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

77 lines
1.8 KiB
Rust
Raw Normal View History

2019-09-15 15:16:17 +00:00
use std::convert::{TryFrom, From};
use std::io;
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,
Float,
SignedInteger,
String,
ByteString,
Symbol,
Record,
Sequence,
Set,
Dictionary,
2022-07-10 11:25:35 +00:00
Embedded,
Annotation,
2019-09-15 15:16:17 +00:00
}
#[derive(Debug, PartialEq, Eq)]
2021-01-06 16:42:02 +00:00
pub struct InvalidTag(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 {
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 {
2022-07-10 11:25:35 +00:00
0xa0 => Ok(Self::False),
0xa1 => Ok(Self::True),
0xa2 => Ok(Self::Float),
0xa3 => Ok(Self::SignedInteger),
0xa4 => Ok(Self::String),
0xa5 => Ok(Self::ByteString),
0xa6 => Ok(Self::Symbol),
0xa7 => Ok(Self::Record),
0xa8 => Ok(Self::Sequence),
0xa9 => Ok(Self::Set),
0xaa => Ok(Self::Dictionary),
0xab => Ok(Self::Embedded),
0xbf => Ok(Self::Annotation),
2021-01-06 16:42:02 +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 {
2022-07-10 11:25:35 +00:00
Tag::False => 0xa0,
Tag::True => 0xa1,
Tag::Float => 0xa2,
Tag::SignedInteger => 0xa3,
Tag::String => 0xa4,
Tag::ByteString => 0xa5,
Tag::Symbol => 0xa6,
Tag::Record => 0xa7,
Tag::Sequence => 0xa8,
Tag::Set => 0xa9,
Tag::Dictionary => 0xaa,
Tag::Embedded => 0xab,
Tag::Annotation => 0xbf,
2019-09-15 15:16:17 +00:00
}
}
}