use core::fmt;
use octseq::ShortInput;
use octseq::{Octets, Parser};
use std::net::{Ipv4Addr, Ipv6Addr};
pub fn parse_ipv4addr<R: Octets>(parser: &mut Parser<'_, R>)
-> Result<Ipv4Addr, ShortInput>
{
parser.check_len(4)?;
Ok(Ipv4Addr::new(
parser.parse_u8()?,
parser.parse_u8()?,
parser.parse_u8()?,
parser.parse_u8()?,
))
}
pub fn parse_ipv6addr<R: Octets>(parser: &mut Parser<'_, R>)
-> Result<Ipv6Addr, ShortInput>
{
let mut buf = [0u8; 16];
parser.parse_buf(&mut buf)?;
Ok(buf.into())
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum ParseError {
ShortInput,
Form(FormError),
StateRequired,
Unsupported,
}
impl ParseError {
pub fn form_error(msg: &'static str) -> Self {
FormError::new(msg).into()
}
}
impl From<ShortInput> for ParseError {
fn from(_: ShortInput) -> Self {
ParseError::ShortInput
}
}
impl From<FormError> for ParseError {
fn from(err: FormError) -> Self {
ParseError::Form(err)
}
}
impl fmt::Display for ParseError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
ParseError::ShortInput => f.write_str("unexpected end of input"),
ParseError::Form(ref err) => err.fmt(f),
ParseError::StateRequired => f.write_str("required stateful parsing info missing"),
ParseError::Unsupported => f.write_str("parsing unsupported")
}
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct FormError(&'static str);
impl FormError {
pub fn new(msg: &'static str) -> Self {
FormError(msg)
}
}
impl fmt::Display for FormError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str(self.0)
}
}