use super::{AsSpan, IntoComponents, IntoSpan, SimpleSpan};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Ord, PartialOrd, Hash)]
pub struct Delimited<Open, Close, Data, S = SimpleSpan> {
pub(super) open: Open,
pub(super) close: Close,
pub(super) span: S,
pub(super) data: Data,
}
impl<Open, Close, Data, S> AsRef<S> for Delimited<Open, Close, Data, S> {
#[cfg_attr(not(tarpaulin), inline(always))]
fn as_ref(&self) -> &S {
self.span_ref()
}
}
impl<Open, Close, Data, S> AsSpan<S> for Delimited<Open, Close, Data, S> {
#[cfg_attr(not(tarpaulin), inline(always))]
fn as_span(&self) -> &S {
AsRef::as_ref(self)
}
}
impl<Open, Close, Data, S> IntoSpan<S> for Delimited<Open, Close, Data, S> {
#[cfg_attr(not(tarpaulin), inline(always))]
fn into_span(self) -> S {
self.span
}
}
impl<Open, Close, Data, S> core::ops::Deref for Delimited<Open, Close, Data, S> {
type Target = Data;
#[cfg_attr(not(tarpaulin), inline(always))]
fn deref(&self) -> &Self::Target {
&self.data
}
}
impl<Open, Close, Data, S> core::ops::DerefMut for Delimited<Open, Close, Data, S> {
#[cfg_attr(not(tarpaulin), inline(always))]
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.data
}
}
impl<Open, Close, Data, S> core::fmt::Display for Delimited<Open, Close, Data, S>
where
Data: core::fmt::Display,
{
#[cfg_attr(not(tarpaulin), inline(always))]
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
self.data.fmt(f)
}
}
impl<Open, Close, Data, S> core::error::Error for Delimited<Open, Close, Data, S>
where
Data: core::error::Error,
Open: core::fmt::Debug,
Close: core::fmt::Debug,
S: core::fmt::Debug,
{
}
impl<Open, Close, Data, S> IntoComponents for Delimited<Open, Close, Data, S> {
type Components = (S, Open, Close, Data);
#[cfg_attr(not(tarpaulin), inline(always))]
fn into_components(self) -> Self::Components {
(self.span, self.open, self.close, self.data)
}
}
impl<Open, Close, Data, S> Delimited<&Open, &Close, &Data, &S> {
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn copied(&self) -> Delimited<Open, Close, Data, S>
where
Open: Copy,
Close: Copy,
Data: Copy,
S: Copy,
{
Delimited {
open: *self.open,
close: *self.close,
span: *self.span,
data: *self.data,
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn cloned(&self) -> Delimited<Open, Close, Data, S>
where
Open: Clone,
Close: Clone,
Data: Clone,
S: Clone,
{
self.map(Clone::clone, Clone::clone, Clone::clone, Clone::clone)
}
}
impl<Open, Close, Data, S> Delimited<Open, Close, Data, S> {
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn new(open: Open, close: Close, data: Data, span: S) -> Self {
Self {
open,
close,
span,
data,
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn open(&self) -> Open
where
Open: Copy,
{
self.open
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn open_ref(&self) -> &Open {
&self.open
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn open_mut(&mut self) -> &mut Open {
&mut self.open
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn close(&self) -> Close
where
Close: Copy,
{
self.close
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn close_ref(&self) -> &Close {
&self.close
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn close_mut(&mut self) -> &mut Close {
&mut self.close
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn span(&self) -> S
where
S: Copy,
{
self.span
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn span_ref(&self) -> &S {
&self.span
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn span_mut(&mut self) -> &mut S {
&mut self.span
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn data(&self) -> &Data {
&self.data
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn data_mut(&mut self) -> &mut Data {
&mut self.data
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn as_ref(&self) -> Delimited<&Open, &Close, &Data, &S> {
Delimited {
open: &self.open,
close: &self.close,
span: &self.span,
data: &self.data,
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn as_mut(&mut self) -> Delimited<&mut Open, &mut Close, &mut Data, &mut S> {
Delimited {
open: &mut self.open,
close: &mut self.close,
span: &mut self.span,
data: &mut self.data,
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn into_open(self) -> Open {
self.open
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn into_close(self) -> Close {
self.close
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn into_span(self) -> S {
self.span
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn into_data(self) -> Data {
self.data
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn into_components(self) -> (S, Open, Close, Data) {
(self.span, self.open, self.close, self.data)
}
#[inline]
pub fn map_data<F, U>(self, f: F) -> Delimited<Open, Close, U, S>
where
F: FnOnce(Data) -> U,
{
Delimited {
open: self.open,
close: self.close,
span: self.span,
data: f(self.data),
}
}
#[inline]
pub fn map_open<F, O>(self, f: F) -> Delimited<O, Close, Data, S>
where
F: FnOnce(Open) -> O,
{
Delimited {
open: f(self.open),
close: self.close,
span: self.span,
data: self.data,
}
}
#[inline]
pub fn map_close<F, C>(self, f: F) -> Delimited<Open, C, Data, S>
where
F: FnOnce(Close) -> C,
{
Delimited {
open: self.open,
close: f(self.close),
span: self.span,
data: self.data,
}
}
#[inline]
pub fn map_span<F, T>(self, f: F) -> Delimited<Open, Close, Data, T>
where
F: FnOnce(S) -> T,
{
Delimited {
open: self.open,
close: self.close,
span: f(self.span),
data: self.data,
}
}
#[inline]
pub fn map<FO, FC, FD, FS, O, C, U, T>(
self,
fo: FO,
fc: FC,
fd: FD,
fs: FS,
) -> Delimited<O, C, U, T>
where
FO: FnOnce(Open) -> O,
FC: FnOnce(Close) -> C,
FD: FnOnce(Data) -> U,
FS: FnOnce(S) -> T,
{
Delimited {
open: fo(self.open),
close: fc(self.close),
span: fs(self.span),
data: fd(self.data),
}
}
}