use std::fmt;
use std::ops::Deref;
use crate::model::DateTime;
use crate::model::Entry;
use crate::render::Gazetta;
use super::Index;
pub struct BasePage<'a, G>
where
G: Gazetta + 'a,
G::PageMeta: 'a,
G::SiteMeta: 'a,
{
pub title: &'a str,
pub description: Option<&'a str>,
pub date: Option<&'a DateTime>,
pub updated: &'a DateTime,
pub href: &'a str,
pub meta: &'a G::PageMeta,
pub content: Content<'a>,
}
impl<'a, G> BasePage<'a, G>
where
G: Gazetta + 'a,
G::PageMeta: 'a,
G::SiteMeta: 'a,
{
pub fn for_entry(entry: &'a Entry<G::PageMeta>) -> Self {
BasePage {
title: &entry.title,
date: entry.date.as_ref(),
updated: &entry.updated,
description: entry.description.as_deref(),
content: Content {
data: &entry.content,
format: &entry.format,
},
href: &entry.name,
meta: &entry.meta,
}
}
}
impl<'a, G> Deref for BasePage<'a, G>
where
G: Gazetta + 'a,
G::PageMeta: 'a,
G::SiteMeta: 'a,
{
type Target = G::PageMeta;
fn deref(&self) -> &Self::Target {
self.meta
}
}
pub struct Page<'a, G>
where
G: Gazetta + 'a,
G::PageMeta: 'a,
G::SiteMeta: 'a,
{
pub base: BasePage<'a, G>,
pub index: Option<Index<'a, G>>,
pub references: &'a [BasePage<'a, G>],
}
impl<'a, G> Deref for Page<'a, G>
where
G: Gazetta + 'a,
G::PageMeta: 'a,
G::SiteMeta: 'a,
{
type Target = BasePage<'a, G>;
fn deref(&self) -> &Self::Target {
&self.base
}
}
#[derive(Copy, Clone, Debug)]
pub struct Content<'a> {
pub data: &'a str,
pub format: &'a str,
}
impl<'a, G> Copy for BasePage<'a, G>
where
G: Gazetta + 'a,
G::PageMeta: 'a,
G::SiteMeta: 'a,
{
}
impl<'a, G> Clone for BasePage<'a, G>
where
G: Gazetta + 'a,
G::PageMeta: 'a,
G::SiteMeta: 'a,
{
fn clone(&self) -> Self {
*self
}
}
impl<'a, G> Copy for Page<'a, G>
where
G: Gazetta + 'a,
G::PageMeta: 'a,
G::SiteMeta: 'a,
{
}
impl<'a, G> Clone for Page<'a, G>
where
G: Gazetta + 'a,
G::PageMeta: 'a,
G::SiteMeta: 'a,
{
fn clone(&self) -> Self {
*self
}
}
impl<'a, G> fmt::Debug for Page<'a, G>
where
G: Gazetta + 'a,
G::PageMeta: fmt::Debug + 'a,
G::SiteMeta: 'a,
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("Page")
.field("title", &self.title)
.field("date", &self.date)
.field("href", &self.href)
.field("index", &self.index)
.field("meta", &self.meta)
.field("content", &self.content)
.finish()
}
}