From ccf6bef34ceaae6e28dacdb18b6eebdf67ad5094 Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Sat, 8 Jul 2023 23:30:33 -0400 Subject: [PATCH] bucket --- .dockerignore | 3 + .gitignore | 1 + Cargo.lock | 1904 ++++++++++++++++++++++++++++++++ Cargo.toml | 17 + LICENSE | 428 +++++++ README.md | 5 + deployments/docker/Dockerfile | 14 + public/static/main.css | 117 ++ public/static/merriweather.ttf | Bin 0 -> 149120 bytes public/static/white.css | 11 + public/templates/embed.html | 19 + src/main.rs | 68 ++ src/routes.rs | 57 + 13 files changed, 2644 insertions(+) create mode 100644 .dockerignore create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 deployments/docker/Dockerfile create mode 100644 public/static/main.css create mode 100644 public/static/merriweather.ttf create mode 100644 public/static/white.css create mode 100644 public/templates/embed.html create mode 100644 src/main.rs create mode 100644 src/routes.rs diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..e167471 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +.git +deployments +target diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..3f35856 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,1904 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +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-trait" +version = "0.1.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a564d521dd56509c4c47480d00b80ee55f7e385ae48db5744c67ad50c92d2ebf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "axum" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8175979259124331c1d7bf6586ee7e0da434155e4b2d48ec2c8386281d8df39" +dependencies = [ + "async-trait", + "axum-core", + "bitflags 1.3.2", + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +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.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cfg-if" +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 = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +dependencies = [ + "libc", +] + +[[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 = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "encoding_rs" +version = "0.8.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-sink" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" + +[[package]] +name = "futures-task" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" + +[[package]] +name = "futures-util" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hermit-abi" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" + +[[package]] +name = "http" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "http-range-header" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29" + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[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 = "idna" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys", +] + +[[package]] +name = "ipnet" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" + +[[package]] +name = "itoa" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a" + +[[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 = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "lock_api" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" + +[[package]] +name = "matchit" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40" + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +dependencies = [ + "libc", + "wasi", + "windows-sys", +] + +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[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.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "openssl" +version = "0.10.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "parse-zoneinfo" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c705f256449c60da65e11ff6626e0c16a0a0b96aaa348de61376b249bc340f41" +dependencies = [ + "regex", +] + +[[package]] +name = "percent-encoding" +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" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "030ad2bc4db10a8944cb0d837f158bdfec4d4a4873ab701a95046770d11f8842" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro2" +version = "1.0.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "regex" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +dependencies = [ + "aho-corasick 1.0.2", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d3daa6976cffb758ec878f108ba0e062a45b2d6ca3a2cca965338855476caf" +dependencies = [ + "aho-corasick 1.0.2", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab07dc67230e4a4718e70fd5c20055a4334b121f1f9db8fe63ef39ce9b8c846" + +[[package]] +name = "reqwest" +version = "0.11.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustix" +version = "0.37.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "rustversion" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc31bd9b61a32c31f9650d18add92aa83a49ba979c143eefd27fe7177b05bd5f" + +[[package]] +name = "ryu" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9" + +[[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 = "schannel" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "security-framework" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc758eb7bffce5b308734e9b0c1468893cae9ff70ebf13e7090be8dcbcc83a8" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f51d0c0d83bec45f16480d0ce0058397a69e48fcdc52d1dc8855fb68acbd31a7" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "serde" +version = "1.0.168" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d614f89548720367ded108b3c843be93f3a341e22d5674ca0dd5cd57f34926af" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.168" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fe589678c688e44177da4f27152ee2d190757271dc7f1d5b6b9f68d869d641" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f1e14e89be7aa4c4b78bdbdc9eb5bf8517829a600ae8eaa39a6e1d960b5185c" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc4422959dd87a76cb117c191dcbffc20467f06c9100b76721dab370f24d3a" +dependencies = [ + "itoa", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "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 = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +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.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" + +[[package]] +name = "socket2" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "syn" +version = "2.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59fb7d6d8281a51045d62b8eb3a7d1ce347b76f312af50cd3dc0af39c87c1737" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "tempfile" +version = "3.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" +dependencies = [ + "autocfg", + "cfg-if", + "fastrand", + "redox_syscall", + "rustix", + "windows-sys", +] + +[[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.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a35fc5b8971143ca348fa6df4f024d4d55264f3468c71ad1c2f365b0a4d58c42" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "463fe12d7993d3b327787537ce8dd4dfa058de32fc2b195ef3cde03dc4771e8f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" +dependencies = [ + "autocfg", + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys", +] + +[[package]] +name = "tokio-macros" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8bd22a874a2d0b70452d5597b12c537331d49060824a95f49f108994f94aa4c" +dependencies = [ + "bitflags 2.3.3", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-range-header", + "httpdate", + "mime", + "mime_guess", + "percent-encoding", + "pin-project-lite", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "log", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +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 = "ucd-trie" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" + +[[package]] +name = "uncased" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b9bc53168a4be7402ab86c3aad243a84dd7381d09be0eddc81280c1da95ca68" +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 = "unicase" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +dependencies = [ + "version_check", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "url" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +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-futures" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[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 = "web-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webring" +version = "0.1.0" +dependencies = [ + "axum", + "reqwest", + "serde", + "tera", + "tokio", + "tower-http", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +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", +] + +[[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.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[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.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[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.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..e56a078 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "webring" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +# web +tokio = { version = "1", features = ["full"] } +tower-http = { version = "0.4.1", features = ["fs"] } +axum = "0.6.12" +reqwest = { version = "0.11.18", features = ["json"] } + +# templating +serde = { version = "1", features = ["derive"] } +tera = "1" diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2d58298 --- /dev/null +++ b/LICENSE @@ -0,0 +1,428 @@ +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + including for purposes of Section 3(b); and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. + diff --git a/README.md b/README.md new file mode 100644 index 0000000..470ebd9 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# bucket + +a version of the [bucket webring](https://webring.bucketfish.me) embed with no js + +i dont like js diff --git a/deployments/docker/Dockerfile b/deployments/docker/Dockerfile new file mode 100644 index 0000000..e87046f --- /dev/null +++ b/deployments/docker/Dockerfile @@ -0,0 +1,14 @@ +FROM rust:alpine AS builder + +COPY Cargo.toml Cargo.lock /app/ +COPY src /app/src +WORKDIR /app +RUN apk add musl-dev +RUN cargo build --release + +FROM alpine +RUN apk add --no-cache tini +COPY --from=builder /app/target/release/webring /webring +COPY public /public + +ENTRYPOINT [ "/sbin/tini", "--", "/webring" ] diff --git a/public/static/main.css b/public/static/main.css new file mode 100644 index 0000000..b51a997 --- /dev/null +++ b/public/static/main.css @@ -0,0 +1,117 @@ +@font-face { + font-family: merriweather; + src: url("/static/merriweather.ttf"); +} + +:root { + --red: #ffcaca; + --orange: #ffedc1; + --yellow: #feffb8; + --green: #c4ffcb; + --blue: #add8ff; + --purple: #ccafe9; + + --darkgreen: #3E885B; + --darkblue: #7fb4f5; + + + --background: #454545; + + + --rainbowright: linear-gradient(to right, var(--red) 0%, var(--orange) 20%, var(--yellow) 40%, var(--green) 60%, var(--blue) 80%, var(--purple) 100%); +} + +* { + font-family: merriweather, Georgia, serif; + color: var(--purple); +} + +html { + background-color: var(--background); +} + +html, body { + height: 100%; + margin: 0; + box-sizing: border-box; +} + + +body { + display: flex; + + padding: 0.5em; + + flex-wrap: wrap; + justify-content: space-evenly; + align-content: center; +} + +a { + display: inline-block; + color: inherit; + position: relative; + text-decoration: none; + transition: linear 0.2s; + color: var(--purple); +} + +a:before { + background: var(--rainbowright); + content: ''; + height: 2px; + position: absolute; + bottom: -1.5px; + width: 100%; + left: 50%; + transform: translateX(-50%); + transition: width 0.2s ease-in-out; +} + +a:hover{ + color: var(--white); +} + +a:hover:before{ + width: 0; +} + +#left { text-align: left; } +#mid { text-align: center; } +#right { text-align: right; } + +#left, #right { + flex-grow: 1; + flex-basis: 0; +} + +#header span { + animation-delay: var(--n); + animation: wave 1.5s linear var(--n) infinite forwards running, rainbow 3s linear var(--n) infinite forwards running; + position: relative; + display: inline-block; +} + +@media screen and (prefers-reduced-motion: reduce) { + #header span { + animation: none; + } +} + +@keyframes wave { + 0% {top: 0px;} + 25% {top: -1px;} + 50% {top: 0px;} + 75% {top: 1px;} + 100% {top: 0px;} +} + +@keyframes rainbow { + 0% {color: var(--red);} + 17% {color: var(--orange);} + 33% {color: var(--yellow);} + 50% {color: var(--green);} + 67% {color: var(--blue);} + 83% {color: var(--purple);} + 100% {color: var(--red);} +} diff --git a/public/static/merriweather.ttf b/public/static/merriweather.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3fecc77777abf21b9544e0d5e6610d2b51f1779a GIT binary patch literal 149120 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 + + + + + + {% if theme == "white" %} + + {% endif %} + + + + 🏳️‍🌈 + bucket + webring + 🏳️‍🌈 + + + diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..8ea0114 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,68 @@ +use std::{env, error::Error, collections::HashMap, process::exit, sync::Arc}; +use serde::Deserialize; +use axum::{Router, Extension}; +use tera::Tera; + +mod routes; + +pub struct State { + pub templates: Tera, + pub pages: HashMap +} + +#[derive(Deserialize)] +pub struct Page { + name: String, + url: String +} + +async fn load_state() -> Result> { + let mut templates = Tera::new("public/templates/**")?; + templates.autoescape_on(vec![]); + + let json = reqwest::get("https://raw.githubusercontent.com/bucketfish/bucket-webring/master/webring.json") + .await? + .json::>() + .await?; + + let mut pages = HashMap::new(); + + for (i, page) in json.iter().enumerate() { + let prev = json[(i + json.len() - 1) % json.len()].url.clone(); + let next = json[(i + json.len() + 1) % json.len()].url.clone(); + pages.insert(page.name.clone(), (prev, next)); + } + + Ok(State{ templates, pages }) +} + +#[tokio::main] +async fn main() { + + let port: u16 = env::var("PORT") + .unwrap_or_else(|_| String::new()) + .parse::() + .unwrap_or(8080); + + let addr = format!("[::]:{port}") + .parse::() + .expect("Failed to create port binding"); + + let state = match load_state().await { + Ok(s) => s, + Err(e) => { + eprintln!("Parsing error: {e}"); + exit(1); + } + }; + + let router = Router::new() + .fallback_service(routes::router()) + .layer(Extension(Arc::new(state))); + + axum::Server::bind(&addr) + .serve(router.into_make_service()) + .await + .expect("Failed to launch web server"); + +} diff --git a/src/routes.rs b/src/routes.rs new file mode 100644 index 0000000..b8f855a --- /dev/null +++ b/src/routes.rs @@ -0,0 +1,57 @@ +use std::sync::Arc; +use axum::{Router, response::{Response, IntoResponse}, extract::Query, Extension, http::{HeaderName, HeaderValue}, routing::get}; +use serde::Deserialize; +use tera::{Context, Tera}; +use tower_http::services::ServeDir; +use crate::State; + +pub fn router() -> Router { + Router::new() + .fallback(not_found) + .route("/", get(embed)) + .nest_service("/static", ServeDir::new("public/static")) +} + +#[derive(Deserialize, Debug)] +struct Params { + name: String, + theme: Option +} + +async fn not_found() -> Response { + "do not the".into_response() +} + +async fn embed(Extension(state): Extension>, Query(params): Query) -> Response { + let Some(page) = state.pages.get(¶ms.name) else { + return not_found().await + }; + + let theme = match ¶ms.theme { + Some(t) => t, + None => "dark" + }; + + let mut ctx = Context::default(); + ctx.insert("prev", page.0.as_str()); + ctx.insert("next", page.1.as_str()); + ctx.insert("theme", theme); + + render(&state.templates, &ctx, "embed.html") +} + +pub fn render(tera: &Tera, ctx: &Context, template: &str) -> Response { + let rendered = match tera.render(template, ctx) { + Ok(r) => r, + Err(err) => { + return format!("{err:?}").into_response() + } + }; + let mut res = rendered.into_response(); + res.headers_mut().insert( + HeaderName::from_static("content-type"), + HeaderValue::from_static("text/html") + ); + res +} +