catgirl-cooking/src/main.rs

105 lines
3.2 KiB
Rust

use build_html::{self, Container, ContainerType, Html, HtmlContainer};
use uuid::Uuid;
mod captcha;
mod io;
mod networking;
mod structures;
mod tests;
#[macro_use]
extern crate rocket;
use rocket::fairing::{Fairing, Info, Kind};
use rocket::fs::FileServer;
use rocket::{http::Header, Request, Response};
use crate::captcha::*;
use crate::networking::*;
fn construct_main_page() {
// Create the footer
let footer = Container::new(ContainerType::Footer)
.with_raw(r#"<hr>"#) // Line seperator
.with_link("/", "home") // Link to the root page
.with_link("/submit.html", "submit recipe") // Link to submission form
.with_link("/rss.xml", "rss") // Link the the Atom feed
// License info
.with_paragraph("Software licensed under the CNPLv7+")
.with_paragraph("Recipes under Public Domain");
// Create (test) lists of tags & recipes
let tags: Vec<&str> = vec!["breakfast", "apples", "cheese", "vegan", "vegetarian"];
let recipes = io::db_get_all_recipes();
// Create HTML string of tags
let mut tags_html = String::new(); // Create custom html string for tags
tags_html.push_str(r#"<p>Tags: "#); // Begin paragraph element
for x in tags {
// Go through the list of tags
tags_html.push_str(format!("<a href='{}'>{}</a>,", x, x).as_str()); // Append the tags as a link
}
tags_html.push_str(r#"</p>"#); // End the paragraph
// Recipes
let mut recipes_container = Container::new(ContainerType::UnorderedList);
for i in recipes {
let mut link = String::new();
link.push_str("/");
link.push_str(&i.shortcode);
recipes_container.add_link(link, &i.name);
}
// Create home page
let home_page = build_html::HtmlPage::new()
.with_head_link("favicon.ico", "icon") // Favicon
.with_stylesheet("style.css") // Link stylesheet
.with_meta(vec![("charset", "UTF-8")])
.with_meta(vec![
("name", "viewport"),
("content", "width=device-width, initial-scale=1"),
]) // Display stuff
.with_meta(vec![
("name", "description"),
("content", structures::DESCRIPTION),
]) // Add the description
.with_title(structures::TITLE)
.with_header(1, structures::HEADER)
.with_raw(r#"<hr>"#)
.with_paragraph(structures::DESCRIPTION)
.with_paragraph(structures::DETAILS)
.with_raw(r#"<i>"#)
.with_raw(tags_html)
.with_raw(r#"</i>"#) // End the italics
.with_header(2, "Recipes:")
.with_container(recipes_container)
.with_container(footer);
// Create the main page file
io::write_html(home_page.to_html_string(), "en", None);
}
fn rebuild() {
construct_main_page();
for i in io::db_get_all_recipes() {
i.construct_page();
}
io::write_feed("en");
}
#[launch]
fn rocket() -> _ {
rebuild();
// Launch rocket
let _config = sled::Config::default()
.use_compression(true)
.compression_factor(15);
rocket::build()
.mount(
"/api",
routes![test, return_captcha, check_captcha, new_recipe],
)
.mount("/", FileServer::from("static/en/"))
}