2 // AGPL-3.0 License (see LICENSE)
11 use rich_rust::console::Console;
12 use rich_rust::interactive::Status;
14 use std::path::PathBuf;
15 use std::time::Instant;
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;
29 .format(|out, message, record| out.finish(format_args!("[{}] {}", record.level(), message)))
30 .level(log::LevelFilter::Debug)
32 std::fs::OpenOptions::new()
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"))
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."
57 let start_time = Instant::now();
60 let console = Console::new().shared();
61 if let Ok(_status) = Status::new(&console, "Generating site...") {
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());
70 // generate core pages:
71 let core_shared = CoreShared::new().shared();
72 let core_handle = tokio::spawn(generate_core());
74 // generate screenshot pages:
75 let screenshots_shared = ScreenshotsShared::new().shared();
76 let screenshots_handle = tokio::spawn(generate_screenshots(screenshots_shared.clone()));
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(
83 String::from(blog_base_dir),
86 // wait until blog and screenshots are generated:
87 screenshots_handle.await.unwrap();
88 blog_handle.await.unwrap();
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"),
96 let core_index_handle = tokio::spawn(generate_root_index(core_shared.clone()));
98 // wait until core is fully done:
99 core_handle.await.unwrap();
100 core_index_handle.await.unwrap();
103 console.print("[dim]See 'output' folder for generated files..[/]");
104 console.print("[dim]Serve locally example: 'servez output'[/]");
106 console.print(&format!(
107 "[dim]Completed in {:.1}s[/]",
108 start_time.elapsed().as_secs_f64()
110 console.print("[green]Generation completed successfully![/]");