Merge pull request #633 from a-kenji/simplify-setup
Simplify deserialization for layouts, config
This commit is contained in:
commit
424786594a
3 changed files with 72 additions and 41 deletions
30
src/main.rs
30
src/main.rs
|
|
@ -5,16 +5,14 @@ mod tests;
|
||||||
|
|
||||||
use crate::install::populate_data_dir;
|
use crate::install::populate_data_dir;
|
||||||
use sessions::{assert_session, assert_session_ne, get_active_session, list_sessions};
|
use sessions::{assert_session, assert_session_ne, get_active_session, list_sessions};
|
||||||
use std::convert::TryFrom;
|
|
||||||
use std::process;
|
use std::process;
|
||||||
use zellij_client::{os_input_output::get_client_os_input, start_client, ClientInfo};
|
use zellij_client::{os_input_output::get_client_os_input, start_client, ClientInfo};
|
||||||
use zellij_server::{os_input_output::get_server_os_input, start_server};
|
use zellij_server::{os_input_output::get_server_os_input, start_server};
|
||||||
use zellij_utils::{
|
use zellij_utils::{
|
||||||
cli::{CliArgs, Command, Sessions},
|
cli::{CliArgs, Command, Sessions},
|
||||||
consts::{ZELLIJ_TMP_DIR, ZELLIJ_TMP_LOG_DIR},
|
consts::{ZELLIJ_TMP_DIR, ZELLIJ_TMP_LOG_DIR},
|
||||||
input::{config::Config, layout::Layout, options::Options},
|
|
||||||
logging::*,
|
logging::*,
|
||||||
setup::{find_default_config_dir, get_default_data_dir, get_layout_dir, Setup},
|
setup::{get_default_data_dir, Setup},
|
||||||
structopt::StructOpt,
|
structopt::StructOpt,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -26,24 +24,13 @@ pub fn main() {
|
||||||
list_sessions();
|
list_sessions();
|
||||||
}
|
}
|
||||||
|
|
||||||
let config = match Config::try_from(&opts) {
|
let (config, layout, config_options) = match Setup::from_options(&opts) {
|
||||||
Ok(config) => config,
|
Ok(results) => results,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
eprintln!("There was an error in the config file:\n{}", e);
|
eprintln!("{}", e);
|
||||||
process::exit(1);
|
process::exit(1);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let config_options = Options::from_cli(&config.options, opts.command.clone());
|
|
||||||
|
|
||||||
if let Some(Command::Setup(ref setup)) = opts.command {
|
|
||||||
Setup::from_cli(setup, &opts, &config_options).map_or_else(
|
|
||||||
|e| {
|
|
||||||
eprintln!("{:?}", e);
|
|
||||||
process::exit(1);
|
|
||||||
},
|
|
||||||
|_| {},
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
atomic_create_dir(&*ZELLIJ_TMP_DIR).unwrap();
|
atomic_create_dir(&*ZELLIJ_TMP_DIR).unwrap();
|
||||||
atomic_create_dir(&*ZELLIJ_TMP_LOG_DIR).unwrap();
|
atomic_create_dir(&*ZELLIJ_TMP_LOG_DIR).unwrap();
|
||||||
|
|
@ -94,15 +81,6 @@ pub fn main() {
|
||||||
#[cfg(not(disable_automatic_asset_installation))]
|
#[cfg(not(disable_automatic_asset_installation))]
|
||||||
populate_data_dir(&data_dir);
|
populate_data_dir(&data_dir);
|
||||||
|
|
||||||
let layout_dir = config_options.layout_dir.or_else(|| {
|
|
||||||
get_layout_dir(opts.config_dir.clone().or_else(find_default_config_dir))
|
|
||||||
});
|
|
||||||
let layout = Layout::from_path_or_default(
|
|
||||||
opts.layout.as_ref(),
|
|
||||||
opts.layout_path.as_ref(),
|
|
||||||
layout_dir,
|
|
||||||
);
|
|
||||||
|
|
||||||
start_client(
|
start_client(
|
||||||
Box::new(os_input),
|
Box::new(os_input),
|
||||||
opts,
|
opts,
|
||||||
|
|
|
||||||
|
|
@ -80,8 +80,8 @@ impl Layout {
|
||||||
layout: Option<&PathBuf>,
|
layout: Option<&PathBuf>,
|
||||||
layout_path: Option<&PathBuf>,
|
layout_path: Option<&PathBuf>,
|
||||||
layout_dir: Option<PathBuf>,
|
layout_dir: Option<PathBuf>,
|
||||||
) -> Option<Layout> {
|
) -> Option<Result<Layout, ConfigError>> {
|
||||||
let layout_result = layout
|
layout
|
||||||
.map(|p| Layout::from_dir(p, layout_dir.as_ref()))
|
.map(|p| Layout::from_dir(p, layout_dir.as_ref()))
|
||||||
.or_else(|| layout_path.map(|p| Layout::new(p)))
|
.or_else(|| layout_path.map(|p| Layout::new(p)))
|
||||||
.or_else(|| {
|
.or_else(|| {
|
||||||
|
|
@ -89,16 +89,7 @@ impl Layout {
|
||||||
&std::path::PathBuf::from("default"),
|
&std::path::PathBuf::from("default"),
|
||||||
layout_dir.as_ref(),
|
layout_dir.as_ref(),
|
||||||
))
|
))
|
||||||
});
|
})
|
||||||
|
|
||||||
match layout_result {
|
|
||||||
None => None,
|
|
||||||
Some(Ok(layout)) => Some(layout),
|
|
||||||
Some(Err(e)) => {
|
|
||||||
eprintln!("There was an error in the layout file:\n{}", e);
|
|
||||||
std::process::exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Currently still needed but on nightly
|
// Currently still needed but on nightly
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,17 @@
|
||||||
use crate::cli::CliArgs;
|
|
||||||
use crate::consts::{
|
use crate::consts::{
|
||||||
FEATURES, SYSTEM_DEFAULT_CONFIG_DIR, SYSTEM_DEFAULT_DATA_DIR_PREFIX, VERSION, ZELLIJ_PROJ_DIR,
|
FEATURES, SYSTEM_DEFAULT_CONFIG_DIR, SYSTEM_DEFAULT_DATA_DIR_PREFIX, VERSION, ZELLIJ_PROJ_DIR,
|
||||||
};
|
};
|
||||||
use crate::input::options::Options;
|
use crate::input::options::Options;
|
||||||
|
use crate::{
|
||||||
|
cli::{CliArgs, Command},
|
||||||
|
input::{
|
||||||
|
config::{Config, ConfigError},
|
||||||
|
layout::Layout,
|
||||||
|
},
|
||||||
|
};
|
||||||
use directories_next::BaseDirs;
|
use directories_next::BaseDirs;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::{io::Write, path::Path, path::PathBuf};
|
use std::{convert::TryFrom, io::Write, path::Path, path::PathBuf, process};
|
||||||
use structopt::StructOpt;
|
use structopt::StructOpt;
|
||||||
|
|
||||||
const CONFIG_LOCATION: &str = ".config/zellij";
|
const CONFIG_LOCATION: &str = ".config/zellij";
|
||||||
|
|
@ -139,6 +145,63 @@ pub struct Setup {
|
||||||
|
|
||||||
impl Setup {
|
impl Setup {
|
||||||
/// Entrypoint from main
|
/// Entrypoint from main
|
||||||
|
/// Merges options from the config file and the command line options
|
||||||
|
/// into `[Options]`, the command line options superceding the config
|
||||||
|
/// file options:
|
||||||
|
/// 1. command line options (`zellij options`)
|
||||||
|
/// 2. config options (`config.yaml`)
|
||||||
|
pub fn from_options(opts: &CliArgs) -> Result<(Config, Option<Layout>, Options), ConfigError> {
|
||||||
|
let clean = match &opts.command {
|
||||||
|
Some(Command::Setup(ref setup)) => setup.clean,
|
||||||
|
_ => false,
|
||||||
|
};
|
||||||
|
|
||||||
|
let config = if !clean {
|
||||||
|
match Config::try_from(opts) {
|
||||||
|
Ok(config) => config,
|
||||||
|
Err(e) => {
|
||||||
|
eprintln!("There was an error in the config file:");
|
||||||
|
return Err(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Config::default()
|
||||||
|
};
|
||||||
|
|
||||||
|
let config_options = Options::from_cli(&config.options, opts.command.clone());
|
||||||
|
|
||||||
|
let layout_dir = config_options
|
||||||
|
.layout_dir
|
||||||
|
.clone()
|
||||||
|
.or_else(|| get_layout_dir(opts.config_dir.clone().or_else(find_default_config_dir)));
|
||||||
|
let layout_result = crate::input::layout::Layout::from_path_or_default(
|
||||||
|
opts.layout.as_ref(),
|
||||||
|
opts.layout_path.as_ref(),
|
||||||
|
layout_dir,
|
||||||
|
);
|
||||||
|
let layout = match layout_result {
|
||||||
|
None => None,
|
||||||
|
Some(Ok(layout)) => Some(layout),
|
||||||
|
Some(Err(e)) => {
|
||||||
|
eprintln!("There was an error in the layout file:");
|
||||||
|
return Err(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Some(Command::Setup(ref setup)) = &opts.command {
|
||||||
|
setup.from_cli(opts, &config_options).map_or_else(
|
||||||
|
|e| {
|
||||||
|
eprintln!("{:?}", e);
|
||||||
|
process::exit(1);
|
||||||
|
},
|
||||||
|
|_| {},
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok((config, layout, config_options))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// General setup helpers
|
||||||
pub fn from_cli(&self, opts: &CliArgs, config_options: &Options) -> std::io::Result<()> {
|
pub fn from_cli(&self, opts: &CliArgs, config_options: &Options) -> std::io::Result<()> {
|
||||||
if self.clean {
|
if self.clean {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
|
|
@ -201,7 +264,6 @@ impl Setup {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if let Some(config_file) = config_file {
|
if let Some(config_file) = config_file {
|
||||||
use crate::input::config::Config;
|
|
||||||
message.push_str(&format!("[CONFIG FILE]: {:?}\n", config_file));
|
message.push_str(&format!("[CONFIG FILE]: {:?}\n", config_file));
|
||||||
match Config::new(&config_file) {
|
match Config::new(&config_file) {
|
||||||
Ok(_) => message.push_str("[CONFIG FILE]: Well defined.\n"),
|
Ok(_) => message.push_str("[CONFIG FILE]: Well defined.\n"),
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue