(src: &str, bump: &Bump)
| 15 | use std::collections::HashSet; |
| 16 | |
| 17 | fn extract_colors(src: &str, bump: &Bump) -> Result<Vec<(Color, Span)>, Vec<Diagnostic>> { |
| 18 | let mut visitor = ColorExtractor::new(); |
| 19 | |
| 20 | // Try parsing as a bare list of colors first. |
| 21 | let lexer = Lexer::new(&CssAtomSet::ATOMS, src); |
| 22 | let mut parser = Parser::new(bump, src, lexer); |
| 23 | let result = parser.parse_entirely::<bumpalo::collections::Vec<ASTColor>>(); |
| 24 | if let Some(output) = result.output.filter(|_| result.errors.is_empty()) { |
| 25 | let _ = output.accept(&mut visitor); |
| 26 | return Ok(visitor.colors); |
| 27 | } |
| 28 | |
| 29 | // Fall back to full stylesheet parse. |
| 30 | let lexer = Lexer::new(&CssAtomSet::ATOMS, src); |
| 31 | let mut parser = Parser::new(bump, src, lexer); |
| 32 | let result = parser.parse_entirely::<StyleSheet>(); |
| 33 | if let Some(stylesheet) = result.output { |
| 34 | let _ = stylesheet.accept(&mut visitor); |
| 35 | Ok(visitor.colors) |
| 36 | } else { |
| 37 | Err(result.errors.to_vec()) |
| 38 | } |
| 39 | } |
| 40 | |
| 41 | struct ColorExtractor { |
| 42 | colors: Vec<(Color, Span)>, |
no test coverage detected