작업을 인쇄하는 함수 작성
정의해야 하는 세 번째 및 마지막 작업은 list_tasks
함수입니다. 저널 파일을 읽고 작업 목록(있는 경우)을 인쇄하기만 하면 됩니다.
pub fn list_tasks(journal_path: PathBuf) -> Result<()> {
// Open the file.
let file = OpenOptions::new().read(true).open(journal_path)?;
// Parse the file and collect the tasks.
let tasks = collect_tasks(&file)?;
// Enumerate and display tasks, if any.
if tasks.is_empty() {
println!("Task list is empty!");
} else {
let mut order: u32 = 1;
for task in tasks {
println!("{}: {}", order, task);
order += 1;
}
}
Ok(())
}
이 함수는 파일에 쓸 필요가 없기 때문에 유사한 다른 함수들보다 약간 더 복잡합니다. collect_tasks
도우미 함수를 다시 사용하여 리팩터링의 유용성을 입증합니다. 그런 다음, 작업 벡터가 비어 있는지 확인한 후 콘텐츠를 나열하려고 합니다.
목록을 인쇄할 때 1
에서 시작하는 간단한 카운터를 사용하여 작업을 열거합니다. 이 숫자는 사용자가 complete_task
작업에 전달할 숫자와 동일합니다.
Task
구조체가 Display
특성을 아직 구현하지 않기 때문에 이 코드가 컴파일되지 않습니다. 다른 모듈에서 살펴본 것처럼, Display
특성은 최종 사용자에게 구조체 표시를 보여주는 데 사용되며, 이것이 바로 여기서 수행하는 작업입니다.
유형에 대한 Display
특성을 구현하는 것은 쉽습니다. 다음과 같이 fmt
함수를 구현하기만 하면 됩니다.
use std::fmt;
impl fmt::Display for Task {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let created_at = self.created_at.with_timezone(&Local).format("%F %H:%M");
write!(f, "{:<50} [{}]", self.text, created_at)
}
}
Display::fmt
함수에서 DateTime<Utc>
타임스탬프를 DateTime<Local>
구조체로 변환하기 때문에 사용자는 작업이 생성된 날짜와 시간을 현지 시간으로 볼 수 있습니다.
처음부터 DateTime<Local>
유형을 사용하여 created_at
필드를 정의하지 않은 이유를 궁금해하실 수 있을 것 같습니다. chrono::serde::ts_seconds
모듈에서 Utc
유형에 대해 DateTime
구조체가 특수화될 것으로 예상하기 때문에 그렇게 하지 않았습니다.
그런 다음, write!
매크로를 사용하여 Task
표시를 Formatter
값 f
에 씁니다. 다음과 같이 Task
유형을 나타냅니다.
{:<50}
: 50개의 공백으로 채워진 왼쪽 정렬 문자열.[{}]
다음 문자: 작업을 만든 날짜 및 시간(대괄호 내부).
요약
이것으로 tasks.rs
모듈 파일로의 전환 과정을 마칩니다. 작업 모듈에 대한 전체 코드를 확인하려는 경우, Rust 플레이그라운드에서 확인하세요. 마지막으로 수행해야 하는 단계는 cli::CommandLineArgs
에서 캡처된 사용자 입력을 이 모듈에서 정의된 세 함수와 바인딩하는 것입니다.
다음 섹션에서는 main.rs
파일의 끝을 연결하고 애플리케이션을 완료하겠습니다.