Echo Writes Code

templates.rs

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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
use crate::errors::{ Result };
use crate::state::{ ApplicationState };

use serde::{ Serialize };

#[derive(Serialize)]
struct SiteContext {
	link: String,
	name: String,
	menu: Vec<LinkContext>,
	version: String,
}

#[derive(Serialize)]
struct ListContext {
	items: Vec<LinkContext>,
	name: String,
}

#[derive(Serialize)]
struct LinkContext {
	link: String,
	name: String,
}

#[derive(Serialize)]
struct PageContext {
	content: String,
	name: String,
}

pub(crate) fn index_context(state: &ApplicationState) -> Result<tera::Context> {
	let mut context = tera::Context::new();
	add_site_context(&mut context, state)?;
	add_page_context(&mut context, state, "_index")?;

	Ok(context)
}

pub(crate) fn list_context(state: &ApplicationState, list_path: &str) -> Result<tera::Context> {
	let mut context = tera::Context::new();
	add_site_context(&mut context, state)?;
	add_list_context(&mut context, state, list_path)?;

	Ok(context)
}

pub(crate) fn page_context(state: &ApplicationState, page_path: &str) -> Result<tera::Context> {
	let mut context = tera::Context::new();
	add_site_context(&mut context, state)?;
	add_page_context(&mut context, state, page_path)?;

	Ok(context)
}

fn add_site_context(context: &mut tera::Context, state: &ApplicationState) -> Result<()> {
	let menu = state.provider.site_menu()
		.iter()
		.map(|link| LinkContext {
			link: link.link.clone(),
			name: link.name.clone(),
		})
		.collect();

	let site_context = SiteContext {
		link: state.provider.site_link(),
		name: state.provider.site_name(),
		menu,
		version: env!("CARGO_PKG_VERSION").to_string(),
	};

	context.insert("site", &site_context);
	Ok(())
}

fn add_list_context(context: &mut tera::Context, state: &ApplicationState, list_path: &str) -> Result<()> {
	let list = state.provider.find_list(list_path)?;

	let items = state.provider.find_list_items(&list)
		.iter()
		.map(|item| LinkContext {
			link: format!("/page/{}", item.slug),
			name: item.name.clone(),
		}).collect();

	let name = list.name;

	let list_context = ListContext {
		items,
		name,
	};

	context.insert("list", &list_context);
	Ok(())
}

fn add_page_context(context: &mut tera::Context, state: &ApplicationState, page_path: &str) -> Result<()> {
	let page = state.provider.find_page(page_path)?;

	let content = state.provider.render_page(&page)?;
	let name = page.name;

	let page_context = PageContext {
		content,
		name,
	};

	context.insert("page", &page_context);
	Ok(())
}