기본 모듈 완료

완료됨

이제 프로그램이 사용자 상호 작용(cli 모듈 사용) 및 파일 처리(tasks 모듈 사용)를 처리할 수 있으며, 모든 것이 예상대로 작동하는지 확인하기 위해 시험해 볼 수 있습니다.

기본 저널 파일을 사용하고 사용자에게 친숙한 오류를 제공하는 등의 몇 가지 작업을 수행해야 하지만, 이러한 작업은 나중에 처리해 보겠습니다.

기본 모듈 완료 및 프로그램 실행

다음으로 수행해야 할 일은 Actions 구조체를 tasks 모듈에서 정의된 세 가지 공용 함수에 연결하는 것입니다. main.rs 파일을 열고 다음과 같이 만듭니다.

use structopt::StructOpt;
mod cli;
mod tasks;

use cli::{Action::*, CommandLineArgs};
use tasks::Task;

fn main() {
    // Get the command-line arguments.
    let CommandLineArgs {
        action,
        journal_file,
    } = CommandLineArgs::from_args();

    // Unpack the journal file.
    let journal_file = journal_file.expect("Failed to find journal file");

    // Perform the action.
    match action {
        Add { text } => tasks::add_task(journal_file, Task::new(text)),
        List => tasks::list_tasks(journal_file),
        Done { position } => tasks::complete_task(journal_file, position),
    }
    .expect("Failed to perform action")
}

main.rs 개요는 정말 간단합니다.

먼저 CommandLineArgs 구조체를 해당 필드로 해체하면 해당 값을 작업 처리 함수에 독립적으로 전달할 수 있습니다.

journal_fileOption<PathBuf> 유형이므로 저널 파일에 대한 경로를 추출하거나 panic을 내보내야 합니다. 나중에 이 단계를 다시 수행하여 프로그램이 기본 파일을 찾도록 하겠습니다. 지금은 이 .expect 명령이 제대로 작동합니다.

마지막으로, 가능한 각 Action을 해당 함수에 일치시켜 열거형에서 함수로 필수 필드를 전달합니다. 모든 함수가 실패할 수 있는 Result 유형을 반환하기 때문에 match 블록 끝에서 .expect를 호출합니다. 다시 말씀드리지만, 오류 발생 시 사용자에게 유용한 오류 메시지를 제공하도록 이 기능을 나중에 다시 한번 다듬겠습니다.

사용해 보겠습니다. 터미널을 열고 다음 명령을 입력합니다.

$ cargo run -- -j test-journal.json add "buy milk"

$ cargo run -- -j test-journal.json add "take the dog for a walk"

$ cargo run -- -j test-journal.json add "water the plants"

$ cargo run -- -j test-journal.json list
1: buy milk                                           [2021-01-08 16:39]
2: take the dog for a walk                            [2021-01-08 16:39]
3: water the plants                                   [2021-01-08 16:39]

$ cargo run -- -j test-journal.json done 2

$ cargo run -- -j test-journal.json list
1: buy milk                                           [2021-01-08 16:39]
2: water the plants                                   [2021-01-08 16:39]

프로그램이 정상적으로 실행되고 있는 것 같습니다.

-- 이후에 전달된 모든 인수가 cargo 자체가 아닌 프로그램으로 전송되도록 cargo run -- 호출로 시작했습니다.

그런 다음, 하위 명령 add 다음에 작업 이름 문자열을 사용하여 세 가지 작업을 연속으로 추가했습니다. 그러면 list 하위 명령은 맨 오른쪽에 타임스탬프와 함께 세 가지 작업을 순서대로 표시했습니다. 그런 다음, 우리는 done 2 하위 명령을 호출하여 두 번째 작업을 완료로 표시했습니다. list를다시 호출했을 때 해당 작업이 사라졌습니다. 놀랍지 않습니까?

test-journal.json 파일을 들여다 보면 다음 콘텐츠를 볼 수 있습니다.

[{"text":"buy milk","created_at":1610134741},{"text":"water the plants","created_at":1610134762}]

Task는 JSON 개체로 표시되고 각 파일이 하나의 키임을 알 수 있습니다. 작업 설명은 문자열로 저장되고 타임스탬프는 epoch 이후 경과된 시간(초)으로 유지됩니다.

JSON 파일을 보기 쉽게 인쇄하면 다음과 같습니다.

[
  {
    "text": "buy milk",
    "created_at": 1610134741
  },
  {
    "text": "water the plants",
    "created_at": 1610134762
  }
]

다음 두 섹션에서는 기본 저널 파일을 사용하도록 구성하고 더 보기 쉬운 오류 메시지를 표시하여 프로그램의 유용성을 개선할 것입니다.