Решение на Code Identifier от Димитър Михайлов
Към профила на Димитър Михайлов
Резултати
- 17 точки от тестове
- 0 бонус точки
- 17 точки общо
- 13 успешни тест(а)
- 2 неуспешни тест(а)
Код
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20190123-22631-kndhxt/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 ... 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:95:5 note: Run with `RUST_BACKTRACE=1` for a backtrace. ---- solution_test::test_multibyte_uppercase stdout ---- 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'
История (2 версии и 5 коментара)
Димитър качи решение на 22.10.2018 19:27 (преди над 4 години)
#![allow(non_camel_case_types)]
pub enum TransformType {
camelCase,
under_score,
kebabcase,
SCREAMING_SNAKECASE,
TitleCase,
}
#[derive(Debug)]
pub struct CodeIdentifier {
value: String
}
impl CodeIdentifier {
pub fn new(identifier: &str) -> Option<Self> {
if CodeIdentifier::is_correct(identifier.trim()) {
- return Some(CodeIdentifier { value:identifier.trim().to_string()})
+ return Some(CodeIdentifier { value:identifier.trim().to_string()})
}
else {
None
}
}
+
pub fn camelcase(&self) -> String {
return CodeIdentifier::transform(&self.value, TransformType::camelCase)
}
+
pub fn titlecase(&self) -> String {
return CodeIdentifier::transform(&self.value, TransformType::TitleCase);
}
+
pub fn kebabcase(&self) -> String {
return CodeIdentifier::transform(&self.value, TransformType::kebabcase)
}
pub fn underscore(&self) -> String {
return CodeIdentifier::transform(&self.value, TransformType::under_score)
}
pub fn screaming_snakecase(&self) -> String {
return CodeIdentifier::transform(&self.value, TransformType::SCREAMING_SNAKECASE);
}
pub fn is_correct(identifier: &str) -> bool{
for c in identifier.chars().enumerate() {
match c {
(0,x) if !x.is_alphabetic() => return false,
(_,x) if !((x.is_alphabetic() || x.is_numeric()) || x == '_') => return false,
(_,_) => (),
}
}
return true;
}
pub fn transform(string: &str, tranform_type: TransformType) -> String {
let mut result = String::from("");
let mut next_toupper = false;
- for c in string.chars().enumerate() {
- let _char = tuple_get_char(c);
+ for (i, c) in string.chars().enumerate() {
match tranform_type {
TransformType::kebabcase => {
- if _char == '_' {
+ if c == '_' {
result.push('-')
}
else {
- result.push(_char.to_ascii_lowercase())
+ result.push(c.to_ascii_lowercase())
}
}
+
TransformType::camelCase => {
- if _char == '_'{
+ if c == '_'{
next_toupper = true;
- }else {
- if next_toupper {
- result.push(_char.to_ascii_uppercase());
- next_toupper = false;
}
- else {
- result.push(_char.to_ascii_lowercase())
+ else if next_toupper {
+ result.push(c.to_ascii_uppercase());
+ next_toupper = false;
}
+ else {
+ result.push(c.to_ascii_lowercase())
+ }
}
- }
+
TransformType::SCREAMING_SNAKECASE => {
- result.push(_char.to_ascii_uppercase());
- },
+ result.push(c.to_ascii_uppercase());
+ }
+
TransformType::under_score => {
- result.push(_char.to_ascii_lowercase())
- },
+ result.push(c.to_ascii_lowercase())
+ }
+
TransformType::TitleCase => {
- if tuple_get_index(c) == 0 {
- result.push(_char.to_ascii_uppercase())
+ if i == 0 {
+ result.push(c.to_ascii_uppercase())
}
- else{
- if _char == '_'{
+ else if c == '_'{
next_toupper = true;
}
- else {
- if next_toupper {
- result.push(_char.to_ascii_uppercase());
- next_toupper = false;
- }
- else {
- result.push(_char.to_ascii_lowercase())
- }
+ else if next_toupper {
+ result.push(c.to_ascii_uppercase());
+ next_toupper = false;
}
+ else {
+ result.push(c.to_ascii_lowercase())
}
}
}
}
return result;
- }
-}
-
-pub fn tuple_get_char(tuple: (usize, char)) -> char {
- match tuple {
- (_, c) => return c,
- }
-}
-
-pub fn tuple_get_index(tuple: (usize, char)) -> usize {
- match tuple {
- (i, _) => return i,
}
}
Благодаря за отзивите, пооправих малко кода, надявам се да е ок сега, ако не е ще го дооправяме :D
Хах, забавен начин да комуникираш отделните типове, директно в кода. Хитро е, макар че извън домашни, може да е по-скоро объркващо за хората, заради неконсистентността на идентификаторите, отколкото полезно. Особено предвид, че
kebab-case
не е валиден идентификатор в Rust :D.Тук можеш да смекчиш водопада от
}}}}}}
, ако сплескаш малко if-клаузите сelse if
: