add config (WIP)

This commit is contained in:
steven-omaha
2023-01-14 16:56:07 +01:00
parent 9d1b94dca4
commit 13e34983b9
9 changed files with 122 additions and 7 deletions
Generated
+33
View File
@@ -148,7 +148,10 @@ dependencies = [
"pacdef_macro", "pacdef_macro",
"path-absolutize", "path-absolutize",
"regex", "regex",
"serde",
"serde_derive",
"serde_json", "serde_json",
"serde_yaml",
] ]
[[package]] [[package]]
@@ -231,6 +234,17 @@ version = "1.0.152"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb"
[[package]]
name = "serde_derive"
version = "1.0.152"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "serde_json" name = "serde_json"
version = "1.0.91" version = "1.0.91"
@@ -242,6 +256,19 @@ dependencies = [
"serde", "serde",
] ]
[[package]]
name = "serde_yaml"
version = "0.9.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "92b5b431e8907b50339b51223b97d102db8d987ced36f6e4d03621db9316c834"
dependencies = [
"indexmap",
"itoa",
"ryu",
"serde",
"unsafe-libyaml",
]
[[package]] [[package]]
name = "strsim" name = "strsim"
version = "0.10.0" version = "0.10.0"
@@ -280,6 +307,12 @@ version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc"
[[package]]
name = "unsafe-libyaml"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc7ed8ba44ca06be78ea1ad2c3682a43349126c8818054231ee6f4748012aed2"
[[package]] [[package]]
name = "winapi" name = "winapi"
version = "0.3.9" version = "0.3.9"
+3
View File
@@ -11,6 +11,9 @@ clap = "3.*"
path-absolutize = "*" path-absolutize = "*"
regex = "*" regex = "*"
serde_json = "*" serde_json = "*"
serde_yaml = "*"
serde_derive = "*"
serde = "*"
pacdef_macro = {path = "pacdef_macro/"} pacdef_macro = {path = "pacdef_macro/"}
[profile.release] [profile.release]
+2
View File
@@ -8,6 +8,7 @@ use crate::backend::backend_trait::*;
use crate::{impl_backend_constants, Group, Package}; use crate::{impl_backend_constants, Group, Package};
pub(crate) struct Pacman { pub(crate) struct Pacman {
pub(crate) binary: String,
pub(crate) packages: HashSet<Package>, pub(crate) packages: HashSet<Package>,
} }
@@ -69,6 +70,7 @@ fn get_db_handle() -> Result<Alpm> {
impl Pacman { impl Pacman {
pub(crate) fn new() -> Self { pub(crate) fn new() -> Self {
Self { Self {
binary: BINARY.to_string(),
packages: HashSet::new(), packages: HashSet::new(),
} }
} }
+61
View File
@@ -0,0 +1,61 @@
use std::fs::{read_to_string, File};
use std::io::{ErrorKind, Write};
use std::path::PathBuf;
use anyhow::{bail, Context, Result};
use serde_derive::{Deserialize, Serialize};
use crate::path::get_pacdef_base_dir;
const CONFIG_FILE_NAME: &str = "pacdef.yaml";
#[derive(Debug, Serialize, Deserialize)]
pub struct Config {
pub aur_helper: String,
pub warn_not_symlinks: bool,
}
impl Config {
pub fn load() -> Result<Self> {
let file = get_config_file()?;
let from_file = read_to_string(&file);
if let Err(e) = from_file {
if e.kind() == ErrorKind::NotFound {
println!("creating default config under {file:?}");
return Self::use_default_and_save_to(file);
} else {
bail!("unexpected error occured: {e:?}");
};
}
let content = from_file.unwrap();
serde_yaml::from_str(&content).context("parsing yaml config")
}
fn use_default_and_save_to(file: PathBuf) -> Result<Self> {
let result = Self::default();
let content = serde_yaml::to_string(&result).context("converting Config to yaml")?;
let mut output = File::create(file).context("creating default config file")?;
write!(output, "{content}").context("writing default config")?;
Ok(result)
}
}
fn get_config_file() -> Result<PathBuf> {
let mut file = get_pacdef_base_dir().context("getting pacdef base dir for config file")?;
file.push(CONFIG_FILE_NAME);
Ok(file)
}
impl Default for Config {
fn default() -> Self {
Self {
aur_helper: "paru".into(),
warn_not_symlinks: true,
}
}
}
+8 -2
View File
@@ -14,18 +14,24 @@ use crate::env::get_single_var;
use crate::path::get_pacdef_group_dir; use crate::path::get_pacdef_group_dir;
use crate::search; use crate::search;
use crate::ui::get_user_confirmation; use crate::ui::get_user_confirmation;
use crate::Config;
use crate::Group; use crate::Group;
pub struct Pacdef { pub struct Pacdef {
args: ArgMatches, args: ArgMatches,
config: Config,
groups: HashSet<Group>, groups: HashSet<Group>,
} }
// TODO review // TODO review
impl Pacdef { impl Pacdef {
#[must_use] #[must_use]
pub fn new(args: ArgMatches, groups: HashSet<Group>) -> Self { pub fn new(args: ArgMatches, config: Config, groups: HashSet<Group>) -> Self {
Self { args, groups } Self {
args,
config,
groups,
}
} }
#[allow(clippy::unit_arg)] #[allow(clippy::unit_arg)]
+8 -1
View File
@@ -8,6 +8,8 @@ use anyhow::{Context, Result};
use super::Section; use super::Section;
use crate::Config;
#[derive(Debug)] #[derive(Debug)]
pub struct Group { pub struct Group {
pub(crate) name: String, pub(crate) name: String,
@@ -15,7 +17,7 @@ pub struct Group {
} }
impl Group { impl Group {
pub fn load_from_dir() -> Result<HashSet<Self>> { pub fn load(config: &Config) -> Result<HashSet<Self>> {
let mut result = HashSet::new(); let mut result = HashSet::new();
let path = crate::path::get_pacdef_group_dir().context("getting pacdef group dir")?; let path = crate::path::get_pacdef_group_dir().context("getting pacdef group dir")?;
@@ -23,8 +25,13 @@ impl Group {
let file = entry.context("getting group file")?; let file = entry.context("getting group file")?;
let path = file.path(); let path = file.path();
if config.warn_not_symlinks && !path.is_symlink() {
println!("WARNING: group file {path:?} is not a symlink");
}
let group = let group =
Group::try_from(&path).with_context(|| format!("reading group file {path:?}"))?; Group::try_from(&path).with_context(|| format!("reading group file {path:?}"))?;
result.insert(group); result.insert(group);
} }
+2
View File
@@ -2,6 +2,7 @@ mod action;
pub mod args; pub mod args;
mod backend; mod backend;
mod cmd; mod cmd;
mod config;
mod core; mod core;
mod env; mod env;
mod grouping; mod grouping;
@@ -9,6 +10,7 @@ mod path;
mod search; mod search;
mod ui; mod ui;
pub use crate::config::Config;
pub use crate::core::Pacdef; pub use crate::core::Pacdef;
pub use crate::grouping::Group; pub use crate::grouping::Group;
pub(crate) use crate::grouping::Package; pub(crate) use crate::grouping::Package;
+4 -3
View File
@@ -1,10 +1,11 @@
use anyhow::{Context, Result}; use anyhow::{Context, Result};
use pacdef::{args, Group, Pacdef}; use pacdef::{args, Config, Group, Pacdef};
fn main() -> Result<()> { fn main() -> Result<()> {
let args = args::get(); let args = args::get();
let groups = Group::load_from_dir()?; let config = Config::load().context("loading config file")?;
let pacdef = Pacdef::new(args, groups); let groups = Group::load(&config).context("loading groups")?;
let pacdef = Pacdef::new(args, config, groups);
pacdef.run_action_from_arg().context("running action") pacdef.run_action_from_arg().context("running action")
} }
+1 -1
View File
@@ -8,7 +8,7 @@ pub(crate) fn get_pacdef_group_dir() -> Result<PathBuf> {
Ok(result) Ok(result)
} }
fn get_pacdef_base_dir() -> Result<PathBuf> { pub(crate) fn get_pacdef_base_dir() -> Result<PathBuf> {
let mut dir = get_xdg_config_home().context("getting XDG_CONFIG_HOME")?; let mut dir = get_xdg_config_home().context("getting XDG_CONFIG_HOME")?;
dir.push("pacdef"); dir.push("pacdef");
Ok(dir) Ok(dir)