(spec: &str)
| 40 | } |
| 41 | |
| 42 | fn parse_spec(spec: &str) -> Result<Spec, &'static str> { |
| 43 | let bytes = spec.as_bytes(); |
| 44 | let mut s = Spec { fill: ' ', ..Spec::default() }; |
| 45 | let mut i = 0; |
| 46 | |
| 47 | /* fill+align is "<char><align>" only when char #2 is one of `<>^=`. */ |
| 48 | if bytes.len() >= 2 && matches!(bytes[1], b'<' | b'>' | b'^' | b'=') { |
| 49 | s.fill = bytes[0] as char; |
| 50 | s.align = Some(bytes[1]); |
| 51 | i = 2; |
| 52 | } else if !bytes.is_empty() && matches!(bytes[0], b'<' | b'>' | b'^' | b'=') { |
| 53 | s.align = Some(bytes[0]); |
| 54 | i = 1; |
| 55 | } |
| 56 | |
| 57 | if i < bytes.len() && matches!(bytes[i], b'+' | b'-' | b' ') { |
| 58 | s.sign = bytes[i]; |
| 59 | i += 1; |
| 60 | } |
| 61 | |
| 62 | // '#' alternate form, opt in to base prefix on b/o/x/X. |
| 63 | if i < bytes.len() && bytes[i] == b'#' { s.alt = true; i += 1; } |
| 64 | |
| 65 | if i < bytes.len() && bytes[i] == b'0' { |
| 66 | s.zero_pad = true; |
| 67 | if s.align.is_none() { |
| 68 | s.align = Some(b'='); |
| 69 | s.fill = '0'; |
| 70 | } |
| 71 | i += 1; |
| 72 | } |
| 73 | |
| 74 | let w_start = i; |
| 75 | while i < bytes.len() && bytes[i].is_ascii_digit() { i += 1; } |
| 76 | if i > w_start { |
| 77 | s.width = spec[w_start..i].parse().map_err(|_| "invalid width in format spec")?; |
| 78 | } |
| 79 | |
| 80 | // ',' or '_' digit-group separator; '_' groups hex/oct/bin by four. |
| 81 | if i < bytes.len() && matches!(bytes[i], b',' | b'_') { |
| 82 | s.sep = bytes[i]; |
| 83 | i += 1; |
| 84 | } |
| 85 | |
| 86 | if i < bytes.len() && bytes[i] == b'.' { |
| 87 | i += 1; |
| 88 | let p_start = i; |
| 89 | while i < bytes.len() && bytes[i].is_ascii_digit() { i += 1; } |
| 90 | if i == p_start { return Err("missing precision in format spec"); } |
| 91 | s.precision = Some(spec[p_start..i].parse().map_err(|_| "invalid precision in format spec")?); |
| 92 | } |
| 93 | |
| 94 | if i < bytes.len() { |
| 95 | if !bytes[i].is_ascii() { return Err("invalid type in format spec"); } |
| 96 | s.ty = bytes[i]; |
| 97 | i += 1; |
| 98 | } |
| 99 |
no test coverage detected