From 001e27418683f1a782d8902046a21c2371efdd80 Mon Sep 17 00:00:00 2001 From: jacekpoz Date: Fri, 13 Sep 2024 21:38:59 +0200 Subject: [PATCH] move webring data to webring.nix --- flake.nix | 6 ++++-- server/Cargo.lock | 15 ++++++++------ server/Cargo.toml | 2 ++ server/default.nix | 2 +- server/src/main.rs | 48 +++++++++++++++++++++++++++++++------------ server/src/members.rs | 16 --------------- site/default.nix | 22 ++++++++++++-------- site/index.css | 8 ++++++++ site/index.nix | 15 +++++++++++++- webring.nix | 4 ++++ 10 files changed, 91 insertions(+), 47 deletions(-) delete mode 100644 server/src/members.rs create mode 100644 webring.nix diff --git a/flake.nix b/flake.nix index c276cbd..5d5ee50 100644 --- a/flake.nix +++ b/flake.nix @@ -13,14 +13,16 @@ outputs = { nixpkgs, nte, self, systems, ... }: let forEachSystem = nixpkgs.lib.genAttrs (import systems); pkgsForEach = nixpkgs.legacyPackages; + + webringMembers = import ./webring.nix; in { packages = forEachSystem ( system: let pkgs = pkgsForEach.${system}; in { site = import ./site/default.nix { - inherit pkgs; - inherit (pkgs) jetbrains-mono lib; + inherit pkgs webringMembers; + inherit (pkgs) jetbrains-mono lib writeText; inherit (nte.functions.${system}) mkNteDerivation; }; server = import ./server/default.nix { diff --git a/server/Cargo.lock b/server/Cargo.lock index 8b78522..e1bd910 100644 --- a/server/Cargo.lock +++ b/server/Cargo.lock @@ -804,6 +804,8 @@ dependencies = [ "ntex", "ntex-files", "rand", + "serde", + "serde_json", ] [[package]] @@ -1383,18 +1385,18 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.204" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.204" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", @@ -1403,11 +1405,12 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.120" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] diff --git a/server/Cargo.toml b/server/Cargo.toml index 80cc0ea..af29611 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -7,4 +7,6 @@ edition = "2021" env_logger = "0.11.3" ntex = { version = "2.0.0", features = [ "tokio", "rustls" ] } ntex-files = "2.0.0" +serde = "1.0.210" +serde_json = "1.0.128" rand = "0.8.5" diff --git a/server/default.nix b/server/default.nix index 318728b..9479769 100644 --- a/server/default.nix +++ b/server/default.nix @@ -5,5 +5,5 @@ rustPlatform.buildRustPackage { src = ./.; - cargoHash = "sha256-O+rhWIjIBQdemTsFc1TV/lpKZpGE/IL7uPs3TP8KVu0="; + cargoHash = "sha256-v96+UzVjj44DOs4nFUR6+qyqI+0JwyQK+/5z/bi1J1o="; } diff --git a/server/src/main.rs b/server/src/main.rs index 892ab38..55d9dab 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -1,15 +1,24 @@ -mod members; +use std::fs::{self}; -use members::WEBRING_MEMBERS; use ntex::{http::{header, Response}, web::{self, middleware}}; use ntex_files as nfs; use ::rand::{thread_rng, Rng}; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Serialize, Deserialize)] +struct WebringMember { + name: String, + domain: String, +} #[web::get("/next/{name}")] -async fn next(name: web::types::Path) -> impl web::Responder { - if let Some((i, _)) = WEBRING_MEMBERS.iter().enumerate().find(|(_, member)| member.name == *name) { - let next_index = (i + 1) % WEBRING_MEMBERS.len(); - let next_domain = WEBRING_MEMBERS[next_index].domain; +async fn next( + members: web::types::State>, + name: web::types::Path, +) -> impl web::Responder { + if let Some((i, _)) = members.iter().enumerate().find(|(_, member)| member.name == *name) { + let next_index = (i + 1) % members.len(); + let next_domain = &members[next_index].domain; let next_url = format!("https://{next_domain}/"); return Response::PermanentRedirect() @@ -23,10 +32,13 @@ async fn next(name: web::types::Path) -> impl web::Responder { } #[web::get("/prev/{name}")] -async fn prev(name: web::types::Path) -> impl web::Responder { - if let Some((i, _)) = WEBRING_MEMBERS.iter().enumerate().find(|(_, member)| member.name == *name) { - let prev_index = if i == 0 { WEBRING_MEMBERS.len() - 1 } else { i - 1 }; - let prev_domain = WEBRING_MEMBERS[prev_index].domain; +async fn prev( + members: web::types::State>, + name: web::types::Path, +) -> impl web::Responder { + if let Some((i, _)) = members.iter().enumerate().find(|(_, member)| member.name == *name) { + let prev_index = if i == 0 { members.len() - 1 } else { i - 1 }; + let prev_domain = &members[prev_index].domain; let prev_url = format!("https://{prev_domain}/"); return Response::PermanentRedirect() @@ -40,9 +52,11 @@ async fn prev(name: web::types::Path) -> impl web::Responder { } #[web::get("/rand")] -async fn rand() -> impl web::Responder { - let rand_index = thread_rng().gen_range(0..WEBRING_MEMBERS.len()); - let rand_domain = WEBRING_MEMBERS[rand_index].domain; +async fn rand( + members: web::types::State>, +) -> impl web::Responder { + let rand_index = thread_rng().gen_range(0..members.len()); + let rand_domain = &members[rand_index].domain; let rand_url = format!("https://{rand_domain}/"); Response::PermanentRedirect() @@ -64,8 +78,16 @@ async fn main() -> std::io::Result<()> { .expect("NIX_WEBRING_PORT has to be u16"); web::server(move || { + let path = format!("{nix_webring_dir}/webring.json"); + let json = fs::read_to_string(&path) + .expect(&format!("couldn't open {path}")); + + let members: Vec = serde_json::from_str(&json) + .expect(&format!("failed deserializing webring members: {json}")); + web::App::new() .wrap(middleware::Logger::default()) + .state(members) .service( web::scope("/") .service(next) diff --git a/server/src/members.rs b/server/src/members.rs deleted file mode 100644 index d4ef0ec..0000000 --- a/server/src/members.rs +++ /dev/null @@ -1,16 +0,0 @@ -// this is hilariously bad but I'm too lazy to do anything about it right now -pub struct WebringMember { - pub name: &'static str, - pub domain: &'static str, -} - -pub const WEBRING_MEMBERS: &'static [WebringMember] = &[ - WebringMember { - name: "poz", - domain: "jacekpoz.pl", - }, - WebringMember { - name: "krizej", - domain: "krizej.codeberg.page", - }, -]; diff --git a/site/default.nix b/site/default.nix index a369574..9638a08 100644 --- a/site/default.nix +++ b/site/default.nix @@ -2,6 +2,8 @@ jetbrains-mono, lib, mkNteDerivation, + webringMembers, + writeText, ... }: let inherit (lib.attrsets) listToAttrs; @@ -13,19 +15,19 @@ in /*html*/'' # ${content} ''; + + hs = listToAttrs (map (n: { + name = "h${toString n}"; + value = text: h n text; + }) [ 1 2 3 4 5 6 ]); in mkNteDerivation { name = "nix-webring-site"; version = "0.1.0"; src = ./.; - extraArgs = { - inherit h; - } - // listToAttrs (map (n: { - name = "h${toString n}"; - value = text: h n text; - }) [ 1 2 3 4 5 6 ] - ); + extraArgs = hs // { + inherit h webringMembers; + }; entries = [ ./index.nix @@ -35,5 +37,9 @@ in mkNteDerivation { { source = "./index.css"; destination = "/"; } { source = "./nix-webring.svg"; destination = "/"; } { source = "${jetbrains-mono}/share/fonts/truetype/JetBrainsMono-Regular.ttf"; destination = "/"; } + { + source = writeText "webring.json" (builtins.toJSON webringMembers); + destination = "/webring.json"; + } ]; } diff --git a/site/index.css b/site/index.css index 8da2fc8..6b07d71 100644 --- a/site/index.css +++ b/site/index.css @@ -19,3 +19,11 @@ body { margin: 0; height: 100%; } + +a:link { + color: #7EB6E1; +} + +a:visited { + color: #5075BF; +} diff --git a/site/index.nix b/site/index.nix index 1ab44e7..95ea673 100644 --- a/site/index.nix +++ b/site/index.nix @@ -1,4 +1,9 @@ -_: { +{ + h2, + pkgs, + webringMembers, + ... +}: { template = "passthrough"; format = "html"; @@ -15,6 +20,14 @@ _: {

work in progress

+ ${h2 "webring members"} +
    + ${pkgs.lib.concatStrings (map (member: /*html*/'' +
  • + ${member.name} +
  • + '') webringMembers)} +
''; diff --git a/webring.nix b/webring.nix new file mode 100644 index 0000000..051b53a --- /dev/null +++ b/webring.nix @@ -0,0 +1,4 @@ +[ + { name = "poz"; domain = "jacekpoz.pl"; } + { name = "krizej"; domain = "krizej.codeberg.page"; } +]