私はコンテキストとして行番号を持っているので、私はラインで、テキストファイルの行を解析しています:Errへのコンテキストの追加を自動化するにはどうすればよいですか?
#[derive(Debug, Clone)]
pub struct Position {
pub line: usize,
pub column: usize,
}
#[derive(Debug)]
pub enum ParseError {
IoError(io::Error),
InvalidRecord(Position),
EncodingError(Position),
}
私はこのようなループがあります。
let mut pos = Position { line: 0, column: 0 };
const LF: u8 = 0xa;
let mut record_buf = Vec::new();
while let Ok(nbytes) = reader.read_until(LF, &mut record_buf) {
// if record_buf contains some special bytes, then
// we have several numbers in ASCII
let x = str::from_utf8(&record_buf[42..(42 + 2)])?.parse::<u32>()?;
let y = str::from_utf8(&record_buf[46..(46 + 4)])?.parse::<u32>()?;
//at the end
record_buf.clear();
pos.line += 1;
}
を私はParseError::EncodingError
にマッピングUtf8Error
を自動化したいですおよび ParseIntError
~ParseError::EncodingError
。
impl From<Utf8Error> for ParseError
、 を実装することはできません。行番号の形式のコンテキストが特性実装で使用できないためです。
コードを簡略化し、Vec<u8>
から抽出したいすべての番号について、このように冗長なエラー処理を記述しないでください。
str::from_utf8(&record_buf[42..(42 + 2)])
.map_err(|_| ParseError::EncodingError(pos.clone()))?
.parse::<u32>()
.map_err(|_| ParseError::InvalidRecord(pos.clone()))?
は、あなたが読書やエラーの変換を行う関数を作成しようとしたことがありますか? – red75prime
@ red75prime私はいくつかのより一般的な方法で問題を解決したい。私は構文解析の作業を開始し、 "ヘッダ"行を解析した後、他の多くのエラーを処理しなければならず、そのすべてに対して行と列のコンテキストを追加します。 – user1244932