MCPcopy Create free account
hub / github.com/dylan-sutton-chavez/edge-python / parse_spec

Function parse_spec

compiler/src/modules/vm/handlers/format.rs:42–102  ·  view source on GitHub ↗
(spec: &str)

Source from the content-addressed store, hash-verified

40}
41
42fn 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

Callers 1

format_valueFunction · 0.70

Calls 4

is_noneMethod · 0.80
lenMethod · 0.45
is_emptyMethod · 0.45
parseMethod · 0.45

Tested by

no test coverage detected