zerotier_crypto/
identity_type.rsuse arrayref::array_ref;
use std::num::ParseIntError;
use std::str::FromStr;
pub const IDENTITY_TYPE_LENGTH: usize = 1;
#[derive(Debug)]
pub struct IdentityType(u8);
impl IdentityType {
pub fn new() -> Self {
Self(0)
}
}
#[derive(Debug)]
pub enum IdentityTypeError {
Unknown(IdentityType),
}
impl TryFrom<u8> for IdentityType {
type Error = IdentityTypeError;
fn try_from(n: u8) -> Result<Self, Self::Error> {
match n {
0 => Ok(Self(0)),
_ => Err(Self::Error::Unknown(Self(0))),
}
}
}
impl TryFrom<&[u8; IDENTITY_TYPE_LENGTH]> for IdentityType {
type Error = IdentityTypeError;
fn try_from(bytes: &[u8; IDENTITY_TYPE_LENGTH]) -> Result<Self, Self::Error> {
Self::try_from(bytes[0])
}
}
#[derive(Debug)]
pub enum FromSliceIdentityTypeError {
InvalidLength(usize),
IdentityTypeError(IdentityTypeError),
}
impl From<IdentityTypeError> for FromSliceIdentityTypeError {
fn from(err: IdentityTypeError) -> Self {
Self::IdentityTypeError(err)
}
}
impl TryFrom<&[u8]> for IdentityType {
type Error = FromSliceIdentityTypeError;
fn try_from(bytes: &[u8]) -> Result<Self, Self::Error> {
let length = bytes.len();
if length == IDENTITY_TYPE_LENGTH {
Ok(Self::try_from(array_ref![bytes, 0, IDENTITY_TYPE_LENGTH])?)
} else {
Err(Self::Error::InvalidLength(length))
}
}
}
#[derive(Debug)]
pub enum FromStrIdentityTypeError {
DecodeError(ParseIntError),
InvalidByteLength(usize),
IdentityTypeError(IdentityTypeError),
}
impl From<ParseIntError> for FromStrIdentityTypeError {
fn from(err: ParseIntError) -> Self {
Self::DecodeError(err)
}
}
impl From<IdentityTypeError> for FromStrIdentityTypeError {
fn from(err: IdentityTypeError) -> Self {
Self::IdentityTypeError(err)
}
}
impl From<FromSliceIdentityTypeError> for FromStrIdentityTypeError {
fn from(err: FromSliceIdentityTypeError) -> Self {
match err {
FromSliceIdentityTypeError::InvalidLength(len) => Self::InvalidByteLength(len),
FromSliceIdentityTypeError::IdentityTypeError(err) => err.into(),
}
}
}
impl FromStr for IdentityType {
type Err = FromStrIdentityTypeError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(Self::try_from(s.parse::<u8>()?)?)
}
}