MCPcopy Create free account
hub / github.com/PRQL/prql / replace_examples

Function replace_examples

web/book/src/lib.rs:66–137  ·  view source on GitHub ↗
(text: &str)

Source from the content-addressed store, hash-verified

64}
65
66fn 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 })?

Callers 1

runMethod · 0.85

Calls 11

allFunction · 0.85
code_block_lang_tagsFunction · 0.85
table_of_prql_onlyFunction · 0.85
table_of_errorFunction · 0.85
table_of_comparisonFunction · 0.85
nextMethod · 0.80
pushMethod · 0.80
no_signatureMethod · 0.80
as_strMethod · 0.80
into_iterMethod · 0.80
compileFunction · 0.50

Tested by

no test coverage detected