1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
use crate::error::TelescopeError;
use crate::templates::navbar::Navbar;
use crate::templates::tags::Tags;
use crate::templates::Template;
use actix_web::{HttpRequest, HttpResponse, Responder};
use futures::future::{ready, Ready};
#[derive(Clone, Serialize, Deserialize, Debug)]
pub struct Page {
pub title: String,
pub navbar: Navbar,
pub content: Template,
version: String,
pub ogp_tags: Tags,
}
impl Page {
const TEMPLATE_PATH: &'static str = "page";
pub async fn new(
request: &HttpRequest,
title: impl Into<String>,
content: Template,
) -> Result<Self, TelescopeError> {
Ok(Page {
title: title.into(),
navbar: Navbar::for_request(request).await?,
content,
version: env!("CARGO_PKG_VERSION").to_string(),
ogp_tags: Tags::for_request(request),
})
}
pub fn as_template(&self) -> Result<Template, TelescopeError> {
let content_rendered: String = self.content.render()?;
let mut template = Template::new(Self::TEMPLATE_PATH);
template.fields = json!(&self);
template["content"] = json!(content_rendered);
return Ok(template);
}
pub fn render(&self) -> Result<String, TelescopeError> {
self.as_template()?.render()
}
}
impl Responder for Page {
type Error = TelescopeError;
type Future = Ready<Result<HttpResponse, Self::Error>>;
fn respond_to(self, req: &HttpRequest) -> Self::Future {
match self.as_template() {
Ok(template) => template.respond_to(req),
Err(err) => ready(Err(err)),
}
}
}