From 9c3002a8d08b89d0cb7ea18b403ad3c1ce77732d Mon Sep 17 00:00:00 2001 From: Fries Date: Thu, 29 Jun 2023 19:45:41 -0700 Subject: [PATCH] add a not found template and reorgainze the code this commit does quite a bit as it adds a not found html template and it reorganized the code entirely by splitting stuff into modules. --- Cargo.lock | 822 +++++++++++++++++- Cargo.toml | 13 +- .../atkinson-hyperlegible-all-400-normal.woff | Bin 0 -> 27792 bytes ...kinson-hyperlegible-latin-400-normal.woff2 | Bin 0 -> 16496 bytes ...on-hyperlegible-latin-ext-400-normal.woff2 | Bin 0 -> 8440 bytes public/style.css | 72 ++ src/assets.rs | 50 ++ src/links.rs | 18 + src/main.rs | 72 +- src/routes.rs | 67 ++ templates/error.html.tera | 15 + 11 files changed, 1048 insertions(+), 81 deletions(-) create mode 100644 public/atkinson-hyperlegible-all-400-normal.woff create mode 100644 public/atkinson-hyperlegible-latin-400-normal.woff2 create mode 100644 public/atkinson-hyperlegible-latin-ext-400-normal.woff2 create mode 100644 public/style.css create mode 100644 src/assets.rs create mode 100644 src/links.rs create mode 100644 src/routes.rs create mode 100644 templates/error.html.tera diff --git a/Cargo.lock b/Cargo.lock index 66a32db..f8de4a0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,39 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "aho-corasick" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +dependencies = [ + "memchr", +] + +[[package]] +name = "aho-corasick" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +dependencies = [ + "memchr", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "async-stream" version = "0.3.5" @@ -95,6 +128,31 @@ version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bstr" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a246e68bb43f6cd9db24bea052a53e40405417c5fb372e3d1a8a7f770a564ef5" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "bumpalo" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" + [[package]] name = "bytes" version = "1.4.0" @@ -113,6 +171,40 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "winapi", +] + +[[package]] +name = "chrono-tz" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58549f1842da3080ce63002102d5bc954c7bc843d4f47818e642abdc36253552" +dependencies = [ + "chrono", + "chrono-tz-build", + "phf", +] + +[[package]] +name = "chrono-tz-build" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db058d493fb2f65f41861bfed7e3fe6335264a9f0f92710cab5bdf01fef09069" +dependencies = [ + "parse-zoneinfo", + "phf", + "phf_codegen", +] + [[package]] name = "cookie" version = "0.17.0" @@ -124,6 +216,56 @@ dependencies = [ "version_check", ] +[[package]] +name = "core-foundation-sys" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + +[[package]] +name = "cpufeatures" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03e69e28e9f7f77debdedbaafa2866e1de9ba56df55a8bd7cfc724c25a09987c" +dependencies = [ + "libc", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "deunicode" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "850878694b7933ca4c9569d30a34b55031b9b139ee1fc7b94a527c4ef960d690" + [[package]] name = "devise" version = "0.4.1" @@ -157,6 +299,16 @@ dependencies = [ "syn", ] +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + [[package]] name = "either" version = "1.8.1" @@ -186,7 +338,7 @@ checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" dependencies = [ "errno-dragonfly", "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -222,12 +374,33 @@ dependencies = [ "version_check", ] +[[package]] +name = "filetime" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.2.16", + "windows-sys 0.48.0", +] + [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "fsevent-sys" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" +dependencies = [ + "libc", +] + [[package]] name = "futures" version = "0.3.28" @@ -306,6 +479,16 @@ dependencies = [ "windows", ] +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.2.10" @@ -329,6 +512,30 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +[[package]] +name = "globset" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc" +dependencies = [ + "aho-corasick 0.7.20", + "bstr", + "fnv", + "log", + "regex", +] + +[[package]] +name = "globwalk" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc" +dependencies = [ + "bitflags 1.3.2", + "ignore", + "walkdir", +] + [[package]] name = "h2" version = "0.3.20" @@ -409,6 +616,15 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +[[package]] +name = "humansize" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cb51c9a029ddc91b07a787f1d86b53ccfa49b0e86688c946ebe8d3555685dd7" +dependencies = [ + "libm", +] + [[package]] name = "hyper" version = "0.14.27" @@ -433,6 +649,46 @@ dependencies = [ "want", ] +[[package]] +name = "iana-time-zone" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ignore" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492" +dependencies = [ + "globset", + "lazy_static", + "log", + "memchr", + "regex", + "same-file", + "thread_local", + "walkdir", + "winapi-util", +] + [[package]] name = "indexmap" version = "1.9.3" @@ -460,6 +716,26 @@ version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" +[[package]] +name = "inotify" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" +dependencies = [ + "bitflags 1.3.2", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +dependencies = [ + "libc", +] + [[package]] name = "instant" version = "0.1.12" @@ -477,7 +753,7 @@ checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ "hermit-abi 0.3.1", "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -489,7 +765,7 @@ dependencies = [ "hermit-abi 0.3.1", "io-lifetimes", "rustix", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -498,6 +774,35 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +[[package]] +name = "js-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "kqueue" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c8fc60ba15bf51257aa9807a48a61013db043fcf3a78cb0d916e8e396dcad98" +dependencies = [ + "kqueue-sys", + "libc", +] + +[[package]] +name = "kqueue-sys" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8367585489f01bc55dd27404dcf56b95e6da061a256a666ab23be9ba96a2e587" +dependencies = [ + "bitflags 1.3.2", + "libc", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -510,6 +815,12 @@ version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +[[package]] +name = "libm" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" + [[package]] name = "linux-raw-sys" version = "0.3.8" @@ -567,6 +878,8 @@ name = "meowy-webring" version = "0.1.0" dependencies = [ "rocket", + "rocket_dyn_templates", + "rust-embed", ] [[package]] @@ -591,8 +904,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", + "log", "wasi", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -615,6 +929,33 @@ dependencies = [ "version_check", ] +[[package]] +name = "normpath" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec60c60a693226186f5d6edf073232bfb6464ed97eb22cf3b01c1e8198fd97f5" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "notify" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "729f63e1ca555a43fe3efa4f3efdf4801c479da85b432242a7b726f353c88486" +dependencies = [ + "bitflags 1.3.2", + "crossbeam-channel", + "filetime", + "fsevent-sys", + "inotify", + "kqueue", + "libc", + "mio", + "walkdir", + "windows-sys 0.45.0", +] + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -625,6 +966,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + [[package]] name = "num_cpus" version = "1.15.0" @@ -674,9 +1024,18 @@ checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.3.5", "smallvec", - "windows-targets", + "windows-targets 0.48.1", +] + +[[package]] +name = "parse-zoneinfo" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c705f256449c60da65e11ff6626e0c16a0a0b96aaa348de61376b249bc340f41" +dependencies = [ + "regex", ] [[package]] @@ -708,6 +1067,89 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +[[package]] +name = "pest" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f73935e4d55e2abf7f130186537b19e7a4abc886a0252380b59248af473a3fc9" +dependencies = [ + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef623c9bbfa0eedf5a0efba11a5ee83209c326653ca31ff019bec3a95bfff2b" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3e8cba4ec22bada7fc55ffe51e2deb6a0e0db2d0b7ab0b103acc80d2510c190" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01f71cb40bd8bb94232df14b946909e14660e33fc05db3e50ae2a82d7ea0ca0" +dependencies = [ + "once_cell", + "pest", + "sha2", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_codegen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared", + "rand", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", + "uncased", +] + [[package]] name = "pin-project-lite" version = "0.2.9" @@ -787,6 +1229,15 @@ dependencies = [ "getrandom", ] +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "redox_syscall" version = "0.3.5" @@ -822,6 +1273,8 @@ version = "1.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" dependencies = [ + "aho-corasick 1.0.2", + "memchr", "regex-syntax 0.7.2", ] @@ -901,6 +1354,19 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "rocket_dyn_templates" +version = "0.1.0-rc.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276cac97fcddca93d741a4a530f58969f45a5bdb587f8c6b04c75cf849ca7f4c" +dependencies = [ + "glob", + "normpath", + "notify", + "rocket", + "tera", +] + [[package]] name = "rocket_http" version = "0.5.0-rc.3" @@ -928,6 +1394,40 @@ dependencies = [ "uncased", ] +[[package]] +name = "rust-embed" +version = "6.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73e721f488c353141288f223b599b4ae9303ecf3e62923f40a492f0634a4dc3" +dependencies = [ + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "6.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22ce362f5561923889196595504317a4372b84210e6e335da529a65ea5452b5" +dependencies = [ + "proc-macro2", + "quote", + "rust-embed-utils", + "syn", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "7.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512b0ab6853f7e14e3c8754acb43d6f748bb9ced66aa5915a6553ac8213f7731" +dependencies = [ + "sha2", + "walkdir", +] + [[package]] name = "rustc-demangle" version = "0.1.23" @@ -945,7 +1445,7 @@ dependencies = [ "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -960,6 +1460,15 @@ version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -1012,6 +1521,17 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sharded-slab" version = "0.1.4" @@ -1030,6 +1550,12 @@ dependencies = [ "libc", ] +[[package]] +name = "siphasher" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" + [[package]] name = "slab" version = "0.4.8" @@ -1039,6 +1565,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "slug" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3bc762e6a4b6c6fcaade73e77f9ebc6991b676f88bb2358bddb56560f073373" +dependencies = [ + "deunicode", +] + [[package]] name = "smallvec" version = "1.10.0" @@ -1099,18 +1634,60 @@ dependencies = [ "autocfg", "cfg-if", "fastrand", - "redox_syscall", + "redox_syscall 0.3.5", "rustix", - "windows-sys", + "windows-sys 0.48.0", +] + +[[package]] +name = "tera" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ab29bb4f3e256ae6ad5c3e2775aa1f8829f2c0c101fc407bfd3a6df15c60c5" +dependencies = [ + "chrono", + "chrono-tz", + "globwalk", + "humansize", + "lazy_static", + "percent-encoding", + "pest", + "pest_derive", + "rand", + "regex", + "serde", + "serde_json", + "slug", + "thread_local", + "unic-segment", +] + +[[package]] +name = "thiserror" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] name = "thread_local" -version = "1.1.7" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" dependencies = [ - "cfg-if", "once_cell", ] @@ -1157,7 +1734,7 @@ dependencies = [ "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1304,6 +1881,12 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + [[package]] name = "ubyte" version = "0.10.3" @@ -1313,6 +1896,12 @@ dependencies = [ "serde", ] +[[package]] +name = "ucd-trie" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" + [[package]] name = "uncased" version = "0.9.9" @@ -1323,6 +1912,56 @@ dependencies = [ "version_check", ] +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-segment" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4ed5d26be57f84f176157270c112ef57b86debac9cd21daaabbe56db0f88f23" +dependencies = [ + "unic-ucd-segment", +] + +[[package]] +name = "unic-ucd-segment" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2079c122a62205b421f499da10f3ee0f7697f012f55b675e002483c73ea34700" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + [[package]] name = "unicode-ident" version = "1.0.9" @@ -1347,6 +1986,16 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "walkdir" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" @@ -1362,6 +2011,60 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasm-bindgen" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" + [[package]] name = "winapi" version = "0.3.9" @@ -1378,6 +2081,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -1390,7 +2102,16 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" dependencies = [ - "windows-targets", + "windows-targets 0.48.1", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", ] [[package]] @@ -1399,7 +2120,22 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.1", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", ] [[package]] @@ -1408,51 +2144,93 @@ version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_aarch64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_i686_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + [[package]] name = "windows_x86_64_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "windows_x86_64_msvc" version = "0.48.0" diff --git a/Cargo.toml b/Cargo.toml index 523f72e..cbf1ed5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,5 +5,14 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -[dependencies] -rocket = { version = "=0.5.0-rc.3", features = ["json"] } +[dependencies.rocket] +version = "=0.5.0-rc.3" +features = ["json"] + +[dependencies.rocket_dyn_templates] +version = "=0.1.0-rc.3" +features = ["tera"] + +[dependencies.rust-embed] +version = "6.7.0" +features = ["debug-embed"] diff --git a/public/atkinson-hyperlegible-all-400-normal.woff b/public/atkinson-hyperlegible-all-400-normal.woff new file mode 100644 index 0000000000000000000000000000000000000000..14755e0e7a7ea2986b326bde1b398ac56ce1fed5 GIT binary patch literal 27792 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 byQ~pxZofCso5hRm>KE&j`LbBu0fq$tzBJ=> literal 0 HcmV?d00001 diff --git a/public/atkinson-hyperlegible-latin-ext-400-normal.woff2 b/public/atkinson-hyperlegible-latin-ext-400-normal.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..3e88f7ad853546884c92243bb176ce627e5f6a58 GIT binary patch literal 8440 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 literal 0 HcmV?d00001 diff --git a/public/style.css b/public/style.css new file mode 100644 index 0000000..b1801cb --- /dev/null +++ b/public/style.css @@ -0,0 +1,72 @@ +@media (prefers-color-scheme: light) { + :root { + --background-color: #f6f5f4; + --text-color: black; + --link-color: darkblue; + } +} + +@media (prefers-color-scheme: dark) { + :root { + --background-color: #191919; + --text-color: #E9E9E9; + --link-color: cyan; + } +} + +body { + font-family: "Atkinson Hyperlegible", sans-serif; + text-align: center; + max-width: 600px; + margin: auto; + background-color: var(--background-color); + color: var(--text-color) +} + +p { + font-size: 22px; +} + +@font-face { + font-family: Atkinson Hyperlegible; + font-style: normal; + font-display: swap; + font-weight: 400; + src: url(/public/woff2/atkinson-hyperlegible-latin-ext-400-normal.woff2) format("woff2"), + url(/public/woff/atkinson-hyperlegible-all-400-normal.woff) format("woff"); + unicode-range: U+0100-024F, + U+0259, + U+1E00-1EFF, + U+2020, + U+20A0-20AB, + U+20AD-20CF, + U+2113, + U+2C60-2C7F, + U+A720-A7FF +} + +@font-face { + font-family: Atkinson Hyperlegible; + font-style: normal; + font-display: swap; + font-weight: 400; + src: url(/public/woff2/atkinson-hyperlegible-latin-400-normal.woff2) format("woff2"), + url(/public/woff/atkinson-hyperlegible-all-400-normal.woff) format("woff"); + unicode-range: U+0000-00FF, + U+0131, + U+0152-0153, + U+02BB-02BC, + U+02C6, + U+02DA, + U+02DC, + U+2000-206F, + U+2074, + U+20AC, + U+2122, + U+2191, + U+2193, + U+2212, + U+2215, + U+FEFF, + U+FFFD +} diff --git a/src/assets.rs b/src/assets.rs new file mode 100644 index 0000000..cbc4599 --- /dev/null +++ b/src/assets.rs @@ -0,0 +1,50 @@ +use std::borrow::Cow; + +use rocket::http::Status; +use rust_embed::RustEmbed; + +#[derive(RustEmbed)] +#[folder = "public/"] +pub struct PublicAssets; + +#[derive(Responder)] +#[response(status = 200, content_type = "font/woff2")] +pub struct RawWoff2Font(pub Cow<'static, [u8]>); + +#[derive(Responder)] +#[response(status = 200, content_type = "font/woff")] +pub struct RawWoffFont(pub Cow<'static, [u8]>); + +#[get("/style.css")] +pub fn style() -> Result, Status> { + let style = PublicAssets::get("style.css").unwrap(); + match std::str::from_utf8(&style.data) { + Ok(style) => Ok(rocket::response::content::RawCss::(style.to_string())), + Err(_) => Err(Status::InternalServerError), + } +} + +#[get("/woff2/")] +pub fn woff2_font(font: &str) -> Result { + let latin = "atkinson-hyperlegible-latin-400-normal.woff2"; + let latin_ext = "atkinson-hyperlegible-latin-ext-400-normal.woff2"; + + if font == latin { + Ok(RawWoff2Font(PublicAssets::get(latin).unwrap().data)) + } else if font == latin_ext { + Ok(RawWoff2Font(PublicAssets::get(latin_ext).unwrap().data)) + } else { + Err(Status::NotFound) + } +} + +#[get("/woff/")] +pub fn woff_font(font: &str) -> Result { + let all = "atkinson-hyperlegible-all-400-normal.woff"; + + if font == all { + Ok(RawWoffFont(PublicAssets::get(all).unwrap().data)) + } else { + Err(Status::NotFound) + } +} diff --git a/src/links.rs b/src/links.rs new file mode 100644 index 0000000..eab9c10 --- /dev/null +++ b/src/links.rs @@ -0,0 +1,18 @@ +static NAMES: [&str; 3] = ["mossfet.xyz", "fries.gay", "ta-kev.digital"]; + +pub fn previous_url(source_url: &String) -> Option { + match NAMES.iter().position(|&r| r == source_url) { + Some(index) if index == 0 => Some(NAMES[NAMES.len() - 1].to_string()), + Some(index) => Some(NAMES[index - 1].to_string()), + None => None, + } +} + +pub fn next_url(source_url: &String) -> Option { + // this is gay + match NAMES.iter().position(|&r| r == source_url) { + Some(index) if index == NAMES.len() - 1 => Some(NAMES[0].to_string()), + Some(index) => Some(NAMES[index + 1].to_string()), + None => None, + } +} diff --git a/src/main.rs b/src/main.rs index 61ae80b..b3d81cb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,64 +1,22 @@ #[macro_use] extern crate rocket; -use rocket::response::Redirect; -use rocket::serde::{json::Json, Serialize}; +use rocket_dyn_templates::Template; -static NAMES: [&str; 3] = ["mossfet.xyz", "fries.gay", "ta-kev.digital"]; - -#[derive(Serialize)] -#[serde(crate = "rocket::serde")] -struct JsonResponse { - previous_site_name: Option, - next_site_name: Option, -} - -#[get("/")] -fn index() -> &'static str { - "Like, this is a webring, meow!" -} - -fn previous_url(source_url: &String) -> Option { - match NAMES.iter().position(|&r| r == source_url) { - Some(index) if index == 0 => Some(NAMES[NAMES.len() - 1].to_string()), - Some(index) => Some(NAMES[index - 1].to_string()), - None => None, - } -} - -fn next_url(source_url: &String) -> Option { - // this is gay - match NAMES.iter().position(|&r| r == source_url) { - Some(index) if index == NAMES.len() - 1 => Some(NAMES[0].to_string()), - Some(index) => Some(NAMES[index + 1].to_string()), - None => None, - } -} - -#[get("/previous?")] -fn previous(source_url: String) -> Redirect { - match previous_url(&source_url) { - Some(url) => Redirect::to(format!("https://{}", url)), - None => todo!(), - } -} - -#[get("/next?")] -fn next(source_url: String) -> Redirect { - match next_url(&source_url) { - Some(url) => Redirect::to(format!("https://{}", url)), - None => todo!(), - } -} - -#[get("/name?")] -fn name(source_url: String) -> Json { - Json(JsonResponse { - previous_site_name: previous_url(&source_url), - next_site_name: next_url(&source_url), - }) -} +mod assets; +mod links; +mod routes; #[launch] fn rocket() -> _ { - rocket::build().mount("/", routes![index, previous, next, name]) + rocket::build() + .attach(Template::fairing()) + .mount( + "/", + routes![routes::index, routes::previous, routes::next, routes::name], + ) + .register("/", catchers![routes::not_found]) + .mount( + "/public", + routes![assets::style, assets::woff2_font, assets::woff_font], + ) } diff --git a/src/routes.rs b/src/routes.rs new file mode 100644 index 0000000..b58d6f8 --- /dev/null +++ b/src/routes.rs @@ -0,0 +1,67 @@ +use crate::links::{next_url, previous_url}; +use rocket::{ + http::Status, + response::Redirect, + serde::{json::Json, Serialize}, +}; +use rocket_dyn_templates::Template; + +#[derive(Serialize)] +#[serde(crate = "rocket::serde")] +struct ErrorTemplate<'a> { + error: &'a str, + error_description: &'a str, +} + +const NOT_FOUND_ERROR: ErrorTemplate = ErrorTemplate { + error: "Not Found", + error_description: "this URL could not be found on the webring.", +}; + +#[derive(Serialize)] +#[serde(crate = "rocket::serde")] +pub struct JsonResponse { + previous_site_name: Option, + next_site_name: Option, +} + +#[get("/")] +pub fn index() -> &'static str { + "Like, this is a webring, meow!" +} + +#[get("/previous?")] +pub fn previous(source_url: String) -> Result { + match previous_url(&source_url) { + Some(url) => Ok(Redirect::to(format!("https://{}", url))), + None => Err(Status::NotFound), + } +} + +#[get("/next?")] +pub fn next(source_url: String) -> Result { + match next_url(&source_url) { + Some(url) => Ok(Redirect::to(format!("https://{}", url))), + None => Err(Status::NotFound), + } +} + +#[get("/name?")] +pub fn name(source_url: String) -> Result, Status> { + let previous_site_name = previous_url(&source_url); + let next_site_name = next_url(&source_url); + + if previous_site_name.is_none() && next_site_name.is_none() { + return Err(Status::NotFound); + } + + Ok(Json(JsonResponse { + previous_site_name, + next_site_name, + })) +} + +#[catch(404)] +pub fn not_found() -> Template { + Template::render("error", NOT_FOUND_ERROR) +} diff --git a/templates/error.html.tera b/templates/error.html.tera new file mode 100644 index 0000000..d02027b --- /dev/null +++ b/templates/error.html.tera @@ -0,0 +1,15 @@ + + + + + + Meowy Webring - {{ error }} + + + +
+

{{ error }}

+

{{ error_description }}

+
+ +