whitespace = _{ " " | "\t" }
digit = _{ '0'..'9' }
digits = { digit ~ (digit | "_")* }
alpha = _{ 'a'..'z' | 'A'..'Z' }
symbol = _{ "!" | "@" | "," | "." | ";" | ":" | "/" | "\'" | "\"" | "(" | ")" | "-" | "%" | "\\" }
alpha_num = _{ digit | alpha }
alpha_nums = _{ alpha_num+ }
text = _{ (alpha_num | whitespace |symbol)+ }
path = @{ !raid_enum ~ "/"? ~ (name ~ "/"?)+ }
url = @{ ("https" | "http") ~ ":/" ~ path }
state_enum = { "ONLINE" | "OFFLINE" | "UNAVAIL" | "DEGRADED" | "FAULTED" | "AVAIL" | "INUSE" }
raid_enum = { "mirror" | "raidz1" | "raidz2" | "raidz3" }
raid_name = ${ raid_enum ~ ("-" ~ digits)? }
name = @{ ("_" | "-" | "."| ":" | alpha_num)+ }
pool_name = { whitespace* ~ "pool:" ~ whitespace ~ name ~ "\n" }
pool_id = { whitespace* ~ "id:" ~ whitespace ~ digits ~ "\n" }
state = { whitespace* ~ "state:" ~ whitespace ~ state_enum ~ "\n" }
status = { whitespace* ~ "status:" ~ multi_line_text }
action = { whitespace* ~ "action: " ~ multi_line_text }
see = { whitespace* ~ "see:" ~ whitespace ~ url ~ "\n" }
config = { whitespace* ~ "config:" ~ "\n" }
comment = { whitespace* ~ "comment: " ~ text? ~ "\n" }
reason = { text }
error_statistics = { whitespace* ~ digits ~ whitespace* ~ digits ~ whitespace* ~ digits }
pool_line = { whitespace* ~ name ~ whitespace* ~ state_enum ~ whitespace? ~ error_statistics? ~ whitespace* ~ reason? ~ "\n"? }
raid_line = { whitespace* ~ raid_name ~ whitespace* ~ state_enum ~ whitespace? ~ error_statistics? ~ whitespace* ~ reason? ~ "\n"? }
disk_line = { whitespace* ~ path ~ whitespace* ~ state_enum ~ whitespace? ~ error_statistics? ~ whitespace* ~ reason? ~ "\n"? }
scan_line = { whitespace* ~ "scan:" ~ whitespace* ~ multi_line_text }
pool_headers = _{ whitespace* ~ "NAME" ~ whitespace* ~ "STATE" ~ whitespace* ~ "READ" ~ whitespace* ~ "WRITE" ~ whitespace* ~ "CKSUM" ~ "\n" }
no_errors = { "No known data errors" }
errors = { whitespace* ~ "errors:" ~ whitespace* ~ (no_errors | multi_line_text) }
naked_vdev = { disk_line }
raided_vdev = { raid_line ~ disk_line+}
vdev = _{ raided_vdev | naked_vdev }
vdev_line = _{ vdev ~ "\n"? }
vdevs = { vdev_line+ }
logs = { whitespace* ~ "logs" ~ whitespace* ~ "\n" ~ whitespace* ~ vdevs ~ "\n"?}
caches = { whitespace* ~ "cache" ~ whitespace* ~ "\n" ~ whitespace* ~ disk_line+ ~ "\n"?}
spares = { whitespace* ~ "spares" ~ whitespace* ~ "\n" ~ whitespace* ~ disk_line+ ~ "\n"?}
zpool = { "\n"? ~ pool_name ~ pool_id? ~ state ~ status? ~ action? ~ comment? ~ see? ~ scan_line? ~ config ~ "\n" ~ pool_headers? ~ pool_line ~ vdevs ~ logs? ~ caches? ~ spares? ~ errors? ~ "\n"?}
zpools = _{ zpool* ~ whitespace* }
text_line = _{ text ~ "\n" }
aligned_text_line = _{ (whitespace{8} | "\t") ~ text ~ "\n" }
multi_line_text = { text_line ~ aligned_text_line{, 5} }