#[ cfg( feature = "std" ) ]
use std::{ vec, vec::Vec };
#[ cfg( all( feature = "use_alloc", not( feature = "std" ) ) ) ]
use alloc::{ vec, vec::Vec };
#[ cfg( all( feature = "string_parse_request", feature = "std" ) ) ]
use crate::string::parse_request::OpType;
use super::SplitFlags;
use super::types::{ Split, Searcher, SplitOptions };
use super::iterator::{ SplitFastIterator, SplitIterator };
impl<'a> SplitOptions<'a, Vec< &'a str >> {
#[ must_use ]
pub fn split(self) -> SplitIterator<'a> {
SplitIterator::new(&self)
}
}
impl<'a, D: Searcher + Default + Clone> SplitOptions<'a, D> {
#[ allow( dead_code ) ]
pub( super ) fn split_fast(self) -> SplitFastIterator<'a, D> {
SplitFastIterator::new(&self)
}
}
impl<'a> core::iter::IntoIterator for SplitOptions<'a, Vec< &'a str >> {
type Item = Split<'a>;
type IntoIter = SplitIterator<'a>;
fn into_iter(self) -> Self::IntoIter {
SplitIterator::new(&self)
}
}
#[ derive( Debug ) ]
pub struct BasicSplitBuilder<'a> {
src: &'a str,
delimiters: Vec<&'a str>,
flags: SplitFlags,
quoting_prefixes: Vec<&'a str>,
quoting_postfixes: Vec<&'a str>,
}
impl<'a> Default for BasicSplitBuilder<'a> {
fn default() -> Self {
Self::new()
}
}
impl<'a> BasicSplitBuilder<'a> {
#[ must_use ]
pub fn new() -> BasicSplitBuilder<'a> {
Self {
src: "",
delimiters: vec![],
flags: SplitFlags::PRESERVING_DELIMITERS, quoting_prefixes: vec![],
quoting_postfixes: vec![],
}
}
pub fn src(&mut self, value: &'a str) -> &mut Self {
self.src = value;
self
}
pub fn delimiter(&mut self, value: &'a str) -> &mut Self {
self.delimiters = vec![value];
self
}
pub fn delimiters(&mut self, value: &[&'a str]) -> &mut Self {
self.delimiters = value.to_vec();
self
}
pub fn quoting(&mut self, value: bool) -> &mut Self {
if value {
self.flags.insert(SplitFlags::QUOTING);
if self.quoting_prefixes.is_empty() {
self.quoting_prefixes = vec!["\"", "'"];
}
if self.quoting_postfixes.is_empty() {
self.quoting_postfixes = vec!["\"", "'"];
}
} else {
self.flags.remove(SplitFlags::QUOTING);
}
self
}
pub fn stripping(&mut self, value: bool) -> &mut Self {
if value {
self.flags.insert(SplitFlags::STRIPPING);
} else {
self.flags.remove(SplitFlags::STRIPPING);
}
self
}
pub fn preserving_empty(&mut self, value: bool) -> &mut Self {
if value {
self.flags.insert(SplitFlags::PRESERVING_EMPTY);
} else {
self.flags.remove(SplitFlags::PRESERVING_EMPTY);
}
self
}
pub fn preserving_delimiters(&mut self, value: bool) -> &mut Self {
if value {
self.flags.insert(SplitFlags::PRESERVING_DELIMITERS);
} else {
self.flags.remove(SplitFlags::PRESERVING_DELIMITERS);
}
self
}
pub fn preserving_quoting(&mut self, value: bool) -> &mut Self {
if value {
self.flags.insert(SplitFlags::PRESERVING_QUOTING);
} else {
self.flags.remove(SplitFlags::PRESERVING_QUOTING);
}
self
}
pub fn quoting_prefixes(&mut self, value: &[&'a str]) -> &mut Self {
self.quoting_prefixes = value.to_vec();
self
}
pub fn quoting_postfixes(&mut self, value: &[&'a str]) -> &mut Self {
self.quoting_postfixes = value.to_vec();
self
}
pub fn perform(&mut self) -> SplitIterator<'a> {
let options = SplitOptions {
src: self.src,
delimiter: self.delimiters.clone(),
flags: self.flags,
quoting_prefixes: self.quoting_prefixes.clone(),
quoting_postfixes: self.quoting_postfixes.clone(),
};
options.split()
}
#[ cfg( feature = "simd" ) ]
pub fn perform_simd(&mut self) -> SplitIterator<'a> {
self.perform()
}
#[ cfg( not( feature = "simd" ) ) ]
pub fn perform_simd(&mut self) -> SplitIterator<'a> {
self.perform()
}
}
#[ cfg( all( feature = "string_parse_request", feature = "std" ) ) ]
#[ derive( Debug ) ]
pub struct SplitOptionsFormer<'a> {
src: &'a str,
delimiter: OpType<&'a str>,
flags: SplitFlags,
quoting_prefixes: Vec< &'a str >,
quoting_postfixes: Vec< &'a str >,
}
#[ cfg( all( feature = "string_parse_request", feature = "std" ) ) ]
impl<'a> SplitOptionsFormer<'a> {
pub fn new<D: Into<OpType<&'a str>>>(delimiter: D) -> SplitOptionsFormer<'a> {
Self {
src: "",
delimiter: OpType::Vector(vec![]).append(delimiter.into()),
flags: SplitFlags::PRESERVING_DELIMITERS, quoting_prefixes: vec![],
quoting_postfixes: vec![],
}
}
pub fn preserving_empty(&mut self, value: bool) -> &mut Self {
if value {
self.flags.insert(SplitFlags::PRESERVING_EMPTY);
} else {
self.flags.remove(SplitFlags::PRESERVING_EMPTY);
}
self
}
pub fn preserving_delimiters(&mut self, value: bool) -> &mut Self {
if value {
self.flags.insert(SplitFlags::PRESERVING_DELIMITERS);
} else {
self.flags.remove(SplitFlags::PRESERVING_DELIMITERS);
}
self
}
pub fn preserving_quoting(&mut self, value: bool) -> &mut Self {
if value {
self.flags.insert(SplitFlags::PRESERVING_QUOTING);
} else {
self.flags.remove(SplitFlags::PRESERVING_QUOTING);
}
self
}
pub fn stripping(&mut self, value: bool) -> &mut Self {
if value {
self.flags.insert(SplitFlags::STRIPPING);
} else {
self.flags.remove(SplitFlags::STRIPPING);
}
self
}
pub fn quoting(&mut self, value: bool) -> &mut Self {
if value {
self.flags.insert(SplitFlags::QUOTING);
} else {
self.flags.remove(SplitFlags::QUOTING);
}
self
}
pub fn quoting_prefixes(&mut self, value: Vec< &'a str >) -> &mut Self {
self.quoting_prefixes = value;
self
}
pub fn quoting_postfixes(&mut self, value: Vec< &'a str >) -> &mut Self {
self.quoting_postfixes = value;
self
}
pub fn src(&mut self, value: &'a str) -> &mut Self {
self.src = value;
self
}
pub fn delimiter<D: Into<OpType<&'a str>>>(&mut self, value: D) -> &mut Self {
self.delimiter = OpType::Vector(vec![]).append(value.into());
self
}
pub fn form(&mut self) -> SplitOptions<'a, Vec< &'a str >> {
if self.flags.contains(SplitFlags::QUOTING) {
if self.quoting_prefixes.is_empty() {
self.quoting_prefixes = vec!["\"", "`", "'"];
}
if self.quoting_postfixes.is_empty() {
self.quoting_postfixes = vec!["\"", "`", "'"];
}
}
SplitOptions {
src: self.src,
delimiter: self.delimiter.clone().vector().unwrap(),
flags: self.flags,
quoting_prefixes: self.quoting_prefixes.clone(),
quoting_postfixes: self.quoting_postfixes.clone(),
}
}
pub fn perform(&mut self) -> SplitIterator<'a> {
self.form().split()
}
#[ cfg( feature = "simd" ) ]
pub fn perform_simd(&mut self) -> SplitIterator<'a> {
if let OpType::Vector(ref delims) = self.delimiter {
if delims.len() > 1 {
if let Ok(_simd_iter) = super::simd_split_cached(self.src, delims) {
return self.perform(); }
}
}
self.perform()
}
#[ cfg( not( feature = "simd" ) ) ]
pub fn perform_simd(&mut self) -> SplitIterator<'a> {
self.perform()
}
}
#[ must_use ]
pub fn split<'a>() -> BasicSplitBuilder<'a> {
BasicSplitBuilder::new()
}
#[ cfg( all( feature = "string_parse_request", feature = "std" ) ) ]
#[ must_use ]
pub fn split_advanced<'a>() -> SplitOptionsFormer<'a> {
SplitOptionsFormer::new(<&str>::default())
}