Files

189 lines
4.1 KiB
Rust
Raw Permalink Normal View History

2023-11-01 13:09:58 +01:00
// spell-checker:ignore noxfer infile outfile iseek oseek conv iflag oflag iflags oflags
use std::path::PathBuf;
2023-12-02 17:40:52 +01:00
use uutils_args::{Arguments, Options, Value};
2023-11-01 13:09:58 +01:00
#[derive(Value, Debug, PartialEq, Eq)]
enum StatusLevel {
#[value("none")]
None,
#[value("noxfer")]
Noxfer,
#[value("progress")]
Progress,
}
// TODO: The bytes arguments should parse sizes
#[derive(Arguments)]
enum Arg {
#[arg("if=FILE")]
2023-11-01 13:09:58 +01:00
Infile(PathBuf),
#[arg("of=FILE")]
2023-11-01 13:09:58 +01:00
Outfile(PathBuf),
#[arg("ibs=BYTES")]
2023-11-01 13:09:58 +01:00
Ibs(usize),
#[arg("obs=BYTES")]
2023-11-01 13:09:58 +01:00
Obs(usize),
#[arg("bs=BYTES")]
2023-11-01 13:09:58 +01:00
Bs(usize),
#[arg("cbs=BYTES")]
2024-03-29 14:05:32 +01:00
Cbs(#[allow(unused)] usize),
2023-11-01 13:09:58 +01:00
#[arg("skip=BYTES", "iseek=BYTES")]
2023-11-01 13:09:58 +01:00
Skip(u64),
#[arg("seek=BYTES", "oseek=BYTES")]
2023-11-01 13:09:58 +01:00
Seek(u64),
#[arg("count=N")]
2023-11-01 13:09:58 +01:00
Count(usize),
#[arg("status=LEVEL")]
2023-11-01 13:09:58 +01:00
Status(StatusLevel),
#[arg("conv=CONVERSIONS")]
2024-03-29 14:05:32 +01:00
Conv(#[allow(unused)] String),
2023-11-01 13:09:58 +01:00
#[arg("iflag=FLAGS")]
2024-03-29 14:05:32 +01:00
Iflag(#[allow(unused)] String),
2023-11-01 13:09:58 +01:00
#[arg("oflag=FLAGS")]
2024-03-29 14:05:32 +01:00
Oflag(#[allow(unused)] String),
2023-11-01 13:09:58 +01:00
}
2023-12-02 17:40:52 +01:00
#[derive(Debug, PartialEq, Eq)]
2023-11-01 13:09:58 +01:00
struct Settings {
infile: Option<PathBuf>,
outfile: Option<PathBuf>,
ibs: usize,
obs: usize,
skip: u64,
seek: u64,
count: usize,
_iconv: Vec<String>,
_iflags: Vec<String>,
_oconv: Vec<String>,
_oflags: Vec<String>,
status: Option<StatusLevel>,
}
2023-12-02 17:40:52 +01:00
impl Default for Settings {
fn default() -> Self {
Self {
ibs: 512,
obs: 512,
infile: Default::default(),
outfile: Default::default(),
skip: Default::default(),
seek: Default::default(),
count: Default::default(),
_iconv: Default::default(),
_iflags: Default::default(),
_oconv: Default::default(),
_oflags: Default::default(),
status: Default::default(),
}
}
}
2023-11-01 13:09:58 +01:00
impl Options<Arg> for Settings {
2024-03-29 03:32:30 +01:00
fn apply(&mut self, arg: Arg) -> Result<(), uutils_args::Error> {
2023-11-01 13:09:58 +01:00
match arg {
Arg::Infile(f) => self.infile = Some(f),
Arg::Outfile(f) => self.outfile = Some(f),
Arg::Ibs(b) => self.ibs = b,
Arg::Obs(b) => self.obs = b,
Arg::Bs(b) => {
self.ibs = b;
self.obs = b;
}
2024-04-10 10:33:49 +02:00
Arg::Cbs(_b) => todo!(),
2023-11-01 13:09:58 +01:00
Arg::Skip(b) => self.skip = b,
Arg::Seek(b) => self.seek = b,
Arg::Count(n) => self.count = n,
Arg::Status(level) => self.status = Some(level),
2024-04-10 10:33:49 +02:00
Arg::Conv(_c) => todo!(),
Arg::Iflag(_f) => todo!(),
Arg::Oflag(_f) => todo!(),
2023-11-01 13:09:58 +01:00
}
2024-03-29 03:32:30 +01:00
Ok(())
2023-11-01 13:09:58 +01:00
}
}
#[test]
fn empty() {
2023-12-19 15:13:12 +01:00
assert_eq!(
Settings::default().parse(["dd"]).unwrap().0,
Settings::default()
)
2023-11-01 13:09:58 +01:00
}
#[test]
fn infile() {
assert_eq!(
2023-12-19 15:13:12 +01:00
Settings::default().parse(["dd", "if=hello"]).unwrap().0,
2023-11-01 13:09:58 +01:00
Settings {
infile: Some(PathBuf::from("hello")),
2023-12-02 17:40:52 +01:00
..Settings::default()
2023-11-01 13:09:58 +01:00
}
)
}
#[test]
fn outfile() {
assert_eq!(
2023-12-19 15:13:12 +01:00
Settings::default().parse(["dd", "of=hello"]).unwrap().0,
2023-11-01 13:09:58 +01:00
Settings {
outfile: Some(PathBuf::from("hello")),
2023-12-02 17:40:52 +01:00
..Settings::default()
2023-11-01 13:09:58 +01:00
}
)
}
#[test]
fn bs() {
assert_eq!(
2023-12-19 15:13:12 +01:00
Settings::default().parse(["dd", "ibs=1"]).unwrap().0,
2023-11-01 13:09:58 +01:00
Settings {
ibs: 1,
obs: 512,
2023-12-02 17:40:52 +01:00
..Settings::default()
2023-11-01 13:09:58 +01:00
}
);
assert_eq!(
2023-12-19 15:13:12 +01:00
Settings::default().parse(["dd", "obs=1"]).unwrap().0,
2023-11-01 13:09:58 +01:00
Settings {
ibs: 512,
obs: 1,
2023-12-02 17:40:52 +01:00
..Settings::default()
2023-11-01 13:09:58 +01:00
}
);
assert_eq!(
2023-12-19 15:13:12 +01:00
Settings::default()
.parse(["dd", "ibs=10", "obs=1"])
.unwrap()
.0,
2023-11-01 13:09:58 +01:00
Settings {
ibs: 10,
obs: 1,
2023-12-02 17:40:52 +01:00
..Settings::default()
2023-11-01 13:09:58 +01:00
}
);
assert_eq!(
2023-12-19 15:13:12 +01:00
Settings::default()
.parse(["dd", "ibs=10", "bs=1"])
.unwrap()
.0,
2023-11-01 13:09:58 +01:00
Settings {
ibs: 1,
obs: 1,
2023-12-02 17:40:52 +01:00
..Settings::default()
2023-11-01 13:09:58 +01:00
}
)
}