Решение на Code Identifier от Александър Дойков

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

Към профила на Александър Дойков

Резултати

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

Код

/// Необходимо е CodeIdentifier да имплементира Debug, за да можем да го
/// използваме в тестови assertion-и.
///
#[derive(Debug)]
pub struct CodeIdentifier {
// Каквито полета ви трябват
variable: String,
}
impl CodeIdentifier {
/// Функцията ще върне Option<CodeIdentifier>, което ще бъде:
/// - None: ако входа не е валиден идентификатор. Вижте горе за това
/// какво значи "валиден идентификатор".
/// - Some(code_identifier): Ако входа е валиден.
///
pub fn new(identifier: &str) -> Option<Self> {
let identifier_trimmed = identifier.trim();
println!("{:?}", identifier_trimmed);
let mut identifier_iter = identifier_trimmed.chars();
let first_symbol = identifier_iter.next();
if !char::is_alphabetic(first_symbol.unwrap()) {
return None;
}
while let Some(c) = identifier_iter.next() {
if !char::is_alphabetic(c) && !char::is_numeric(c) && c != '_' {

Извикването на функции по този начин е totally fine, но метод синтаксиса, c.is_alphabetic() се използва по-често. Ако не друго, има и удобното качество, че работи с references и с разни други smart pointer-и (за които ще говорим по-натам).

return None;
}
}
return Some(Self {
variable: String::from(identifier_trimmed),
});
}
/// Конвертира идентификатора до camelcased вариант.
/// - Примерен вход: "some_var"
/// - Примерен изход: "someVar"
///
pub fn camelcase(&self) -> String {
let mut chars: Vec<char> = self.variable.chars().collect();
let mut result = String::new();
let mut flag = false;
for i in 0..chars.len() {
if chars[i] == '_' {
chars[i + 1] = chars[i + 1].to_ascii_uppercase();
result.push(chars[i + 1]);
flag = true;
} else {
if flag == false {
result.push(chars[i].to_ascii_lowercase());
} else {
flag = false;
}
}
}
result
}
/// Конвертира идентификатора до titlecased вариант (camelcased с първа заглавна буква).
/// - Примерен вход: "some_var"
/// - Примерен изход: "SomeVar"
///
pub fn titlecase(&self) -> String {
let camelcase_string = self.camelcase();
let mut v: Vec<char> = camelcase_string.chars().collect();
v[0] = v[0].to_uppercase().nth(0).unwrap();
let s2: String = v.into_iter().collect();
s2
}
/// Конвертира идентификатора до kebabcased вариант.
/// - Примерен вход: "some_var"
/// - Примерен изход: "some-var"
///
pub fn kebabcase(&self) -> String {
self.variable.replace('_', "-")
}
/// Конвертира идентификатора до underscored вариант.
/// - Примерен вход: "some_var"
/// - Примерен изход: "some_var"
///
/// - Примерен вход: "Some_Var"
/// - Примерен изход: "some_var"
///
pub fn underscore(&self) -> String {
self.variable.to_lowercase()
}
/// Конвертира идентификатора до screaming-snakecased вариант.
/// - Примерен вход: "some_var"
/// - Примерен изход: "SOME_VAR"
///
pub fn screaming_snakecase(&self) -> String {
self.variable.to_uppercase()
}
}

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

Compiling solution v0.1.0 (/tmp/d20190123-22631-1mgvlq/solution)
    Finished dev [unoptimized + debuginfo] target(s) in 5.10s
     Running target/debug/deps/solution-2e785d603b538f71

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

     Running target/debug/deps/solution_test-29808948fb50ed3a

running 15 tests
test solution_test::test_both_static_and_dynamic_strings ... ok
test solution_test::test_camelcase_basic ... ok
test solution_test::test_cyrillic1 ... FAILED
test solution_test::test_digits1 ... ok
test solution_test::test_digits2 ... ok
test solution_test::test_digits3 ... ok
test solution_test::test_kebabcase_basic ... ok
test solution_test::test_multibyte_uppercase ... FAILED
test solution_test::test_normalize_case1 ... ok
test solution_test::test_normalize_case2 ... ok
test solution_test::test_screaming_snakecase_basic ... ok
test solution_test::test_titlecase_basic ... ok
test solution_test::test_underscore_basic ... ok
test solution_test::test_validity ... ok
test solution_test::test_whitespace ... ok

failures:

---- solution_test::test_cyrillic1 stdout ----
"що_стана"
thread 'solution_test::test_cyrillic1' panicked at 'assertion failed: `(left == right)`
  left: `"щостана"`,
 right: `"щоСтана"`', tests/solution_test.rs:96:5
note: Run with `RUST_BACKTRACE=1` for a backtrace.

---- solution_test::test_multibyte_uppercase stdout ----
"some_ßpecial_case"
thread 'solution_test::test_multibyte_uppercase' panicked at 'assertion failed: `(left == right)`
  left: `"someßpecialCase"`,
 right: `"someSSpecialCase"`', tests/solution_test.rs:104:5


failures:
    solution_test::test_cyrillic1
    solution_test::test_multibyte_uppercase

test result: FAILED. 13 passed; 2 failed; 0 ignored; 0 measured; 0 filtered out

error: test failed, to rerun pass '--test solution_test'

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

Александър качи първо решение на 22.10.2018 22:40 (преди почти 7 години)