aboutsummaryrefslogtreecommitdiff
path: root/crates/tools/src/lib.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-08-10 20:33:29 +0100
committerAleksey Kladov <[email protected]>2018-08-10 20:33:29 +0100
commit7c67612b8a894187fa3b64725531a5459f9211bf (patch)
tree9e2a536efa0c880d921fd8d4d74423afc9451fd4 /crates/tools/src/lib.rs
parent26262aaf05983c5b7f41cc438e287523268fe1eb (diff)
organizize
Diffstat (limited to 'crates/tools/src/lib.rs')
-rw-r--r--crates/tools/src/lib.rs43
1 files changed, 43 insertions, 0 deletions
diff --git a/crates/tools/src/lib.rs b/crates/tools/src/lib.rs
new file mode 100644
index 000000000..97a56a31f
--- /dev/null
+++ b/crates/tools/src/lib.rs
@@ -0,0 +1,43 @@
1extern crate itertools;
2
3use itertools::Itertools;
4
5#[derive(Debug)]
6pub struct Test {
7 pub name: String,
8 pub text: String,
9}
10
11pub fn collect_tests(s: &str) -> Vec<(usize, Test)> {
12 let mut res = vec![];
13 let prefix = "// ";
14 let comment_blocks = s
15 .lines()
16 .map(str::trim_left)
17 .enumerate()
18 .group_by(|(_idx, line)| line.starts_with(prefix));
19
20 'outer: for (is_comment, block) in comment_blocks.into_iter() {
21 if !is_comment {
22 continue;
23 }
24 let mut block = block.map(|(idx, line)| (idx, &line[prefix.len()..]));
25
26 let (start_line, name) = loop {
27 match block.next() {
28 Some((idx, line)) if line.starts_with("test ") => {
29 break (idx, line["test ".len()..].to_string())
30 }
31 Some(_) => (),
32 None => continue 'outer,
33 }
34 };
35 let text: String = itertools::join(
36 block.map(|(_, line)| line).chain(::std::iter::once("")),
37 "\n",
38 );
39 assert!(!text.trim().is_empty() && text.ends_with("\n"));
40 res.push((start_line, Test { name, text }))
41 }
42 res
43}