use super::*;
#[derive(Debug, Clone)]
pub enum StringOperator {
Lower,
Upper,
Strip(String),
LStrip(String),
RStrip(String),
Len,
ByteCount,
Contains(String),
StartsWith(String),
EndsWith(String),
Like { pattern: String, escape: Option<String> },
ReplaceWithBackrefs { pattern: String, replacement: String },
Slice(StringSliceOptions),
}
pub struct ExprStringNamespace(pub(super) Expr);
impl ExprStringNamespace {
pub fn lower(self) -> Expr {
Expr::StringOp { input: Box::new(self.0), op: StringOperator::Lower }
}
pub fn upper(self) -> Expr {
Expr::StringOp { input: Box::new(self.0), op: StringOperator::Upper }
}
pub fn strip(self) -> Expr {
self.strip_chars("")
}
pub fn strip_chars(self, to_strip: impl Into<String>) -> Expr {
Expr::StringOp { input: Box::new(self.0), op: StringOperator::Strip(to_strip.into()) }
}
pub fn lstrip(self) -> Expr {
self.lstrip_chars("")
}
pub fn lstrip_chars(self, to_strip: impl Into<String>) -> Expr {
Expr::StringOp { input: Box::new(self.0), op: StringOperator::LStrip(to_strip.into()) }
}
pub fn rstrip(self) -> Expr {
self.rstrip_chars("")
}
pub fn rstrip_chars(self, to_strip: impl Into<String>) -> Expr {
Expr::StringOp { input: Box::new(self.0), op: StringOperator::RStrip(to_strip.into()) }
}
pub fn len(self) -> Expr {
Expr::StringOp { input: Box::new(self.0), op: StringOperator::Len }
}
pub fn byte_count(self) -> Expr {
Expr::StringOp { input: Box::new(self.0), op: StringOperator::ByteCount }
}
pub fn contains(self, pat: impl Into<String>) -> Expr {
Expr::StringOp { input: Box::new(self.0), op: StringOperator::Contains(pat.into()) }
}
pub fn starts_with(self, pat: impl Into<String>) -> Expr {
Expr::StringOp { input: Box::new(self.0), op: StringOperator::StartsWith(pat.into()) }
}
pub fn ends_with(self, pat: impl Into<String>) -> Expr {
Expr::StringOp { input: Box::new(self.0), op: StringOperator::EndsWith(pat.into()) }
}
pub fn like(self, pattern: impl Into<String>) -> Expr {
Expr::StringOp { input: Box::new(self.0), op: StringOperator::Like { pattern: pattern.into(), escape: None } }
}
pub fn like_escape(self, pattern: impl Into<String>, escape: impl Into<String>) -> Expr {
Expr::StringOp {
input: Box::new(self.0),
op: StringOperator::Like { pattern: pattern.into(), escape: Some(escape.into()) },
}
}
pub fn replace_with_backrefs(self, pattern: impl Into<String>, replacement: impl Into<String>) -> Expr {
Expr::StringOp {
input: Box::new(self.0),
op: StringOperator::ReplaceWithBackrefs { pattern: pattern.into(), replacement: replacement.into() },
}
}
pub fn slice(self, options: StringSliceOptions) -> Expr {
Expr::StringOp { input: Box::new(self.0), op: StringOperator::Slice(options) }
}
}