Целта на задачата е да напишем едно малко тематично допълнение към домашно 1. В идеалния вариант, не бихме очаквали само идентификатори с подчертавки, а бихме засякли какъв стил идентификатор се подава. Това искаме да направите.
Възможните варианти са:
CodeStyle::Underscored: малки символи, разделени с (колкото и да е, но поне една) подчертавки. Примерно: some_var, some___var_
CodeStyle::ScreamingSnakecased: големи символи, разделени с (колкото и да е, може и нула) подчертавки. Например: SOME_VAR, SOME___VAR_
CodeStyle::Camelcased: само малки и големи символи (никакви подчертавки): SomeVar, someVar
CodeStyle::Mixed: комбинация от малки и големи символи, и подчертавки: Some_Var, someVar_
CodeStyle::Unknown: само малки символи -- няма как да преценим дали е underscored или camelcased, ако няма индикатор за смяна на "думата". Пример: "somevar", "патладжан".
Забележете, че SOMEVAR е ScreamingSnakecased, а не Unknown, защото приемаме, че няма как да е camelcased, така че няма двусмислие.
"Символ" се дефинира както при първото домашно, като вкарваме error handling:
Първия символ трябва да е задължително буква. Ако не е, връщаме CodeStyleError::InvalidFirstChar, конструиран със символа.
Всеки следващ символ може да е буква, цифра, или _. Ако не е, връщаме CodeStyleError::InvalidChar, конструиран със символа.
Дефинираме "буква" като: това, за което char::is_alphabetic върне истина.
Дефинираме "цифра" като: това, за което char::is_numeric върне истина.
В случай, че подадем празен низ (след нормализация на входа), очакваме грешка CodeStyleError::EmptyString.
Нормализация на входа
Ако ви подадем низ с интервали, табове, или нови редове преди или след идентификатора, изчистете ги. Тоест, тези две са еквивалентни:
let code_style = CodeStyle::from_str(" some_var ");
let code_style = CodeStyle::from_str("some_var");
Внимавайте за кирилица и друг unicode! Напишете си тестове, които упражняват по-особени символи! Четете документацията на char, str, и каквито други линкове има в тях.
Compiling solution v0.1.0 (file:///tmp/d20181108-22631-wo7ba4/solution)
Finished dev [unoptimized + debuginfo] target(s) in 2.73s
Running target/debug/deps/solution-7017bcc2d31a1134
running 2 tests
test is_invalid ... ok
test is_valid ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Running target/debug/deps/solution_test-773f144f21eb3f81
running 2 tests
test solution_test::test_invalid ... ok
test solution_test::test_valid ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Doc-tests solution
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out