use anyhow::Result;
use crate::{
internal::{type_of, FnStr},
ParserOptions, PathRegex, TryIntoWith,
};
#[cfg(feature = "match")]
use crate::MatcherOptions;
#[derive(Clone)]
pub struct PathRegexOptions {
pub delimiter: String,
pub prefixes: String,
pub sensitive: bool,
pub strict: bool,
pub end: bool,
pub start: bool,
pub ends_with: String,
pub encode: FnStr,
}
impl Default for PathRegexOptions {
fn default() -> Self {
let ParserOptions {
delimiter,
prefixes,
} = ParserOptions::default();
Self {
delimiter,
prefixes,
sensitive: false,
strict: false,
end: true,
start: true,
ends_with: "".to_owned(),
encode: |x| x.to_owned(),
}
}
}
#[cfg(feature = "match")]
impl From<MatcherOptions> for PathRegexOptions {
#[inline]
fn from(options: MatcherOptions) -> Self {
let MatcherOptions {
delimiter,
prefixes,
sensitive,
strict,
end,
start,
ends_with,
encode,
..
} = options;
Self {
delimiter,
prefixes,
sensitive,
strict,
end,
start,
ends_with,
encode,
}
}
}
impl std::fmt::Display for PathRegexOptions {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Debug::fmt(&self, f)
}
}
impl std::fmt::Debug for PathRegexOptions {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("PathRegexOptions")
.field("delimiter", &self.delimiter)
.field("prefixes", &self.prefixes)
.field("sensitive", &self.sensitive)
.field("strict", &self.strict)
.field("end", &self.end)
.field("start", &self.start)
.field("ends_with", &self.ends_with)
.field("encode", &type_of(self.encode))
.finish()
}
}
pub struct PathRegexBuilder<S> {
source: S,
options: PathRegexOptions,
}
impl<S> PathRegexBuilder<S>
where
S: TryIntoWith<PathRegex, PathRegexOptions>,
{
pub fn new(source: S) -> Self {
Self {
source,
options: Default::default(),
}
}
pub fn new_with_options(source: S, options: PathRegexOptions) -> Self {
Self { source, options }
}
pub fn build(&self) -> Result<PathRegex> {
self.source.clone().try_into_with(&self.options)
}
pub fn set_prefixes(&mut self, prefixes: impl AsRef<str>) -> &mut Self {
self.options.prefixes = prefixes.as_ref().to_owned();
self
}
pub fn set_sensitive(&mut self, yes: bool) -> &mut Self {
self.options.sensitive = yes;
self
}
pub fn set_strict(&mut self, yes: bool) -> &mut Self {
self.options.strict = yes;
self
}
pub fn set_end(&mut self, yes: bool) -> &mut Self {
self.options.end = yes;
self
}
pub fn set_start(&mut self, yes: bool) -> &mut Self {
self.options.start = yes;
self
}
pub fn set_delimiter(&mut self, de: impl AsRef<str>) -> &mut Self {
self.options.delimiter = de.as_ref().to_owned();
self
}
pub fn set_ends_with(&mut self, end: impl AsRef<str>) -> &mut Self {
self.options.ends_with = end.as_ref().to_owned();
self
}
pub fn set_encode(&mut self, encode: FnStr) -> &mut Self {
self.options.encode = encode;
self
}
}