Решение на Code Identifier от Милен Дончев

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

Към профила на Милен Дончев

Резултати

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

Код

/// Необходимо е CodeIdentifier да имплементира Debug, за да можем да го
/// използваме в тестови assertion-и.
///
#[derive(Debug)]
pub struct CodeIdentifier {
// Каквито полета ви трябват
data: Vec<String>
}
impl CodeIdentifier {
/// Функцията ще върне Option<CodeIdentifier>, което ще бъде:
/// - None: ако входа не е валиден идентификатор. Вижте горе за това
/// какво значи "валиден идентификатор".
/// - Some(code_identifier): Ако входа е валиден.
///
pub fn new(identifier: &str) -> Option<Self> {
let parsed = Self::parse_string(identifier.to_string());
if parsed.len() == 0 {
return None;
}
Some(CodeIdentifier { data: parsed })
}
/// Конвертира идентификатора до camelcased вариант.
/// - Примерен вход: "some_var"
/// - Примерен изход: "someVar"
///
pub fn camelcase(&self) -> String {
let res = Self::titlecase(&self);
let first = res.chars().next().unwrap().to_string().to_lowercase();
let last = res[1..].to_string();
[first, last].join("")
}
/// Конвертира идентификатора до titlecased вариант (camelcased с първа заглавна буква).
/// - Примерен вход: "some_var"
/// - Примерен изход: "SomeVar"
///
pub fn titlecase(&self) -> String {
let v = &self.data;
let result: Vec<String> = v.iter()
.map(|x|
// first to upper and the rest
[x.chars().next().unwrap().to_string().to_uppercase(), x[1..].to_string()]
.join("")
)
.collect();
result.join("")
}
/// Конвертира идентификатора до kebabcased вариант.
/// - Примерен вход: "some_var"
/// - Примерен изход: "some-var"
///
pub fn kebabcase(&self) -> String {
let v = &self.data;
v.join("-")
}
/// Конвертира идентификатора до underscored вариант.
/// - Примерен вход: "some_var"
/// - Примерен изход: "some_var"
///
/// - Примерен вход: "Some_Var"
/// - Примерен изход: "some_var"
///
pub fn underscore(&self) -> String {
let v = &self.data;
v.join("_")
}
/// Конвертира идентификатора до screaming-snakecased вариант.
/// - Примерен вход: "some_var"
/// - Примерен изход: "SOME_VAR"
///
pub fn screaming_snakecase(&self) -> String {
let v = &self.data;
let result: Vec<String> = v.iter()
.map(|x| x.to_uppercase())
.collect();
result.join("_")
}
fn parse_string(s: String) -> Vec<String> {
let trimed = s.trim();
let first_char = trimed.chars().next().unwrap();
if !char::is_alphabetic(first_char) {
return vec![];
}
let non_empty_ref = &trimed;
let result: Vec<&str> = non_empty_ref.split_terminator('_').collect();
let filtered = result.iter()
.map(|&x| x.to_string().to_lowercase())
.filter(|x| x != "")
.collect::<Vec<String>>();
let allowed: Vec<String> = result.iter()
.map(|&x| x.to_string().to_lowercase())
.filter(|x| x != "" && Self::is_valid(x.to_string()))
.collect::<Vec<String>>();
if filtered.len() != allowed.len() {
return vec![];
}
allowed
}
fn is_valid(identifier: String) -> bool {
let char_vec: Vec<char> = identifier.chars().collect();
let allowed_vec: Vec<bool> = char_vec.iter()
.map(|&x| char::is_numeric(x) || char::is_alphabetic(x))
.collect();
!allowed_vec.contains(&false)
}
}

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

Compiling solution v0.1.0 (/tmp/d20190123-22631-10oz0p0/solution)
    Finished dev [unoptimized + debuginfo] target(s) in 5.48s
     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 ... FAILED
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 'byte index 1 is not a char boundary; it is inside 'щ' (bytes 0..2) of `що`', libcore/str/mod.rs:2111:5
note: Run with `RUST_BACKTRACE=1` for a backtrace.

---- solution_test::test_digits3 stdout ----
thread 'solution_test::test_digits3' panicked at 'byte index 1 is not a char boundary; it is inside '٣' (bytes 0..2) of `٣`', libcore/str/mod.rs:2111:5

---- solution_test::test_multibyte_uppercase stdout ----
thread 'solution_test::test_multibyte_uppercase' panicked at 'byte index 1 is not a char boundary; it is inside 'ß' (bytes 0..2) of `ßpecial`', libcore/str/mod.rs:2111:5


failures:
    solution_test::test_cyrillic1
    solution_test::test_digits3
    solution_test::test_multibyte_uppercase

test result: FAILED. 12 passed; 3 failed; 0 ignored; 0 measured; 0 filtered out

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

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

Милен качи първо решение на 25.10.2018 16:29 (преди почти 7 години)