(&mut self)
| 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)); |
no test coverage detected