factor out do_append in prep for delta subcommands

This commit is contained in:
Qyriad 2026-02-02 13:42:07 +01:00
parent 8477c73067
commit 9ae0630db4
8 changed files with 237 additions and 56 deletions

View file

@ -1,3 +1,5 @@
use std::sync::Arc;
use clap::ColorChoice;
use crate::prelude::*;
@ -46,27 +48,39 @@ impl FromStr for NixOsOption {
}
}
#[derive(Debug, Clone, PartialEq, clap::Parser)]
pub struct AppendCmd {
#[arg(required = true)]
pub name: Arc<str>,
#[arg(required = true)]
pub value: Arc<str>,
}
#[derive(Debug, Clone, PartialEq, clap::Subcommand)]
pub enum Subcommand {
Append(AppendCmd),
}
#[derive(Debug, Clone, PartialEq, clap::Parser)]
#[command(version, about, author, arg_required_else_help(true))]
pub struct Parser {
#[command(propagate_version = true)]
pub struct Args {
#[arg(long, default_value = "auto")]
pub color: ColorChoice,
#[arg(long)]
pub file: Box<OsStr>,
pub file: Arc<OsStr>,
#[arg(required = true)]
pub name: Box<str>,
#[arg(required = true)]
pub value: Box<str>,
///// Flakeref to a base configuration to modify.
//#[arg(group = "config", long, default_value("."))]
//#[arg(long, default_value(Some(".")))]
//flake: Option<Option<Box<OsStr>>>,
//
//#[arg(group = "config", long)]
//expr: Option<String>,
#[command(subcommand)]
pub subcommand: Subcommand,
}
///// Flakeref to a base configuration to modify.
//#[arg(group = "config", long, default_value("."))]
//#[arg(long, default_value(Some(".")))]
//flake: Option<Option<Box<OsStr>>>,
//
//#[arg(group = "config", long)]
//expr: Option<String>,
//impl Parser {
// fn eval_cmd(&self) {

View file

@ -1,4 +1,4 @@
use std::sync::Arc;
use std::{iter, sync::Arc};
pub(crate) mod prelude {
#![allow(unused_imports)]
@ -32,7 +32,7 @@ pub(crate) mod prelude {
use prelude::*;
pub mod args;
pub use args::Parser;
pub use args::{AppendCmd, Args};
mod color;
pub use color::{CLI_ENABLE_COLOR, SHOULD_COLOR};
pub mod line;
@ -47,6 +47,43 @@ use crate::source::SourceFile;
pub const ASCII_WHITESPACE: &[char] = &['\t', '\n', '\x0C', '\r', ' '];
pub fn do_append(args: Arc<Args>, append_args: AppendCmd) -> Result<(), BoxDynError> {
let filepath = Path::new(&args.file);
let filepath: PathBuf = if filepath.is_relative() && !filepath.starts_with("./") {
iter::once(OsStr::new("./"))
.chain(filepath.iter())
.collect()
} else {
filepath.to_path_buf()
};
// Get what file that thing is defined in.
let def_path = get_where(&append_args.name, &filepath)?;
let mut opts = File::options();
opts.read(true)
.write(true)
.create(false)
.custom_flags(libc::O_CLOEXEC);
let source_file = SourceFile::open_from(Arc::from(def_path), opts)?;
let pri = get_highest_prio(&append_args.name, source_file.clone())?;
let new_pri = pri - 1;
let new_pri_line = get_next_prio_line(
source_file.clone(),
append_args.name.into(),
new_pri,
append_args.value.into(),
)?;
eprintln!("new_pri_line={new_pri_line}");
write_next_prio(source_file, new_pri_line)?;
Ok(())
}
#[derive(Debug, Clone, PartialEq, Hash, Serialize, Deserialize)]
pub struct DefinitionWithLocation {
pub file: Box<Path>,

View file

@ -1,17 +1,11 @@
use std::ffi::OsStr;
use std::io::{self, IsTerminal};
use std::iter;
use std::path::{Path, PathBuf};
use std::process::ExitCode;
use std::{error::Error as StdError, sync::Arc};
use dynix::source::SourceFile;
use clap::{ColorChoice, Parser as _};
use fs_err::File;
use fs_err::os::unix::fs::OpenOptionsExt;
fn main_wrapped() -> Result<(), Box<dyn StdError + Send + Sync + 'static>> {
let args = dynix::Parser::parse();
let args = Arc::new(dynix::Args::parse());
dbg!(&args);
@ -24,40 +18,11 @@ fn main_wrapped() -> Result<(), Box<dyn StdError + Send + Sync + 'static>> {
success.expect("logic error in CLI_ENABLE_COLOR");
}
let filepath = Path::new(&args.file);
let filepath: PathBuf = if filepath.is_relative() && !filepath.starts_with("./") {
iter::once(OsStr::new("./"))
.chain(filepath.iter())
.collect()
} else {
filepath.to_path_buf()
use dynix::args::Subcommand::*;
match &args.subcommand {
Append(append_args) => dynix::do_append(args.clone(), append_args.clone())?,
};
// Get what file that thing is defined in.
let def_path = dynix::get_where(&args.name, &filepath)?;
dbg!(&def_path);
let def_path = Arc::from(def_path);
let mut opts = File::options();
opts.read(true)
.write(true)
.create(false)
.custom_flags(libc::O_CLOEXEC);
let source_file = SourceFile::open_from(Arc::clone(&def_path), opts)?;
let pri = dynix::get_highest_prio(&args.name, source_file.clone())?;
let new_pri = pri - 1;
let new_pri_line = dynix::get_next_prio_line(
source_file.clone(),
args.name.into(),
new_pri,
args.value.into(),
)?;
eprintln!("new_pri_line={new_pri_line}");
dynix::write_next_prio(source_file, new_pri_line)?;
Ok(())
}