Решение на Форматиране на импорти от Пламен Дарджиков

Обратно към всички решения

Към профила на Пламен Дарджиков

Резултати

  • 20 точки от тестове
  • 0 бонус точки
  • 20 точки общо
  • 20 успешни тест(а)
  • 0 неуспешни тест(а)

Код

use std::{cmp::Ordering, collections::HashSet};
pub struct Import<'a>(pub &'a [&'a str]);
pub enum Order {
Original,
Sorted,
}
struct TreeNode {
value: String,
children: Vec<TreeNode>,
}
impl TreeNode {
fn create_if_not_exist(&mut self, value: String) {
match self.children.iter().find(|tree_node| tree_node.value == value) {
None => {
self.children.push(TreeNode {value: value, children: Vec::new()})
},
_ => {}
}
}
fn get_by_value(&mut self, value: String) -> &mut TreeNode {
self.children.iter_mut().find(|tree_node| tree_node.value == value).unwrap()
}
fn get_string(&mut self, level: usize, value: &mut String, order: &Order) {
let indent = " ".repeat(level * 4);
value.push_str(&format!("{}{}", indent, self.value));
if self.children.is_empty() || (self.children.len() == 1 && self.children[0].value == "self") {
value.push_str(",\n");
} else {
value.push_str("::{\n");
match order {
Order::Sorted => self.children.sort_by(|node1, node2| {
if node1.value == "self" {
Ordering::Less
} else if node2.value == "self" {
Ordering::Greater
} else {
node1.value.cmp(&node2.value)
}
}),
Order::Original => self.children.sort_by(|node1, node2| {
if node1.value == "self" {
Ordering::Less
} else if node2.value == "self" {
Ordering::Greater
} else {
Ordering::Equal
}
}),
}
for child in &mut self.children {
child.get_string(level + 1, value, order);
}
value.push_str(&format!("{}}},\n", indent));
}
}
}
pub fn format_nested(imports: &[Import], order: Order) -> Vec<String> {
let mut trees: TreeNode = TreeNode {value: String::from("root"), children: Vec::new()};
for import in imports {
insert_into_tree(&mut trees, import.0, 0);
}
let mut results: Vec<String> = Vec::new();
match order {
Order::Sorted => trees.children.sort_by(|node1, node2| node1.value.cmp(&node2.value)),
_ => {}
}
for tree in &mut trees.children {
let mut result = String::new();
tree.get_string(0, &mut result, &order);
result.pop();
result.pop();
result.push('\n');
results.push(result);
}
results
}
fn insert_into_tree(treeNode: &mut TreeNode, parts: &[&str], level: usize) {
if level >= parts.len() {
return;
}
let value = parts[level].to_string();
treeNode.create_if_not_exist(value.clone());
let nextNode = treeNode.get_by_value(value);
if level == parts.len() - 1 {
nextNode.create_if_not_exist("self".to_string());
}
insert_into_tree(nextNode, parts, level + 1);
}
pub fn format_flat(imports: &[Import], order: Order) -> Vec<String> {
let mut unique_imports = HashSet::new();
let mut ordered_imports = Vec::new();
for import in imports {
let value_to_insert: String = import.0.join("::");
if unique_imports.insert(value_to_insert.clone()) {
ordered_imports.push(value_to_insert);
}
}
match order {
Order::Original => ordered_imports,
Order::Sorted => {
ordered_imports.sort_by(|s1, s2| {
s1.trim_matches(':').cmp(&s2.trim_matches(':'))
}
);
ordered_imports
},
}
}

Лог от изпълнението

Compiling solution v0.1.0 (/tmp/d20241203-1739405-19x19as/solution)
warning: variable `treeNode` should have a snake case name
  --> src/lib.rs:94:21
   |
94 | fn insert_into_tree(treeNode: &mut TreeNode, parts: &[&str], level: usize) {
   |                     ^^^^^^^^ help: convert the identifier to snake case: `tree_node`
   |
   = note: `#[warn(non_snake_case)]` on by default

warning: variable `nextNode` should have a snake case name
   --> src/lib.rs:101:9
    |
101 |     let nextNode = treeNode.get_by_value(value);
    |         ^^^^^^^^ help: convert the identifier to snake case: `next_node`

warning: `solution` (lib) generated 2 warnings
    Finished test [unoptimized + debuginfo] target(s) in 1.43s
     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_basic ... ok
test solution_test::test_nested_deep ... ok
test solution_test::test_nested_empty ... ok
test solution_test::test_nested_only_crate ... ok
test solution_test::test_nested_original ... ok
test solution_test::test_nested_original_2 ... ok
test solution_test::test_nested_original_duplicates ... ok
test solution_test::test_nested_original_multi_crate ... ok
test solution_test::test_nested_original_self ... ok
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 ... ok

test result: ok. 20 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

История (1 версия и 0 коментара)

Пламен качи първо решение на 02.12.2024 23:17 (преди 9 месеца)