#[cfg(feature = "alloc")]
use alloc::string::String;
#[cfg(feature = "alloc")]
use core::fmt;
use crate::error;
use crate::format_description::Component;
#[non_exhaustive]
#[cfg_attr(not(feature = "alloc"), derive(Debug))]
#[derive(Clone, Eq)]
pub enum BorrowedFormatItem<'a> {
#[deprecated(
since = "0.3.48",
note = "use `StringLiteral` instead; raw bytes are not recommended"
)]
Literal(&'a [u8]),
StringLiteral(&'a str),
Component(Component),
Compound(&'a [Self]),
Optional(&'a Self),
First(&'a [Self]),
}
#[cfg(feature = "alloc")]
impl fmt::Debug for BorrowedFormatItem<'_> {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
#[expect(deprecated)]
Self::Literal(literal) => f.write_str(&String::from_utf8_lossy(literal)),
Self::StringLiteral(literal) => f.write_str(literal),
Self::Component(component) => component.fmt(f),
Self::Compound(compound) => compound.fmt(f),
Self::Optional(item) => f.debug_tuple("Optional").field(item).finish(),
Self::First(items) => f.debug_tuple("First").field(items).finish(),
}
}
}
impl PartialEq for BorrowedFormatItem<'_> {
fn eq(&self, other: &Self) -> bool {
match (self, other) {
#[expect(deprecated)]
(Self::Literal(a), Self::Literal(b)) => a == b,
(Self::StringLiteral(a), Self::StringLiteral(b)) => a == b,
(Self::Component(a), Self::Component(b)) => a == b,
(Self::Compound(a), Self::Compound(b)) => a == b,
(Self::Optional(a), Self::Optional(b)) => a == b,
(Self::First(a), Self::First(b)) => a == b,
#[expect(deprecated)]
(Self::Literal(a), Self::StringLiteral(b)) => *a == b.as_bytes(),
#[expect(deprecated)]
(Self::StringLiteral(a), Self::Literal(b)) => a.as_bytes() == *b,
_ => false,
}
}
}
impl From<Component> for BorrowedFormatItem<'_> {
#[inline]
fn from(component: Component) -> Self {
Self::Component(component)
}
}
impl TryFrom<BorrowedFormatItem<'_>> for Component {
type Error = error::DifferentVariant;
#[inline]
fn try_from(value: BorrowedFormatItem<'_>) -> Result<Self, Self::Error> {
match value {
BorrowedFormatItem::Component(component) => Ok(component),
_ => Err(error::DifferentVariant),
}
}
}
impl<'a> From<&'a [BorrowedFormatItem<'_>]> for BorrowedFormatItem<'a> {
#[inline]
fn from(items: &'a [BorrowedFormatItem<'_>]) -> Self {
Self::Compound(items)
}
}
impl<'a> TryFrom<BorrowedFormatItem<'a>> for &[BorrowedFormatItem<'a>] {
type Error = error::DifferentVariant;
#[inline]
fn try_from(value: BorrowedFormatItem<'a>) -> Result<Self, Self::Error> {
match value {
BorrowedFormatItem::Compound(items) => Ok(items),
_ => Err(error::DifferentVariant),
}
}
}
impl PartialEq<Component> for BorrowedFormatItem<'_> {
#[inline]
fn eq(&self, rhs: &Component) -> bool {
matches!(self, Self::Component(component) if component == rhs)
}
}
impl PartialEq<BorrowedFormatItem<'_>> for Component {
#[inline]
fn eq(&self, rhs: &BorrowedFormatItem<'_>) -> bool {
rhs == self
}
}
impl PartialEq<&[Self]> for BorrowedFormatItem<'_> {
#[inline]
fn eq(&self, rhs: &&[Self]) -> bool {
matches!(self, Self::Compound(compound) if compound == rhs)
}
}
impl PartialEq<BorrowedFormatItem<'_>> for &[BorrowedFormatItem<'_>] {
#[inline]
fn eq(&self, rhs: &BorrowedFormatItem<'_>) -> bool {
rhs == self
}
}