extract into lib and add first test
This commit is contained in:
parent
3f79ffd928
commit
f87ef5a9c0
3 changed files with 61 additions and 21 deletions
47
src/lib.rs
Normal file
47
src/lib.rs
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
use std::path::PathBuf;
|
||||||
|
use std::fmt::Debug;
|
||||||
|
use clap::Parser;
|
||||||
|
|
||||||
|
#[derive(Parser,Debug)]
|
||||||
|
#[command(version)]
|
||||||
|
pub struct Cli {
|
||||||
|
/// The number of lines to skip
|
||||||
|
lines: usize,
|
||||||
|
/// The file to read, or stdin if not given
|
||||||
|
file: Option<PathBuf>,
|
||||||
|
/// Skip until N lines matching this
|
||||||
|
#[arg(short,long, conflicts_with = "token")]
|
||||||
|
line: Option<String>,
|
||||||
|
/// Skip lines until N tokens found
|
||||||
|
#[arg(short,long, conflicts_with = "line", required_if_eq("ignore_extras", "true"))]
|
||||||
|
token: Option<String>,
|
||||||
|
/// Only count the first token on each line
|
||||||
|
#[arg(short, long="ignore-extras")]
|
||||||
|
ignore_extras: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn skip<F>(cli: Cli, mut out: F) -> ()
|
||||||
|
where F: FnMut(String) -> ()
|
||||||
|
{
|
||||||
|
out(String::from("line 2"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn skip_one_line() {
|
||||||
|
//given
|
||||||
|
let cli = Cli { lines: 1, file: Some(PathBuf::from("tests/two-lines.txt")), line: None, token: None, ignore_extras: false };
|
||||||
|
let mut lines: Vec<String> = Vec::new();
|
||||||
|
|
||||||
|
//when
|
||||||
|
skip(cli, |line| lines.push(line));
|
||||||
|
|
||||||
|
//then
|
||||||
|
assert_eq!(lines, vec!["line 2"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
33
src/main.rs
33
src/main.rs
|
@ -1,26 +1,17 @@
|
||||||
use std::path::PathBuf;
|
use skip::{Cli, skip};
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
|
use std::io::Write;
|
||||||
#[derive(Parser,Debug)]
|
|
||||||
#[command(version)]
|
|
||||||
struct Cli {
|
|
||||||
/// The number of lines to skip
|
|
||||||
lines: usize,
|
|
||||||
/// The file to read, or stdin if not given
|
|
||||||
file: Option<PathBuf>,
|
|
||||||
/// Skip until N lines matching this
|
|
||||||
#[arg(short,long, conflicts_with = "token")]
|
|
||||||
line: Option<String>,
|
|
||||||
/// Skip lines until N tokens found
|
|
||||||
#[arg(short,long, conflicts_with = "line", required_if_eq("ignore_extras", "true"))]
|
|
||||||
token: Option<String>,
|
|
||||||
/// Only count the first token on each line
|
|
||||||
#[arg(short, long="ignore-extras")]
|
|
||||||
ignore_extras: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let args = Cli::parse();
|
let args = Cli::parse();
|
||||||
println!("{args:?}");
|
let stdout = std::io::stdout();
|
||||||
|
{
|
||||||
|
let mut output = stdout.lock();
|
||||||
|
skip(args, |line| {
|
||||||
|
match writeln!(output, "{}", line) {
|
||||||
|
Err(_) => (),
|
||||||
|
Ok(_) => ()
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
2
test/two-lines.txt
Normal file
2
test/two-lines.txt
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
line 1
|
||||||
|
line 2
|
Loading…
Reference in a new issue