기본 저널 파일을 사용하여 작업 저장
일부 명령줄 애플리케이션에서는 일반적으로 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
이면 map
이 Some
변형에서만 작동하므로 아무런 작업도 수행되지 않습니다.
그러면 main
함수에서, 원래 값이 None
인 경우에만 find_default_journal_file
을 호출하여 업데이트하는 journal_file
변수를 섀도 처리합니다. .or_else
메서드는 map
메서드와 반대로 수행합니다 .이 메서드는 변형이 None
인 경우에만 보유하는 함수를 호출합니다.
사용자가 대상 저널 파일을 제공하지 않았고 find_default_journal_file
이 적절한 파일을 찾을 수 없는 경우, 저널 파일 없이는 아무 것도 할 수 없기 때문에 프로그램은 패닉 상태가 됩니다.