100 Exercises To Learn Rust - 5.13 try from 풀기

목차

풀이

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(()),
        }
    }
}

 

TryFromTryIntoResult를 반환하는 트레이트다.

 

테스트에서는 Status::try_from("todo")으로 변환한 정보가 Status::ToDo와 일치하는지 확인한다.

이때 입력이 어떻게 되든지 간에 대소문자 구별 없이(case insensitive) 비교 가능하도록 해야 한다.

 

String&str 각각에 TryFrom을 구현해야 하므로, 같은 형식을 갖춘 TryFrom<String>, TryFrom<&str>을 구현한다.

 

match문으로 돌릴 대상은 입력으로 들어온 valueto_lowercase()로 소문자 변환한 값이다. 이는 case insensitive를 위함이다.

 

Status의 모든 경우에 대응시키기 위해 "todo", "done", "inprogress" 각각에 대하여 Ok(Status::Todo), Ok(Status::Done), Ok(Status::InProgress)로 변환한다. 나머지의 경우(_) Err을 반환한다.