technoduck
Blog | Git | Files | [WIP] |
About | PGP | Mail

Full website Re-Update

New Website?

Rust

The time has come and another re-write is upon us.

This time inspied by this article, theprimeagen, and everpresent desire to rewrite everything in Rust, the new website is a complete rewrite using rust and adjacent techniques.

Using only

[dependencies]
askama = { version = "0.12.1", features = ["with-axum"] }
askama_axum = "0.4.0"
axum = "0.7.5"
comrak = "0.27.0"
markdown-parser = "0.1.2"
rand = "0.8.5"
serde = { version = "1.0.209", features = ["derive"] }
serde_yaml = "0.9.34"
tokio = { version = "1.39.3", features = ["macros", "rt-multi-thread"] }
tower-http = { version = "0.5.2", features = ["fs"] }

as dependencies in the end we get a clean~ish, 2.8MB executable.

All markdown compilation gets done every time page is loaded, which is sub-optimal, But reading time for all posts is non-significant compared to other loading times.

And voila, there is the new post.

Update

This approach however had few issues. As fun as it is writing your own routing logic, It feels purely unnecessary.

Even scaling down from axum to tiny_http, it doesn't change the binary size, and because of the limited resources and location of the VPS, it does not affect the load times.

Short of rewriting it all in Yew and loading the wasm as a SPA (which comes with it's own complexity) loading times would not improve.

Therefore the goal has been slightly changed. From serving the files the goal is now using askama like a sort of static site generator.

DIY Hugo?

Not exactly. In the current state it is basically Saait again, but with extra steps. Additional pages require source code intervention, which isn't hard, but tidious.

//TODO: use some enum for pages, with derive as EnumString, so new pages can be added simply by adding a template.

But for now, the new dependencies now look like this:

[dependencies]
askama = { version = "0.12.1" }
comrak = "0.27.0"
markdown-parser = "0.1.2"
rand = "0.8.5"
serde = { version = "1.0.209", features = ["derive"] }
serde_yaml = "0.9.34"
syntect = "5.2.0"

Syntect providing oh so nice code highlighting in the markdown.

{
  "firstName": "John",
  "lastName": "Smith",
  "age": 25
}

std::fs::write(format!("{output_path}/index.html"), handlers::index().as_bytes()).expect("Couldnt write index file");
std::fs::write(format!("{output_path}/about.html"), handlers::about().as_bytes()).expect("Couldnt write about file");
std::fs::write(format!("{output_path}/404.html"), handlers::not_found().as_bytes()).expect("Couldnt write 404 file");


for entry in post_dir_iter {
    if let Ok(entry) = entry {

        let filename = entry.file_name().into_string().unwrap().split(".").collect::<Vec<_>>()[0].to_string();

        fs::write(format!("{output_path}/blog/{filename}.html"), handlers::blog(filename).as_bytes()).expect("Couldnt write blog entry");
    };

}

For now, I am rather happy with the result.

Built for release profile, binary is just 3.1M (majority of it is syntact), and produces a output folder with it's contents in a rather pleasant amount of time.

./target/release/rusty_duck 0.03s user 0.01s system 97% cpu 0.035 total

This is no BLAZING speed, but it's honest work.