]> luflow.net public git repositories - flow-web.git/blob - src/site.rs
Initial commit.
[flow-web.git] / src / site.rs
1 // luflow.net web site
2 // AGPL-3.0 License (see LICENSE)
3
4 pub mod blog;
5 pub mod blog_post;
6 pub mod core;
7 pub mod helper;
8 pub mod screenshot;
9 pub mod screenshots;
10
11 use rich_rust::console::Console;
12 use rich_rust::interactive::Status;
13
14 use std::path::PathBuf;
15 use std::time::Instant;
16
17 use crate::site::blog::BlogShared;
18 use crate::site::blog::generate_blog;
19 use crate::site::blog::get_latest_blog_posts;
20 use crate::site::core::CoreShared;
21 use crate::site::core::generate_core;
22 use crate::site::core::generate_root_index;
23 use crate::site::helper::Helper;
24 use crate::site::screenshots::ScreenshotsShared;
25 use crate::site::screenshots::generate_screenshots;
26
27 fn init_logger() {
28 fern::Dispatch::new()
29 .format(|out, message, record| out.finish(format_args!("[{}] {}", record.level(), message)))
30 .level(log::LevelFilter::Debug)
31 .chain(
32 std::fs::OpenOptions::new()
33 .create(true)
34 .write(true)
35 .truncate(true)
36 .append(false)
37 .open("flow-web.log")
38 .unwrap(),
39 )
40 .apply()
41 .unwrap();
42 }
43
44 pub async fn generate_site() {
45 // make sure 'templates', 'screenshots' and 'blog-posts' dirs exists:
46 // (this tool must be executed in root folder)
47 if !Helper::exists_dir(&PathBuf::new().join("blog-posts"))
48 || !Helper::exists_dir(&PathBuf::new().join("screenshots"))
49 || !Helper::exists_dir(&PathBuf::new().join("templates"))
50 {
51 panic!(
52 "flow-web must be executed in root folder where 'blog-posts', 'screenshots' and
53 'templates' folders reside. Use command 'cargo run --release' in root folder."
54 );
55 }
56
57 let start_time = Instant::now();
58
59 // init rich_rust:
60 let console = Console::new().shared();
61 if let Ok(_status) = Status::new(&console, "Generating site...") {
62 // init logger:
63 init_logger();
64
65 // remove old output dir if exists:
66 if Helper::exists_dir(&Helper::get_output_dir()) {
67 Helper::remove_dir_all(&Helper::get_output_dir());
68 }
69
70 // generate core pages:
71 let core_shared = CoreShared::new().shared();
72 let core_handle = tokio::spawn(generate_core());
73
74 // generate screenshot pages:
75 let screenshots_shared = ScreenshotsShared::new().shared();
76 let screenshots_handle = tokio::spawn(generate_screenshots(screenshots_shared.clone()));
77
78 // generate blog pages:
79 let blog_base_dir = "blog";
80 let blog_shared = BlogShared::new(String::from(blog_base_dir), 20).shared();
81 let blog_handle = tokio::spawn(generate_blog(
82 blog_shared.clone(),
83 String::from(blog_base_dir),
84 ));
85
86 // wait until blog and screenshots are generated:
87 screenshots_handle.await.unwrap();
88 blog_handle.await.unwrap();
89
90 // generate core index page now when we've all data we need:
91 core_shared.set_core_index_data(
92 String::from(blog_base_dir),
93 get_latest_blog_posts(blog_shared.clone(), 3),
94 screenshots_shared.get_screenshots(6, "HFGE Screenshots"),
95 );
96 let core_index_handle = tokio::spawn(generate_root_index(core_shared.clone()));
97
98 // wait until core is fully done:
99 core_handle.await.unwrap();
100 core_index_handle.await.unwrap();
101 }
102
103 console.print("[dim]See 'output' folder for generated files..[/]");
104 console.print("[dim]Serve locally example: 'servez output'[/]");
105 console.print("");
106 console.print(&format!(
107 "[dim]Completed in {:.1}s[/]",
108 start_time.elapsed().as_secs_f64()
109 ));
110 console.print("[green]Generation completed successfully![/]");
111 }