(text: &str)
| 64 | } |
| 65 | |
| 66 | fn replace_examples(text: &str) -> Result<String> { |
| 67 | let mut parser = Parser::new_ext(text, Options::all()); |
| 68 | let mut cmark_acc = vec![]; |
| 69 | |
| 70 | while let Some(event) = parser.next() { |
| 71 | // If it's there no tag, or it's not PRQL, or it has `no-eval`, just |
| 72 | // push it and continue. |
| 73 | let Some(lang_tags) = code_block_lang_tags(&event) else { |
| 74 | cmark_acc.push(event.clone()); |
| 75 | continue; |
| 76 | }; |
| 77 | if !lang_tags.contains(&LangTag::Prql) { |
| 78 | cmark_acc.push(event.clone()); |
| 79 | continue; |
| 80 | } |
| 81 | |
| 82 | for tag in &lang_tags { |
| 83 | if matches!(tag, LangTag::Other(_)) { |
| 84 | bail!("Unknown code block language: {}", tag) |
| 85 | } |
| 86 | } |
| 87 | |
| 88 | if lang_tags.contains(&LangTag::NoEval) { |
| 89 | cmark_acc.push(event.clone()); |
| 90 | continue; |
| 91 | } |
| 92 | |
| 93 | let Some(Event::Text(text)) = parser.next() else { |
| 94 | bail!("Expected text within code block") |
| 95 | }; |
| 96 | |
| 97 | let prql = text.to_string(); |
| 98 | let result = compile(&prql, &prqlc::Options::default().no_signature()); |
| 99 | |
| 100 | if lang_tags.contains(&LangTag::NoTest) { |
| 101 | cmark_acc.push(Event::Html(table_of_prql_only(&prql).into())); |
| 102 | } else if lang_tags.contains(&LangTag::Error) { |
| 103 | // This logic is implemented again, and better, in |
| 104 | // [../tests/snapshot.rs], so would be fine to just skip here. |
| 105 | let error_message = match result { |
| 106 | Ok(sql) => { |
| 107 | anyhow::bail!( |
| 108 | "Query was labeled to raise an error, but succeeded.\n{prql}\n\n{sql}\n\n" |
| 109 | ) |
| 110 | } |
| 111 | Err(e) => ansi_to_html::convert(e.to_string().as_str()).unwrap(), |
| 112 | }; |
| 113 | |
| 114 | cmark_acc.push(Event::Html(table_of_error(&prql, &error_message).into())) |
| 115 | } else { |
| 116 | // Show the comparison |
| 117 | cmark_acc.push(Event::Html( |
| 118 | table_of_comparison( |
| 119 | &prql, |
| 120 | result |
| 121 | .map_err(|e| { |
| 122 | anyhow::anyhow!("Query raised an error:\n\n {prql}\n\n{e}\n\n") |
| 123 | })? |
no test coverage detected