// TODO: Ticket 구조체의 각 필드에 대여-가변 설정자(&mut-setter)를 추가하세요.
// `Ticket::new`와 동일한 조건을 준수하세요.
// 동일한 로직을 추출해 재사용하면 더 좋습니다.
// 비공개(private) 함수나 비공개 정적(static) 메서드를 사용할 수 있습니다.
풀이:
impl Ticket {
pub fn new(title: String, description: String, status: String) -> Ticket {
//조건 검사 로직은 필드 별로 분리
check_title(&title);
check_description(&description);
check_status(&status);
Ticket {
title,
description,
status,
}
}
pub fn title(&self) -> &String {
&self.title
}
pub fn description(&self) -> &String {
&self.description
}
pub fn status(&self) -> &String {
&self.status
}
//setter 생성
pub fn set_title(&mut self, title: String) {
check_title(&title);
self.title = title
}
pub fn set_description(&mut self, description: String) {
check_description(&description);
self.description = description
}
pub fn set_status(&mut self, status: String) {
check_status(&status);
self.status = status
}
}
fn check_title(title: &String) {
if title.is_empty() {
panic!("Title cannot be empty");
}
if title.len() > 50 {
panic!("Title cannot be longer than 50 bytes");
}
}
fn check_description(description: &String) {
if description.is_empty() {
panic!("Description cannot be empty");
}
if description.len() > 500 {
panic!("Description cannot be longer than 500 bytes");
}
}
fn check_status(status: &String) {
if status != "To-Do" && status != "In Progress" && status != "Done" {
panic!("Only `To-Do`, `In Progress`, and `Done` statuses are allowed");
}
}
setter로 필드를 수정할 때 역시 인스턴스를 생성할 때와 마찬가지로 조건을 검사해야 한다.
기존 new()
함수는 모든 필드의 조건을 한 번에 검사하고 있었으므로, 이를 필드 별로 분리하여 3개의 check_()
함수를 생성하여 new()
와 각 setter에 사용했다.
setter에서는 &mut self
로 인스턴스를 가변으로 대여하여, 조건을 검사한 후 새로운 값으로 대입한다.