mirror of
https://github.com/qwjyh/xdbm
synced 2024-11-24 23:51:04 +09:00
refactor: separate argument defs
This commit is contained in:
parent
01dd0ad77a
commit
b949cca1e8
2 changed files with 80 additions and 74 deletions
73
src/cmd_args.rs
Normal file
73
src/cmd_args.rs
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
//! CLI arguments
|
||||||
|
|
||||||
|
use crate::StorageType;
|
||||||
|
use crate::path;
|
||||||
|
use crate::PathBuf;
|
||||||
|
use clap::{Parser, Subcommand};
|
||||||
|
use clap_verbosity_flag::Verbosity;
|
||||||
|
|
||||||
|
#[derive(Parser)]
|
||||||
|
#[command(author, version, about, long_about = None)]
|
||||||
|
pub(crate) struct Cli {
|
||||||
|
#[command(subcommand)]
|
||||||
|
pub(crate) command: Commands,
|
||||||
|
|
||||||
|
#[command(flatten)]
|
||||||
|
pub(crate) verbose: Verbosity,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Subcommand)]
|
||||||
|
pub(crate) enum Commands {
|
||||||
|
/// Initialize for this device.
|
||||||
|
/// Provide `repo_url` to use existing repository, otherwise this device will be configured as the
|
||||||
|
/// first device.
|
||||||
|
Init {
|
||||||
|
repo_url: Option<String>, // url?
|
||||||
|
},
|
||||||
|
|
||||||
|
/// Manage storages.
|
||||||
|
Storage(StorageArgs),
|
||||||
|
|
||||||
|
/// Print config dir.
|
||||||
|
Path {},
|
||||||
|
|
||||||
|
/// Sync with git repo.
|
||||||
|
Sync {},
|
||||||
|
|
||||||
|
/// Check config files.
|
||||||
|
Check {},
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(clap::Args)]
|
||||||
|
#[command(args_conflicts_with_subcommands = true)]
|
||||||
|
pub(crate) struct StorageArgs {
|
||||||
|
#[command(subcommand)]
|
||||||
|
pub(crate) command: StorageCommands,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Subcommand)]
|
||||||
|
pub(crate) enum StorageCommands {
|
||||||
|
/// Add new storage.
|
||||||
|
Add {
|
||||||
|
#[arg(value_enum)]
|
||||||
|
storage_type: StorageType,
|
||||||
|
|
||||||
|
// TODO: set this require and select matching disk for physical
|
||||||
|
#[arg(short, long, value_name = "PATH")]
|
||||||
|
path: Option<PathBuf>,
|
||||||
|
},
|
||||||
|
/// List all storages.
|
||||||
|
List {},
|
||||||
|
/// Make `storage` available for the current device.
|
||||||
|
/// For physical disk, the name is taken from system info automatically.
|
||||||
|
Bind {
|
||||||
|
/// Name of the storage.
|
||||||
|
storage: String,
|
||||||
|
/// Device specific alias for the storage.
|
||||||
|
#[arg(short, long)]
|
||||||
|
alias: String,
|
||||||
|
/// Mount point on this device.
|
||||||
|
#[arg(short, long)]
|
||||||
|
path: path::PathBuf,
|
||||||
|
},
|
||||||
|
}
|
81
src/main.rs
81
src/main.rs
|
@ -13,23 +13,20 @@ extern crate dirs;
|
||||||
|
|
||||||
use anyhow::{anyhow, Context, Result};
|
use anyhow::{anyhow, Context, Result};
|
||||||
use clap::error::ErrorKind;
|
use clap::error::ErrorKind;
|
||||||
use clap::{CommandFactory, Parser, Subcommand};
|
use clap::{CommandFactory, Parser};
|
||||||
use clap_verbosity_flag::Verbosity;
|
|
||||||
use git2::{Commit, Oid, Repository};
|
use git2::{Commit, Oid, Repository};
|
||||||
use inquire::{min_length, Confirm, CustomType, Select};
|
use inquire::{min_length, Confirm, CustomType, Select};
|
||||||
use inquire::{validator::Validation, Text};
|
use inquire::{validator::Validation, Text};
|
||||||
use serde_yaml;
|
use serde_yaml;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
use std::io::{self, BufWriter};
|
||||||
use std::path::{self, PathBuf};
|
use std::path::{self, PathBuf};
|
||||||
use std::{env, io::BufReader, path::Path};
|
use std::{env, io::BufReader, path::Path};
|
||||||
use std::{
|
|
||||||
ffi::OsString,
|
|
||||||
io::{self, BufWriter},
|
|
||||||
};
|
|
||||||
use std::{fmt::Debug, fs::File};
|
use std::{fmt::Debug, fs::File};
|
||||||
use std::{fs, io::prelude::*};
|
use std::{fs, io::prelude::*};
|
||||||
use sysinfo::{Disk, DiskExt, SystemExt};
|
use sysinfo::{Disk, DiskExt, SystemExt};
|
||||||
|
|
||||||
|
use crate::cmd_args::{Cli, Commands, StorageArgs, StorageCommands};
|
||||||
use crate::inquire_filepath_completer::FilePathCompleter;
|
use crate::inquire_filepath_completer::FilePathCompleter;
|
||||||
use crate::storages::online_storage::OnlineStorage;
|
use crate::storages::online_storage::OnlineStorage;
|
||||||
use crate::storages::{
|
use crate::storages::{
|
||||||
|
@ -38,72 +35,7 @@ use crate::storages::{
|
||||||
};
|
};
|
||||||
use devices::{Device, DEVICESFILE, *};
|
use devices::{Device, DEVICESFILE, *};
|
||||||
|
|
||||||
#[derive(Parser)]
|
mod cmd_args;
|
||||||
#[command(author, version, about, long_about = None)]
|
|
||||||
struct Cli {
|
|
||||||
#[command(subcommand)]
|
|
||||||
command: Commands,
|
|
||||||
|
|
||||||
#[command(flatten)]
|
|
||||||
verbose: Verbosity,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Subcommand)]
|
|
||||||
enum Commands {
|
|
||||||
/// Initialize for this device.
|
|
||||||
/// Provide `repo_url` to use existing repository, otherwise this device will be configured as the
|
|
||||||
/// first device.
|
|
||||||
Init {
|
|
||||||
repo_url: Option<String>, // url?
|
|
||||||
},
|
|
||||||
|
|
||||||
/// Manage storages.
|
|
||||||
Storage(StorageArgs),
|
|
||||||
|
|
||||||
/// Print config dir.
|
|
||||||
Path {},
|
|
||||||
|
|
||||||
/// Sync with git repo.
|
|
||||||
Sync {},
|
|
||||||
|
|
||||||
/// Check config files.
|
|
||||||
Check {},
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(clap::Args)]
|
|
||||||
#[command(args_conflicts_with_subcommands = true)]
|
|
||||||
struct StorageArgs {
|
|
||||||
#[command(subcommand)]
|
|
||||||
command: StorageCommands,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Subcommand)]
|
|
||||||
enum StorageCommands {
|
|
||||||
/// Add new storage.
|
|
||||||
Add {
|
|
||||||
#[arg(value_enum)]
|
|
||||||
storage_type: StorageType,
|
|
||||||
|
|
||||||
// TODO: set this require and select matching disk for physical
|
|
||||||
#[arg(short, long, value_name = "PATH")]
|
|
||||||
path: Option<PathBuf>,
|
|
||||||
},
|
|
||||||
/// List all storages.
|
|
||||||
List {},
|
|
||||||
/// Make `storage` available for the current device.
|
|
||||||
/// For physical disk, the name is taken from system info automatically.
|
|
||||||
Bind {
|
|
||||||
/// Name of the storage.
|
|
||||||
storage: String,
|
|
||||||
/// Device specific alias for the storage.
|
|
||||||
#[arg(short, long)]
|
|
||||||
alias: String,
|
|
||||||
/// Mount point on this device.
|
|
||||||
#[arg(short, long)]
|
|
||||||
path: path::PathBuf,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
mod devices;
|
mod devices;
|
||||||
mod inquire_filepath_completer;
|
mod inquire_filepath_completer;
|
||||||
mod storages;
|
mod storages;
|
||||||
|
@ -427,9 +359,10 @@ fn main() -> Result<()> {
|
||||||
}
|
}
|
||||||
Commands::Check {} => {
|
Commands::Check {} => {
|
||||||
println!("Config dir: {}", &config_dir.display());
|
println!("Config dir: {}", &config_dir.display());
|
||||||
let _storages = storages::get_storages(&config_dir).context("Failed to parse storages file.");
|
let _storages =
|
||||||
|
storages::get_storages(&config_dir).context("Failed to parse storages file.");
|
||||||
todo!()
|
todo!()
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
full_status(&Repository::open(&config_dir)?)?;
|
full_status(&Repository::open(&config_dir)?)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
Loading…
Reference in a new issue