Решение на Code Identifier от Димитър Михайлов

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

Към профила на Димитър Михайлов

Резултати

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

Код

#![allow(non_camel_case_types)]
pub enum TransformType {
camelCase,
under_score,
kebabcase,
SCREAMING_SNAKECASE,
TitleCase,
}

Хах, забавен начин да комуникираш отделните типове, директно в кода. Хитро е, макар че извън домашни, може да е по-скоро объркващо за хората, заради неконсистентността на идентификаторите, отколкото полезно. Особено предвид, че kebab-case не е валиден идентификатор в Rust :D.

#[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()})
}
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 (i, c) in string.chars().enumerate() {
match tranform_type {
TransformType::kebabcase => {
if c == '_' {
result.push('-')
}
else {
result.push(c.to_ascii_lowercase())
}
}
TransformType::camelCase => {
if c == '_'{
next_toupper = true;
}
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(c.to_ascii_uppercase());
}
TransformType::under_score => {
result.push(c.to_ascii_lowercase())
}
TransformType::TitleCase => {
if i == 0 {
result.push(c.to_ascii_uppercase())
}
else if c == '_'{
next_toupper = true;
}
else if next_toupper {
result.push(c.to_ascii_uppercase());
next_toupper = false;
}
else {
result.push(c.to_ascii_lowercase())
}
}
}
}
return result;
}
}

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

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 коментара)

Димитър качи първо решение на 20.10.2018 19:44 (преди над 4 години)

Димитър качи решение на 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,
}
}