use std::{fmt::Display, marker::PhantomData};
use crate::formatter::{FmtGroupStart, FmtListGroupStart};
#[derive(Debug, Default, Clone, Copy, Hash, PartialEq, Eq)]
pub struct FromGroupKey;
#[derive(Debug, Default, Clone, Copy, Hash, PartialEq, Eq)]
pub struct FromGroupCtx;
#[derive(Debug, Default, Clone, Hash, PartialEq, Eq)]
pub struct GroupLabel<M> {
marker: PhantomData<M>,
pub label: String,
}
impl<'g, GroupKey: Display, GroupCtx> From<&FmtGroupStart<'g, GroupKey, GroupCtx>>
for GroupLabel<FromGroupKey>
{
fn from(value: &FmtGroupStart<'g, GroupKey, GroupCtx>) -> Self {
GroupLabel {
marker: PhantomData,
label: value.key.to_string(),
}
}
}
impl<'g, GroupKey: Display, GroupCtx> From<&FmtListGroupStart<'g, GroupKey, GroupCtx>>
for GroupLabel<FromGroupKey>
{
fn from(value: &FmtListGroupStart<'g, GroupKey, GroupCtx>) -> Self {
GroupLabel {
marker: PhantomData,
label: value.key.to_string(),
}
}
}
impl<GroupKey: Display, GroupCtx> From<(&GroupKey, Option<&GroupCtx>)>
for GroupLabel<FromGroupKey>
{
fn from(value: (&GroupKey, Option<&GroupCtx>)) -> Self {
GroupLabel {
marker: PhantomData,
label: value.0.to_string(),
}
}
}
impl<'g, GroupKey, GroupCtx: Display> From<&FmtGroupStart<'g, GroupKey, GroupCtx>>
for GroupLabel<FromGroupCtx>
{
fn from(value: &FmtGroupStart<'g, GroupKey, GroupCtx>) -> Self {
GroupLabel {
marker: PhantomData,
label: value.ctx.map(|ctx| ctx.to_string()).unwrap_or_default(),
}
}
}
impl<'g, GroupKey, GroupCtx: Display> From<&FmtListGroupStart<'g, GroupKey, GroupCtx>>
for GroupLabel<FromGroupCtx>
{
fn from(value: &FmtListGroupStart<'g, GroupKey, GroupCtx>) -> Self {
GroupLabel {
marker: PhantomData,
label: value.ctx.map(|ctx| ctx.to_string()).unwrap_or_default(),
}
}
}
impl<GroupKey, GroupCtx: Display> From<(&GroupKey, Option<&GroupCtx>)>
for GroupLabel<FromGroupCtx>
{
fn from(value: (&GroupKey, Option<&GroupCtx>)) -> Self {
GroupLabel {
marker: PhantomData,
label: value.1.map(|ctx| ctx.to_string()).unwrap_or_default(),
}
}
}
impl<M> Display for GroupLabel<M> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(&self.label)
}
}