use core::default::Default;
pub mod private {
use super::*;
#[ derive( Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default ) ]
pub struct Src<'a>(pub &'a str);
#[ derive( Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default ) ]
pub struct Delimiter<'a>(pub &'a str);
#[ derive( Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default ) ]
pub struct Quote(pub bool);
#[ derive( Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default ) ]
pub struct Left(pub bool);
#[ derive( Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default ) ]
pub struct NoneFlag(pub bool);
#[ allow( dead_code ) ]
#[ derive( Debug ) ] pub struct IsolateOptions<'a> {
pub src: Src<'a>,
pub delimiter: Delimiter<'a>,
pub quote: Quote,
pub left: Left,
pub times: u8,
pub none: NoneFlag,
}
impl Default for IsolateOptions<'_> {
fn default() -> Self {
Self {
src: Src::default(),
delimiter: Delimiter::default(),
quote: Quote::default(),
left: Left::default(),
times: 1,
none: NoneFlag::default(),
}
}
}
impl<'a> IsolateOptions<'a> {
#[ must_use ]
pub fn isolate(&self) -> (&'a str, Option< &'a str >, &'a str) {
let times = self.times + 1;
let result;
let left_none_result = |src: &'a str| -> (&'a str, Option< &'a str >, &'a str) {
if self.none.0 {
("", None, src)
} else {
(src, None, "")
}
};
let right_none_result = |src: &'a str| -> (&'a str, Option< &'a str >, &'a str) {
if self.none.0 {
(src, None, "")
} else {
("", None, src)
}
};
let count_parts_len = |parts: &Vec< &str >| -> usize {
let mut len = 0;
for i in 0..self.times {
let i = i as usize;
if i > 0 {
len += self.delimiter.0.len();
}
len += parts[i].len();
}
len
};
if self.left.0 {
let parts: Vec< &str > = self.src.0.trim().splitn(times.into(), self.delimiter.0).collect();
if parts.len() == 1 {
result = left_none_result(parts[0]);
} else {
let len = count_parts_len(&parts);
let max_len = len + self.delimiter.0.len();
if max_len <= self.src.0.len() {
let delim_opt = if self.delimiter.0.is_empty() {
None
} else {
Some(self.delimiter.0)
};
result = (&self.src.0[0..len], delim_opt, &self.src.0[max_len..]);
} else {
result = left_none_result(self.src.0);
}
}
} else {
let parts: Vec< &str > = self.src.0.trim().rsplitn(times.into(), self.delimiter.0).collect();
if parts.len() == 1 {
result = right_none_result(parts[0]);
} else {
let len = count_parts_len(&parts);
if len + self.delimiter.0.len() <= self.src.0.len() {
let delim_opt = if self.delimiter.0.is_empty() {
None
} else {
Some(self.delimiter.0)
};
result = (parts[parts.len() - 1], delim_opt, &self.src.0[self.src.0.len() - len..]);
} else {
result = right_none_result(self.src.0);
}
}
}
result
}
}
#[ must_use ]
pub fn isolate<'a>() -> IsolateOptions<'a> {
IsolateOptions::default()
}
#[ must_use ]
pub fn isolate_left<'a>() -> IsolateOptions<'a> {
IsolateOptions {
left: Left(true),
..IsolateOptions::default()
}
}
#[ must_use ]
pub fn isolate_right<'a>() -> IsolateOptions<'a> {
IsolateOptions {
left: Left(false),
..IsolateOptions::default()
}
}
}
#[ allow( unused_imports ) ]
pub mod own {
#[ allow( unused_imports ) ]
use super::*;
use super::private as i;
pub use orphan::*; pub use i::IsolateOptions;
pub use i::isolate;
pub use i::isolate_left;
pub use i::isolate_right;
}
pub use own::*;
#[ allow( unused_imports ) ]
pub mod orphan {
#[ allow( unused_imports ) ]
use super::*;
pub use exposed::*;
}
#[ allow( unused_imports ) ]
pub mod exposed {
#[ allow( unused_imports ) ]
use super::*;
pub use prelude::*; pub use super::own as isolate;
use super::private as i;
pub use i::isolate;
pub use i::isolate_left;
pub use i::isolate_right;
}
#[ allow( unused_imports ) ]
pub mod prelude {
#[ allow( unused_imports ) ]
use super::*;
use super::private as i;
}