기본 저널 파일을 사용하여 작업 저장

완료됨

일부 명령줄 애플리케이션에서는 일반적으로 dot 파일 및 구성 파일과 같은 사용자 소유 파일을 홈 디렉터리에 저장합니다. 따라서 기본 저널 파일도 여기에 저장할 수 있습니다.

홈 디렉터리는 사용자의 운영 체제에 따라 다르기 때문에 home이라는 타사 크레이트를 사용하여 디렉터리를 결정합니다.

먼저 이를 Cargo.toml 파일에 추가합니다.

[dependencies]
home = "0.5" # <--- Add `home` to our project dependencies.
serde_json = "1.0"
structopt = "0.3"

[dependencies.chrono]
features = ["serde"]
version = "0.4"

[dependencies.serde]
features = ["derive"]
version = "1.0"

이제 home::home_dir() 함수를 사용하도록 main.rs 파일을 업데이트할 수 있습니다. 이 함수는 사용자의 홈 디렉터리를 검색하고 CommandLineArgs 유형의 journal_file 필드와 마찬가지로 Option<PathBuf> 유형으로 반환합니다.

// ...
use std::path::PathBuf;


fn find_default_journal_file() -> Option<PathBuf> {
    home::home_dir().map(|mut path| {
        path.push(".rusty-journal.json");
        path
    })
}

fn main() {

    let CommandLineArgs {
        action,
        journal_file,
    } = CommandLineArgs::from_args();

    let journal_file = journal_file
        .or_else(find_default_journal_file)
        .expect("Failed to find journal file.");

    // ...
}

find_default_journal_file이라는 새 함수를 만들었습니다. 입력 인수를 사용하지 않고 Option<PathBuf>를 반환합니다.

이 함수 내에서 기본 저널 파일의 전체 경로를 빌드하려고 합니다. home::home_dir 함수 출력에서 Option 유형을 가져와 ".rusty-journal.json" 문자열을 경로로 푸시하는 익명 함수로 map 메소드를 호출하여 경로를 빌드합니다. home::home_dir의 출력이 None이면 mapSome 변형에서만 작동하므로 아무런 작업도 수행되지 않습니다.

그러면 main 함수에서, 원래 값이 None인 경우에만 find_default_journal_file을 호출하여 업데이트하는 journal_file 변수를 섀도 처리합니다. .or_else 메서드는 map 메서드와 반대로 수행합니다 .이 메서드는 변형이 None인 경우에만 보유하는 함수를 호출합니다.

사용자가 대상 저널 파일을 제공하지 않았고 find_default_journal_file이 적절한 파일을 찾을 수 없는 경우, 저널 파일 없이는 아무 것도 할 수 없기 때문에 프로그램은 패닉 상태가 됩니다.