parent
c3af720ebd
commit
2927ffd552
@ -0,0 +1 @@
|
|||||||
|
avril@flan-laptop.299665:1596751578
|
@ -0,0 +1,3 @@
|
|||||||
|
Add `collect_stderr` feature, to not immediately print stderr, but collect it like stdout.
|
||||||
|
|
||||||
|
Add `--install` mode with feature flag to enable using it
|
@ -0,0 +1,163 @@
|
|||||||
|
use super::*;
|
||||||
|
use std::{
|
||||||
|
collections::HashSet,
|
||||||
|
num::NonZeroUsize,
|
||||||
|
hash::{Hash, Hasher},
|
||||||
|
borrow::Cow,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Flags for `leanify`
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq, Ord, PartialOrd)]
|
||||||
|
pub enum LeanifyFlag
|
||||||
|
{
|
||||||
|
/// Corresponds to `-i`
|
||||||
|
Iteration(NonZeroUsize),
|
||||||
|
/// Corresponds to `-d`
|
||||||
|
Depth(NonZeroUsize),
|
||||||
|
/// Corresponds to `-f`
|
||||||
|
Fastmode,
|
||||||
|
/// Corresponds to `-q`
|
||||||
|
Quiet,
|
||||||
|
/// Corresponds to `-v`
|
||||||
|
Verbose,
|
||||||
|
/// Corresponds to `--keep-exif`
|
||||||
|
KeepExif,
|
||||||
|
/// Any other the user specified
|
||||||
|
Custom(Vec<String>),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Hash for LeanifyFlag {
|
||||||
|
fn hash<H: Hasher>(&self, state: &mut H) {
|
||||||
|
// Don't let us pass multiple of the same discriminant when their inner values are different
|
||||||
|
if let Self::Custom(custom) = self {
|
||||||
|
// Except custom
|
||||||
|
custom.hash(state)
|
||||||
|
}
|
||||||
|
std::mem::discriminant(self).hash(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl LeanifyFlag
|
||||||
|
{
|
||||||
|
pub fn try_parse<P: AsRef<str>,T: Iterator<Item=S> + ?Sized, S: AsRef<str>>(path: P, iter: &mut T) -> Result<Option<Self>, arg::Error>
|
||||||
|
{
|
||||||
|
Ok(match path.as_ref() {
|
||||||
|
"-i" | "--iteration" => {
|
||||||
|
if let Some(iter) = iter.next() {
|
||||||
|
Some(Self::Iteration(iter.as_ref().parse()?))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"-d" | "--max_depth" => {
|
||||||
|
if let Some(iter) = iter.next() {
|
||||||
|
Some(Self::Depth(iter.as_ref().parse()?))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"-f" | "--fastmode" => {
|
||||||
|
Some(Self::Fastmode)
|
||||||
|
},
|
||||||
|
"-q" | "--quiet" => {
|
||||||
|
Some(Self::Quiet)
|
||||||
|
},
|
||||||
|
"-v" | "--verbose" => {
|
||||||
|
Some(Self::Verbose)
|
||||||
|
},
|
||||||
|
"--keep-exif" => {
|
||||||
|
Some(Self::KeepExif)
|
||||||
|
},
|
||||||
|
_ => None,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
fn try_into_string(self) -> Option<String>
|
||||||
|
{
|
||||||
|
Some(match self {
|
||||||
|
Self::Iteration(iter) => format!("--iteration {}", iter),
|
||||||
|
Self::Depth(depth) => format!("--max_depth {}", depth),
|
||||||
|
Self::Fastmode => format!("-f"),
|
||||||
|
Self::Quiet => format!("-q"),
|
||||||
|
Self::Verbose => format!("-v"),
|
||||||
|
Self::KeepExif => format!("--keep-exif"),
|
||||||
|
Self::Custom(string) => string.into_iter().join(" "),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl IntoIterator for LeanifyFlag
|
||||||
|
{
|
||||||
|
type Item= Cow<'static, str>;
|
||||||
|
type IntoIter = maybe_single::IntoIter<Cow<'static, str>>;
|
||||||
|
|
||||||
|
fn into_iter(self) -> Self::IntoIter
|
||||||
|
{
|
||||||
|
use maybe_single::MaybeSingle;
|
||||||
|
match self {
|
||||||
|
Self::Iteration(iter) => MaybeSingle::from(vec![Cow::Borrowed("--iteration"), Cow::Owned(iter.to_string())]),
|
||||||
|
Self::Depth(depth) => MaybeSingle::from(vec![Cow::Borrowed("--max_depth"), Cow::Owned(depth.to_string())]),
|
||||||
|
Self::Fastmode => MaybeSingle::single(Cow::Borrowed("-f")),
|
||||||
|
Self::Quiet => MaybeSingle::single(Cow::Borrowed("-q")),
|
||||||
|
Self::Verbose => MaybeSingle::single(Cow::Borrowed("-v")),
|
||||||
|
Self::KeepExif => MaybeSingle::single(Cow::Borrowed("--keep-exif")),
|
||||||
|
Self::Custom(string) => string.into_iter().map(|x| Cow::Owned(x)).collect(),
|
||||||
|
}.into_iter()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// Extra flags to pass to `leanify`
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
pub struct LeanifyFlags
|
||||||
|
{
|
||||||
|
flags: HashSet<LeanifyFlag>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for LeanifyFlags
|
||||||
|
{
|
||||||
|
#[inline]
|
||||||
|
fn default() -> Self
|
||||||
|
{
|
||||||
|
Self{flags:HashSet::new()}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl LeanifyFlags
|
||||||
|
{
|
||||||
|
/// Create a new empty flag list
|
||||||
|
#[inline] pub fn new() -> Self
|
||||||
|
{
|
||||||
|
Self::default()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Add one
|
||||||
|
pub fn add(&mut self, flag: LeanifyFlag)
|
||||||
|
{
|
||||||
|
self.flags.insert(flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Create the `leanify` arg string
|
||||||
|
pub fn into_arg_string(self) -> String
|
||||||
|
{
|
||||||
|
self.flags.into_iter().filter_map(|x| x.try_into_string()).join(" ")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn iter_cloned<'a>(&'a self) -> impl Iterator<Item = Cow<'static, str>> + 'a
|
||||||
|
{
|
||||||
|
self.flags.iter().map(|x| x.clone().into_iter()).flatten()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub type IntoIter = std::iter::FilterMap<std::collections::hash_set::IntoIter<LeanifyFlag>, fn (LeanifyFlag) -> Option<String>>; //fuck this is annoying
|
||||||
|
|
||||||
|
impl IntoIterator for LeanifyFlags
|
||||||
|
{
|
||||||
|
type Item= String;
|
||||||
|
type IntoIter = IntoIter;
|
||||||
|
|
||||||
|
fn into_iter(self) -> Self::IntoIter
|
||||||
|
{
|
||||||
|
self.flags.into_iter().filter_map(|x| x.try_into_string())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in new issue