ui_cli/shared/
markdown_utils.rs1pub fn extract_rust_code_from_markdown(markdown: &str) -> Option<String> {
2 let lines: Vec<&str> = markdown.lines().collect();
3 let mut in_rust_block = false;
4 let mut rust_code_lines = Vec::new();
5
6 for line in lines {
7 if line.trim() == "```rust" {
8 in_rust_block = true;
9 continue;
10 }
11
12 if in_rust_block && line.trim() == "```" {
13 break;
14 }
15
16 if in_rust_block {
17 rust_code_lines.push(line);
18 }
19 }
20
21 if rust_code_lines.is_empty() { None } else { Some(rust_code_lines.join("\n")) }
22}
23
24#[cfg(test)]
29mod tests {
30 use super::*;
31
32 #[test]
33 fn returns_none_when_no_rust_block() {
34 assert_eq!(extract_rust_code_from_markdown("just prose\nno code"), None);
35 }
36
37 #[test]
38 fn returns_none_for_empty_input() {
39 assert_eq!(extract_rust_code_from_markdown(""), None);
40 }
41
42 #[test]
43 fn returns_none_for_empty_rust_block() {
44 assert_eq!(extract_rust_code_from_markdown("```rust\n```"), None);
45 }
46
47 #[test]
48 fn extracts_code_from_rust_block() {
49 let md = "# Title\n\n```rust\nfn main() {}\n```\n\nsome prose";
50 assert_eq!(extract_rust_code_from_markdown(md), Some("fn main() {}".to_string()));
51 }
52
53 #[test]
54 fn returns_only_first_rust_block() {
55 let md = "```rust\nfn first() {}\n```\n```rust\nfn second() {}\n```";
56 assert_eq!(extract_rust_code_from_markdown(md), Some("fn first() {}".to_string()));
57 }
58
59 #[test]
60 fn ignores_non_rust_fenced_blocks() {
61 assert_eq!(extract_rust_code_from_markdown("```toml\nkey = \"value\"\n```"), None);
62 }
63
64 #[test]
65 fn preserves_multiline_code() {
66 let md = "```rust\nuse leptos::*;\n\nfn foo() {}\n```";
67 let result = extract_rust_code_from_markdown(md).unwrap();
68 assert!(result.contains("use leptos::*;"));
69 assert!(result.contains("fn foo() {}"));
70 }
71}