2019: switch to anyhow

This commit is contained in:
Antoine Martin 2020-12-14 19:24:43 +01:00
parent d91165207f
commit deb808faf3
19 changed files with 84 additions and 114 deletions

View file

@ -1,5 +1,4 @@
use aoc::err;
use aoc::Result;
use anyhow::{anyhow, bail, Result};
mod parameter;
@ -8,7 +7,7 @@ use parameter::Parameter;
pub fn parse_memory(s: &str) -> Result<Vec<i64>> {
s.trim_end()
.split(',')
.map(|x| x.parse().map_err(|e| err!("couldn't parse int: {}", e)))
.map(|x| x.parse().map_err(anyhow::Error::new))
.collect()
}
@ -74,7 +73,7 @@ impl Intcode {
let dst = Parameter::new(mode3, self.memory.get(self.ip + 3).copied())?;
if let Parameter::Immediate(_) = dst {
Err(err!("add: destination parameter can't be immediate"))
Err(anyhow!("add: destination parameter can't be immediate"))
} else {
Ok(Opcode::Add(op1, op2, dst))
}
@ -85,7 +84,9 @@ impl Intcode {
let dst = Parameter::new(mode3, self.memory.get(self.ip + 3).copied())?;
if let Parameter::Immediate(_) = dst {
Err(err!("multiply: destination parameter can't be immediate"))
Err(anyhow!(
"multiply: destination parameter can't be immediate"
))
} else {
Ok(Opcode::Multiply(op1, op2, dst))
}
@ -94,7 +95,7 @@ impl Intcode {
let dst = Parameter::new(mode1, self.memory.get(self.ip + 1).copied())?;
if let Parameter::Immediate(_) = dst {
Err(err!("input: destination parameter can't be immediate"))
Err(anyhow!("input: destination parameter can't be immediate"))
} else {
Ok(Opcode::Input(dst))
}
@ -122,7 +123,9 @@ impl Intcode {
let dst = Parameter::new(mode3, self.memory.get(self.ip + 3).copied())?;
if let Parameter::Immediate(_) = dst {
Err(err!("less than: destination parameter can't be immediate"))
Err(anyhow!(
"less than: destination parameter can't be immediate"
))
} else {
Ok(Opcode::LessThan(op1, op2, dst))
}
@ -133,7 +136,7 @@ impl Intcode {
let dst = Parameter::new(mode3, self.memory.get(self.ip + 3).copied())?;
if let Parameter::Immediate(_) = dst {
Err(err!("equals: destination parameter can't be immediate"))
Err(anyhow!("equals: destination parameter can't be immediate"))
} else {
Ok(Opcode::Equals(op1, op2, dst))
}
@ -144,14 +147,14 @@ impl Intcode {
Ok(Opcode::AdjustRelBase(offset))
}
99 => Ok(Opcode::Halt),
_ => Err(err!("unknown opcode: {}", opcode)),
_ => Err(anyhow!("unknown opcode: {}", opcode)),
}
}
fn exec(&mut self) -> Result<bool> {
loop {
if self.ip >= self.memory.len() {
return Err(err!("reached end of program without halting"));
bail!("reached end of program without halting");
}
let opcode = self.get_opcode()?;
@ -181,7 +184,7 @@ impl Intcode {
} else if self.wait_input {
break Ok(false);
} else {
break Err(err!("tried to read input but it was empty"));
break Err(anyhow!("tried to read input but it was empty"));
};
dst.set(input, &mut self.memory, self.relative_base)?;
@ -197,7 +200,7 @@ impl Intcode {
let val = test.get(&mut self.memory, self.relative_base)?;
let dst = dst.get(&mut self.memory, self.relative_base)?;
if dst < 0 {
return Err(err!("dst must be a valid address: {}", dst));
bail!("dst must be a valid address: {}", dst);
}
if val != 0 {
@ -210,7 +213,7 @@ impl Intcode {
let val = test.get(&mut self.memory, self.relative_base)?;
let dst = dst.get(&mut self.memory, self.relative_base)?;
if dst < 0 {
return Err(err!("dst must be a valid address: {}", dst));
bail!("dst must be a valid address: {}", dst);
}
if val == 0 {

View file

@ -1,5 +1,4 @@
use aoc::err;
use aoc::Result;
use anyhow::{anyhow, Context, Result};
#[derive(Debug)]
pub enum Parameter {
@ -10,13 +9,13 @@ pub enum Parameter {
impl Parameter {
pub fn new(mode: i64, val: Option<i64>) -> Result<Self> {
let val = val.ok_or_else(|| err!("parameter value out of bounds"))?;
let val = val.context("parameter value out of bounds")?;
let mode = mode % 10;
match mode {
0 => {
if val < 0 {
Err(err!("negative value for position parameter: {}", val))
Err(anyhow!("negative value for position parameter: {}", val))
} else {
let val = val as usize;
Ok(Parameter::Position(val))
@ -24,7 +23,7 @@ impl Parameter {
}
1 => Ok(Parameter::Immediate(val)),
2 => Ok(Parameter::Relative(val)),
_ => Err(err!("wrong mode for parameter: {}", mode)),
_ => Err(anyhow!("wrong mode for parameter: {}", mode)),
}
}
@ -75,7 +74,7 @@ impl Parameter {
}
Ok(())
}
Parameter::Immediate(_) => Err(err!("cannot write to immediate parameter")),
Parameter::Immediate(_) => Err(anyhow!("cannot write to immediate parameter")),
Parameter::Relative(offset) => {
let address = relative_base.wrapping_add(*offset as usize);
let cell = memory.get_mut(address);