fix(unwrap): remove the unwraps.

This commit is contained in:
Mark Schmale 2018-09-13 09:55:53 +02:00
parent 9968d88d61
commit 5921f6cbd0

View File

@ -1,10 +1,13 @@
use regex::{escape, Captures, Error as RegexError, Regex}; use regex::{escape, Captures, Error as RegexError, Regex};
use std::str::FromStr; use std::str::{self, FromStr, Utf8Error};
#[derive(Debug, Fail)] #[derive(Debug, Fail)]
pub enum FormatParserError { pub enum FormatParserError {
#[fail(display = "compiling the regular expression failed: {}", inner)] #[fail(display = "compiling the regular expression failed: {}", inner)]
CompilationFailed { inner: RegexError }, CompilationFailed { inner: RegexError },
#[fail(display = "cannot convert bytes to string: {}", inner)]
StringConversionError { inner: Utf8Error },
} }
/// a single entry/line in a log. /// a single entry/line in a log.
@ -136,14 +139,14 @@ enum FormatParserState {
Fixed(usize, usize), Fixed(usize, usize),
} }
fn is_var_char(char: &u8) -> bool { fn is_var_char(char: u8) -> bool {
match char { match char {
b'a'...b'z' | b'A'...b'Z' | b'_' => true, b'a'...b'z' | b'A'...b'Z' | b'_' => true,
_ => false, _ => false,
} }
} }
fn read_byte(chr: &u8, index: usize, state: &FormatParserState) -> FormatParserState { fn read_byte(chr: u8, index: usize, state: &FormatParserState) -> FormatParserState {
use format::FormatParserState::*; use format::FormatParserState::*;
match state { match state {
Start => match chr { Start => match chr {
@ -161,31 +164,35 @@ fn read_byte(chr: &u8, index: usize, state: &FormatParserState) -> FormatParserS
} }
} }
fn create_owned_str(bytes: &[u8], start: usize, end: usize) -> Result<String, FormatParserError> {
str::from_utf8(&bytes[start..end])
.map(|res| res.to_owned())
.map_err(|err| FormatParserError::StringConversionError { inner: err })
}
fn read_format(bytes: &[u8]) -> Result<Format, FormatParserError> { fn read_format(bytes: &[u8]) -> Result<Format, FormatParserError> {
use format::FormatParserState::*; use format::FormatParserState::*;
let mut state = Start; let mut state = Start;
let mut stack = vec![]; let mut stack = vec![];
for i in 0..bytes.len() { for i in 0..bytes.len() {
let new_state = read_byte(&bytes[i], i, &state); let new_state = read_byte(bytes[i], i, &state);
match (&state, &new_state) { match (&state, &new_state) {
(Variable(start, end), Fixed(_, _)) => stack.push(FormatPart::Variable( (Variable(start, end), Fixed(_, _)) => stack.push(FormatPart::Variable(
String::from_utf8(bytes[*start..*end].to_vec()).unwrap(), create_owned_str(&bytes, *start, *end)?,
)),
(Fixed(start, end), Variable(_, _)) => stack.push(FormatPart::Fixed(
String::from_utf8(bytes[*start..*end].to_vec()).unwrap(),
)), )),
(Fixed(start, end), Variable(_, _)) => {
stack.push(FormatPart::Fixed(create_owned_str(&bytes, *start, *end)?))
}
_ => {} _ => {}
}; };
state = new_state state = new_state
} }
match &state { match &state {
Variable(start, end) => stack.push(FormatPart::Variable( Variable(start, end) => stack.push(FormatPart::Variable(create_owned_str(
String::from_utf8(bytes[*start..*end].to_vec()).unwrap(), &bytes, *start, *end,
)), )?)),
Fixed(start, end) => stack.push(FormatPart::Fixed( Fixed(start, end) => stack.push(FormatPart::Fixed(create_owned_str(&bytes, *start, *end)?)),
String::from_utf8(bytes[*start..*end].to_vec()).unwrap(),
)),
_ => {} _ => {}
}; };