#[doc(hidden)]
pub enum AltPattern<'a> {
Str(&'a str),
Char(char),
}
impl<'a> From<&'a str> for AltPattern<'a> {
fn from(data: &'a str) -> Self {
Self::Str(data)
}
}
impl<'a> From<char> for AltPattern<'a> {
fn from(data: char) -> Self {
Self::Char(data)
}
}
pub trait StrExt {
fn splitn_exact<'a, P: Into<AltPattern<'a>>>(
&'a self,
n: usize,
pat: P,
) -> Option<Vec<&'a str>>;
}
impl StrExt for &str {
fn splitn_exact<'a, P: Into<AltPattern<'a>>>(
&'a self,
n: usize,
pat: P,
) -> Option<Vec<&'a str>> {
let pat = pat.into();
let splitted: Vec<_> = match pat {
AltPattern::Str(sep) => self.splitn(n, sep).collect(),
AltPattern::Char(sep) => self.splitn(n, sep).collect(),
};
if splitted.len() == n {
Some(splitted)
} else {
None
}
}
}