MCPcopy Create free account
hub / github.com/PerroEngine/Perro / parse_value

Method parse_value

perro_source/runtime_project/perro_scene/src/parser.rs:123–343  ·  view source on GitHub ↗
(&mut self)

Source from the content-addressed store, hash-verified

121 continue;
122 }
123 self.advance();
124 }
125 Ok(vars)
126 }
127
128 fn parse_value(&mut self) -> ParseResult<SceneValue> {
129 self.parse_value_at_depth(0)
130 }
131
132 fn parse_value_at_depth(&mut self, depth: usize) -> ParseResult<SceneValue> {
133 if depth > MAX_SCENE_VALUE_DEPTH {
134 return Err(format!(
135 "Scene value nesting exceeds limit of {MAX_SCENE_VALUE_DEPTH}"
136 ));
137 }
138
139 match &self.current {
140 Token::Number(n) => {
141 let v = *n;
142 self.advance();
143 Ok(SceneValue::F32(v))
144 }
145
146 Token::String(s) => {
147 let v = s.clone();
148 self.advance();
149 Ok(SceneValue::Str(Cow::Owned(v)))
150 }
151
152 Token::Dollar => {
153 self.advance();
154 let name = self.expect_ident()?;
155 let value = self
156 .vars
157 .get(name)
158 .ok_or_else(|| format!("Unknown variable ${name}"))?;
159 ensure_value_fits_depth(value, depth)?;
160 Ok(value.clone())
161 }
162
163 Token::Percent => {
164 self.advance();
165 let marker = self.expect_ident()?;
166 self.expect(Token::Colon)?;
167 if marker != "loc" {
168 return Err(format!("Unknown percent marker %{marker}:"));
169 }
170 let key = match std::mem::replace(&mut self.current, Token::Eof) {
171 Token::String(s) => {
172 self.advance();
173 s
174 }
175 Token::Ident(s) => {
176 self.advance();
177 s.to_string()
178 }
179 other => {
180 return Err(format!("Expected locale key after %loc:, got {:?}", other));

Callers 4

parse_scene_innerMethod · 0.80
parse_value_literalMethod · 0.80

Calls 9

cloneMethod · 0.80
expect_node_ref_keyMethod · 0.80
advanceMethod · 0.45
expect_identMethod · 0.45
getMethod · 0.45
expectMethod · 0.45
lenMethod · 0.45
pushMethod · 0.45

Tested by

no test coverage detected