#![doc = include_str!("../examples/all_methods.rs")]
mod error;
use regex::{self, Regex};
use std::fmt::Display;
use std::str::FromStr;
pub use self::error::{CaptureError, Group, Result};
pub struct Captures<'a>(regex::Captures<'a>);
impl<'a> Captures<'a> {
pub fn new<'b: 'a>(regex: &'a Regex, s: &'b str) -> Result<Captures<'a>> {
Ok(Captures(
regex
.captures(s)
.ok_or_else(|| CaptureError::no_match(regex, s))?,
))
}
pub fn get<A: From<&'a str>>(&'a self, n: usize) -> Result<A> {
Ok(self.get_numeric_group(n)?.into())
}
pub fn parse_get<A>(&'a self, n: usize) -> Result<A>
where
A: FromStr,
A::Err: ToString,
{
self.get_numeric_group(n)?
.parse()
.map_err(|err| CaptureError::conversion_error(n, err))
}
pub fn try_get<A>(&'a self, n: usize) -> Result<A>
where
A: TryFrom<&'a str>,
A::Error: ToString,
{
self.get_numeric_group(n)?
.try_into()
.map_err(|err| CaptureError::conversion_error(n, err))
}
pub fn name<'b, A: From<&'a str>>(&'a self, name: &'b str) -> Result<A> {
Ok(self.get_named_group(name)?.into())
}
pub fn parse_name<'b, A>(&'a self, name: &'b str) -> Result<A>
where
A: FromStr,
A::Err: Display,
{
self.get_named_group(name)?
.parse()
.map_err(|err| CaptureError::conversion_error(name, err))
}
pub fn try_name<'b, A>(&'a self, name: &'b str) -> Result<A>
where
A: TryFrom<&'a str>,
A::Error: Display,
{
self.get_named_group(name)?
.try_into()
.map_err(|err| CaptureError::conversion_error(name, err))
}
fn get_numeric_group(&'a self, n: usize) -> Result<&str> {
Ok(self
.0
.get(n)
.ok_or_else(|| CaptureError::capture_group_not_found(n))?
.as_str())
}
fn get_named_group<'b>(&'a self, n: &'b str) -> Result<&str> {
Ok(self
.0
.name(n)
.ok_or_else(|| CaptureError::capture_group_not_found(n))?
.as_str())
}
}