MCPcopy Create free account
hub / github.com/cel-rust/cel-rust / parse

Method parse

cel/src/parser/parser.rs:196–248  ·  view source on GitHub ↗
(mut self, source: &str)

Source from the content-addressed store, hash-verified

194 }
195
196 pub fn parse(mut self, source: &str) -> Result<IdedExpr, ParseErrors> {
197 let parse_errors = Rc::new(RefCell::new(Vec::<ParseError>::new()));
198 let stream = InputStream::new(source);
199 let mut lexer = gen::CELLexer::new(stream);
200 lexer.remove_error_listeners();
201 lexer.add_error_listener(Box::new(ParserErrorListener {
202 parse_errors: parse_errors.clone(),
203 }));
204
205 // todo! might want to avoid this cloning here...
206 self.helper.source_info.source = source.into();
207
208 let mut prsr = gen::CELParser::new(CommonTokenStream::new(lexer));
209 prsr.remove_error_listeners();
210 prsr.add_error_listener(Box::new(ParserErrorListener {
211 parse_errors: parse_errors.clone(),
212 }));
213 prsr.add_parse_listener(Box::new(RecursionListener {
214 max: self.max_recursion_depth,
215 depth: 0,
216 }));
217 let r = match prsr.start() {
218 Ok(t) => Ok(self.visit(t.deref())),
219 Err(e) => Err(ParseError {
220 source: Some(Box::new(e)),
221 pos: (0, 0),
222 msg: "UNKNOWN".to_string(),
223 expr_id: 0,
224 source_info: None,
225 }),
226 };
227
228 let info = self.helper.source_info;
229 let source_info = Arc::new(info);
230
231 let mut errors = parse_errors.take();
232 errors.extend(self.errors);
233 errors.sort_by_key(|a| a.pos);
234
235 if errors.is_empty() {
236 r.map_err(|e| ParseErrors { errors: vec![e] })
237 } else {
238 Err(ParseErrors {
239 errors: errors
240 .into_iter()
241 .map(|mut e: ParseError| {
242 e.source_info = Some(source_info.clone());
243 e
244 })
245 .collect(),
246 })
247 }
248 }
249
250 fn field_initializer_list(
251 &mut self,

Callers 5

criterion_benchmarkFunction · 0.80
map_macro_benchmarkFunction · 0.80
compileMethod · 0.80
test_optionalFunction · 0.80
testFunction · 0.80

Calls 5

cloneMethod · 0.80
startMethod · 0.80
visitMethod · 0.80
mapMethod · 0.80
derefMethod · 0.45

Tested by 2

test_optionalFunction · 0.64
testFunction · 0.64