use std::ops::Deref;
use serde::{Serialize, ser::Serializer};
use super::inlines::InlineNode;
#[derive(Clone, Debug, Default, PartialEq)]
#[non_exhaustive]
pub struct Attribution<'a>(Vec<InlineNode<'a>>);
impl Serialize for Attribution<'_> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
self.0.serialize(serializer)
}
}
impl<'a> Attribution<'a> {
#[must_use]
pub fn new(inlines: Vec<InlineNode<'a>>) -> Self {
Self(inlines)
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
#[must_use]
pub fn len(&self) -> usize {
self.0.len()
}
}
impl<'a> From<Vec<InlineNode<'a>>> for Attribution<'a> {
fn from(inlines: Vec<InlineNode<'a>>) -> Self {
Self(inlines)
}
}
impl<'a> AsRef<[InlineNode<'a>]> for Attribution<'a> {
fn as_ref(&self) -> &[InlineNode<'a>] {
&self.0
}
}
impl<'a> Deref for Attribution<'a> {
type Target = [InlineNode<'a>];
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl<'a, 'b> IntoIterator for &'b Attribution<'a> {
type Item = &'b InlineNode<'a>;
type IntoIter = std::slice::Iter<'b, InlineNode<'a>>;
fn into_iter(self) -> Self::IntoIter {
self.0.iter()
}
}
#[derive(Clone, Debug, Default, PartialEq)]
#[non_exhaustive]
pub struct CiteTitle<'a>(Vec<InlineNode<'a>>);
impl Serialize for CiteTitle<'_> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
self.0.serialize(serializer)
}
}
impl<'a> CiteTitle<'a> {
#[must_use]
pub fn new(inlines: Vec<InlineNode<'a>>) -> Self {
Self(inlines)
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
#[must_use]
pub fn len(&self) -> usize {
self.0.len()
}
}
impl<'a> From<Vec<InlineNode<'a>>> for CiteTitle<'a> {
fn from(inlines: Vec<InlineNode<'a>>) -> Self {
Self(inlines)
}
}
impl<'a> AsRef<[InlineNode<'a>]> for CiteTitle<'a> {
fn as_ref(&self) -> &[InlineNode<'a>] {
&self.0
}
}
impl<'a> Deref for CiteTitle<'a> {
type Target = [InlineNode<'a>];
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl<'a, 'b> IntoIterator for &'b CiteTitle<'a> {
type Item = &'b InlineNode<'a>;
type IntoIter = std::slice::Iter<'b, InlineNode<'a>>;
fn into_iter(self) -> Self::IntoIter {
self.0.iter()
}
}