문제
// TODO: `easy_ticket`은 title이 유효하지 않을 때 panic이 발생해야 합니다.
// description이 유효하지 않다면 "Description not provided"라는 기본 description을 사용합니다.
fn easy_ticket(title: String, description: String, status: Status) -> Ticket {
todo!()
}
#[derive(Debug, PartialEq, Clone)]
struct Ticket {
title: String,
description: String,
status: Status,
}
#[derive(Debug, PartialEq, Clone)]
enum Status {
ToDo,
InProgress { assigned_to: String },
Done,
}
impl Ticket {
pub fn new(title: String, description: String, status: Status) -> Result<Ticket, String> {
if title.is_empty() {
return Err("Title cannot be empty".to_string());
}
if title.len() > 50 {
return Err("Title cannot be longer than 50 bytes".to_string());
}
if description.is_empty() {
return Err("Description cannot be empty".to_string());
}
if description.len() > 500 {
return Err("Description cannot be longer than 500 bytes".to_string());
}
Ok(Ticket {
title,
description,
status,
})
}
}
풀이
fn easy_ticket(title: String, description: String, status: Status) -> Ticket {
let default_desc = "Description not provided".to_string();
if description.is_empty() || description.len() > 500 {
Ticket::new(title, default_desc, status).unwrap()
} else {
Ticket::new(title, description, status).unwrap()
}
}
"Description not provided"
를 담고 있는 기본 설명 default_desc
를 정의해두고,
description
이 유효하지 않은 경우에는 default_desc
를, 유효한 경우에는 매개변수로 받은 description
을 사용하도록 한다.
Ticket::new()
는 Result
타입으로 Ok()
또는 Err()
을 반환한다. 이 자체로는 무언가를 할 수 없다. 필요한 값은 Ok()
, Err()
로 감싸져 있다(wrapped)고 볼 수 있다. 이 값을 사용하려면 unwrap()
이나 expect()
로 꺼내야 한다.
둘 다 역할은 비슷하지만 expect()
는 panic!
메시지를 직접 설정할 수 있다.