Решение на Code Identifier от Християн Захариев

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

Към профила на Християн Захариев

Резултати

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

Код

/// Необходимо е CodeIdentifier да имплементира Debug, за да можем да го
/// използваме в тестови assertion-и.
///
#[derive(Debug)]
pub struct CodeIdentifier {
name: String
}
impl CodeIdentifier {
/// Функцията ще върне Option<CodeIdentifier>, което ще бъде:
/// - None: ако входа не е валиден идентификатор. Вижте горе за това
/// какво значи "валиден идентификатор".
/// - Some(code_identifier): Ако входа е валиден.
///
pub fn new(identifier: &str) -> Option<Self> {
let str = CodeIdentifier::normalize(identifier);
return if CodeIdentifier::is_valid(str) {
Some(CodeIdentifier {
name: str.to_string()
})
} else { return None }
}
fn normalize(identifier: &str) -> &str {
identifier.trim()
}
fn is_valid(identifier: &str) -> bool { // Should refactor. I think I can do something like this: https://stackoverflow.com/a/34610817
let mut is_valid = true;
for (i, c) in identifier.chars().enumerate() {
if i == 0 && !char::is_alphabetic(c) {
is_valid = false
}
if i != 0 && (!char::is_alphabetic(c) && !char::is_numeric(c) && c != '_') {
is_valid = false
}
};
is_valid

Мм, внимавай със SO отговора, понеже там директно match-ват range от символи, и те са само ASCII.

Иначе, можеше и да не поддържаш булева променлива. return false щеше да ти свърши работа.

}
/// Конвертира идентификатора до camelcased вариант.
/// - Примерен вход: "some_var"
/// - Примерен изход: "someVar"
///
pub fn camelcase(&self) -> String { // WORST CODE EVER
let mut v: Vec<char> = self.name.to_lowercase().chars().collect();
for (i, c) in self.name.to_lowercase().chars().enumerate() {
if c == '_' { // Will crash when _ at the end
v[i+1] = v[i+1].to_uppercase().nth(0).unwrap();
}
};
v.retain(|&x| x != '_');
v.into_iter().collect()
}
/// Конвертира идентификатора до titlecased вариант (camelcased с първа заглавна буква).
/// - Примерен вход: "some_var"
/// - Примерен изход: "SomeVar"
///
pub fn titlecase(&self) -> String {
let name = CodeIdentifier::camelcase(self);
let mut v: Vec<char> = name.chars().collect();
v[0] = v[0].to_uppercase().nth(0).unwrap();
v.into_iter().collect()
}
/// Конвертира идентификатора до kebabcased вариант.
/// - Примерен вход: "some_var"
/// - Примерен изход: "some-var"
///
pub fn kebabcase(&self) -> String {
CodeIdentifier::underscore(self).replace("_", "-") // Should separate this in constants
}
/// Конвертира идентификатора до underscored вариант.
/// - Примерен вход: "some_var"
/// - Примерен изход: "some_var"
///
/// - Примерен вход: "Some_Var"
/// - Примерен изход: "some_var"
///
pub fn underscore(&self) -> String {
return self.name.to_lowercase()
}
/// Конвертира идентификатора до screaming-snakecased вариант.
/// - Примерен вход: "some_var"
/// - Примерен изход: "SOME_VAR"
///
pub fn screaming_snakecase(&self) -> String {
return self.name.to_uppercase()
}
}

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

Compiling solution v0.1.0 (/tmp/d20190123-22631-13sd03x/solution)
    Finished dev [unoptimized + debuginfo] target(s) in 4.81s
     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 ... ok
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_multibyte_uppercase stdout ----
thread 'solution_test::test_multibyte_uppercase' panicked at 'assertion failed: `(left == right)`
  left: `"someSpecialCase"`,
 right: `"someSSpecialCase"`', tests/solution_test.rs:104:5
note: Run with `RUST_BACKTRACE=1` for a backtrace.


failures:
    solution_test::test_multibyte_uppercase

test result: FAILED. 14 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out

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

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

Християн качи първо решение на 25.10.2018 16:34 (преди почти 7 години)