목차
풀이
impl TryFrom<String> for Status {
type Error = ();
fn try_from(value: String) -> Result<Self, Self::Error> {
match value.to_lowercase().as_str() {
"todo" => Ok(Status::ToDo),
"done" => Ok(Status::Done),
"inprogress" => Ok(Status::InProgress),
_ => Err(()),
}
}
}
impl TryFrom<&str> for Status {
type Error = ();
fn try_from(value: &str) -> Result<Self, Self::Error> {
match value.to_lowercase().as_str() {
"todo" => Ok(Status::ToDo),
"done" => Ok(Status::Done),
"inprogress" => Ok(Status::InProgress),
_ => Err(()),
}
}
}
TryFrom
과 TryInto
는 Result
를 반환하는 트레이트다.
테스트에서는 Status::try_from("todo")
으로 변환한 정보가 Status::ToDo
와 일치하는지 확인한다.
이때 입력이 어떻게 되든지 간에 대소문자 구별 없이(case insensitive) 비교 가능하도록 해야 한다.
String
과 &str
각각에 TryFrom
을 구현해야 하므로, 같은 형식을 갖춘 TryFrom<String>
, TryFrom<&str>
을 구현한다.
match문으로 돌릴 대상은 입력으로 들어온 value
를 to_lowercase()
로 소문자 변환한 값이다. 이는 case insensitive를 위함이다.
Status
의 모든 경우에 대응시키기 위해 "todo"
, "done"
, "inprogress"
각각에 대하여 Ok(Status::Todo)
, Ok(Status::Done)
, Ok(Status::InProgress)
로 변환한다. 나머지의 경우(_
) Err
을 반환한다.