diff --git a/.hgignore b/.hgignore index 60d53e09b2acc52d6d760d85dd35596edcd01822_LmhnaWdub3Jl..a5a4311d5148c64d19a5ad9e1e41d880c68734a8_LmhnaWdub3Jl 100644 --- a/.hgignore +++ b/.hgignore @@ -1,1 +1,2 @@ ^target/ +^tmp/ diff --git a/src/main.rs b/src/main.rs index 60d53e09b2acc52d6d760d85dd35596edcd01822_c3JjL21haW4ucnM=..a5a4311d5148c64d19a5ad9e1e41d880c68734a8_c3JjL21haW4ucnM= 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ use dialoguer::console::style; use dialoguer::Confirm; +use std::path::PathBuf; use structopt::StructOpt; #[derive(StructOpt)] @@ -7,5 +8,9 @@ NewDataset { directory: String }, } +struct Megafine { + tmp_dir: PathBuf, +} + type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>; @@ -10,10 +15,21 @@ type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>; -fn new_dataset(directory: String) -> Result<()> { - println!( - "Creating a dataset from directory {}", - style(&directory).bold() - ); - if !std::fs::metadata(&directory)?.is_dir() { - Err("Not a directory")? +impl Megafine { + fn new_dataset(&self, directory: String) -> Result<()> { + println!( + "Creating a dataset from directory {}", + style(&directory).bold() + ); + if !std::fs::metadata(&directory)?.is_dir() { + Err("Not a directory")? + } + let proceed = Confirm::new() + .with_prompt("Continue?") + .default(false) + .interact()?; + if !proceed { + Err("")? + } + // TODO + Ok(()) } @@ -19,8 +35,27 @@ } - let proceed = Confirm::new() - .with_prompt("Continue?") - .default(false) - .interact()?; - if !proceed { - Err("")? + + fn new() -> Result<Self> { + let exe = std::fs::canonicalize(std::env::current_exe()?)?; + + // TODO: use a `try` block when available + // https://github.com/rust-lang/rust/issues/31436 + let find_repo = || { + let parent_1 = exe.parent()?; + let parent_2 = parent_1.parent()?; + let parent_3 = parent_2.parent()?; + let name_1 = parent_1.file_name()?; + let name_2 = parent_2.file_name()?; + (name_2 == "target" && (name_1 == "debug" || name_1 == "release")).then(|| parent_3) + }; + + let repo = find_repo().ok_or_else(|| { + format!( + "Couldn’t find megafine repository, executable is '{}' \ + instead of the expected target/{{debug,target}}/megafine", + exe.display() + ) + })?; + let tmp_dir = repo.join("tmp"); + std::fs::create_dir_all(&tmp_dir)?; + Ok(Self { tmp_dir }) } @@ -26,6 +61,11 @@ } - // TODO - Ok(()) + + fn main() -> Result<()> { + let megafine = Megafine::new()?; + match Args::from_args() { + Args::NewDataset { directory } => megafine.new_dataset(directory), + } + } } fn main() { @@ -29,10 +69,7 @@ } fn main() { - let result = match Args::from_args() { - Args::NewDataset { directory } => new_dataset(directory), - }; - match result { + match Megafine::main() { Ok(()) => {} Err(error) => { let message = error.to_string();