작업을 인쇄하는 함수 작성

완료됨

정의해야 하는 세 번째 및 마지막 작업은 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 표시를 Formatterf에 씁니다. 다음과 같이 Task 유형을 나타냅니다.

  • {:<50}: 50개의 공백으로 채워진 왼쪽 정렬 문자열.
  • [{}] 다음 문자: 작업을 만든 날짜 및 시간(대괄호 내부).

요약

이것으로 tasks.rs 모듈 파일로의 전환 과정을 마칩니다. 작업 모듈에 대한 전체 코드를 확인하려는 경우, Rust 플레이그라운드에서 확인하세요. 마지막으로 수행해야 하는 단계는 cli::CommandLineArgs에서 캡처된 사용자 입력을 이 모듈에서 정의된 세 함수와 바인딩하는 것입니다.

다음 섹션에서는 main.rs 파일의 끝을 연결하고 애플리케이션을 완료하겠습니다.