use crate::__private::{IncomingField, IncomingName};
use crate::field_ref::IntoField;
use crate::{FieldSection, StaticTableEntry};
use std::fmt;
pub enum FieldName<'a, S> {
Text(&'a str),
Indexed(StaticTableEntry<S>),
}
impl<'a, S> FieldName<'a, S> {
pub fn as_str(&self) -> &'a str {
match self {
Self::Text(name) => name,
Self::Indexed(entry) => entry.name(),
}
}
}
impl<S> Clone for FieldName<'_, S> {
fn clone(&self) -> Self {
*self
}
}
impl<S> Copy for FieldName<'_, S> {}
impl<S> PartialEq for FieldName<'_, S> {
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(Self::Text(left), Self::Text(right)) => left == right,
(Self::Indexed(left), Self::Indexed(right)) => left == right,
_ => false,
}
}
}
impl<S> Eq for FieldName<'_, S> {}
impl<S> fmt::Debug for FieldName<'_, S> {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Text(name) => formatter.debug_tuple("Text").field(name).finish(),
Self::Indexed(entry) => formatter.debug_tuple("Indexed").field(entry).finish(),
}
}
}
impl<'a, S: FieldSection<'a>> IntoField<'a, S> for (FieldName<'a, S::Identity>, &'a [u8]) {
fn into_field(self, index: usize) -> IncomingField<'a> {
let name = match self.0 {
FieldName::Text(name) => IncomingName::Text(name),
FieldName::Indexed(entry) => entry.incoming_name(),
};
IncomingField {
position: index,
name,
value: self.1,
}
}
}