aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--Cargo.lock1850
-rw-r--r--Cargo.toml12
-rw-r--r--Rocket.toml2
-rw-r--r--TODO.md2
-rw-r--r--articles/ejabberd.md5
-rw-r--r--articles/rot.md2
-rw-r--r--default.nix23
-rw-r--r--src/atom.rs142
-rw-r--r--src/blog.rs186
-rw-r--r--src/error.rs88
-rw-r--r--src/main.rs212
-rw-r--r--src/posts.rs62
-rw-r--r--src/posts/article.rs0
-rw-r--r--src/posts/mod.rs228
-rw-r--r--src/posts/syndication.rs96
-rw-r--r--src/templates.rs55
-rw-r--r--src/utils.rs3
-rw-r--r--static/badges/badussyflops.pngbin0 -> 12393 bytes
-rw-r--r--static/fonts.css124
-rw-r--r--templates/base.html88
-rw-r--r--templates/base.html.tera82
-rw-r--r--templates/blog.html23
-rw-r--r--templates/blog.html.tera22
-rw-r--r--templates/blogpost-panel.html10
-rw-r--r--templates/blogpost-panel.html.tera8
-rw-r--r--templates/blogpost.html7
-rw-r--r--templates/blogpost.html.tera7
-rw-r--r--templates/contact.html (renamed from templates/contact.html.tera)14
-rw-r--r--templates/error.html (renamed from templates/error.html.tera)6
-rw-r--r--templates/filtertags.html10
-rw-r--r--templates/filtertags.html.tera7
-rw-r--r--templates/home.html (renamed from templates/home.html.tera)34
-rw-r--r--templates/latestposts.html13
-rw-r--r--templates/latestposts.html.tera10
-rw-r--r--templates/latestskweets.html (renamed from templates/latestskweets.html.tera)0
35 files changed, 1640 insertions, 1793 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 4b7a5cb..a86ee13 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]]
name = "aho-corasick"
-version = "1.0.5"
+version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783"
+checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
dependencies = [
"memchr",
]
@@ -42,36 +42,63 @@ dependencies = [
]
[[package]]
-name = "async-stream"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51"
+name = "askama"
+version = "0.12.1"
+source = "git+https://bunny.garden/forks/askama.git#d3b048544eebf7b8402fb585b4e2531de9b28a33"
dependencies = [
- "async-stream-impl",
- "futures-core",
- "pin-project-lite",
+ "askama_derive",
+ "askama_escape",
+ "humansize",
+ "num-traits",
+ "percent-encoding",
]
[[package]]
-name = "async-stream-impl"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
+name = "askama_derive"
+version = "0.12.5"
+source = "git+https://bunny.garden/forks/askama.git#d3b048544eebf7b8402fb585b4e2531de9b28a33"
dependencies = [
+ "askama_parser",
+ "basic-toml",
+ "mime",
+ "mime_guess",
"proc-macro2",
- "quote 1.0.33",
- "syn 2.0.35",
+ "quote 1.0.35",
+ "serde",
+ "syn 2.0.48",
+]
+
+[[package]]
+name = "askama_escape"
+version = "0.10.3"
+source = "git+https://bunny.garden/forks/askama.git#d3b048544eebf7b8402fb585b4e2531de9b28a33"
+
+[[package]]
+name = "askama_parser"
+version = "0.2.1"
+source = "git+https://bunny.garden/forks/askama.git#d3b048544eebf7b8402fb585b4e2531de9b28a33"
+dependencies = [
+ "nom",
+]
+
+[[package]]
+name = "askama_poem"
+version = "0.14.0"
+source = "git+https://bunny.garden/forks/askama.git#d3b048544eebf7b8402fb585b4e2531de9b28a33"
+dependencies = [
+ "askama",
+ "poem",
]
[[package]]
name = "async-trait"
-version = "0.1.73"
+version = "0.1.77"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0"
+checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9"
dependencies = [
"proc-macro2",
- "quote 1.0.33",
- "syn 2.0.35",
+ "quote 1.0.35",
+ "syn 2.0.48",
]
[[package]]
@@ -88,19 +115,13 @@ dependencies = [
]
[[package]]
-name = "atomic"
-version = "0.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba"
-
-[[package]]
name = "attohttpc"
version = "0.24.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d9a9bf8b79a749ee0b911b91b671cc2b6c670bdbc7e3dfd537576ddc94bb2a2"
dependencies = [
"flate2",
- "http",
+ "http 0.2.11",
"log",
"native-tls",
"serde",
@@ -131,15 +152,18 @@ dependencies = [
[[package]]
name = "base64"
-version = "0.21.4"
+version = "0.21.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2"
+checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
[[package]]
-name = "binascii"
-version = "0.1.4"
+name = "basic-toml"
+version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72"
+checksum = "2db21524cad41c5591204d22d75e1970a2d1f71060214ca931dc7d5afe2c14e5"
+dependencies = [
+ "serde",
+]
[[package]]
name = "bitflags"
@@ -149,9 +173,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
-version = "2.4.0"
+version = "2.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"
+checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf"
[[package]]
name = "block-buffer"
@@ -164,20 +188,25 @@ dependencies = [
[[package]]
name = "blossom"
-version = "1.0.0"
+version = "2.0.0"
dependencies = [
+ "askama",
+ "askama_poem",
"async-trait",
"atom_syndication",
"chrono",
"chrono-humanize",
+ "fluent",
"listenbrainz",
"markdown",
"mastodon-async",
+ "poem",
+ "rand",
"reqwest",
- "rocket",
- "rocket_dyn_templates",
+ "rust-embed",
"serde",
"serde_json",
+ "thiserror",
"time",
"tokio",
"tokio-stream",
@@ -185,16 +214,6 @@ dependencies = [
]
[[package]]
-name = "bstr"
-version = "1.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c2f7349907b712260e64b0afe2f84692af14a454be26187d9df565c7f69266a"
-dependencies = [
- "memchr",
- "serde",
-]
-
-[[package]]
name = "bumpalo"
version = "3.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -202,9 +221,9 @@ checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec"
[[package]]
name = "bytecount"
-version = "0.6.3"
+version = "0.6.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2c676a478f63e9fa2dd5368a42f28bba0d6c560b775f38583c8bbaa7fcd67c9c"
+checksum = "e1e5f035d16fc623ae5f74981db80a439803888314e3a555fd6f04acd51a3205"
[[package]]
name = "bytes"
@@ -223,9 +242,9 @@ dependencies = [
[[package]]
name = "cargo-platform"
-version = "0.1.3"
+version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2cfa25e60aea747ec7e1124f238816749faa93759c6ff5b31f1ccdda137f4479"
+checksum = "ceed8ef69d8518a5dda55c07425450b58a4e1946f4951eab6d7191ee86c2443d"
dependencies = [
"serde",
]
@@ -260,16 +279,16 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "chrono"
-version = "0.4.31"
+version = "0.4.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38"
+checksum = "41daef31d7a747c5c847246f36de49ced6f7403b4cdabc807a97b5cc184cda7a"
dependencies = [
"android-tzdata",
"iana-time-zone",
"js-sys",
"num-traits",
"wasm-bindgen",
- "windows-targets 0.48.5",
+ "windows-targets 0.52.0",
]
[[package]]
@@ -282,43 +301,10 @@ dependencies = [
]
[[package]]
-name = "chrono-tz"
-version = "0.8.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1369bc6b9e9a7dfdae2055f6ec151fe9c554a9d23d357c0237cee2e25eaabb7"
-dependencies = [
- "chrono",
- "chrono-tz-build",
- "phf",
-]
-
-[[package]]
-name = "chrono-tz-build"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2f5ebdc942f57ed96d560a6d1a459bae5851102a25d5bf89dc04ae453e31ecf"
-dependencies = [
- "parse-zoneinfo",
- "phf",
- "phf_codegen",
-]
-
-[[package]]
-name = "cookie"
-version = "0.17.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7efb37c3e1ccb1ff97164ad95ac1606e8ccd35b3fa0a7d99a304c7f4a428cc24"
-dependencies = [
- "percent-encoding",
- "time",
- "version_check",
-]
-
-[[package]]
name = "core-foundation"
-version = "0.9.3"
+version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146"
+checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
dependencies = [
"core-foundation-sys",
"libc",
@@ -326,15 +312,15 @@ dependencies = [
[[package]]
name = "core-foundation-sys"
-version = "0.8.4"
+version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
+checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
[[package]]
name = "cpufeatures"
-version = "0.2.9"
+version = "0.2.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1"
+checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504"
dependencies = [
"libc",
]
@@ -349,25 +335,6 @@ dependencies = [
]
[[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"
@@ -396,7 +363,7 @@ dependencies = [
"fnv",
"ident_case",
"proc-macro2",
- "quote 1.0.33",
+ "quote 1.0.35",
"strsim",
"syn 1.0.109",
]
@@ -408,16 +375,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e"
dependencies = [
"darling_core",
- "quote 1.0.33",
+ "quote 1.0.35",
"syn 1.0.109",
]
[[package]]
name = "deranged"
-version = "0.3.8"
+version = "0.3.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946"
+checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
dependencies = [
+ "powerfmt",
"serde",
]
@@ -438,7 +406,7 @@ checksum = "c11bdc11a0c47bc7d37d582b5285da6849c96681023680b906673c5707af7b0f"
dependencies = [
"darling",
"proc-macro2",
- "quote 1.0.33",
+ "quote 1.0.35",
"syn 1.0.109",
]
@@ -459,7 +427,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dcdbcee2d9941369faba772587a565f4f534e42cb8d17e5295871de730163b2b"
dependencies = [
"proc-macro2",
- "quote 1.0.33",
+ "quote 1.0.35",
"syn 1.0.109",
]
@@ -475,45 +443,6 @@ dependencies = [
]
[[package]]
-name = "deunicode"
-version = "0.4.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d95203a6a50906215a502507c0f879a0ce7ff205a6111e2db2a5ef8e4bb92e43"
-
-[[package]]
-name = "devise"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d6eacefd3f541c66fc61433d65e54e0e46e0a029a819a7dbbc7a7b489e8a85f8"
-dependencies = [
- "devise_codegen",
- "devise_core",
-]
-
-[[package]]
-name = "devise_codegen"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c8cf4b8dd484ede80fd5c547592c46c3745a617c8af278e2b72bea86b2dfed6"
-dependencies = [
- "devise_core",
- "quote 1.0.33",
-]
-
-[[package]]
-name = "devise_core"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "35b50dba0afdca80b187392b24f2499a88c336d5a8493e4b4ccfb608708be56a"
-dependencies = [
- "bitflags 2.4.0",
- "proc-macro2",
- "proc-macro2-diagnostics",
- "quote 1.0.33",
- "syn 2.0.35",
-]
-
-[[package]]
name = "digest"
version = "0.10.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -533,16 +462,21 @@ dependencies = [
]
[[package]]
-name = "doc-comment"
-version = "0.3.3"
+name = "displaydoc"
+version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
+checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d"
+dependencies = [
+ "proc-macro2",
+ "quote 1.0.35",
+ "syn 2.0.48",
+]
[[package]]
-name = "either"
-version = "1.9.0"
+name = "doc-comment"
+version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
+checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
[[package]]
name = "encoding_rs"
@@ -561,32 +495,21 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
[[package]]
name = "erased-serde"
-version = "0.3.31"
+version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c138974f9d5e7fe373eb04df7cae98833802ae4b11c24ac7039a21d5af4b26c"
+checksum = "55d05712b2d8d88102bc9868020c9e5c7a1f5527c452b9b97450a1d006140ba7"
dependencies = [
"serde",
]
[[package]]
name = "errno"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd"
-dependencies = [
- "errno-dragonfly",
- "libc",
- "windows-sys 0.48.0",
-]
-
-[[package]]
-name = "errno-dragonfly"
-version = "0.1.2"
+version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
dependencies = [
- "cc",
"libc",
+ "windows-sys 0.52.0",
]
[[package]]
@@ -600,44 +523,62 @@ dependencies = [
[[package]]
name = "fastrand"
-version = "2.0.0"
+version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764"
+checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
[[package]]
-name = "figment"
-version = "0.10.10"
+name = "flate2"
+version = "1.0.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4547e226f4c9ab860571e070a9034192b3175580ecea38da34fcdb53a018c9a5"
+checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e"
dependencies = [
- "atomic",
- "pear",
- "serde",
- "toml",
- "uncased",
- "version_check",
+ "crc32fast",
+ "miniz_oxide",
]
[[package]]
-name = "filetime"
-version = "0.2.22"
+name = "fluent"
+version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0"
+checksum = "61f69378194459db76abd2ce3952b790db103ceb003008d3d50d97c41ff847a7"
dependencies = [
- "cfg-if",
- "libc",
- "redox_syscall",
- "windows-sys 0.48.0",
+ "fluent-bundle",
+ "unic-langid",
]
[[package]]
-name = "flate2"
-version = "1.0.27"
+name = "fluent-bundle"
+version = "0.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010"
+checksum = "e242c601dec9711505f6d5bbff5bedd4b61b2469f2e8bb8e57ee7c9747a87ffd"
dependencies = [
- "crc32fast",
- "miniz_oxide",
+ "fluent-langneg",
+ "fluent-syntax",
+ "intl-memoizer",
+ "intl_pluralrules",
+ "rustc-hash",
+ "self_cell 0.10.3",
+ "smallvec",
+ "unic-langid",
+]
+
+[[package]]
+name = "fluent-langneg"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c4ad0989667548f06ccd0e306ed56b61bd4d35458d54df5ec7587c0e8ed5e94"
+dependencies = [
+ "unic-langid",
+]
+
+[[package]]
+name = "fluent-syntax"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0abed97648395c902868fee9026de96483933faa54ea3b40d652f7dfe61ca78"
+dependencies = [
+ "thiserror",
]
[[package]]
@@ -663,27 +604,18 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
[[package]]
name = "form_urlencoded"
-version = "1.2.0"
+version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652"
+checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
dependencies = [
"percent-encoding",
]
[[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"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40"
+checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0"
dependencies = [
"futures-channel",
"futures-core",
@@ -696,9 +628,9 @@ dependencies = [
[[package]]
name = "futures-channel"
-version = "0.3.28"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2"
+checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78"
dependencies = [
"futures-core",
"futures-sink",
@@ -706,15 +638,15 @@ dependencies = [
[[package]]
name = "futures-core"
-version = "0.3.28"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c"
+checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
[[package]]
name = "futures-executor"
-version = "0.3.28"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0"
+checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d"
dependencies = [
"futures-core",
"futures-task",
@@ -723,38 +655,38 @@ dependencies = [
[[package]]
name = "futures-io"
-version = "0.3.28"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964"
+checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1"
[[package]]
name = "futures-macro"
-version = "0.3.28"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
+checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
dependencies = [
"proc-macro2",
- "quote 1.0.33",
- "syn 2.0.35",
+ "quote 1.0.35",
+ "syn 2.0.48",
]
[[package]]
name = "futures-sink"
-version = "0.3.28"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e"
+checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5"
[[package]]
name = "futures-task"
-version = "0.3.28"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65"
+checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
[[package]]
name = "futures-util"
-version = "0.3.28"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533"
+checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
dependencies = [
"futures-channel",
"futures-core",
@@ -769,19 +701,6 @@ dependencies = [
]
[[package]]
-name = "generator"
-version = "0.7.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e"
-dependencies = [
- "cc",
- "libc",
- "log",
- "rustversion",
- "windows",
-]
-
-[[package]]
name = "generic-array"
version = "0.14.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -793,9 +712,9 @@ dependencies = [
[[package]]
name = "getrandom"
-version = "0.2.10"
+version = "0.2.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427"
+checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5"
dependencies = [
"cfg-if",
"libc",
@@ -804,9 +723,9 @@ dependencies = [
[[package]]
name = "gimli"
-version = "0.28.0"
+version = "0.28.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0"
+checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
[[package]]
name = "glob"
@@ -815,42 +734,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
[[package]]
-name = "globset"
-version = "0.4.13"
+name = "h2"
+version = "0.3.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "759c97c1e17c55525b57192c06a267cda0ac5210b222d6b82189a2338fa1c13d"
+checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9"
dependencies = [
- "aho-corasick",
- "bstr",
+ "bytes",
"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",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "http 0.2.11",
+ "indexmap",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
]
[[package]]
name = "h2"
-version = "0.3.21"
+version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833"
+checksum = "31d030e59af851932b72ceebadf4a2b5986dba4c3b99dd2493f8273a0f151943"
dependencies = [
"bytes",
"fnv",
"futures-core",
"futures-sink",
"futures-util",
- "http",
- "indexmap 1.9.3",
+ "http 1.0.0",
+ "indexmap",
"slab",
"tokio",
"tokio-util",
@@ -859,15 +773,33 @@ dependencies = [
[[package]]
name = "hashbrown"
-version = "0.12.3"
+version = "0.14.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
[[package]]
-name = "hashbrown"
-version = "0.14.0"
+name = "headers"
+version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a"
+checksum = "322106e6bd0cba2d5ead589ddb8150a13d7c4217cf80d7c4f682ca994ccc6aa9"
+dependencies = [
+ "base64",
+ "bytes",
+ "headers-core",
+ "http 1.0.0",
+ "httpdate",
+ "mime",
+ "sha1",
+]
+
+[[package]]
+name = "headers-core"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4"
+dependencies = [
+ "http 1.0.0",
+]
[[package]]
name = "heck"
@@ -880,15 +812,32 @@ dependencies = [
[[package]]
name = "hermit-abi"
-version = "0.3.2"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f"
+
+[[package]]
+name = "hex"
+version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
[[package]]
name = "http"
-version = "0.2.9"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
+name = "http"
+version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482"
+checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea"
dependencies = [
"bytes",
"fnv",
@@ -897,12 +846,35 @@ dependencies = [
[[package]]
name = "http-body"
-version = "0.4.5"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2"
+dependencies = [
+ "bytes",
+ "http 0.2.11",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "http-body"
+version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
+checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643"
dependencies = [
"bytes",
- "http",
+ "http 1.0.0",
+]
+
+[[package]]
+name = "http-body-util"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840"
+dependencies = [
+ "bytes",
+ "futures-util",
+ "http 1.0.0",
+ "http-body 1.0.0",
"pin-project-lite",
]
@@ -929,22 +901,22 @@ dependencies = [
[[package]]
name = "hyper"
-version = "0.14.27"
+version = "0.14.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468"
+checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80"
dependencies = [
"bytes",
"futures-channel",
"futures-core",
"futures-util",
- "h2",
- "http",
- "http-body",
+ "h2 0.3.24",
+ "http 0.2.11",
+ "http-body 0.4.6",
"httparse",
"httpdate",
"itoa",
"pin-project-lite",
- "socket2 0.4.9",
+ "socket2",
"tokio",
"tower-service",
"tracing",
@@ -952,30 +924,67 @@ dependencies = [
]
[[package]]
+name = "hyper"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5aa53871fc917b1a9ed87b683a5d86db645e23acb32c2e0785a353e522fb75"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-util",
+ "h2 0.4.2",
+ "http 1.0.0",
+ "http-body 1.0.0",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite",
+ "tokio",
+]
+
+[[package]]
name = "hyper-tls"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905"
dependencies = [
"bytes",
- "hyper",
+ "hyper 0.14.28",
"native-tls",
"tokio",
"tokio-native-tls",
]
[[package]]
+name = "hyper-util"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bdea9aac0dbe5a9240d68cfd9501e2db94222c6dc06843e06640b9e07f0fdc67"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-util",
+ "http 1.0.0",
+ "http-body 1.0.0",
+ "hyper 1.1.0",
+ "pin-project-lite",
+ "socket2",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
name = "iana-time-zone"
-version = "0.1.57"
+version = "0.1.59"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613"
+checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539"
dependencies = [
"android_system_properties",
"core-foundation-sys",
"iana-time-zone-haiku",
"js-sys",
"wasm-bindgen",
- "windows",
+ "windows-core",
]
[[package]]
@@ -995,100 +1004,54 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
[[package]]
name = "idna"
-version = "0.4.0"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c"
+checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
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 0.12.3",
- "serde",
-]
-
-[[package]]
name = "indexmap"
-version = "2.0.0"
+version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d"
+checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f"
dependencies = [
"equivalent",
- "hashbrown 0.14.0",
+ "hashbrown",
]
[[package]]
-name = "inlinable_string"
-version = "0.1.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb"
-
-[[package]]
-name = "inotify"
-version = "0.9.6"
+name = "intl-memoizer"
+version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff"
+checksum = "c310433e4a310918d6ed9243542a6b83ec1183df95dff8f23f87bb88a264a66f"
dependencies = [
- "bitflags 1.3.2",
- "inotify-sys",
- "libc",
+ "type-map",
+ "unic-langid",
]
[[package]]
-name = "inotify-sys"
-version = "0.1.5"
+name = "intl_pluralrules"
+version = "7.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb"
+checksum = "078ea7b7c29a2b4df841a7f6ac8775ff6074020c6776d48491ce2268e068f972"
dependencies = [
- "libc",
+ "unic-langid",
]
[[package]]
name = "ipnet"
-version = "2.8.0"
+version = "2.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6"
-
-[[package]]
-name = "is-terminal"
-version = "0.4.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b"
-dependencies = [
- "hermit-abi",
- "rustix",
- "windows-sys 0.48.0",
-]
+checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3"
[[package]]
name = "isolang"
-version = "2.3.0"
+version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f80f221db1bc708b71128757b9396727c04de86968081e18e89b0575e03be071"
+checksum = "fe50d48c77760c55188549098b9a7f6e37ae980c586a24693d6b01c3b2010c3c"
dependencies = [
"phf",
"serde",
@@ -1096,40 +1059,20 @@ dependencies = [
[[package]]
name = "itoa"
-version = "1.0.9"
+version = "1.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
+checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c"
[[package]]
name = "js-sys"
-version = "0.3.64"
+version = "0.3.67"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a"
+checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1"
dependencies = [
"wasm-bindgen",
]
[[package]]
-name = "kqueue"
-version = "1.0.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c"
-dependencies = [
- "kqueue-sys",
- "libc",
-]
-
-[[package]]
-name = "kqueue-sys"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b"
-dependencies = [
- "bitflags 1.3.2",
- "libc",
-]
-
-[[package]]
name = "lazy_static"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1137,21 +1080,21 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "libc"
-version = "0.2.148"
+version = "0.2.152"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b"
+checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7"
[[package]]
name = "libm"
-version = "0.2.7"
+version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4"
+checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058"
[[package]]
name = "linux-raw-sys"
-version = "0.4.7"
+version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a9bad9f94746442c783ca431b22403b519cd7fbeed0533fdd6328b2f2212128"
+checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c"
[[package]]
name = "listenbrainz"
@@ -1167,9 +1110,9 @@ dependencies = [
[[package]]
name = "lock_api"
-version = "0.4.10"
+version = "0.4.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
+checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
dependencies = [
"autocfg",
"scopeguard",
@@ -1186,25 +1129,10 @@ dependencies = [
]
[[package]]
-name = "loom"
-version = "0.5.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5"
-dependencies = [
- "cfg-if",
- "generator",
- "scoped-tls",
- "serde",
- "serde_json",
- "tracing",
- "tracing-subscriber",
-]
-
-[[package]]
name = "markdown"
-version = "1.0.0-alpha.13"
+version = "1.0.0-alpha.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92e9ce98969bb1391c8d6fdac320897ea7e86c4d356e8f220a5abd28b142e512"
+checksum = "5b0f0025e8c0d89b84d6dc63e859475e40e8e82ab1a08be0a93ad5731513a508"
dependencies = [
"unicode-id",
]
@@ -1254,19 +1182,10 @@ dependencies = [
]
[[package]]
-name = "matchers"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
-dependencies = [
- "regex-automata 0.1.10",
-]
-
-[[package]]
name = "memchr"
-version = "2.6.3"
+version = "2.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c"
+checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
[[package]]
name = "mime"
@@ -1285,6 +1204,12 @@ dependencies = [
]
[[package]]
+name = "minimal-lexical"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+
+[[package]]
name = "miniz_oxide"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1295,37 +1220,16 @@ dependencies = [
[[package]]
name = "mio"
-version = "0.8.8"
+version = "0.8.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2"
+checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09"
dependencies = [
"libc",
- "log",
"wasi",
"windows-sys 0.48.0",
]
[[package]]
-name = "multer"
-version = "2.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01acbdc23469fd8fe07ab135923371d5f5a422fbf9c522158677c8eb15bc51c2"
-dependencies = [
- "bytes",
- "encoding_rs",
- "futures-util",
- "http",
- "httparse",
- "log",
- "memchr",
- "mime",
- "spin",
- "tokio",
- "tokio-util",
- "version_check",
-]
-
-[[package]]
name = "native-tls"
version = "0.2.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1350,47 +1254,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c96aba5aa877601bb3f6dd6a63a969e1f82e60646e81e71b14496995e9853c91"
[[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"
+name = "nix"
+version = "0.27.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "729f63e1ca555a43fe3efa4f3efdf4801c479da85b432242a7b726f353c88486"
+checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053"
dependencies = [
- "bitflags 1.3.2",
- "crossbeam-channel",
- "filetime",
- "fsevent-sys",
- "inotify",
- "kqueue",
+ "bitflags 2.4.2",
+ "cfg-if",
"libc",
- "mio",
- "walkdir",
- "windows-sys 0.45.0",
]
[[package]]
-name = "nu-ansi-term"
-version = "0.46.0"
+name = "nom"
+version = "7.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
+checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
dependencies = [
- "overload",
- "winapi",
+ "memchr",
+ "minimal-lexical",
]
[[package]]
name = "num-traits"
-version = "0.2.16"
+version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2"
+checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c"
dependencies = [
"autocfg",
]
@@ -1407,26 +1295,26 @@ dependencies = [
[[package]]
name = "object"
-version = "0.32.1"
+version = "0.32.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0"
+checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
dependencies = [
"memchr",
]
[[package]]
name = "once_cell"
-version = "1.18.0"
+version = "1.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
+checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
[[package]]
name = "openssl"
-version = "0.10.57"
+version = "0.10.63"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bac25ee399abb46215765b1cb35bc0212377e58a061560d8b29b024fd0430e7c"
+checksum = "15c9d69dd87a29568d4d017cfe8ec518706046a05184e5aea92d0af890b803c8"
dependencies = [
- "bitflags 2.4.0",
+ "bitflags 2.4.2",
"cfg-if",
"foreign-types",
"libc",
@@ -1442,8 +1330,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
dependencies = [
"proc-macro2",
- "quote 1.0.33",
- "syn 2.0.35",
+ "quote 1.0.35",
+ "syn 2.0.48",
]
[[package]]
@@ -1454,9 +1342,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
[[package]]
name = "openssl-sys"
-version = "0.9.93"
+version = "0.9.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db4d56a4c0478783083cfafcc42493dd4a981d41669da64b4572a2a089b51b1d"
+checksum = "22e1bf214306098e4832460f797824c05d25aacdf896f64a985fb0fd992454ae"
dependencies = [
"cc",
"libc",
@@ -1465,12 +1353,6 @@ dependencies = [
]
[[package]]
-name = "overload"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
-
-[[package]]
name = "parking_lot"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1482,9 +1364,9 @@ dependencies = [
[[package]]
name = "parking_lot_core"
-version = "0.9.8"
+version = "0.9.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"
+checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
dependencies = [
"cfg-if",
"libc",
@@ -1494,99 +1376,22 @@ dependencies = [
]
[[package]]
-name = "parse-zoneinfo"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c705f256449c60da65e11ff6626e0c16a0a0b96aaa348de61376b249bc340f41"
-dependencies = [
- "regex",
-]
-
-[[package]]
name = "parse_link_header"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3687fe9debbbf2a019f381a8bc6b42049b22647449b39af54b3013985c0cf6de"
dependencies = [
- "http",
+ "http 0.2.11",
"lazy_static",
"regex",
"url",
]
[[package]]
-name = "pear"
-version = "0.2.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61a386cd715229d399604b50d1361683fe687066f42d56f54be995bc6868f71c"
-dependencies = [
- "inlinable_string",
- "pear_codegen",
- "yansi 1.0.0-rc.1",
-]
-
-[[package]]
-name = "pear_codegen"
-version = "0.2.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da9f0f13dac8069c139e8300a6510e3f4143ecf5259c60b116a9b271b4ca0d54"
-dependencies = [
- "proc-macro2",
- "proc-macro2-diagnostics",
- "quote 1.0.33",
- "syn 2.0.35",
-]
-
-[[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.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7a4d085fd991ac8d5b05a147b437791b4260b76326baf0fc60cf7c9c27ecd33"
-dependencies = [
- "memchr",
- "thiserror",
- "ucd-trie",
-]
-
-[[package]]
-name = "pest_derive"
-version = "2.7.3"
+version = "2.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2bee7be22ce7918f641a33f08e3f43388c7656772244e2bbb2477f44cc9021a"
-dependencies = [
- "pest",
- "pest_generator",
-]
-
-[[package]]
-name = "pest_generator"
-version = "2.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d1511785c5e98d79a05e8a6bc34b4ac2168a0e3e92161862030ad84daa223141"
-dependencies = [
- "pest",
- "pest_meta",
- "proc-macro2",
- "quote 1.0.33",
- "syn 2.0.35",
-]
-
-[[package]]
-name = "pest_meta"
-version = "2.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b42f0394d3123e33353ca5e1e89092e533d2cc490389f2bd6131c43c634ebc5f"
-dependencies = [
- "once_cell",
- "pest",
- "sha2",
-]
+checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
[[package]]
name = "phf"
@@ -1598,26 +1403,6 @@ dependencies = [
]
[[package]]
-name = "phf_codegen"
-version = "0.11.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a"
-dependencies = [
- "phf_generator",
- "phf_shared",
-]
-
-[[package]]
-name = "phf_generator"
-version = "0.11.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0"
-dependencies = [
- "phf_shared",
- "rand",
-]
-
-[[package]]
name = "phf_shared"
version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1640,9 +1425,64 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
[[package]]
name = "pkg-config"
-version = "0.3.27"
+version = "0.3.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
+checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb"
+
+[[package]]
+name = "poem"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38a712ff53e257d60d3d22936c51cafa606552129d55539c8a400de44eff676d"
+dependencies = [
+ "async-trait",
+ "bytes",
+ "futures-util",
+ "headers",
+ "hex",
+ "http 1.0.0",
+ "http-body-util",
+ "hyper 1.1.0",
+ "hyper-util",
+ "mime",
+ "mime_guess",
+ "nix",
+ "parking_lot",
+ "percent-encoding",
+ "pin-project-lite",
+ "poem-derive",
+ "regex",
+ "rfc7239",
+ "rust-embed",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "smallvec",
+ "sync_wrapper",
+ "thiserror",
+ "tokio",
+ "tokio-util",
+ "tracing",
+ "wildmatch",
+]
+
+[[package]]
+name = "poem-derive"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e2bd3f82499a00ecb2d0e06bb1b9a17540aeaa28bab14336a94255ff5185f8f"
+dependencies = [
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote 1.0.35",
+ "syn 2.0.48",
+]
+
+[[package]]
+name = "powerfmt"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
[[package]]
name = "ppv-lite86"
@@ -1651,25 +1491,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
[[package]]
-name = "proc-macro2"
-version = "1.0.67"
+name = "proc-macro-crate"
+version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328"
+checksum = "97dc5fea232fc28d2f597b37c4876b348a40e33f3b02cc975c8d006d78d94b1a"
dependencies = [
- "unicode-ident",
+ "toml_datetime",
+ "toml_edit 0.20.2",
]
[[package]]
-name = "proc-macro2-diagnostics"
-version = "0.10.1"
+name = "proc-macro2"
+version = "1.0.78"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8"
+checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae"
dependencies = [
- "proc-macro2",
- "quote 1.0.33",
- "syn 2.0.35",
- "version_check",
- "yansi 1.0.0-rc.1",
+ "unicode-ident",
]
[[package]]
@@ -1701,9 +1538,9 @@ checksum = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a"
[[package]]
name = "quote"
-version = "1.0.33"
+version = "1.0.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
+checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
dependencies = [
"proc-macro2",
]
@@ -1740,92 +1577,57 @@ dependencies = [
[[package]]
name = "redox_syscall"
-version = "0.3.5"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
+checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
dependencies = [
"bitflags 1.3.2",
]
[[package]]
-name = "ref-cast"
-version = "1.0.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "acde58d073e9c79da00f2b5b84eed919c8326832648a5b109b3fce1bb1175280"
-dependencies = [
- "ref-cast-impl",
-]
-
-[[package]]
-name = "ref-cast-impl"
-version = "1.0.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f7473c2cfcf90008193dd0e3e16599455cb601a9fce322b5bb55de799664925"
-dependencies = [
- "proc-macro2",
- "quote 1.0.33",
- "syn 2.0.35",
-]
-
-[[package]]
name = "regex"
-version = "1.9.5"
+version = "1.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47"
+checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15"
dependencies = [
"aho-corasick",
"memchr",
- "regex-automata 0.3.8",
- "regex-syntax 0.7.5",
+ "regex-automata",
+ "regex-syntax",
]
[[package]]
name = "regex-automata"
-version = "0.1.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
-dependencies = [
- "regex-syntax 0.6.29",
-]
-
-[[package]]
-name = "regex-automata"
-version = "0.3.8"
+version = "0.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795"
+checksum = "3b7fa1134405e2ec9353fd416b17f8dacd46c473d7d3fd1cf202706a14eb792a"
dependencies = [
"aho-corasick",
"memchr",
- "regex-syntax 0.7.5",
+ "regex-syntax",
]
[[package]]
name = "regex-syntax"
-version = "0.6.29"
+version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
-
-[[package]]
-name = "regex-syntax"
-version = "0.7.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da"
+checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
[[package]]
name = "reqwest"
-version = "0.11.20"
+version = "0.11.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1"
+checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41"
dependencies = [
"base64",
"bytes",
"encoding_rs",
"futures-core",
"futures-util",
- "h2",
- "http",
- "http-body",
- "hyper",
+ "h2 0.3.24",
+ "http 0.2.11",
+ "http-body 0.4.6",
+ "hyper 0.14.28",
"hyper-tls",
"ipnet",
"js-sys",
@@ -1839,6 +1641,7 @@ dependencies = [
"serde",
"serde_json",
"serde_urlencoded",
+ "system-configuration",
"tokio",
"tokio-native-tls",
"tokio-util",
@@ -1852,98 +1655,46 @@ dependencies = [
]
[[package]]
-name = "rocket"
-version = "0.5.0-rc.3"
+name = "rfc7239"
+version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "58734f7401ae5cfd129685b48f61182331745b357b96f2367f01aebaf1cc9cc9"
+checksum = "087317b3cf7eb481f13bd9025d729324b7cd068d6f470e2d76d049e191f5ba47"
dependencies = [
- "async-stream",
- "async-trait",
- "atomic",
- "binascii",
- "bytes",
- "either",
- "figment",
- "futures",
- "indexmap 1.9.3",
- "is-terminal",
- "log",
- "memchr",
- "multer",
- "num_cpus",
- "parking_lot",
- "pin-project-lite",
- "rand",
- "ref-cast",
- "rocket_codegen",
- "rocket_http",
- "serde",
- "serde_json",
- "state",
- "tempfile",
- "time",
- "tokio",
- "tokio-stream",
- "tokio-util",
- "ubyte",
- "version_check",
- "yansi 0.5.1",
+ "uncased",
]
[[package]]
-name = "rocket_codegen"
-version = "0.5.0-rc.3"
+name = "rust-embed"
+version = "8.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7093353f14228c744982e409259fb54878ba9563d08214f2d880d59ff2fc508b"
+checksum = "a82c0bbc10308ed323529fd3c1dce8badda635aa319a5ff0e6466f33b8101e3f"
dependencies = [
- "devise",
- "glob",
- "indexmap 1.9.3",
- "proc-macro2",
- "quote 1.0.33",
- "rocket_http",
- "syn 2.0.35",
- "unicode-xid 0.2.4",
+ "rust-embed-impl",
+ "rust-embed-utils",
+ "walkdir",
]
[[package]]
-name = "rocket_dyn_templates"
-version = "0.1.0-rc.3"
+name = "rust-embed-impl"
+version = "8.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "276cac97fcddca93d741a4a530f58969f45a5bdb587f8c6b04c75cf849ca7f4c"
+checksum = "6227c01b1783cdfee1bcf844eb44594cd16ec71c35305bf1c9fb5aade2735e16"
dependencies = [
- "glob",
- "normpath",
- "notify",
- "rocket",
- "tera",
+ "proc-macro2",
+ "quote 1.0.35",
+ "rust-embed-utils",
+ "syn 2.0.48",
+ "walkdir",
]
[[package]]
-name = "rocket_http"
-version = "0.5.0-rc.3"
+name = "rust-embed-utils"
+version = "8.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "936012c99162a03a67f37f9836d5f938f662e26f2717809761a9ac46432090f4"
+checksum = "8cb0a25bfbb2d4b4402179c2cf030387d9990857ce08a32592c6238db9fa8665"
dependencies = [
- "cookie",
- "either",
- "futures",
- "http",
- "hyper",
- "indexmap 1.9.3",
- "log",
- "memchr",
- "pear",
- "percent-encoding",
- "pin-project-lite",
- "ref-cast",
- "serde",
- "smallvec",
- "stable-pattern",
- "state",
- "time",
- "tokio",
- "uncased",
+ "sha2",
+ "walkdir",
]
[[package]]
@@ -1953,29 +1704,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
[[package]]
+name = "rustc-hash"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
+
+[[package]]
name = "rustix"
-version = "0.38.13"
+version = "0.38.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7db8590df6dfcd144d22afd1b83b36c21a18d7cbc1dc4bb5295a8712e9eb662"
+checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca"
dependencies = [
- "bitflags 2.4.0",
+ "bitflags 2.4.2",
"errno",
"libc",
"linux-raw-sys",
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
]
[[package]]
-name = "rustversion"
-version = "1.0.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
-
-[[package]]
name = "ryu"
-version = "1.0.15"
+version = "1.0.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
+checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c"
[[package]]
name = "same-file"
@@ -1988,20 +1739,14 @@ dependencies = [
[[package]]
name = "schannel"
-version = "0.1.22"
+version = "0.1.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88"
+checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534"
dependencies = [
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
]
[[package]]
-name = "scoped-tls"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
-
-[[package]]
name = "scopeguard"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2031,32 +1776,47 @@ dependencies = [
]
[[package]]
+name = "self_cell"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e14e4d63b804dc0c7ec4a1e52bcb63f02c7ac94476755aa579edac21e01f915d"
+dependencies = [
+ "self_cell 1.0.3",
+]
+
+[[package]]
+name = "self_cell"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "58bf37232d3bb9a2c4e641ca2a11d83b5062066f88df7fed36c28772046d65ba"
+
+[[package]]
name = "semver"
-version = "1.0.18"
+version = "1.0.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918"
+checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0"
dependencies = [
"serde",
]
[[package]]
name = "serde"
-version = "1.0.188"
+version = "1.0.195"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e"
+checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
-version = "1.0.188"
+version = "1.0.195"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2"
+checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c"
dependencies = [
"proc-macro2",
- "quote 1.0.33",
- "syn 2.0.35",
+ "quote 1.0.35",
+ "syn 2.0.48",
]
[[package]]
@@ -2070,9 +1830,9 @@ dependencies = [
[[package]]
name = "serde_json"
-version = "1.0.107"
+version = "1.0.111"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65"
+checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4"
dependencies = [
"itoa",
"ryu",
@@ -2081,9 +1841,9 @@ dependencies = [
[[package]]
name = "serde_spanned"
-version = "0.6.3"
+version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186"
+checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1"
dependencies = [
"serde",
]
@@ -2101,10 +1861,10 @@ dependencies = [
]
[[package]]
-name = "sha2"
-version = "0.10.7"
+name = "sha1"
+version = "0.10.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8"
+checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
dependencies = [
"cfg-if",
"cpufeatures",
@@ -2112,12 +1872,14 @@ dependencies = [
]
[[package]]
-name = "sharded-slab"
-version = "0.1.4"
+name = "sha2"
+version = "0.10.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31"
+checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
dependencies = [
- "lazy_static",
+ "cfg-if",
+ "cpufeatures",
+ "digest",
]
[[package]]
@@ -2160,65 +1922,22 @@ dependencies = [
]
[[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"
+version = "1.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662"
-dependencies = [
- "libc",
- "winapi",
-]
+checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7"
[[package]]
name = "socket2"
-version = "0.5.4"
+version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e"
+checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9"
dependencies = [
"libc",
"windows-sys 0.48.0",
]
[[package]]
-name = "spin"
-version = "0.9.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
-
-[[package]]
-name = "stable-pattern"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4564168c00635f88eaed410d5efa8131afa8d8699a612c80c455a0ba05c21045"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "state"
-version = "0.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b"
-dependencies = [
- "loom",
-]
-
-[[package]]
name = "static_assertions"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2232,15 +1951,15 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
[[package]]
name = "sval"
-version = "2.6.1"
+version = "2.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b031320a434d3e9477ccf9b5756d57d4272937b8d22cb88af80b7633a1b78b1"
+checksum = "1604e9ab506f4805bc62d2868c6d20f23fa6ced4c7cfe695a1d20589ba5c63d0"
[[package]]
name = "sval_buffer"
-version = "2.6.1"
+version = "2.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6bf7e9412af26b342f3f2cc5cc4122b0105e9d16eb76046cd14ed10106cf6028"
+checksum = "2831b6451148d344f612016d4277348f7721b78a0869a145fd34ef8b06b3fa2e"
dependencies = [
"sval",
"sval_ref",
@@ -2248,18 +1967,18 @@ dependencies = [
[[package]]
name = "sval_dynamic"
-version = "2.6.1"
+version = "2.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a0ef628e8a77a46ed3338db8d1b08af77495123cc229453084e47cd716d403cf"
+checksum = "238ac5832a23099a413ffd22e66f7e6248b9af4581b64c758ca591074be059fc"
dependencies = [
"sval",
]
[[package]]
name = "sval_fmt"
-version = "2.6.1"
+version = "2.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7dc09e9364c2045ab5fa38f7b04d077b3359d30c4c2b3ec4bae67a358bd64326"
+checksum = "c8474862431bac5ac7aee8a12597798e944df33f489c340e17e886767bda0c4e"
dependencies = [
"itoa",
"ryu",
@@ -2268,9 +1987,9 @@ dependencies = [
[[package]]
name = "sval_json"
-version = "2.6.1"
+version = "2.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ada6f627e38cbb8860283649509d87bc4a5771141daa41c78fd31f2b9485888d"
+checksum = "d8f348030cc3d2a11eb534145600601f080cf16bf9ec0783efecd2883f14c21e"
dependencies = [
"itoa",
"ryu",
@@ -2278,24 +1997,34 @@ dependencies = [
]
[[package]]
+name = "sval_nested"
+version = "2.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6659c3f6be1e5e99dc7c518877f48a8a39088ace2504b046db789bd78ce5969d"
+dependencies = [
+ "sval",
+ "sval_buffer",
+ "sval_ref",
+]
+
+[[package]]
name = "sval_ref"
-version = "2.6.1"
+version = "2.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "703ca1942a984bd0d9b5a4c0a65ab8b4b794038d080af4eb303c71bc6bf22d7c"
+checksum = "829ad319bd82d0da77be6f3d547623686c453502f8eebdeb466cfa987972bd28"
dependencies = [
"sval",
]
[[package]]
name = "sval_serde"
-version = "2.6.1"
+version = "2.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "830926cd0581f7c3e5d51efae4d35c6b6fc4db583842652891ba2f1bed8db046"
+checksum = "1a9da6c3efaedf8b8c0861ec5343e8e8c51d838f326478623328bd8728b79bca"
dependencies = [
"serde",
"sval",
- "sval_buffer",
- "sval_fmt",
+ "sval_nested",
]
[[package]]
@@ -2306,7 +2035,7 @@ checksum = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad"
dependencies = [
"quote 0.3.15",
"synom",
- "unicode-xid 0.0.4",
+ "unicode-xid",
]
[[package]]
@@ -2316,28 +2045,58 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
dependencies = [
"proc-macro2",
- "quote 1.0.33",
+ "quote 1.0.35",
"unicode-ident",
]
[[package]]
name = "syn"
-version = "2.0.35"
+version = "2.0.48"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "59bf04c28bee9043ed9ea1e41afc0552288d3aba9c6efdd78903b802926f4879"
+checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f"
dependencies = [
"proc-macro2",
- "quote 1.0.33",
+ "quote 1.0.35",
"unicode-ident",
]
[[package]]
+name = "sync_wrapper"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
+dependencies = [
+ "futures-core",
+]
+
+[[package]]
name = "synom"
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6"
dependencies = [
- "unicode-xid 0.0.4",
+ "unicode-xid",
+]
+
+[[package]]
+name = "system-configuration"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7"
+dependencies = [
+ "bitflags 1.3.2",
+ "core-foundation",
+ "system-configuration-sys",
+]
+
+[[package]]
+name = "system-configuration-sys"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
]
[[package]]
@@ -2348,77 +2107,46 @@ checksum = "8f13fc301d415a8cd4529ba679720c59f07369bcff573618a6e8d5afebefb6f3"
[[package]]
name = "tempfile"
-version = "3.8.0"
+version = "3.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef"
+checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa"
dependencies = [
"cfg-if",
"fastrand",
"redox_syscall",
"rustix",
- "windows-sys 0.48.0",
-]
-
-[[package]]
-name = "tera"
-version = "1.19.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "970dff17c11e884a4a09bc76e3a17ef71e01bb13447a11e85226e254fe6d10b8"
-dependencies = [
- "chrono",
- "chrono-tz",
- "globwalk",
- "humansize",
- "lazy_static",
- "percent-encoding",
- "pest",
- "pest_derive",
- "rand",
- "regex",
- "serde",
- "serde_json",
- "slug",
- "unic-segment",
+ "windows-sys 0.52.0",
]
[[package]]
name = "thiserror"
-version = "1.0.48"
+version = "1.0.56"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7"
+checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
-version = "1.0.48"
+version = "1.0.56"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35"
+checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471"
dependencies = [
"proc-macro2",
- "quote 1.0.33",
- "syn 2.0.35",
-]
-
-[[package]]
-name = "thread_local"
-version = "1.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
-dependencies = [
- "cfg-if",
- "once_cell",
+ "quote 1.0.35",
+ "syn 2.0.48",
]
[[package]]
name = "time"
-version = "0.3.28"
+version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17f6bb557fd245c28e6411aa56b6403c689ad95061f50e4be16c274e70a17e48"
+checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e"
dependencies = [
"deranged",
"itoa",
+ "powerfmt",
"serde",
"time-core",
"time-macros",
@@ -2426,20 +2154,29 @@ dependencies = [
[[package]]
name = "time-core"
-version = "0.1.1"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb"
+checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
[[package]]
name = "time-macros"
-version = "0.2.14"
+version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a942f44339478ef67935ab2bbaec2fb0322496cf3cbe84b261e06ac3814c572"
+checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f"
dependencies = [
"time-core",
]
[[package]]
+name = "tinystr"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "83c02bf3c538ab32ba913408224323915f4ef9a6d61c0e85d493f355921c0ece"
+dependencies = [
+ "displaydoc",
+]
+
+[[package]]
name = "tinyvec"
version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2456,9 +2193,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
-version = "1.32.0"
+version = "1.35.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9"
+checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104"
dependencies = [
"backtrace",
"bytes",
@@ -2468,20 +2205,20 @@ dependencies = [
"parking_lot",
"pin-project-lite",
"signal-hook-registry",
- "socket2 0.5.4",
+ "socket2",
"tokio-macros",
"windows-sys 0.48.0",
]
[[package]]
name = "tokio-macros"
-version = "2.1.0"
+version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e"
+checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
dependencies = [
"proc-macro2",
- "quote 1.0.33",
- "syn 2.0.35",
+ "quote 1.0.35",
+ "syn 2.0.48",
]
[[package]]
@@ -2507,9 +2244,9 @@ dependencies = [
[[package]]
name = "tokio-util"
-version = "0.7.8"
+version = "0.7.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d"
+checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15"
dependencies = [
"bytes",
"futures-core",
@@ -2528,7 +2265,7 @@ dependencies = [
"serde",
"serde_spanned",
"toml_datetime",
- "toml_edit",
+ "toml_edit 0.19.15",
]
[[package]]
@@ -2546,7 +2283,7 @@ version = "0.19.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
dependencies = [
- "indexmap 2.0.0",
+ "indexmap",
"serde",
"serde_spanned",
"toml_datetime",
@@ -2554,6 +2291,17 @@ dependencies = [
]
[[package]]
+name = "toml_edit"
+version = "0.20.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338"
+dependencies = [
+ "indexmap",
+ "toml_datetime",
+ "winnow",
+]
+
+[[package]]
name = "tower-service"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2561,11 +2309,10 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
[[package]]
name = "tracing"
-version = "0.1.37"
+version = "0.1.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
+checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
dependencies = [
- "cfg-if",
"pin-project-lite",
"tracing-attributes",
"tracing-core",
@@ -2573,139 +2320,70 @@ dependencies = [
[[package]]
name = "tracing-attributes"
-version = "0.1.26"
+version = "0.1.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab"
+checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [
"proc-macro2",
- "quote 1.0.33",
- "syn 2.0.35",
+ "quote 1.0.35",
+ "syn 2.0.48",
]
[[package]]
name = "tracing-core"
-version = "0.1.31"
+version = "0.1.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a"
+checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
dependencies = [
"once_cell",
- "valuable",
]
[[package]]
-name = "tracing-log"
-version = "0.1.3"
+name = "try-lock"
+version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922"
-dependencies = [
- "lazy_static",
- "log",
- "tracing-core",
-]
+checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
[[package]]
-name = "tracing-subscriber"
-version = "0.3.17"
+name = "type-map"
+version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77"
+checksum = "b6d3364c5e96cb2ad1603037ab253ddd34d7fb72a58bdddf4b7350760fc69a46"
dependencies = [
- "matchers",
- "nu-ansi-term",
- "once_cell",
- "regex",
- "sharded-slab",
- "smallvec",
- "thread_local",
- "tracing",
- "tracing-core",
- "tracing-log",
+ "rustc-hash",
]
[[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.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
[[package]]
-name = "ubyte"
-version = "0.10.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c81f0dae7d286ad0d9366d7679a77934cfc3cf3a8d67e82669794412b2368fe6"
-dependencies = [
- "serde",
-]
-
-[[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"
+version = "0.9.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b9bc53168a4be7402ab86c3aad243a84dd7381d09be0eddc81280c1da95ca68"
+checksum = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697"
dependencies = [
- "serde",
"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"
+name = "unic-langid"
+version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2079c122a62205b421f499da10f3ee0f7697f012f55b675e002483c73ea34700"
+checksum = "238722e6d794ed130f91f4ea33e01fcff4f188d92337a21297892521c72df516"
dependencies = [
- "unic-char-property",
- "unic-char-range",
- "unic-ucd-version",
+ "unic-langid-impl",
]
[[package]]
-name = "unic-ucd-version"
-version = "0.9.0"
+name = "unic-langid-impl"
+version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4"
+checksum = "4bd55a2063fdea4ef1f8633243a7b0524cbeef1905ae04c31a1c9b9775c55bc6"
dependencies = [
- "unic-common",
+ "tinystr",
]
[[package]]
@@ -2719,9 +2397,9 @@ dependencies = [
[[package]]
name = "unicode-bidi"
-version = "0.3.13"
+version = "0.3.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
+checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75"
[[package]]
name = "unicode-id"
@@ -2757,16 +2435,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc"
[[package]]
-name = "unicode-xid"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
-
-[[package]]
name = "url"
-version = "2.4.1"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5"
+checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633"
dependencies = [
"form_urlencoded",
"idna",
@@ -2775,24 +2447,18 @@ dependencies = [
[[package]]
name = "uuid"
-version = "1.4.1"
+version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d"
+checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a"
dependencies = [
"getrandom",
]
[[package]]
-name = "valuable"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
-
-[[package]]
name = "value-bag"
-version = "1.4.1"
+version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d92ccd67fb88503048c01b59152a04effd0782d035a83a6d256ce6085f08f4a3"
+checksum = "7cdbaf5e132e593e9fc1de6a15bbec912395b11fb9719e061cf64f804524c503"
dependencies = [
"value-bag-serde1",
"value-bag-sval2",
@@ -2800,9 +2466,9 @@ dependencies = [
[[package]]
name = "value-bag-serde1"
-version = "1.4.1"
+version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b0b9f3feef403a50d4d67e9741a6d8fc688bcbb4e4f31bd4aab72cc690284394"
+checksum = "92cad98b1b18d06b6f38b3cd04347a9d7a3a0111441a061f71377fb6740437e4"
dependencies = [
"erased-serde",
"serde",
@@ -2811,9 +2477,9 @@ dependencies = [
[[package]]
name = "value-bag-sval2"
-version = "1.4.1"
+version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30b24f4146b6f3361e91cbf527d1fb35e9376c3c0cef72ca5ec5af6d640fad7d"
+checksum = "3dc7271d6b3bf58dd2e610a601c0e159f271ffdb7fbb21517c40b52138d64f8e"
dependencies = [
"sval",
"sval_buffer",
@@ -2863,9 +2529,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "wasm-bindgen"
-version = "0.2.87"
+version = "0.2.90"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342"
+checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406"
dependencies = [
"cfg-if",
"wasm-bindgen-macro",
@@ -2873,24 +2539,24 @@ dependencies = [
[[package]]
name = "wasm-bindgen-backend"
-version = "0.2.87"
+version = "0.2.90"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd"
+checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd"
dependencies = [
"bumpalo",
"log",
"once_cell",
"proc-macro2",
- "quote 1.0.33",
- "syn 2.0.35",
+ "quote 1.0.35",
+ "syn 2.0.48",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-futures"
-version = "0.4.37"
+version = "0.4.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03"
+checksum = "bde2032aeb86bdfaecc8b261eef3cba735cc426c1f3a3416d1e0791be95fc461"
dependencies = [
"cfg-if",
"js-sys",
@@ -2900,32 +2566,32 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.87"
+version = "0.2.90"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d"
+checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999"
dependencies = [
- "quote 1.0.33",
+ "quote 1.0.35",
"wasm-bindgen-macro-support",
]
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.87"
+version = "0.2.90"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b"
+checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7"
dependencies = [
"proc-macro2",
- "quote 1.0.33",
- "syn 2.0.35",
+ "quote 1.0.35",
+ "syn 2.0.48",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.87"
+version = "0.2.90"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1"
+checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b"
[[package]]
name = "wasm-streams"
@@ -2942,15 +2608,21 @@ dependencies = [
[[package]]
name = "web-sys"
-version = "0.3.64"
+version = "0.3.67"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b"
+checksum = "58cd2333b6e0be7a39605f0e255892fd7418a682d8da8fe042fe25128794d2ed"
dependencies = [
"js-sys",
"wasm-bindgen",
]
[[package]]
+name = "wildmatch"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "495ec47bf3c1345005f40724f0269362c8556cbc43aed0526ed44cae1d35fceb"
+
+[[package]]
name = "winapi"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2968,9 +2640,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-util"
-version = "0.1.5"
+version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596"
dependencies = [
"winapi",
]
@@ -2982,21 +2654,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
-name = "windows"
-version = "0.48.0"
+name = "windows-core"
+version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
dependencies = [
- "windows-targets 0.48.5",
-]
-
-[[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",
+ "windows-targets 0.52.0",
]
[[package]]
@@ -3009,18 +2672,12 @@ dependencies = [
]
[[package]]
-name = "windows-targets"
-version = "0.42.2"
+name = "windows-sys"
+version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
+checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
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",
+ "windows-targets 0.52.0",
]
[[package]]
@@ -3039,10 +2696,19 @@ dependencies = [
]
[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.42.2"
+name = "windows-targets"
+version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
+checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd"
+dependencies = [
+ "windows_aarch64_gnullvm 0.52.0",
+ "windows_aarch64_msvc 0.52.0",
+ "windows_i686_gnu 0.52.0",
+ "windows_i686_msvc 0.52.0",
+ "windows_x86_64_gnu 0.52.0",
+ "windows_x86_64_gnullvm 0.52.0",
+ "windows_x86_64_msvc 0.52.0",
+]
[[package]]
name = "windows_aarch64_gnullvm"
@@ -3051,10 +2717,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
[[package]]
-name = "windows_aarch64_msvc"
-version = "0.42.2"
+name = "windows_aarch64_gnullvm"
+version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
+checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"
[[package]]
name = "windows_aarch64_msvc"
@@ -3063,10 +2729,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
[[package]]
-name = "windows_i686_gnu"
-version = "0.42.2"
+name = "windows_aarch64_msvc"
+version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
+checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"
[[package]]
name = "windows_i686_gnu"
@@ -3075,10 +2741,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
[[package]]
-name = "windows_i686_msvc"
-version = "0.42.2"
+name = "windows_i686_gnu"
+version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
+checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"
[[package]]
name = "windows_i686_msvc"
@@ -3087,10 +2753,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
[[package]]
-name = "windows_x86_64_gnu"
-version = "0.42.2"
+name = "windows_i686_msvc"
+version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
+checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"
[[package]]
name = "windows_x86_64_gnu"
@@ -3099,10 +2765,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.42.2"
+name = "windows_x86_64_gnu"
+version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
+checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"
[[package]]
name = "windows_x86_64_gnullvm"
@@ -3111,10 +2777,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
[[package]]
-name = "windows_x86_64_msvc"
-version = "0.42.2"
+name = "windows_x86_64_gnullvm"
+version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
+checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"
[[package]]
name = "windows_x86_64_msvc"
@@ -3123,10 +2789,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
+
+[[package]]
name = "winnow"
-version = "0.5.15"
+version = "0.5.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c2e3184b9c4e92ad5167ca73039d0c42476302ab603e2fec4487511f38ccefc"
+checksum = "b7cf47b659b318dccbd69cc4797a39ae128f533dce7902a1096044d1967b9c16"
dependencies = [
"memchr",
]
@@ -3140,15 +2812,3 @@ dependencies = [
"cfg-if",
"windows-sys 0.48.0",
]
-
-[[package]]
-name = "yansi"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec"
-
-[[package]]
-name = "yansi"
-version = "1.0.0-rc.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1367295b8f788d371ce2dbc842c7b709c73ee1364d30351dd300ec2203b12377"
diff --git a/Cargo.toml b/Cargo.toml
index 4995577..25f0664 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,19 +1,16 @@
[package]
name = "blossom"
-version = "1.0.0"
+version = "2.0.0"
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.2", features = ["json"] }
# sqlx = { version = "0.5", default-features = false, features = ["macros", "offline", "migrate"] }
-# rocket_db_pools = { version = "0.1.0-rc.2", features = ["sqlx_sqlite"] }
reqwest = { version = "0.11", features = ["json"] }
mastodon-async = { git = "https://sectorinf.com/cel/mastodon-async.git" }
tokio = { version = "1", features = ["full"] }
serde = { version = "1.0", features = ["derive"] }
-rocket_dyn_templates = { version = "0.1.0-rc.2", features = ["tera"] }
listenbrainz = "0.7"
chrono = "0.4.23"
serde_json = "1.0.97"
@@ -24,3 +21,10 @@ async-trait = "0.1.68"
toml = "0.7.4"
tokio-stream = { version = "0.1.14", features = ["fs"] }
atom_syndication = "0.12.1"
+fluent = "0.16.0"
+poem = { version = "2.0.0", features = ["embed"] }
+askama = { git = "https://bunny.garden/forks/askama.git", features = ["with-poem"] }
+askama_poem = { git = "https://bunny.garden/forks/askama.git" }
+rust-embed = "8.2.0"
+rand = "0.8.5"
+thiserror = "1.0.56"
diff --git a/Rocket.toml b/Rocket.toml
deleted file mode 100644
index 637a20b..0000000
--- a/Rocket.toml
+++ /dev/null
@@ -1,2 +0,0 @@
-#[default.databases.blossom]
-#url = "db/blossom.sqlite"
diff --git a/TODO.md b/TODO.md
index 05d1d9e..7fd1677 100644
--- a/TODO.md
+++ b/TODO.md
@@ -10,7 +10,6 @@
[ ] more badges
[ ] site translations
[ ] comments
-[ ] clean up spaghetti
[ ] brush font PLZ
[ ] deploy database yum
[ ] visitor counter
@@ -22,6 +21,5 @@
badges to steal:
[x] keith
[x] webb
-[ ] hnr
[ ] puff place
[ ] shibao blog
diff --git a/articles/ejabberd.md b/articles/ejabberd.md
index 51a733a..7831432 100644
--- a/articles/ejabberd.md
+++ b/articles/ejabberd.md
@@ -1,6 +1,6 @@
+++
title = "cozy ejabberd xmpp chat server"
-created_at = "2023-09-16T21:07:40+0100"
+published_at = "2023-09-16T21:07:40+0100"
tags = ["tech", "sysadmin"]
+++
@@ -129,9 +129,6 @@ you should follow standard postgresql installation instructions for your OS. onc
## step 6: ejabberd configuration
-- loglevel last
-- create docroot for uploads
-
begin by replacing `localhost` under `hosts` with your virtualhost (e.g. `example.slay`), then list the certfiles you have obtained under `certfiles`.
```
diff --git a/articles/rot.md b/articles/rot.md
index 5af2a8d..a4e1068 100644
--- a/articles/rot.md
+++ b/articles/rot.md
@@ -1,6 +1,6 @@
+++
title = "rot"
-created_at = "2022-04-27T09:48:30+0100"
+published_at = "2022-04-27T09:48:30+0100"
tags = ["thoughts"]
+++
diff --git a/default.nix b/default.nix
new file mode 100644
index 0000000..15762fb
--- /dev/null
+++ b/default.nix
@@ -0,0 +1,23 @@
+{ config, lib, pkgs }:
+
+with lib;
+
+let
+ cfg = config.blossom;
+in
+{
+ options.blossom = {
+ enable = mkEnableOption "blossom";
+ }
+
+ config =
+}
+pkgs.rustPlatform.buildRustPackage rec {
+ pname = "blossom";
+ version = "1.0.0";
+
+ cargoLock.lockFile = /etc/nixos/blossom/Cargo.lock;
+
+ src = pkgs.lib.cleanSource ./.;
+}
+
diff --git a/src/atom.rs b/src/atom.rs
new file mode 100644
index 0000000..4410edb
--- /dev/null
+++ b/src/atom.rs
@@ -0,0 +1,142 @@
+use atom_syndication::{
+ Category, Content as AtomContent, Entry as AtomEntry, Feed, Generator, Link, Person, Text,
+ TextType,
+};
+use chrono::{DateTime, Utc};
+
+use crate::posts::Post;
+
+pub struct Context {
+ /// the page for which the feed is being generated for
+ pub page_title: String,
+ /// the human-readable page the feed is for
+ pub page_url: String,
+ /// the url to the atom xml document
+ pub self_url: String,
+ /// current site language
+ pub lang: String,
+}
+
+pub async fn atom<P: Post + Clone>(ctx: Context, entries: Vec<P>) -> Feed {
+ let mut authors = Vec::new();
+ let me = Person {
+ name: "cel".to_owned(),
+ email: Some("cel@blos.sm".to_owned()),
+ uri: Some("/contact".to_owned()),
+ };
+ authors.push(me.clone());
+ let page_link = Link {
+ href: ctx.page_url.clone(),
+ rel: "alternate".into(),
+ hreflang: Some(ctx.lang.clone()),
+ mime_type: Some("text/html".into()),
+ title: Some(ctx.page_title.clone()),
+ length: None,
+ };
+ let home_link = Link {
+ // TODO?: localisation
+ href: "/".into(),
+ rel: "via".into(),
+ hreflang: Some(ctx.lang.clone()),
+ mime_type: Some("text/html".into()),
+ // TODO: localisation
+ title: Some("cel's garden".into()),
+ length: None,
+ };
+ let self_link = Link {
+ href: ctx.self_url.into(),
+ rel: "self".into(),
+ hreflang: Some(ctx.lang.clone()),
+ mime_type: Some("application/atom+xml".into()),
+ // TODO: localisation
+ title: Some("atom feed".into()),
+ length: None,
+ };
+ let mut links = Vec::new();
+ links.push(page_link);
+ links.push(home_link);
+ links.push(self_link);
+ let mut feed = Feed {
+ title: Text {
+ value: ctx.page_title,
+ base: None,
+ lang: Some(ctx.lang.clone()),
+ r#type: TextType::Text,
+ },
+ id: ctx.page_url,
+ updated: entries
+ .clone()
+ .into_iter()
+ .fold(DateTime::<Utc>::MIN_UTC, |acc, entry| {
+ let updated_at = entry.updated_at().to_owned();
+ if updated_at > acc {
+ updated_at
+ } else {
+ acc
+ }
+ })
+ .into(),
+ authors: authors.clone(),
+ categories: Vec::new(),
+ contributors: authors.clone(),
+ generator: Some(Generator {
+ value: "blossom".into(),
+ uri: Some("https://bunny.garden/cel/blossom".into()),
+ version: None,
+ }),
+ icon: Some("/favicon.ico".into()),
+ links: links.clone(),
+ logo: Some("/logo.png".into()),
+ entries: Vec::new(),
+ // TODO: determine base url from lang
+ base: Some("https://en.blos.sm/".into()),
+ lang: Some(ctx.lang),
+ ..Default::default()
+ };
+ for entry in entries {
+ // TODO: localisation: url from lang + filtering entries translated or not
+ let categories = entry
+ .tags()
+ .into_iter()
+ .map(|category| Category {
+ term: category.clone(),
+ scheme: None,
+ label: Some(category.clone()),
+ })
+ .collect();
+ let published = Some(entry.published_at().to_owned().into());
+ let title = if let Some(title) = entry.subject() {
+ title.to_owned()
+ } else {
+ entry.content()[..30].to_owned() + "..."
+ };
+ let entry = AtomEntry {
+ title: Text {
+ value: title,
+ base: None,
+ lang: Some(entry.lang().to_owned()),
+ r#type: TextType::Text,
+ },
+ id: entry.link(),
+ updated: entry.updated_at().to_owned().into(),
+ authors: authors.clone(),
+ categories,
+ contributors: authors.clone(),
+ links: links.clone(),
+ published,
+ rights: None,
+ source: None,
+ summary: None,
+ content: Some(AtomContent {
+ base: None,
+ lang: Some(entry.lang().to_owned()),
+ value: Some(entry.content().to_owned()),
+ src: Some(entry.link()),
+ content_type: Some("html".to_string()),
+ }),
+ ..Default::default()
+ };
+ feed.entries.push(entry);
+ }
+ feed
+}
diff --git a/src/blog.rs b/src/blog.rs
new file mode 100644
index 0000000..22cee05
--- /dev/null
+++ b/src/blog.rs
@@ -0,0 +1,186 @@
+use std::path::Path;
+
+use markdown::{mdast::Node, CompileOptions, Constructs, Options, ParseOptions};
+use serde::Deserialize;
+use tokio::{fs, io::AsyncReadExt};
+
+use chrono::{DateTime, Utc};
+
+use crate::{
+ error::BlossomError,
+ posts::{Post, PostType},
+ Result,
+};
+
+static ARTICLES_DIR: &str = "./articles";
+
+#[derive(Clone)]
+pub struct Blogpost {
+ file_name: String,
+ title: String,
+ published_at: DateTime<Utc>,
+ updated_at: Option<DateTime<Utc>>,
+ tags: Vec<String>,
+ content: String,
+}
+
+#[derive(Deserialize)]
+pub struct BlogpostMetadata {
+ title: String,
+ published_at: String,
+ updated_at: Option<String>,
+ tags: Vec<String>,
+}
+
+impl Post for Blogpost {
+ fn id(&self) -> &str {
+ &self.file_name
+ }
+
+ fn subject(&self) -> Option<&str> {
+ Some(&self.title)
+ }
+
+ fn published_at(&self) -> &DateTime<Utc> {
+ &self.published_at
+ }
+
+ fn updated_at(&self) -> &DateTime<Utc> {
+ if let Some(updated_at) = &self.updated_at {
+ updated_at
+ } else {
+ &self.published_at
+ }
+ }
+
+ fn tags(&self) -> &Vec<String> {
+ &self.tags
+ }
+
+ fn lang(&self) -> &str {
+ "en"
+ }
+
+ fn post_type(&self) -> PostType {
+ PostType::Article
+ }
+
+ fn content(&self) -> &str {
+ &self.content
+ }
+}
+
+impl Blogpost {
+ pub fn file_name(&self) -> &str {
+ &self.file_name
+ }
+
+ async fn from_path(path: impl AsRef<Path>) -> Result<Self> {
+ let mut file = fs::File::open(&path).await?;
+ let mut buf = String::new();
+ file.read_to_string(&mut buf).await?;
+ let parse_options = ParseOptions {
+ constructs: Constructs {
+ frontmatter: true,
+ ..Constructs::gfm()
+ },
+ ..ParseOptions::default()
+ };
+ let metadata: BlogpostMetadata = markdown::to_mdast(&buf, &parse_options)
+ .unwrap()
+ .try_into()?;
+ let file_name = path
+ .as_ref()
+ .file_name()
+ .ok_or(BlossomError::NotAFile)?
+ .to_string_lossy();
+ let file_name = file_name[..file_name.len() - 3].to_owned();
+ let updated_at = if let Some(updated_at) = metadata.updated_at {
+ Some(updated_at.parse::<DateTime<Utc>>()?)
+ } else {
+ None
+ };
+ // TODO: cache render only when needed
+ let options = Options {
+ parse: parse_options,
+ compile: CompileOptions {
+ gfm_task_list_item_checkable: true,
+ allow_dangerous_html: true,
+ ..CompileOptions::default()
+ },
+ };
+ let content = markdown::to_html_with_options(&buf, &options).unwrap();
+ Ok(Self {
+ file_name,
+ title: metadata.title,
+ published_at: metadata.published_at.parse::<DateTime<Utc>>()?,
+ updated_at,
+ tags: metadata.tags,
+ content,
+ })
+ }
+
+ // async fn render(&mut self) -> Result<String> {
+ // let path = Path::new(ARTICLES_DIR)
+ // .join(&self.file_name)
+ // .with_extension("md");
+ // // TODO: remove unwraps when file read failure
+ // let mut file = fs::File::open(&path).await.unwrap();
+ // let mut buf = String::new();
+ // file.read_to_string(&mut buf).await.unwrap();
+ // let parse_options = ParseOptions {
+ // constructs: Constructs {
+ // frontmatter: true,
+ // ..Constructs::gfm()
+ // },
+ // ..ParseOptions::default()
+ // };
+ // let options = Options {
+ // parse: parse_options,
+ // compile: CompileOptions {
+ // gfm_task_list_item_checkable: true,
+ // allow_dangerous_html: true,
+ // ..CompileOptions::default()
+ // },
+ // };
+ // let content = markdown::to_html_with_options(&buf, &options).unwrap();
+ // Ok(content)
+ // }
+}
+
+impl TryFrom<Node> for BlogpostMetadata {
+ type Error = BlossomError;
+
+ fn try_from(tree: Node) -> std::prelude::v1::Result<Self, Self::Error> {
+ let children = tree.children();
+ if let Some(children) = children {
+ if let Some(toml) = children.into_iter().find_map(|el| match el {
+ Node::Toml(toml) => Some(&toml.value),
+ _ => None,
+ }) {
+ return Ok(toml::from_str(toml)?);
+ };
+ }
+ Err(BlossomError::NoMetadata)
+ }
+}
+
+pub async fn get_blogposts() -> Result<Vec<Blogpost>> {
+ let mut blogposts: Vec<Blogpost> = Vec::new();
+ let mut articles_dir = fs::read_dir(ARTICLES_DIR).await?;
+ while let Some(entry) = articles_dir.next_entry().await? {
+ let blogpost = Blogpost::from_path(entry.path()).await?;
+ blogposts.push(blogpost);
+ }
+ blogposts.sort_by_key(|post| post.published_at);
+ blogposts.reverse();
+ Ok(blogposts)
+}
+
+pub async fn get_blogpost(file_name: &str) -> Result<Blogpost> {
+ let path = Path::new(ARTICLES_DIR)
+ .join(Path::new(file_name))
+ .with_extension("md");
+ println!("{:?}", path);
+ Blogpost::from_path(path).await
+}
diff --git a/src/error.rs b/src/error.rs
index 42c01b1..611ce79 100644
--- a/src/error.rs
+++ b/src/error.rs
@@ -1,66 +1,112 @@
use std::string::FromUtf8Error;
-use rocket::{http::Status, Responder};
+use poem::{error::ResponseError, http::StatusCode, IntoResponse};
+use thiserror::Error;
-#[derive(Responder, Debug)]
+use crate::templates;
+
+#[derive(Error, Debug)]
pub enum BlossomError {
- Reqwest(Status, #[response(ignore)] reqwest::Error),
- ListenBrainz(Status, #[response(ignore)] listenbrainz::Error),
- Skinnyverse(Status, #[response(ignore)] mastodon_async::Error),
- Chrono(Status, #[response(ignore)] chrono::ParseError),
- Io(Status, #[response(ignore)] std::io::Error),
- Deserialization(Status, #[response(ignore)] toml::de::Error),
- Syndicator(Status, #[response(ignore)] atom_syndication::Error),
- Utf8Conversion(Status, #[response(ignore)] FromUtf8Error),
- NotFound(Status),
- NoMetadata(Status),
- Unimplemented(Status),
+ #[error("http client error")]
+ Reqwest(reqwest::Error),
+ #[error("listenbrainz error")]
+ ListenBrainz(listenbrainz::Error),
+ #[error("mastadon error")]
+ Skinnyverse(mastodon_async::Error),
+ #[error("failed to parse timestamp")]
+ Chrono(chrono::ParseError),
+ #[error("io error")]
+ Io(std::io::Error),
+ #[error("toml deserialization error")]
+ Deserialization(toml::de::Error),
+ #[error("atom syndication error")]
+ Syndicator(atom_syndication::Error),
+ #[error("utf8 conversion error")]
+ Utf8Conversion(FromUtf8Error),
+ #[error("not found")]
+ NotFound,
+ #[error("no metadata")]
+ NoMetadata,
+ #[error("unimplemented")]
+ Unimplemented,
+ #[error("not a file")]
+ NotAFile,
+}
+
+impl ResponseError for BlossomError {
+ fn status(&self) -> poem::http::StatusCode {
+ match self {
+ BlossomError::Reqwest(_) => StatusCode::INTERNAL_SERVER_ERROR,
+ BlossomError::ListenBrainz(_) => StatusCode::INTERNAL_SERVER_ERROR,
+ BlossomError::Skinnyverse(_) => StatusCode::INTERNAL_SERVER_ERROR,
+ BlossomError::Chrono(_) => StatusCode::INTERNAL_SERVER_ERROR,
+ BlossomError::Io(_) => StatusCode::INTERNAL_SERVER_ERROR,
+ BlossomError::Deserialization(_) => StatusCode::INTERNAL_SERVER_ERROR,
+ BlossomError::Syndicator(_) => StatusCode::INTERNAL_SERVER_ERROR,
+ BlossomError::Utf8Conversion(_) => StatusCode::INTERNAL_SERVER_ERROR,
+ BlossomError::NotFound => StatusCode::INTERNAL_SERVER_ERROR,
+ BlossomError::NoMetadata => StatusCode::INTERNAL_SERVER_ERROR,
+ BlossomError::Unimplemented => StatusCode::INTERNAL_SERVER_ERROR,
+ BlossomError::NotAFile => StatusCode::INTERNAL_SERVER_ERROR,
+ }
+ }
+
+ fn as_response(&self) -> poem::Response
+ where
+ Self: std::error::Error + Send + Sync + 'static,
+ {
+ templates::Error {
+ status: self.status(),
+ message: self.to_string(),
+ }
+ .into_response()
+ }
}
impl From<reqwest::Error> for BlossomError {
fn from(e: reqwest::Error) -> Self {
- BlossomError::Reqwest(Status::new(500), e)
+ BlossomError::Reqwest(e)
}
}
impl From<listenbrainz::Error> for BlossomError {
fn from(e: listenbrainz::Error) -> Self {
- BlossomError::ListenBrainz(Status::new(500), e)
+ BlossomError::ListenBrainz(e)
}
}
impl From<mastodon_async::Error> for BlossomError {
fn from(e: mastodon_async::Error) -> Self {
- BlossomError::Skinnyverse(Status::new(500), e)
+ BlossomError::Skinnyverse(e)
}
}
impl From<chrono::ParseError> for BlossomError {
fn from(e: chrono::ParseError) -> Self {
- BlossomError::Chrono(Status::new(500), e)
+ BlossomError::Chrono(e)
}
}
impl From<std::io::Error> for BlossomError {
fn from(e: std::io::Error) -> Self {
- BlossomError::Io(Status::new(500), e)
+ BlossomError::Io(e)
}
}
impl From<toml::de::Error> for BlossomError {
fn from(e: toml::de::Error) -> Self {
- BlossomError::Deserialization(Status::new(500), e)
+ BlossomError::Deserialization(e)
}
}
impl From<atom_syndication::Error> for BlossomError {
fn from(e: atom_syndication::Error) -> Self {
- BlossomError::Syndicator(Status::new(500), e)
+ BlossomError::Syndicator(e)
}
}
impl From<FromUtf8Error> for BlossomError {
fn from(e: FromUtf8Error) -> Self {
- BlossomError::Utf8Conversion(Status::new(500), e)
+ BlossomError::Utf8Conversion(e)
}
}
diff --git a/src/main.rs b/src/main.rs
index ed768b4..c38b2eb 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,155 +1,139 @@
+mod atom;
+mod blog;
mod error;
mod live;
mod posts;
mod scrobbles;
mod skweets;
-
-use std::borrow::Cow;
-use std::collections::HashSet;
-use std::time::Duration;
-
-use atom_syndication::Feed;
-use rocket::fs::{relative, FileServer};
-use rocket::http::{ContentType, Status};
-use rocket::{Request, State};
-use rocket_dyn_templates::{context, Template};
+mod templates;
+mod utils;
+
+use std::rc::Rc;
+use std::{collections::HashSet, time::Duration};
+
+use poem::http::StatusCode;
+use poem::Response;
+use poem::{
+ endpoint::EmbeddedFilesEndpoint,
+ get, handler,
+ listener::TcpListener,
+ middleware::AddData,
+ web::{Data, Path, Query},
+ EndpointExt, Route, Server,
+};
+use rust_embed::RustEmbed;
use error::BlossomError;
+use serde::Deserialize;
type Result<T> = std::result::Result<T, BlossomError>;
-struct Clients {
- listenbrainz: listenbrainz::raw::Client,
- skinnyverse: mastodon_async::Mastodon,
- reqwest: reqwest::Client,
-}
-
-#[macro_use]
-extern crate rocket;
+#[derive(RustEmbed)]
+#[folder = "static/"]
+struct Static;
-#[get("/")]
-async fn home(clients: &State<Clients>) -> Template {
+#[handler]
+async fn home(Data(reqwest): Data<&reqwest::Client>) -> templates::Home {
+ let listenbrainz_client = listenbrainz::raw::Client::new();
let (live, listenbrainz, blogposts) = tokio::join!(
- live::get_live_status(&clients.reqwest),
- scrobbles::get_now_playing(&clients.listenbrainz),
+ live::get_live_status(reqwest),
+ scrobbles::get_now_playing(&listenbrainz_client),
// skweets::get_recents(&clients.skinnyverse),
- posts::get_blogposts()
+ blog::get_blogposts()
);
let is_live = live.unwrap_or_default().online;
let listenbrainz = listenbrainz.unwrap_or_default();
let blogposts = blogposts.unwrap_or_default();
- Template::render(
- "home",
- context! {
- is_live,
- listenbrainz,
- // skweets,
- blogposts,
- },
- )
+ templates::Home {
+ is_live,
+ listenbrainz,
+ blogposts,
+ }
+}
+
+// #[get("/blog/<blogpost>")]
+#[handler]
+async fn blogpost(Path(blogpost): Path<String>) -> Result<templates::Blogpost> {
+ let blogpost = blog::get_blogpost(&blogpost).await?;
+ Ok(templates::Blogpost {
+ blogpost,
+ filter_tags: HashSet::new(),
+ })
}
-#[get("/blog/<blogpost>")]
-async fn blogpost(blogpost: &str) -> Result<Template> {
- let mut blogpost = posts::get_blogpost(blogpost).await?;
- blogpost.render().await?;
- Ok(Template::render(
- "blogpost",
- context! {
- blogpost,
- },
- ))
+#[derive(Deserialize)]
+struct FilterTags {
+ filter: String,
}
-#[get("/blog?<filter>")]
-async fn blog(filter: Vec<String>) -> Result<Template> {
- let mut blogposts = posts::get_blogposts().await?;
- let tags: Vec<String> = posts::get_tags(&blogposts)
+// #[get("/blog?<filter>")]
+#[handler]
+async fn get_blog(filter_tags: Option<Query<FilterTags>>) -> Result<templates::Blog> {
+ let mut blogposts = blog::get_blogposts().await?;
+ let tags: Vec<String> = posts::Post::get_tags(&blogposts)
.into_iter()
.map(|tag| tag.to_owned())
.collect();
let mut filter_hashset: HashSet<String> = HashSet::new();
- if !filter.is_empty() {
- filter_hashset.extend(filter.into_iter());
- blogposts = posts::filter_by_tags(blogposts, &filter_hashset);
- }
- for blogpost in &mut blogposts {
- blogpost.render().await?;
+ if let Some(Query(FilterTags { filter })) = filter_tags {
+ filter_hashset.insert(filter);
+ blogposts = posts::Post::filter_by_tags(blogposts, &filter_hashset);
}
- let reverse = true;
- Ok(Template::render(
- "blog",
- context! {
- reverse,
- tags,
- filter_hashset,
- blogposts,
- },
- ))
+ Ok(templates::Blog {
+ blogposts,
+ tags,
+ filter_tags: filter_hashset,
+ })
}
-#[get("/feed")]
-async fn feed() -> Result<(Status, (ContentType, String))> {
- let posts = posts::get_blogposts().await?;
- let feed = posts::syndication::atom(posts).await;
+#[handler]
+async fn feed() -> Result<Response> {
+ let posts = blog::get_blogposts().await?;
+ // TODO: i18n
+ let context = atom::Context {
+ page_title: "celeste's hard drive".to_owned(),
+ page_url: "https://en.blos.sm".to_owned(),
+ self_url: "https://en.blos.sm/feed".to_owned(),
+ lang: "en".to_owned(),
+ };
+ let feed = atom::atom(context, posts).await;
let feed: String = String::from_utf8(feed.write_to(Vec::new())?)?;
- Ok((
- Status::new(200),
- (ContentType::new("application", "atom+xml"), feed),
- ))
-}
-
-#[get("/contact")]
-async fn contact() -> Template {
- Template::render("contact", context! {})
+ Ok(Response::builder()
+ .status(StatusCode::OK)
+ .content_type("application/atom+xml")
+ .body(feed))
}
-#[get("/plants")]
-async fn plants() -> Result<Template> {
- Err(BlossomError::Unimplemented(Status::NotImplemented))
+#[handler]
+async fn contact() -> templates::Contact {
+ templates::Contact
}
-#[catch(default)]
-fn catcher(status: Status, req: &Request) -> Template {
- let message;
- if status.code == 404 {
- message = "i either haven't built this page yet or it looks like you're a little lost";
- } else if status.code == 500 {
- message = "omg the server went kaputt!!";
- } else if status.code == 501 {
- message = "it looks like this is not yet here!!!";
- } else {
- message = "idk i got bored";
- }
- let status = format!("{}", status);
- Template::render(
- "error",
- context! { status: status, req: req.uri(), message: message },
- )
+#[handler]
+async fn plants() -> Result<()> {
+ Err(BlossomError::Unimplemented)
}
#[tokio::main]
-async fn main() -> std::result::Result<(), rocket::Error> {
- let mut skinny_data = mastodon_async::Data::default();
- skinny_data.base = Cow::from("https://skinnyver.se");
-
- let _rocket = rocket::build()
- .manage(Clients {
- listenbrainz: listenbrainz::raw::Client::new(),
- skinnyverse: mastodon_async::Mastodon::from(skinny_data),
- reqwest: reqwest::Client::builder()
+async fn main() -> std::result::Result<(), std::io::Error> {
+ // let mut skinny_data = mastodon_async::Data::default();
+ // skinny_data.base = Cow::from("https://skinnyver.se");
+ let blossom = Route::new()
+ .at("/", get(home))
+ .at("/blog", get(get_blog))
+ .at("/blog/:blogpost", get(blogpost))
+ .at("/feed", get(feed))
+ .at("/contact", get(contact))
+ .at("/plants", get(plants))
+ .nest("/static/", EmbeddedFilesEndpoint::<Static>::new())
+ .with(AddData::new(
+ reqwest::Client::builder()
.connect_timeout(Duration::from_secs(1))
.build()
.unwrap(),
- })
- .attach(Template::custom(|engines| {
- engines.tera.autoescape_on(vec![]);
- }))
- .mount("/", routes![home, contact, blog, blogpost, feed, plants])
- .register("/", catchers![catcher])
- .mount("/", FileServer::from("./static"))
- .launch()
- .await?;
+ ));
- Ok(())
+ Server::new(TcpListener::bind("0.0.0.0:3000"))
+ .run(blossom)
+ .await
}
diff --git a/src/posts.rs b/src/posts.rs
new file mode 100644
index 0000000..415f743
--- /dev/null
+++ b/src/posts.rs
@@ -0,0 +1,62 @@
+use std::collections::HashSet;
+
+use chrono::{DateTime, Utc};
+use serde::Serialize;
+
+#[derive(Serialize, Debug)]
+pub enum PostType {
+ Article,
+ Note,
+}
+
+pub trait Post {
+ fn id(&self) -> &str;
+ fn subject(&self) -> Option<&str>;
+ fn published_at(&self) -> &DateTime<Utc>;
+ fn updated_at(&self) -> &DateTime<Utc>;
+ fn tags(&self) -> &Vec<String>;
+ fn lang(&self) -> &str;
+ fn post_type(&self) -> PostType;
+ fn content(&self) -> &str;
+
+ fn link(&self) -> String {
+ "https://en.blos.sm/posts/".to_owned() + self.id()
+ }
+
+ fn get_tags<'a>(posts: &'a Vec<Self>) -> Vec<&'a String>
+ where
+ Self: Sized,
+ {
+ let mut tags = posts
+ .into_iter()
+ .fold(HashSet::new(), |mut acc, post| {
+ let tags = post.tags();
+ for tag in tags {
+ acc.insert(tag);
+ }
+ acc
+ })
+ .into_iter()
+ .collect::<Vec<_>>();
+ tags.sort();
+ tags
+ }
+
+ fn filter_by_tags(posts: Vec<Self>, filter_tags: &HashSet<String>) -> Vec<Self>
+ where
+ Self: Sized,
+ {
+ posts
+ .into_iter()
+ .filter(|post| {
+ for tag in post.tags() {
+ match filter_tags.contains(tag) {
+ true => return true,
+ false => continue,
+ }
+ }
+ false
+ })
+ .collect()
+ }
+}
diff --git a/src/posts/article.rs b/src/posts/article.rs
deleted file mode 100644
index e69de29..0000000
--- a/src/posts/article.rs
+++ /dev/null
diff --git a/src/posts/mod.rs b/src/posts/mod.rs
deleted file mode 100644
index c75dd53..0000000
--- a/src/posts/mod.rs
+++ /dev/null
@@ -1,228 +0,0 @@
-mod article;
-mod note;
-pub mod syndication;
-
-use std::collections::HashSet;
-
-use async_trait::async_trait;
-use chrono::{DateTime, Utc};
-use markdown::{mdast::Node, CompileOptions, Constructs, Options, ParseOptions};
-use rocket::http::Status;
-use serde::{ser::SerializeStruct, Deserialize, Serialize};
-use tokio::fs;
-use tokio::io::AsyncReadExt;
-
-use crate::{error::BlossomError, Result};
-
-#[derive(Serialize, Debug)]
-enum PostType {
- Article,
- Note,
-}
-
-#[derive(Debug)]
-pub struct Post<D: Content> {
- id: String,
- subject: Option<String>,
- created_at: DateTime<Utc>,
- updated_at: Option<DateTime<Utc>>,
- tags: Vec<String>,
- post_type: PostType,
- render: Option<String>,
- data: D,
-}
-
-impl<D: Content> Post<D> {
- pub async fn render(&mut self) -> Result<()> {
- self.render = Some(self.data.render().await?);
- Ok(())
- }
-}
-
-impl<D: Content + Serialize> Serialize for Post<D> {
- fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
- where
- S: serde::Serializer,
- {
- let mut state = serializer.serialize_struct("Post", 7)?;
- state.serialize_field("subject", &self.subject)?;
- state.serialize_field("created_at", &self.created_at.to_string())?;
- state.serialize_field(
- "updated_at",
- &self.updated_at.and_then(|time| Some(time.to_string())),
- )?;
- state.serialize_field("tags", &self.tags)?;
- state.serialize_field("post_type", &self.post_type)?;
- state.serialize_field("render", &self.render)?;
- state.serialize_field("data", &self.data)?;
- state.end()
- }
-}
-
-pub async fn get_blogposts() -> Result<Vec<Post<Article>>> {
- let mut blogposts: Vec<Post<Article>> = Vec::new();
- let mut articles_dir = fs::read_dir("./articles").await?;
- while let Some(file) = articles_dir.next_entry().await? {
- let name = file.file_name();
- let name = name.to_str().unwrap_or_default()[..name.len() - 3].to_owned();
- let blogpost: Article = Article {
- path: file.path().to_str().unwrap_or_default().to_owned(),
- name,
- };
- let blogpost = Post::try_from(blogpost).await.unwrap();
- blogposts.push(blogpost);
- }
- blogposts.sort_by_key(|post| post.created_at);
- blogposts.reverse();
- Ok(blogposts)
-}
-
-pub async fn get_blogpost(post_name: &str) -> Result<Post<Article>> {
- let mut articles_dir = fs::read_dir("./articles").await?;
- while let Some(file) = articles_dir.next_entry().await? {
- let name = file.file_name();
- let name = &name.to_str().unwrap_or_default()[..name.len() - 3];
- if name == post_name {
- let blogpost = Article {
- path: file.path().to_str().unwrap_or_default().to_owned(),
- name: name.to_owned(),
- };
- let blogpost = Post::try_from(blogpost).await?;
- return Ok(blogpost);
- }
- }
- Err(BlossomError::NotFound(Status::new(404)))
-}
-
-pub fn get_tags<D: Content>(posts: &Vec<Post<D>>) -> Vec<&String> {
- let mut tags = posts
- .into_iter()
- .fold(HashSet::new(), |mut acc, post| {
- let tags = &post.tags;
- for tag in tags {
- acc.insert(tag);
- }
- acc
- })
- .into_iter()
- .collect::<Vec<_>>();
- tags.sort();
- tags
-}
-
-pub fn filter_by_tags<'p, D: Content>(
- posts: Vec<Post<D>>,
- filter_tags: &HashSet<String>,
-) -> Vec<Post<D>> {
- posts
- .into_iter()
- .filter(|post| {
- for tag in &post.tags {
- match filter_tags.contains(tag) {
- true => return true,
- false => continue,
- }
- }
- false
- })
- .collect()
-}
-
-#[async_trait]
-pub trait Content {
- async fn render(&self) -> Result<String>;
-}
-
-#[derive(Serialize, Debug)]
-pub struct Article {
- path: String,
- name: String,
-}
-
-impl Article {
- async fn tree(&self) -> Result<Node> {
- let mut file = fs::File::open(&self.path).await?;
- let mut buf = String::new();
- file.read_to_string(&mut buf).await?;
- Ok(markdown::to_mdast(
- &buf,
- &ParseOptions {
- constructs: Constructs {
- frontmatter: true,
- ..Constructs::default()
- },
- ..ParseOptions::default()
- },
- )
- .unwrap())
- }
-
- async fn frontmatter(&self) -> Result<String> {
- let tree = self.tree().await?;
- let children = tree.children();
- if let Some(children) = children {
- if let Some(toml) = children.into_iter().find_map(|el| match el {
- Node::Toml(toml) => Some(toml.value.to_owned()),
- _ => None,
- }) {
- return Ok(toml);
- };
- }
- Err(BlossomError::NoMetadata(Status::new(500)))
- }
-}
-
-#[async_trait]
-impl Content for Article {
- async fn render(&self) -> Result<String> {
- let mut file = fs::File::open(&self.path).await?;
- let mut buf = String::new();
- file.read_to_string(&mut buf).await?;
- let options = Options {
- parse: ParseOptions {
- constructs: Constructs {
- frontmatter: true,
- ..Constructs::gfm()
- },
- ..ParseOptions::default()
- },
- compile: CompileOptions {
- gfm_task_list_item_checkable: true,
- allow_dangerous_html: true,
- ..CompileOptions::default()
- },
- };
- Ok(markdown::to_html_with_options(&buf, &options).unwrap())
- }
-}
-
-#[derive(Deserialize)]
-struct ArticleMetadata {
- title: String,
- created_at: String,
- updated_at: Option<String>,
- tags: Vec<String>,
-}
-
-impl Post<Article> {
- async fn try_from(article: Article) -> Result<Post<Article>> {
- let metadata = article.frontmatter().await?;
- let metadata: ArticleMetadata = toml::from_str(&metadata)?;
- let updated_at = if let Some(updated_at) = metadata.updated_at {
- Some(updated_at.parse::<DateTime<Utc>>()?)
- } else {
- None
- };
-
- Ok(Post {
- id: article.name.to_owned(),
- subject: Some(metadata.title),
- created_at: metadata.created_at.parse::<DateTime<Utc>>()?,
- updated_at,
- tags: metadata.tags,
- post_type: PostType::Article,
- render: None,
- data: article,
- })
- }
-}
diff --git a/src/posts/syndication.rs b/src/posts/syndication.rs
deleted file mode 100644
index f6f0b17..0000000
--- a/src/posts/syndication.rs
+++ /dev/null
@@ -1,96 +0,0 @@
-use atom_syndication::{Category, Content, Entry, Feed, Generator, Link, Person, Text, TextType};
-
-use super::{Article, Post};
-
-pub async fn atom(posts: Vec<Post<Article>>) -> Feed {
- let me = Person {
- name: "cel".into(),
- email: Some("cel@blos.sm".into()),
- uri: Some("https://blos.sm".into()),
- };
- let mut authors = Vec::new();
- authors.push(me);
- let link = Link {
- href: "https://blos.sm/feed".into(),
- rel: "self".into(),
- hreflang: Some("en".into()),
- mime_type: Some("application/atom+xml".into()),
- title: Some("atom feed".into()),
- length: None,
- };
- let mut links = Vec::new();
- links.push(link);
- let mut feed = Feed {
- title: Text {
- value: "cel's site".into(),
- base: None,
- lang: Some("en".into()),
- r#type: TextType::Text,
- },
- id: "https://blos.sm".into(),
- updated: posts[0].created_at.into(),
- authors: authors.clone(),
- categories: Vec::new(),
- contributors: authors.clone(),
- generator: Some(Generator {
- value: "blos.sm".into(),
- uri: Some("https://bunny.garden/cel/blos.sm".into()),
- version: None,
- }),
- icon: Some("/icon.png".into()),
- links: links.clone(),
- logo: Some("/logo.png".into()),
- rights: None,
- subtitle: None,
- entries: Vec::new(),
- base: Some("https://blos.sm".into()),
- lang: Some("en".into()),
- ..Default::default()
- };
- for mut post in posts {
- post.render().await.unwrap_or_default();
- let mut id = String::from("https://blos.sm/blog/");
- id.push_str(&post.data.name);
- let categories = post
- .tags
- .into_iter()
- .map(|tag| Category {
- term: tag.clone(),
- scheme: None,
- label: Some(tag.clone()),
- })
- .collect();
- let entry = Entry {
- title: Text {
- value: post.subject.unwrap_or_default(),
- base: None,
- lang: Some("en".into()),
- r#type: TextType::Text,
- },
- id: id.clone(),
- updated: if let Some(updated_at) = post.updated_at {
- updated_at.into()
- } else {
- post.created_at.into()
- },
- authors: authors.clone(),
- categories,
- contributors: authors.clone(),
- links: links.clone(),
- published: Some(post.created_at.into()),
- rights: None,
- source: None,
- summary: None,
- content: Some(Content {
- base: None,
- lang: Some("en".into()),
- value: post.render,
- src: Some(id),
- content_type: Some("html".to_string()),
- }),
- ..Default::default()
- };
- feed.entries.push(entry);
- }
- feed
-}
diff --git a/src/templates.rs b/src/templates.rs
new file mode 100644
index 0000000..861930f
--- /dev/null
+++ b/src/templates.rs
@@ -0,0 +1,55 @@
+use std::collections::HashSet;
+
+use askama::Template;
+use poem::http::StatusCode;
+use rand::{thread_rng, Rng};
+
+use crate::posts::Post;
+use crate::{blog, scrobbles::NowPlayingData};
+
+mod filters {
+ pub fn mytruncate(s: impl std::fmt::Display, length: usize) -> ::askama::Result<String> {
+ let mut s = s.to_string();
+ s.truncate(length);
+ Ok(s)
+ }
+}
+
+#[derive(Template)]
+#[template(path = "base.html")]
+struct Base;
+
+#[derive(Template)]
+#[template(path = "home.html")]
+pub struct Home {
+ pub is_live: bool,
+ pub listenbrainz: NowPlayingData,
+ pub blogposts: Vec<blog::Blogpost>,
+}
+
+#[derive(Template)]
+#[template(path = "blogpost.html")]
+pub struct Blogpost {
+ pub blogpost: blog::Blogpost,
+ pub filter_tags: HashSet<String>,
+}
+
+// filtertags, blogpost-panel
+#[derive(Template)]
+#[template(path = "blog.html")]
+pub struct Blog {
+ pub blogposts: Vec<blog::Blogpost>,
+ pub tags: Vec<String>,
+ pub filter_tags: HashSet<String>,
+}
+
+#[derive(Template)]
+#[template(path = "contact.html")]
+pub struct Contact;
+
+#[derive(Template)]
+#[template(path = "error.html")]
+pub struct Error {
+ pub status: StatusCode,
+ pub message: String,
+}
diff --git a/src/utils.rs b/src/utils.rs
new file mode 100644
index 0000000..4db404a
--- /dev/null
+++ b/src/utils.rs
@@ -0,0 +1,3 @@
+pub trait Tags {
+ type Tag;
+}
diff --git a/static/badges/badussyflops.png b/static/badges/badussyflops.png
new file mode 100644
index 0000000..085e356
--- /dev/null
+++ b/static/badges/badussyflops.png
Binary files differ
diff --git a/static/fonts.css b/static/fonts.css
index ba5a73c..2b44607 100644
--- a/static/fonts.css
+++ b/static/fonts.css
@@ -1,8 +1,8 @@
/* PicNic */
@font-face {
font-family: PicNic;
- src: url('/fonts/PicNic-Regular.woff2') format('woff2'),
- url('/fonts/PicNic-Regular.woff') format('woff');
+ src: url('/static/fonts/PicNic-Regular.woff2') format('woff2'),
+ url('/static/fonts/PicNic-Regular.woff') format('woff');
font-weight: normal;
font-style: normal;
font-display: block;
@@ -11,8 +11,8 @@
/* go mono */
@font-face {
font-family: 'Go Mono';
- src: url('/fonts/GoMono.woff2') format('woff2'),
- url('/fonts/GoMono.woff') format('woff');
+ src: url('/static/fonts/GoMono.woff2') format('woff2'),
+ url('/static/fonts/GoMono.woff') format('woff');
font-weight: normal;
font-style: normal;
font-display: block;
@@ -20,8 +20,8 @@
@font-face {
font-family: 'Go Mono';
- src: url('/fonts/GoMono-Bold.woff2') format('woff2'),
- url('/fonts/GoMono-Bold.woff') format('woff');
+ src: url('/static/fonts/GoMono-Bold.woff2') format('woff2'),
+ url('/static/fonts/GoMono-Bold.woff') format('woff');
font-weight: bold;
font-style: normal;
font-display: block;
@@ -29,8 +29,8 @@
@font-face {
font-family: 'Go Mono';
- src: url('/fonts/GoMono-Italic.woff2') format('woff2'),
- url('/fonts/GoMono-Italic.woff') format('woff');
+ src: url('/static/fonts/GoMono-Italic.woff2') format('woff2'),
+ url('/static/fonts/GoMono-Italic.woff') format('woff');
font-weight: normal;
font-style: italic;
font-display: block;
@@ -38,8 +38,8 @@
@font-face {
font-family: 'Go Mono';
- src: url('/fonts/GoMono-BoldItalic.woff2') format('woff2'),
- url('/fonts/GoMono-BoldItalic.woff') format('woff');
+ src: url('/static/fonts/GoMono-BoldItalic.woff2') format('woff2'),
+ url('/static/fonts/GoMono-BoldItalic.woff') format('woff');
font-weight: bold;
font-style: italic;
font-display: block;
@@ -48,8 +48,8 @@
/* basteleur */
@font-face {
font-family: 'Basteleur';
- src: url('/fonts/Basteleur-Bold.woff2') format('woff2'),
- url('/fonts/Basteleur-Bold.woff') format('woff');
+ src: url('/static/fonts/Basteleur-Bold.woff2') format('woff2'),
+ url('/static/fonts/Basteleur-Bold.woff') format('woff');
font-weight: bold;
font-style: normal;
font-display: block;
@@ -58,8 +58,8 @@
/* kaeru kaeru */
@font-face {
font-family: 'kaeru kaeru';
- src: url('/fonts/kaerukaeru-Regular.woff2') format('woff2'),
- url('/fonts/kaerukaeru-Regular.woff') format('woff');
+ src: url('/static/fonts/kaerukaeru-Regular.woff2') format('woff2'),
+ url('/static/fonts/kaerukaeru-Regular.woff') format('woff');
font-weight: normal;
font-style: normal;
font-display: block;
@@ -68,8 +68,8 @@
/* terminal grotesque open */
@font-face {
font-family: 'Terminal Grotesque Open';
- src: url('/fonts/TerminalGrotesque-Open.woff2') format('woff2'),
- url('/fonts/TerminalGrotesque-Open.woff') format('woff');
+ src: url('/static/fonts/TerminalGrotesque-Open.woff2') format('woff2'),
+ url('/static/fonts/TerminalGrotesque-Open.woff') format('woff');
font-weight: normal;
font-style: normal;
font-display: block;
@@ -78,8 +78,8 @@
/* steps mono */
@font-face {
font-family: 'Steps-Mono';
- src: url('/fonts/Steps-Mono-Mono.woff2') format('woff2'),
- url('/fonts/Steps-Mono-Mono.woff') format('woff');
+ src: url('/static/fonts/Steps-Mono-Mono.woff2') format('woff2'),
+ url('/static/fonts/Steps-Mono-Mono.woff') format('woff');
font-weight: normal;
font-style: normal;
font-display: block;
@@ -87,8 +87,8 @@
@font-face {
font-family: 'Steps Mono';
- src: url('/fonts/Steps-Mono-Thin.woff2') format('woff2'),
- url('/fonts/Steps-Mono-Thin.woff') format('woff');
+ src: url('/static/fonts/Steps-Mono-Thin.woff2') format('woff2'),
+ url('/static/fonts/Steps-Mono-Thin.woff') format('woff');
font-weight: 100;
font-style: normal;
font-display: block;
@@ -97,8 +97,8 @@
/* director */
@font-face {
font-family: 'Director';
- src: url('/fonts/Director-Regular.woff2') format('woff2'),
- url('/fonts/Director-Regular.woff') format('woff');
+ src: url('/static/fonts/Director-Regular.woff2') format('woff2'),
+ url('/static/fonts/Director-Regular.woff') format('woff');
font-weight: normal;
font-style: normal;
font-display: block;
@@ -106,8 +106,8 @@
@font-face {
font-family: 'Director';
- src: url('/fonts/Director-Light.woff2') format('woff2'),
- url('/fonts/Director-Light.woff') format('woff');
+ src: url('/static/fonts/Director-Light.woff2') format('woff2'),
+ url('/static/fonts/Director-Light.woff') format('woff');
font-weight: 100;
font-style: normal;
font-display: block;
@@ -115,8 +115,8 @@
@font-face {
font-family: 'Director';
- src: url('/fonts/Director-bold.woff2') format('woff2'),
- url('/fonts/Director-bold.woff') format('woff');
+ src: url('/static/fonts/Director-bold.woff2') format('woff2'),
+ url('/static/fonts/Director-bold.woff') format('woff');
font-weight: bold;
font-style: normal;
font-display: block;
@@ -125,8 +125,8 @@
/* karrik */
@font-face {
font-family: 'Karrik';
- src: url('/fonts/Karrik-Regular.woff2') format('woff2'),
- url('/fonts/Karrik-Regular.woff') format('woff');
+ src: url('/static/fonts/Karrik-Regular.woff2') format('woff2'),
+ url('/static/fonts/Karrik-Regular.woff') format('woff');
font-weight: normal;
font-style: normal;
font-display: block;
@@ -134,8 +134,8 @@
@font-face {
font-family: 'Karrik';
- src: url('/fonts/Karrik-Italic.woff2') format('woff2'),
- url('/fonts/Karrik-Italic.woff') format('woff');
+ src: url('/static/fonts/Karrik-Italic.woff2') format('woff2'),
+ url('/static/fonts/Karrik-Italic.woff') format('woff');
font-weight: normal;
font-style: italic;
font-display: block;
@@ -144,8 +144,8 @@
/* cherry bomb */
@font-face {
font-family: 'Cherry Bomb';
- src: url('/fonts/CherryBombPersonalUse-Regular.woff2') format('woff2'),
- url('/fonts/CherryBombPersonalUse-Regular.woff') format('woff');
+ src: url('/static/fonts/CherryBombPersonalUse-Regular.woff2') format('woff2'),
+ url('/static/fonts/CherryBombPersonalUse-Regular.woff') format('woff');
font-weight: normal;
font-style: normal;
font-display: block;
@@ -154,8 +154,8 @@
/* compagnon */
@font-face {
font-family: 'Compagnon';
- src: url('/fonts/Compagnon-Bold.woff2') format('woff2'),
- url('/fonts/Compagnon-Bold.woff') format('woff');
+ src: url('/static/fonts/Compagnon-Bold.woff2') format('woff2'),
+ url('/static/fonts/Compagnon-Bold.woff') format('woff');
font-weight: bold;
font-style: normal;
font-display: block;
@@ -163,8 +163,8 @@
@font-face {
font-family: 'Compagnon';
- src: url('/fonts/Compagnon-Italic.woff2') format('woff2'),
- url('/fonts/Compagnon-Italic.woff') format('woff');
+ src: url('/static/fonts/Compagnon-Italic.woff2') format('woff2'),
+ url('/static/fonts/Compagnon-Italic.woff') format('woff');
font-weight: normal;
font-style: italic;
font-display: block;
@@ -172,8 +172,8 @@
@font-face {
font-family: 'Compagnon';
- src: url('/fonts/Compagnon-Medium.woff2') format('woff2'),
- url('/fonts/Compagnon-Medium.woff') format('woff');
+ src: url('/static/fonts/Compagnon-Medium.woff2') format('woff2'),
+ url('/static/fonts/Compagnon-Medium.woff') format('woff');
font-weight: 500;
font-style: normal;
font-display: block;
@@ -181,8 +181,8 @@
@font-face {
font-family: 'Compagnon Roman';
- src: url('/fonts/Compagnon-Roman.woff2') format('woff2'),
- url('/fonts/Compagnon-Roman.woff') format('woff');
+ src: url('/static/fonts/Compagnon-Roman.woff2') format('woff2'),
+ url('/static/fonts/Compagnon-Roman.woff') format('woff');
font-weight: normal;
font-style: normal;
font-display: block;
@@ -190,8 +190,8 @@
@font-face {
font-family: 'Compagnon';
- src: url('/fonts/Compagnon-Light.woff2') format('woff2'),
- url('/fonts/Compagnon-Light.woff') format('woff');
+ src: url('/static/fonts/Compagnon-Light.woff2') format('woff2'),
+ url('/static/fonts/Compagnon-Light.woff') format('woff');
font-weight: 300;
font-style: normal;
font-display: block;
@@ -200,8 +200,8 @@
/* sligoil */
@font-face {
font-family: 'Sligoil';
- src: url('/fonts/Sligoil-Micro.woff2') format('woff2'),
- url('/fonts/Sligoil-Micro.woff') format('woff');
+ src: url('/static/fonts/Sligoil-Micro.woff2') format('woff2'),
+ url('/static/fonts/Sligoil-Micro.woff') format('woff');
font-weight: normal;
font-style: normal;
font-display: block;
@@ -210,8 +210,8 @@
/* degerm locase */
@font-face {
font-family: 'DeGerm LoCase';
- src: url('/fonts/DeGerm_LoCase.woff2') format('woff2'),
- url('/fonts/DeGerm_LoCase.woff') format('woff');
+ src: url('/static/fonts/DeGerm_LoCase.woff2') format('woff2'),
+ url('/static/fonts/DeGerm_LoCase.woff') format('woff');
font-weight: normal;
font-style: normal;
font-display: block;
@@ -222,15 +222,15 @@
font-family: kirieji;
font-style: normal;
font-weight: 400;
- src: url('/fonts/kirieji.woff2') format("woff2");
+ src: url('/static/fonts/kirieji.woff2') format("woff2");
font-display: block;
}
/* almendra display */
@font-face {
font-family: 'Almendra Display';
- src: url('/fonts/AlmendraDisplay-Regular.woff2') format('woff2'),
- url('/fonts/AlmendraDisplay-Regular.woff') format('woff');
+ src: url('/static/fonts/AlmendraDisplay-Regular.woff2') format('woff2'),
+ url('/static/fonts/AlmendraDisplay-Regular.woff') format('woff');
font-weight: normal;
font-style: normal;
font-display: block;
@@ -239,8 +239,8 @@
/* mon hugo in */
@font-face {
font-family: 'Mon Hugo in';
- src: url('/fonts/MonHugo-in.woff2') format('woff2'),
- url('/fonts/MonHugo-in.woff') format('woff');
+ src: url('/static/fonts/MonHugo-in.woff2') format('woff2'),
+ url('/static/fonts/MonHugo-in.woff') format('woff');
font-weight: 500;
font-style: normal;
font-display: block;
@@ -251,15 +251,15 @@
font-family: id_kana018;
font-style: normal;
font-weight: 400;
- src: url('/fonts/id_kana018.woff2') format("woff2");
+ src: url('/static/fonts/id_kana018.woff2') format("woff2");
font-display: block;
}
/* minecraftia */
@font-face {
font-family: 'Minecraftia';
- src: url('/fonts/Minecraftia.woff2') format('woff2'),
- url('/fonts/Minecraftia.woff') format('woff');
+ src: url('/static/fonts/Minecraftia.woff2') format('woff2'),
+ url('/static/fonts/Minecraftia.woff') format('woff');
font-weight: normal;
font-style: normal;
font-display: block;
@@ -268,8 +268,8 @@
/* darumadrop one */
@font-face {
font-family: 'Darumadrop One';
- src: url('/fonts/DarumadropOne-Regular.woff2') format('woff2'),
- url('/fonts/DarumadropOne-Regular.woff') format('woff');
+ src: url('/static/fonts/DarumadropOne-Regular.woff2') format('woff2'),
+ url('/static/fonts/DarumadropOne-Regular.woff') format('woff');
font-weight: normal;
font-style: normal;
font-display: block;
@@ -278,8 +278,8 @@
/* louise */
@font-face {
font-family: 'Louise';
- src: url('/fonts/Louise-Regular.woff2') format('woff2'),
- url('/fonts/Louise-Regular.woff') format('woff');
+ src: url('/static/fonts/Louise-Regular.woff2') format('woff2'),
+ url('/static/fonts/Louise-Regular.woff') format('woff');
font-weight: normal;
font-style: normal;
font-display: block;
@@ -288,8 +288,8 @@
/* ukikusa */
@font-face {
font-family: 'ukikusa';
- src: url('/fonts/ukikusa.woff2') format('woff2'),
- url('/fonts/ukikusa.woff') format('woff');
+ src: url('/static/fonts/ukikusa.woff2') format('woff2'),
+ url('/static/fonts/ukikusa.woff') format('woff');
font-weight: 500;
font-style: normal;
font-display: block;
@@ -298,8 +298,8 @@
/* abordage */
@font-face {
font-family: 'Abordage';
- src: url('/fonts/Abordage-Regular.woff2') format('woff2'),
- url('/fonts/Abordage-Regular.woff') format('woff');
+ src: url('/static/fonts/Abordage-Regular.woff2') format('woff2'),
+ url('/static/fonts/Abordage-Regular.woff') format('woff');
font-weight: normal;
font-style: normal;
font-display: block;
diff --git a/templates/base.html b/templates/base.html
new file mode 100644
index 0000000..59e7984
--- /dev/null
+++ b/templates/base.html
@@ -0,0 +1,88 @@
+<!doctype html>
+<html lang="en">
+
+<head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
+ <link rel="stylesheet" href="/static/style.css">
+ <link rel="stylesheet" href="/static/fonts.css">
+ <title>celeste's hard drive</title>
+</head>
+
+<body>
+
+ <img class="branch" id="branch1" src="/static/branches/branch837-1.png" alt="">
+ <img class="branch" id="branch2" src="/static/branches/branch878.png" alt="">
+ <img class="branch" id="branch3" src="/static/branches/branch837-2.png" alt="">
+ <img class="branch" id="branch4" src="/static/branches/branch840.png" alt="">
+ <img class="branch" id="branch5" src="/static/branches/branch869.png" alt="">
+ <img class="branch" id="branch6" src="/static/branches/branch871.png" alt="">
+ <img class="branch" id="branch7" src="/static/branches/branch879.png" alt="">
+ <img class="branch" id="branch8" src="/static/branches/branch880.png" alt="">
+ <img class="branch" id="branch9" src="/static/branches/branch881-1.png" alt="">
+ <img class="branch" id="branch10" src="/static/branches/branch881-2.png" alt="">
+ <img class="branch" id="branch11" src="/static/branches/branch882-1.png" alt="">
+ <img class="branch" id="branch12" src="/static/branches/branch882-2.png" alt="">
+ <img class="branch" id="branch13" src="/static/branches/branch883-1.png" alt="">
+ <img class="branch" id="branch14" src="/static/branches/branch883-2.png" alt="">
+
+ <div id="page">
+
+ {% block header %}
+ {% endblock header %}
+
+ <nav class="panel">
+ <ul id="nav">
+ <li><a class="{% block nav_home %}{% endblock %}" href="/">home</a></li>
+ <li><a class="{% block nav_contact %}{% endblock %}" style="font-family: 'Compagnon Roman';"
+ href="/contact">kontakt</a></li>
+ <li><a class="{% block nav_poetry %}{% endblock %}" href="/poetry" style="font-family: Louise">poesia</a></li>
+ <li><a class="{% block nav_blog %}{% endblock %}" style="font-family: Sligoil" href="/blog">weblog</a></li>
+ <li><a class="{% block nav_projects %}{% endblock %}" style="font-family: 'DeGerm LoCase';"
+ href="/projects">projetos</a></li>
+ <!--<li><a class="{% block nav_sound %}{% endblock %}" style="font-family: 'kirieji'" href="/sound">音</a></li>-->
+ <li><a class="{% block nav_listens %}{% endblock %}" style="font-family: 'Almendra Display'; font-weight: 900;"
+ href="https://listenbrainz.org/user/celblossom">Γ©coute</a></li>
+ <li><a href="https://bimbo.video/a/cel" style="font-family: 'Mon Hugo In'">video</a></li>
+ <li><a href="https://weirdstar.stream" style="font-family: id_kana018">πŸ”΄γƒ©γ‚€γƒ–</a></li>
+ <!--<li><a class="{% block nav_pix %}{% endblock %}" style="font-family: Minecraftia" href="/pix">pix</a></li>-->
+ <!--<li><a class="{% block nav_shodo %}{% endblock %}" href="/shodo">書道</a></li>-->
+ <!--<li><a class="{% block nav_cute %}{% endblock %}" style="font-family: 'Darumadrop One'" href="/cute">cute linkz</a></li>-->
+ <!--<li><a class="{% block nav_zk %}{% endblock %}" href="https://garden.blos.sm" style="font-family: Louise">zettelkasten</a></li>-->
+ <!--<li><a class="{% block nav_read %}{% endblock %}" style="font-family: ukikusa" href="/read">γ‚ˆγ‚€</a></li>-->
+ <li><a href="https://bunny.garden/cel">πŸ¦‹πŸŒ·πŸ°πŸŒ»πŸπŸ•·πŸͺ»πŸ‡πŸŒ±</a></li>
+ <!--<li><a class="{% block nav_plants %}{% endblock %}" style="font-family: 'Almendra Display'; font-weight: 900;" href="/plants">plantas</a></li>-->
+ <li><a style="font-family: Abordage;" href="https://pussy.accountants">pussy</a></li>
+ <li class="suscakke"><a href="https://ass-sma.cc"><img src="/static/suscakke.png"></a></li>
+ <!--<li><a class="{% block nav_guestbook %}{% endblock %}" style="font-family: Compagnon; font-weight: bold;" href="/guestbook">visitas</a></li>-->
+ </ul>
+ </nav>
+
+ <main class="{% block reverse %}{% endblock %}">
+ <div class="main-content">
+
+ {% block content %}
+ {% endblock content %}
+
+ </div>
+
+ {% block aside %}
+ {% endblock aside %}
+
+ </main>
+
+ <footer class="panel">
+ <a class="badge" href="https://blos.sm"><img src="https://blos.sm/badges/cel.png"></a>
+ <a class="badge" href="https://skinnyver.se"><img src="/static/badges/badussyflops.png"></a>
+ <img class="badge" src="/static/badges/mothracompat.gif">
+ <img class="badge" src="/static/badges/flexbox.png">
+ {# TODO: random skin tone #}
+ <img class="badge" src="/static/badges/servinghttps_{{ self::thread_rng().gen_range(1..=7) }}.png">
+ <a class="badge" href="https://keithhacks.cyou"><img src="/static/badges/keith.gif"></a>
+ <a class="badge" href="https://webb.spiderden.org"><img src="/static/badges/webb.png"></a>
+ </footer>
+
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/templates/base.html.tera b/templates/base.html.tera
deleted file mode 100644
index 9884964..0000000
--- a/templates/base.html.tera
+++ /dev/null
@@ -1,82 +0,0 @@
-<!doctype html>
-<html lang="en">
- <head>
- <meta charset="UTF-8"/>
- <meta name="viewport" content="width=device-width, initial-scale=1" />
- <link rel="stylesheet" href="/style.css">
- <link rel="stylesheet" href="/fonts.css">
- <title>cel's garden</title>
- </head>
-
- <body>
-
- <img class="branch" id="branch1" src="/branches/branch837-1.png" alt="cherry blossom branch">
- <img class="branch" id="branch2" src="/branches/branch878.png" alt="cherry blossom branch">
- <img class="branch" id="branch3" src="/branches/branch837-2.png" alt="cherry blossom branch">
- <img class="branch" id="branch4" src="/branches/branch840.png" alt="cherry blossom branch">
- <img class="branch" id="branch5" src="/branches/branch869.png" alt="cherry blossom branch">
- <img class="branch" id="branch6" src="/branches/branch871.png" alt="cherry blossom branch">
- <img class="branch" id="branch7" src="/branches/branch879.png" alt="cherry blossom branch">
- <img class="branch" id="branch8" src="/branches/branch880.png" alt="cherry blossom branch">
- <img class="branch" id="branch9" src="/branches/branch881-1.png" alt="cherry blossom branch">
- <img class="branch" id="branch10" src="/branches/branch881-2.png" alt="cherry blossom branch">
- <img class="branch" id="branch11" src="/branches/branch882-1.png" alt="cherry blossom branch">
- <img class="branch" id="branch12" src="/branches/branch882-2.png" alt="cherry blossom branch">
- <img class="branch" id="branch13" src="/branches/branch883-1.png" alt="cherry blossom branch">
- <img class="branch" id="branch14" src="/branches/branch883-2.png" alt="cherry blossom branch">
-
- <div id="page">
-
- {% block header %}
- {% endblock header %}
-
- <nav class="panel">
- <ul id="nav">
- <li><a class="{% block nav_home %}{% endblock %}" href="/">home</a></li>
- <li><a class="{% block nav_contact %}{% endblock %}" style="font-family: 'Compagnon Roman';" href="/contact">kontakt</a></li>
- <li><a class="{% block nav_poetry %}{% endblock %}" href="/poetry" style="font-family: Louise">poesia</a></li>
- <li><a class="{% block nav_blog %}{% endblock %}" style="font-family: Sligoil" href="/blog">weblog</a></li>
- <li><a class="{% block nav_projects %}{% endblock %}" style="font-family: 'DeGerm LoCase';" href="/projects">projetos</a></li>
- <!--<li><a class="{% block nav_sound %}{% endblock %}" style="font-family: 'kirieji'" href="/sound">音</a></li>-->
- <li><a class="{% block nav_listens %}{% endblock %}" style="font-family: 'Almendra Display'; font-weight: 900;" href="https://listenbrainz.org/user/celblossom">Γ©coute</a></li>
- <li><a href="https://bimbo.video/a/cel" style="font-family: 'Mon Hugo In'">video</a></li>
- <li><a href="https://weirdstar.stream" style="font-family: id_kana018" >πŸ”΄γƒ©γ‚€γƒ–</a></li>
- <!--<li><a class="{% block nav_pix %}{% endblock %}" style="font-family: Minecraftia" href="/pix">pix</a></li>-->
- <!--<li><a class="{% block nav_shodo %}{% endblock %}" href="/shodo">書道</a></li>-->
- <!--<li><a class="{% block nav_cute %}{% endblock %}" style="font-family: 'Darumadrop One'" href="/cute">cute linkz</a></li>-->
- <!--<li><a class="{% block nav_zk %}{% endblock %}" href="https://garden.blos.sm" style="font-family: Louise">zettelkasten</a></li>-->
- <!--<li><a class="{% block nav_read %}{% endblock %}" style="font-family: ukikusa" href="/read">γ‚ˆγ‚€</a></li>-->
- <li><a href="https://bunny.garden/cel">πŸ¦‹πŸŒ·πŸ°πŸŒ»πŸπŸ•·πŸͺ»πŸ‡πŸŒ±</a></li>
- <!--<li><a class="{% block nav_plants %}{% endblock %}" style="font-family: 'Almendra Display'; font-weight: 900;" href="/plants">plantas</a></li>-->
- <li><a style="font-family: Abordage;" href="https://pussy.accountants">pussy</a></li>
- <li class="suscakke"><a href="https://ass-sma.cc"><img src="/suscakke.png"></a></li>
- <!--<li><a class="{% block nav_guestbook %}{% endblock %}" style="font-family: Compagnon; font-weight: bold;" href="/guestbook">visitas</a></li>-->
- </ul>
- </nav>
-
- <main class="{% if reverse %}reverse{% endif %}">
- <div class="main-content">
-
- {% block content %}
- {% endblock content %}
-
- </div>
-
- {% block aside %}
- {% endblock aside %}
-
- </main>
-
- <footer class="panel">
- <a class="badge" href="https://blos.sm"><img src="https://blos.sm/badges/cel.png"></a>
- <a class="badge" href="https://skinnyver.se"><img src="https://skinnyver.se/instance/skinnyversebadge.png"></a>
- <img class="badge" src="/badges/mothracompat.gif">
- <img class="badge" src="/badges/flexbox.png">
- <img class="badge" src="/badges/servinghttps_{{ get_random(start=1, end=7) }}.png">
- <a class="badge" href="https://keithhacks.cyou"><img src="/badges/keith.gif"></a>
- <a class="badge" href="https://webb.spiderden.org"><img src="/badges/webb.png"></a>
- </footer>
-
- </div>
- </body>
-</html>
diff --git a/templates/blog.html b/templates/blog.html
new file mode 100644
index 0000000..42cf95f
--- /dev/null
+++ b/templates/blog.html
@@ -0,0 +1,23 @@
+{% extends "base.html" %}
+
+{% block reverse %}reverse{% endblock %}
+{% block nav_blog %}active{% endblock %}
+
+{% block content %}
+
+{% for blogpost in blogposts %}
+{% include "blogpost-panel.html" %}
+{% endfor %}
+
+{% endblock content %}
+
+{% block aside %}
+
+<aside>
+
+ {% include "latestposts.html" %}
+ {% include "filtertags.html" %}
+
+</aside>
+
+{% endblock aside %} \ No newline at end of file
diff --git a/templates/blog.html.tera b/templates/blog.html.tera
deleted file mode 100644
index 20ec08e..0000000
--- a/templates/blog.html.tera
+++ /dev/null
@@ -1,22 +0,0 @@
-{% extends "base" %}
-
-{% block nav_blog %}active{% endblock %}
-
-{% block content %}
-
-{% for blogpost in blogposts %}
-{% include "blogpost-panel" %}
-{% endfor %}
-
-{% endblock content %}
-
-{% block aside %}
-
-<aside>
-
- {% include "latestposts" %}
- {% include "filtertags" %}
-
-</aside>
-
-{% endblock aside %}
diff --git a/templates/blogpost-panel.html b/templates/blogpost-panel.html
new file mode 100644
index 0000000..6375012
--- /dev/null
+++ b/templates/blogpost-panel.html
@@ -0,0 +1,10 @@
+<div class="panel content blogpost">
+ <h1 class="title">{{ blogpost.subject().unwrap_or("untitled") }}</h1>
+ <h2 class="created-at">{{ blogpost.published_at() }} <a href="/blog/{{ blogpost.file_name() }}">permalink</a></h2>
+ <div class="tags">{% for tag in blogpost.tags().clone() %}<a
+ class="tag {% if filter_tags.contains(tag) %}active{% endif %}" href="/blog?filter={{ tag }}">{{ tag }}</a>{%
+ endfor %}</div>
+ <div class="blogpost-content">
+ {{ blogpost.content()|safe }}
+ </div>
+</div> \ No newline at end of file
diff --git a/templates/blogpost-panel.html.tera b/templates/blogpost-panel.html.tera
deleted file mode 100644
index 64f064c..0000000
--- a/templates/blogpost-panel.html.tera
+++ /dev/null
@@ -1,8 +0,0 @@
-<div class="panel content blogpost">
- <h1 class="title">{{ blogpost.subject }}</h1>
- <h2 class="created-at">{{ blogpost.created_at }} <a href="/blog/{{ blogpost.data.name }}">permalink</a></h2>
- <div class="tags">{% for tag in blogpost.tags %}<a class="tag {% if filter_hashset %}{% if tag in filter_hashset %}active{% endif %}{% endif %}" href="/blog?filter={{ tag }}">{{ tag }}</a>{% endfor %}</div>
- <div class="blogpost-content">
- {{ blogpost.render }}
- </div>
-</div>
diff --git a/templates/blogpost.html b/templates/blogpost.html
new file mode 100644
index 0000000..935d581
--- /dev/null
+++ b/templates/blogpost.html
@@ -0,0 +1,7 @@
+{% extends "base.html" %}
+
+{% block content %}
+
+{% include "blogpost-panel.html" %}
+
+{% endblock content %} \ No newline at end of file
diff --git a/templates/blogpost.html.tera b/templates/blogpost.html.tera
deleted file mode 100644
index b73a24b..0000000
--- a/templates/blogpost.html.tera
+++ /dev/null
@@ -1,7 +0,0 @@
-{% extends "base" %}
-
-{% block content %}
-
-{% include "blogpost-panel" %}
-
-{% endblock content %}
diff --git a/templates/contact.html.tera b/templates/contact.html
index 28ec6e6..4302e88 100644
--- a/templates/contact.html.tera
+++ b/templates/contact.html
@@ -1,4 +1,4 @@
-{% extends "base" %}
+{% extends "base.html" %}
{% block nav_contact %}active{% endblock %}
@@ -6,7 +6,7 @@
<header>
<div class="panel" id="title">
- <h1>cel 🌸</h1>
+ <h1>celeste 🌸</h1>
</div>
</header>
@@ -16,15 +16,19 @@
<div class="content panel h-card" rel="author">
<h1 class="p-name">cel</h1>
-
+
<ul>
- <li><h3>pronouns: <span class="p-x-pronoun-nominative">she</span>/<span class="p-x-pronoun-accusative">her</span></h3></li>
+ <li>
+ <h3>pronouns: <span class="p-x-pronoun-nominative">she</span>/<span class="p-x-pronoun-accusative">her</span></h3>
+ </li>
<li>email: <a class="u-email" href="mailto:cel@blos.sm">cel@blos.sm</a></li>
<li>jabber: <a class="u-impp" href="xmpp:cel@blos.sm?message">cel@blos.sm</a></li>
<li>scrobbles: <a class="u-url" href="https://listenbrainz.org/user/celblossom">listenbrainz/celblossom</a></li>
<li>bandcamp fan: <a class="u-url" href="https://bandcamp.com/celblossom">bandcamp/celblossom</a></li>
<br>
- <li><span class="p-note">languages (in rough skill order): english, portuguese, french, japanese, german, chinese, latin, toki pona, korean</span></li></li>
+ <li><span class="p-note">languages (in rough skill order): english, portuguese, french, japanese, german, chinese,
+ latin, toki pona, korean</span></li>
+ </li>
<li><span class="p-note">programming: rust, erlang, go, haskell, webdev, lisp</span></li>
</ul>
</div>
diff --git a/templates/error.html.tera b/templates/error.html
index 5a4cc17..a3ffff4 100644
--- a/templates/error.html.tera
+++ b/templates/error.html
@@ -1,10 +1,10 @@
-{% extends "base" %}
+{% extends "base.html" %}
{% block content %}
<div class="content panel">
- <h2>Error {{ status }}: {{ req }}</h2>
+ <h2>Error {{ status }}</h2>
<h3>{{ message }}</h3>
</div>
-{% endblock %}
+{% endblock %} \ No newline at end of file
diff --git a/templates/filtertags.html b/templates/filtertags.html
new file mode 100644
index 0000000..55c802f
--- /dev/null
+++ b/templates/filtertags.html
@@ -0,0 +1,10 @@
+<div class="panel" id="filter-tags">
+ <h2>filter by tags</h2>
+ <div class="tags">
+ {% for tag in tags.clone() %}{% let contains_tag = filter_tags.contains(tag) %}<a
+ class="{% if contains_tag %}active{% endif %}"
+ href="{% if contains_tag %}/blog{% else %}/blog?filter={{ tag }}{% endif %}">{{ tag }}</a>{% endfor
+ %}
+ </div>
+ <br>
+</div> \ No newline at end of file
diff --git a/templates/filtertags.html.tera b/templates/filtertags.html.tera
deleted file mode 100644
index f79ee94..0000000
--- a/templates/filtertags.html.tera
+++ /dev/null
@@ -1,7 +0,0 @@
-<div class="panel" id="filter-tags">
-<h2>filter by tags</h2>
-<div class="tags">
- {% for tag in tags %}<a class="{% if tag in filter_hashset %}active{% endif %}" href="{% if tag in filter_hashset %}/blog{% else %}/blog?filter={{ tag }}{% endif %}">{{ tag }}</a>{% endfor %}
-</div>
-<br>
-</div>
diff --git a/templates/home.html.tera b/templates/home.html
index 5017ea3..7cd8c0f 100644
--- a/templates/home.html.tera
+++ b/templates/home.html
@@ -1,4 +1,4 @@
-{% extends "base" %}
+{% extends "base.html" %}
{% block nav_home %}active{% endblock %}
@@ -6,27 +6,23 @@
<header>
<div class="panel" id="title">
- <h1>cel 🌸</h1>
+ <h1>celeste 🌸</h1>
</div>
{% if is_live %}
- <iframe
- class="panel"
- id="stream"
- src="https://weirdstar.stream/embed/video"
- title="girlstream"
- referrerpolicy="origin"
- scrolling="no"
- allowfullscreen>
+ <iframe class="panel" id="stream" src="https://weirdstar.stream/embed/video" title="girlstream"
+ referrerpolicy="origin" scrolling="no" allowfullscreen>
</iframe>
{% endif %}
{% if listenbrainz.is_scrobbling %}
- <a href="https://listenbrainz.org/user/celblossom" class="panel" id="scrobble">now playing: {{ listenbrainz.song }} - {{ listenbrainz.artist }}</a>
+ <a href="https://listenbrainz.org/user/celblossom" class="panel" id="scrobble">now playing: {{
+ listenbrainz.song.clone().unwrap_or_default() }} -
+ {{ listenbrainz.artist.clone().unwrap_or_default() }}</a>
{% endif %}
</header>
-
+
{% endblock header %}
{% block content %}
@@ -36,9 +32,9 @@
<p>this is where i do the posting</p>
<p>i wish u a wonderful day</p>
<br>
- <img src="/quinntyping.png">
+ <img src="/static/quinntyping.png">
<p>perpetually under construction</p>
- <img style="border: 0;" src="/barraconstruction.gif">
+ <img style="border: 0;" src="/static/barraconstruction.gif">
</div>
{% endblock content %}
@@ -47,12 +43,10 @@
<aside>
- <div class="panel" style="background-color: #b52f6a; z-index: -1; font-family: 'Terminal Grotesque'; font-size: 2em">latest update: the skweets begone</div>
- {% include "latestposts" %}
+ <div class="panel" style="background-color: #b52f6a; z-index: -1; font-family: 'Terminal Grotesque'; font-size: 2em">
+ latest update: the skweets begone</div>
+ {% include "latestposts.html" %}
</aside>
-{% endblock aside %}
-
-
-
+{% endblock aside %} \ No newline at end of file
diff --git a/templates/latestposts.html b/templates/latestposts.html
new file mode 100644
index 0000000..e2dfa9f
--- /dev/null
+++ b/templates/latestposts.html
@@ -0,0 +1,13 @@
+<div class="panel" id="posts">
+ <h2>latest posts <a class="small-badge" href="/feed"><img class="small-badge" src="/static/atombadge.png"
+ alt="atom newsfeed"></a></h2>
+ <table id="post-list">
+ {% for blogpost in blogposts %}
+ <tr>
+ <td><a class="post-entry" href="/blog/{{ blogpost.file_name() }}">{{ blogpost.subject().unwrap_or("untitled")
+ }}<span class="post-date">{{
+ blogpost.published_at()|mytruncate(10) }}</span></a></td>
+ </tr>
+ {% endfor %}
+ </table>
+</div> \ No newline at end of file
diff --git a/templates/latestposts.html.tera b/templates/latestposts.html.tera
deleted file mode 100644
index 11528a4..0000000
--- a/templates/latestposts.html.tera
+++ /dev/null
@@ -1,10 +0,0 @@
-<div class="panel" id="posts">
- <h2>latest posts <a class="small-badge" href="/feed"><img class="small-badge" src="/atombadge.png" alt="atom newsfeed"></a></h2>
- <table id="post-list">
- {% for blogpost in blogposts %}
- <tr>
- <td><a class="post-entry" href="/blog/{{ blogpost.data.name }}">{{ blogpost.subject }}<span class="post-date">{{ blogpost.created_at | truncate(length=10, end="") }}</span></a></td>
- </tr>
- {% endfor %}
- </table>
-</div> \ No newline at end of file
diff --git a/templates/latestskweets.html.tera b/templates/latestskweets.html
index 84798de..84798de 100644
--- a/templates/latestskweets.html.tera
+++ b/templates/latestskweets.html