parse_zpool_status_vdev: consider tabs as 8 spaces

This commit is contained in:
Dietmar Maurer 2020-06-18 18:38:56 +02:00
parent 026dc1d11f
commit b29cbc414d
1 changed files with 12 additions and 3 deletions

View File

@ -31,20 +31,29 @@ pub struct ZFSPoolVDevState {
pub msg: Option<String>, pub msg: Option<String>,
} }
fn expand_tab_length(input: &str) -> usize {
input.chars().map(|c| if c == '\t' { 8 } else { 1 }).sum()
}
fn parse_zpool_status_vdev(i: &str) -> IResult<&str, ZFSPoolVDevState> { fn parse_zpool_status_vdev(i: &str) -> IResult<&str, ZFSPoolVDevState> {
let (n, indent) = multispace0(i)?; let (n, indent) = multispace0(i)?;
if (indent.len() & 1) != 0 {
let indent_len = expand_tab_length(indent);
if (indent_len & 1) != 0 {
return Err(parse_failure(n, "wrong indent length")); return Err(parse_failure(n, "wrong indent length"));
} }
let i = n; let i = n;
let indent_level = (indent_len as u64)/2;
let (i, vdev_name) = notspace1(i)?; let (i, vdev_name) = notspace1(i)?;
if let Ok((n, _)) = preceded(multispace0, line_ending)(i) { // sepecial device if let Ok((n, _)) = preceded(multispace0, line_ending)(i) { // sepecial device
let vdev = ZFSPoolVDevState { let vdev = ZFSPoolVDevState {
name: vdev_name.to_string(), name: vdev_name.to_string(),
lvl: (indent.len() as u64)/2, lvl: indent_level,
state: None, state: None,
read: None, read: None,
write: None, write: None,
@ -63,7 +72,7 @@ fn parse_zpool_status_vdev(i: &str) -> IResult<&str, ZFSPoolVDevState> {
let vdev = ZFSPoolVDevState { let vdev = ZFSPoolVDevState {
name: vdev_name.to_string(), name: vdev_name.to_string(),
lvl: (indent.len() as u64)/2, lvl: indent_level,
state: Some(state.to_string()), state: Some(state.to_string()),
read: Some(read), read: Some(read),
write: Some(write), write: Some(write),