Create unknown constructor error for decode

This commit is contained in:
Kasey White 2022-10-23 14:14:04 -04:00 committed by Lucas
parent 360a5b6017
commit c89690aa77
2 changed files with 24 additions and 24 deletions

View File

@ -20,6 +20,8 @@ pub enum Error {
Message(String), Message(String),
#[error("Parse error: So far we parsed\n\n{0}\n\nand we ran into error: {1}")] #[error("Parse error: So far we parsed\n\n{0}\n\nand we ran into error: {1}")]
ParseError(String, anyhow::Error), ParseError(String, anyhow::Error),
#[error("Unknown term constructor tag: {0}.\n\nHere are the buffer bytes ({1} preceding) {2}\n\nBuffer position is {3} and buffer length is {4}")]
UnknownTermConstructor(u8, usize, String, usize, usize),
#[error(transparent)] #[error(transparent)]
Custom(#[from] anyhow::Error), Custom(#[from] anyhow::Error),
} }

View File

@ -194,21 +194,24 @@ where
5 => Ok(Term::Force(Rc::new(Term::decode(d)?))), 5 => Ok(Term::Force(Rc::new(Term::decode(d)?))),
6 => Ok(Term::Error), 6 => Ok(Term::Error),
7 => Ok(Term::Builtin(DefaultFunction::decode(d)?)), 7 => Ok(Term::Builtin(DefaultFunction::decode(d)?)),
x => Err(de::Error::Message(format!( x => {
"Unknown term constructor tag: {}{}{} {} {:02X?} {} {} {} {}", let buffer_slice: Vec<u8> = d
x, .buffer
".\n\nHere are the buffer bytes (", .to_vec()
if d.pos > 5 { 5 } else { d.pos },
"preceding) ",
d.buffer
.iter() .iter()
.skip(if d.pos - 5 > 0 { d.pos - 5 } else { 0 }) .skip(if d.pos > 5 { d.pos - 5 } else { 0 })
.take(10), .take(10)
"\n\nBuffer position is", .cloned()
.collect();
Err(de::Error::UnknownTermConstructor(
x,
if d.pos > 5 { 5 } else { d.pos },
format!("{:02X?}", buffer_slice),
d.pos, d.pos,
"and buffer length is", d.buffer.len(),
d.buffer.len() ))
))), }
} }
} }
} }
@ -360,23 +363,18 @@ where
.buffer .buffer
.to_vec() .to_vec()
.iter() .iter()
.skip(if d.pos - 5 > 0 { d.pos - 5 } else { 0 }) .skip(if d.pos > 5 { d.pos - 5 } else { 0 })
.take(10) .take(10)
.cloned() .cloned()
.collect(); .collect();
Err(de::Error::Message(format!( Err(de::Error::UnknownTermConstructor(
"Unknown term constructor tag: {}{}{} {} {:02X?} {} {} {} {}",
x, x,
".\n\nHere are the buffer bytes (",
if d.pos > 5 { 5 } else { d.pos }, if d.pos > 5 { 5 } else { d.pos },
"preceding) ", format!("{:02X?}", buffer_slice),
buffer_slice,
"\n\nBuffer position is",
d.pos, d.pos,
"and buffer length is", d.buffer.len(),
d.buffer.len() ))
)))
} }
} }
} }