Решение на Форматиране на импорти от Пламен Стойнев
Резултати
- 13 точки от тестове
- 0 бонус точки
- 13 точки общо
- 13 успешни тест(а)
- 7 неуспешни тест(а)
Код
use std::collections::{BTreeMap, HashSet};
use std::fmt::Write;
pub struct Import<'a>(pub &'a [&'a str]);
pub enum Order {
Original,
Sorted,
}
#[derive(Default, Debug)]
struct NestedNode {
children: BTreeMap<String, NestedNode>,
}
pub fn format_flat(imports: &[Import], order: Order) -> Vec<String> {
let mut unique_imports: HashSet<&[&str]> = HashSet::new();
let mut result: Vec<&[&str]> = Vec::new();
for import in imports {
if unique_imports.insert(import.0) {
result.push(import.0);
}
}
if let Order::Sorted = order {
result.sort();
}
result
.iter()
.map(|path| path.join("::"))
.map(String::from)
.collect()
}
pub fn format_nested(imports: &[Import], order: Order) -> Vec<String> {
let mut tree: BTreeMap<String, NestedNode> = BTreeMap::new();
for import in imports {
let mut current = &mut tree;
for part in import.0 {
current = &mut current
.entry(part.to_string())
.or_insert_with(NestedNode::default)
.children;
}
}
let mut result = Vec::new();
for (root, node) in &tree {
let mut output = String::new();
writeln!(output, "{}::{{", root).unwrap();
write_node(&mut output, node, 1, &order);
writeln!(output, "}}").unwrap();
result.push(output);
}
result
}
fn write_node(output: &mut String, node: &NestedNode, indent: usize, order: &Order) {
let mut children: Vec<_> = node.children.iter().collect();
if let Order::Sorted = order {
children.sort_by_key(|(key, _)| *key);
}
for (key, child) in children {
if child.children.is_empty() {
writeln!(output, "{:indent$}{},", "", key, indent = indent * 4).unwrap();
} else {
writeln!(output, "{:indent$}{}::{{", "", key, indent = indent * 4).unwrap();
write_node(output, child, indent + 1, order);
writeln!(output, "{:indent$}}},", "", indent = indent * 4).unwrap();
}
}
}
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20241203-1739405-1evzfze/solution) Finished test [unoptimized + debuginfo] target(s) in 1.50s Running tests/solution_test.rs (target/debug/deps/solution_test-1428e1090729d165) running 20 tests test solution_test::test_flat_empty ... ok test solution_test::test_flat_multi_crate ... ok test solution_test::test_flat_original ... ok test solution_test::test_flat_original_duplicates ... ok test solution_test::test_flat_sorted ... ok test solution_test::test_flat_sorted_duplicates ... ok test solution_test::test_nested_deep ... ok test solution_test::test_nested_basic ... ok test solution_test::test_nested_empty ... ok test solution_test::test_nested_only_crate ... FAILED test solution_test::test_nested_original ... FAILED test solution_test::test_nested_original_2 ... FAILED test solution_test::test_nested_original_duplicates ... FAILED test solution_test::test_nested_original_multi_crate ... FAILED test solution_test::test_nested_original_self ... FAILED test solution_test::test_nested_sorted ... ok test solution_test::test_nested_sorted_2 ... ok test solution_test::test_nested_sorted_duplicates ... ok test solution_test::test_nested_sorted_multi_crate ... ok test solution_test::test_nested_sorted_self ... FAILED failures: ---- solution_test::test_nested_only_crate stdout ---- thread 'solution_test::test_nested_only_crate' panicked at 'assertion failed: `(left == right)` left: `["my_crate::{\n}\n"]`, right: `["my_crate\n"]`', tests/solution_test.rs:132:5 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ---- solution_test::test_nested_original stdout ---- thread 'solution_test::test_nested_original' panicked at 'assertion failed: `(left == right)` left: `["my_crate::{\n a,\n b::{\n B1,\n B2,\n },\n c,\n}\n"]`, right: `["my_crate::{\n c,\n b::{\n B2,\n B1,\n },\n a,\n}\n"]`', tests/solution_test.rs:173:5 ---- solution_test::test_nested_original_2 stdout ---- thread 'solution_test::test_nested_original_2' panicked at 'assertion failed: `(left == right)` left: `["my_crate::{\n a::{\n A1,\n inner::{\n I1,\n },\n },\n b::{\n B1,\n B2,\n },\n c,\n}\n"]`, right: `["my_crate::{\n c,\n b::{\n B2,\n B1,\n },\n a::{\n inner::{\n I1,\n },\n A1,\n },\n}\n"]`', tests/solution_test.rs:198:5 ---- solution_test::test_nested_original_duplicates stdout ---- thread 'solution_test::test_nested_original_duplicates' panicked at 'assertion failed: `(left == right)` left: `["my_crate::{\n a,\n b::{\n B1,\n B2,\n },\n c,\n}\n"]`, right: `["my_crate::{\n c,\n b::{\n B2,\n B1,\n },\n a,\n}\n"]`', tests/solution_test.rs:283:5 ---- solution_test::test_nested_original_multi_crate stdout ---- thread 'solution_test::test_nested_original_multi_crate' panicked at 'assertion failed: `(left == right)` left: `["crate::{\n a,\n b,\n}\n", "std::{\n string::{\n String,\n },\n}\n"]`, right: `["crate::{\n b,\n a,\n}\n", "std::{\n string::{\n String,\n },\n}\n"]`', tests/solution_test.rs:385:5 ---- solution_test::test_nested_original_self stdout ---- thread 'solution_test::test_nested_original_self' panicked at 'assertion failed: `(left == right)` left: `["my_crate::{\n a,\n b::{\n B1,\n B2,\n },\n c,\n}\n"]`, right: `["my_crate::{\n c,\n b::{\n self,\n B2,\n B1,\n },\n a,\n}\n"]`', tests/solution_test.rs:334:5 ---- solution_test::test_nested_sorted_self stdout ---- thread 'solution_test::test_nested_sorted_self' panicked at 'assertion failed: `(left == right)` left: `["my_crate::{\n a,\n b::{\n B1,\n B2,\n },\n c,\n}\n"]`, right: `["my_crate::{\n a,\n b::{\n self,\n B1,\n B2,\n },\n c,\n}\n"]`', tests/solution_test.rs:360:5 failures: solution_test::test_nested_only_crate solution_test::test_nested_original solution_test::test_nested_original_2 solution_test::test_nested_original_duplicates solution_test::test_nested_original_multi_crate solution_test::test_nested_original_self solution_test::test_nested_sorted_self test result: FAILED. 13 passed; 7 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--test solution_test`