├── .dockerignore ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── Dockerfile ├── LICENSE ├── README.md ├── deploy.sh ├── dhall ├── package.dhall ├── pronouns.tab ├── pronouns │ ├── ae-aer-aer-aers-aerself.dhall │ ├── bun-bun-buns-buns-bunself.dhall │ ├── e-em-eir-eirs-emself.dhall │ ├── ey-em-eir-eirs-eirself.dhall │ ├── fae-faer-faer-faers-faerself.dhall │ ├── fey-fem-feir-feirs-feirself.dhall │ ├── he-him-his-his-himself.dhall │ ├── hu-hum-hus-hus-humself.dhall │ ├── it-it-its-its-itself.dhall │ ├── jee-jem-jeir-jeirs-jemself.dhall │ ├── kit-kit-kits-kits-kitself.dhall │ ├── ne-nem-nir-nirs-nemself.dhall │ ├── peh-pehm-peh_s-peh_s-pehself.dhall │ ├── per-per-per-pers-perself.dhall │ ├── se-sim-ser-sers-serself.dhall │ ├── she-her-her-hers-herself.dhall │ ├── shi-hir-hir-hirs-hirself.dhall │ ├── si-hyr-hyr-hyrs-hyrself.dhall │ ├── sie-hir-hir-hirs-hirself.dhall │ ├── star-star-stars-stars-starself.dhall │ ├── they-them-their-theirs-themself.dhall │ ├── they-them-their-theirs-themselves.dhall │ ├── thon-thon-thons-thons-thonself.dhall │ ├── ve-vem-vir-virs-vemself.dhall │ ├── ve-ver-vis-vis-verself.dhall │ ├── vi-ver-ver-vers-verself.dhall │ ├── vi-vim-vim-vims-vimself.dhall │ ├── vi-vim-vir-virs-vimself.dhall │ ├── xae-xaem-xaer-xaers-xaerself.dhall │ ├── xae-xaer-xaer-xaers-xaerself.dhall │ ├── xae-xem-xaer-xaers-xaerself.dhall │ ├── xe-xem-xyr-xyrs-xemself.dhall │ ├── xe-xer-xer-xers-xerself.dhall │ ├── xey-xem-xeir-xeirs-xemself.dhall │ ├── xey-xem-xyr-xyrs-xemself.dhall │ ├── xie-xer-xer-xers-xerself.dhall │ ├── yo-yo-yos-yos-yosself.dhall │ ├── ze-hir-hir-hirs-hirself.dhall │ ├── ze-mer-zer-zers-zemself.dhall │ ├── ze-zem-zes-zes-zirself.dhall │ ├── ze-zir-zir-zirs-zirself.dhall │ ├── zee-zed-zeta-zetas-zedself.dhall │ ├── zie-hir-hir-hirs-hirself.dhall │ ├── zie-zem-zes-zes-zirself.dhall │ ├── zie-zir-zir-zirs-zirself.dhall │ └── zme-zmyr-zmyr-zmyrs-zmyrself.dhall ├── pronouns2dhall.py └── types │ └── PronounSet.dhall ├── manifest ├── deployment.yaml ├── ingress.yaml ├── kustomization.yaml └── service.yaml ├── src ├── lib.rs ├── main.rs └── trie.rs └── static └── css └── xess.css /.dockerignore: -------------------------------------------------------------------------------- 1 | # flyctl launch added from .gitignore 2 | **/.direnv 3 | **/result 4 | **/target 5 | 6 | 7 | # Added by cargo 8 | 9 | target 10 | fly.toml 11 | terraform 12 | manifest -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .direnv 2 | result 3 | target 4 | 5 | 6 | # Added by cargo 7 | 8 | /target 9 | .terraform -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "abnf" 7 | version = "0.12.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "33741baa462d86e43fdec5e8ffca7c6ac82847ad06cbfb382c1bdbf527de9e6b" 10 | dependencies = [ 11 | "abnf-core", 12 | "nom", 13 | ] 14 | 15 | [[package]] 16 | name = "abnf-core" 17 | version = "0.5.0" 18 | source = "registry+https://github.com/rust-lang/crates.io-index" 19 | checksum = "c44e09c43ae1c368fb91a03a566472d0087c26cf7e1b9e8e289c14ede681dd7d" 20 | dependencies = [ 21 | "nom", 22 | ] 23 | 24 | [[package]] 25 | name = "abnf_to_pest" 26 | version = "0.5.1" 27 | source = "registry+https://github.com/rust-lang/crates.io-index" 28 | checksum = "939d59666dd9a7964a3a5312b9d24c9c107630752ee64f2dd5038189a23fe331" 29 | dependencies = [ 30 | "abnf", 31 | "indexmap", 32 | "itertools", 33 | "pretty", 34 | ] 35 | 36 | [[package]] 37 | name = "adler" 38 | version = "1.0.2" 39 | source = "registry+https://github.com/rust-lang/crates.io-index" 40 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 41 | 42 | [[package]] 43 | name = "alloc-no-stdlib" 44 | version = "2.0.4" 45 | source = "registry+https://github.com/rust-lang/crates.io-index" 46 | checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" 47 | 48 | [[package]] 49 | name = "alloc-stdlib" 50 | version = "0.2.2" 51 | source = "registry+https://github.com/rust-lang/crates.io-index" 52 | checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" 53 | dependencies = [ 54 | "alloc-no-stdlib", 55 | ] 56 | 57 | [[package]] 58 | name = "annotate-snippets" 59 | version = "0.9.1" 60 | source = "registry+https://github.com/rust-lang/crates.io-index" 61 | checksum = "c3b9d411ecbaf79885c6df4d75fff75858d5995ff25385657a28af47e82f9c36" 62 | dependencies = [ 63 | "unicode-width", 64 | ] 65 | 66 | [[package]] 67 | name = "anyhow" 68 | version = "1.0.68" 69 | source = "registry+https://github.com/rust-lang/crates.io-index" 70 | checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61" 71 | 72 | [[package]] 73 | name = "arrayvec" 74 | version = "0.5.2" 75 | source = "registry+https://github.com/rust-lang/crates.io-index" 76 | checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" 77 | 78 | [[package]] 79 | name = "async-compression" 80 | version = "0.3.15" 81 | source = "registry+https://github.com/rust-lang/crates.io-index" 82 | checksum = "942c7cd7ae39e91bde4820d74132e9862e62c2f386c3aa90ccf55949f5bad63a" 83 | dependencies = [ 84 | "brotli", 85 | "flate2", 86 | "futures-core", 87 | "memchr", 88 | "pin-project-lite", 89 | "tokio", 90 | ] 91 | 92 | [[package]] 93 | name = "async-trait" 94 | version = "0.1.61" 95 | source = "registry+https://github.com/rust-lang/crates.io-index" 96 | checksum = "705339e0e4a9690e2908d2b3d049d85682cf19fbd5782494498fbf7003a6a282" 97 | dependencies = [ 98 | "proc-macro2", 99 | "quote", 100 | "syn", 101 | ] 102 | 103 | [[package]] 104 | name = "autocfg" 105 | version = "1.1.0" 106 | source = "registry+https://github.com/rust-lang/crates.io-index" 107 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 108 | 109 | [[package]] 110 | name = "axum" 111 | version = "0.6.1" 112 | source = "registry+https://github.com/rust-lang/crates.io-index" 113 | checksum = "08b108ad2665fa3f6e6a517c3d80ec3e77d224c47d605167aefaa5d7ef97fa48" 114 | dependencies = [ 115 | "async-trait", 116 | "axum-core", 117 | "bitflags 1.3.2", 118 | "bytes", 119 | "futures-util", 120 | "headers", 121 | "http", 122 | "http-body", 123 | "hyper", 124 | "itoa", 125 | "matchit", 126 | "memchr", 127 | "mime", 128 | "percent-encoding", 129 | "pin-project-lite", 130 | "rustversion", 131 | "serde", 132 | "serde_json", 133 | "serde_path_to_error", 134 | "serde_urlencoded", 135 | "sync_wrapper", 136 | "tokio", 137 | "tower", 138 | "tower-http", 139 | "tower-layer", 140 | "tower-service", 141 | ] 142 | 143 | [[package]] 144 | name = "axum-core" 145 | version = "0.3.0" 146 | source = "registry+https://github.com/rust-lang/crates.io-index" 147 | checksum = "79b8558f5a0581152dc94dcd289132a1d377494bdeafcd41869b3258e3e2ad92" 148 | dependencies = [ 149 | "async-trait", 150 | "bytes", 151 | "futures-util", 152 | "http", 153 | "http-body", 154 | "mime", 155 | "rustversion", 156 | "tower-layer", 157 | "tower-service", 158 | ] 159 | 160 | [[package]] 161 | name = "axum-extra" 162 | version = "0.4.2" 163 | source = "registry+https://github.com/rust-lang/crates.io-index" 164 | checksum = "f9a320103719de37b7b4da4c8eb629d4573f6bcfd3dfe80d3208806895ccf81d" 165 | dependencies = [ 166 | "axum", 167 | "bytes", 168 | "futures-util", 169 | "http", 170 | "mime", 171 | "pin-project-lite", 172 | "tokio", 173 | "tower", 174 | "tower-http", 175 | "tower-layer", 176 | "tower-service", 177 | ] 178 | 179 | [[package]] 180 | name = "axum-macros" 181 | version = "0.3.0" 182 | source = "registry+https://github.com/rust-lang/crates.io-index" 183 | checksum = "e4df0fc33ada14a338b799002f7e8657711422b25d4e16afb032708d6b185621" 184 | dependencies = [ 185 | "heck", 186 | "proc-macro2", 187 | "quote", 188 | "syn", 189 | ] 190 | 191 | [[package]] 192 | name = "base64" 193 | version = "0.13.1" 194 | source = "registry+https://github.com/rust-lang/crates.io-index" 195 | checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" 196 | 197 | [[package]] 198 | name = "bitflags" 199 | version = "1.3.2" 200 | source = "registry+https://github.com/rust-lang/crates.io-index" 201 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 202 | 203 | [[package]] 204 | name = "bitflags" 205 | version = "2.4.0" 206 | source = "registry+https://github.com/rust-lang/crates.io-index" 207 | checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" 208 | 209 | [[package]] 210 | name = "block-buffer" 211 | version = "0.10.3" 212 | source = "registry+https://github.com/rust-lang/crates.io-index" 213 | checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" 214 | dependencies = [ 215 | "generic-array", 216 | ] 217 | 218 | [[package]] 219 | name = "brotli" 220 | version = "3.3.4" 221 | source = "registry+https://github.com/rust-lang/crates.io-index" 222 | checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" 223 | dependencies = [ 224 | "alloc-no-stdlib", 225 | "alloc-stdlib", 226 | "brotli-decompressor", 227 | ] 228 | 229 | [[package]] 230 | name = "brotli-decompressor" 231 | version = "2.3.2" 232 | source = "registry+https://github.com/rust-lang/crates.io-index" 233 | checksum = "59ad2d4653bf5ca36ae797b1f4bb4dbddb60ce49ca4aed8a2ce4829f60425b80" 234 | dependencies = [ 235 | "alloc-no-stdlib", 236 | "alloc-stdlib", 237 | ] 238 | 239 | [[package]] 240 | name = "bumpalo" 241 | version = "3.11.1" 242 | source = "registry+https://github.com/rust-lang/crates.io-index" 243 | checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" 244 | 245 | [[package]] 246 | name = "byteorder" 247 | version = "1.4.3" 248 | source = "registry+https://github.com/rust-lang/crates.io-index" 249 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 250 | 251 | [[package]] 252 | name = "bytes" 253 | version = "1.3.0" 254 | source = "registry+https://github.com/rust-lang/crates.io-index" 255 | checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" 256 | 257 | [[package]] 258 | name = "cc" 259 | version = "1.0.78" 260 | source = "registry+https://github.com/rust-lang/crates.io-index" 261 | checksum = "a20104e2335ce8a659d6dd92a51a767a0c062599c73b343fd152cb401e828c3d" 262 | 263 | [[package]] 264 | name = "cfg-if" 265 | version = "1.0.0" 266 | source = "registry+https://github.com/rust-lang/crates.io-index" 267 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 268 | 269 | [[package]] 270 | name = "core-foundation" 271 | version = "0.9.3" 272 | source = "registry+https://github.com/rust-lang/crates.io-index" 273 | checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" 274 | dependencies = [ 275 | "core-foundation-sys", 276 | "libc", 277 | ] 278 | 279 | [[package]] 280 | name = "core-foundation-sys" 281 | version = "0.8.3" 282 | source = "registry+https://github.com/rust-lang/crates.io-index" 283 | checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" 284 | 285 | [[package]] 286 | name = "cpufeatures" 287 | version = "0.2.5" 288 | source = "registry+https://github.com/rust-lang/crates.io-index" 289 | checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" 290 | dependencies = [ 291 | "libc", 292 | ] 293 | 294 | [[package]] 295 | name = "crc32fast" 296 | version = "1.3.2" 297 | source = "registry+https://github.com/rust-lang/crates.io-index" 298 | checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" 299 | dependencies = [ 300 | "cfg-if", 301 | ] 302 | 303 | [[package]] 304 | name = "crunchy" 305 | version = "0.2.2" 306 | source = "registry+https://github.com/rust-lang/crates.io-index" 307 | checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" 308 | 309 | [[package]] 310 | name = "crypto-common" 311 | version = "0.1.6" 312 | source = "registry+https://github.com/rust-lang/crates.io-index" 313 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 314 | dependencies = [ 315 | "generic-array", 316 | "typenum", 317 | ] 318 | 319 | [[package]] 320 | name = "ctrlc" 321 | version = "3.4.1" 322 | source = "registry+https://github.com/rust-lang/crates.io-index" 323 | checksum = "82e95fbd621905b854affdc67943b043a0fbb6ed7385fd5a25650d19a8a6cfdf" 324 | dependencies = [ 325 | "nix", 326 | "windows-sys 0.48.0", 327 | ] 328 | 329 | [[package]] 330 | name = "dhall" 331 | version = "0.12.0" 332 | source = "registry+https://github.com/rust-lang/crates.io-index" 333 | checksum = "ec26264de25a8e3642fbb37abb24a6c6be9e19795444e6cf1bb88be5c2d55cc7" 334 | dependencies = [ 335 | "abnf_to_pest", 336 | "annotate-snippets", 337 | "elsa", 338 | "half 2.2.0", 339 | "hex", 340 | "home", 341 | "itertools", 342 | "lazy_static", 343 | "minicbor", 344 | "once_cell", 345 | "percent-encoding", 346 | "pest", 347 | "pest_consume", 348 | "pest_generator", 349 | "quote", 350 | "reqwest", 351 | "sha2", 352 | "url", 353 | ] 354 | 355 | [[package]] 356 | name = "dhall_proc_macros" 357 | version = "0.6.1" 358 | source = "registry+https://github.com/rust-lang/crates.io-index" 359 | checksum = "efcdb228bf802b21cd843e5ac3959b6255966238e5ec06d2e4bc6b9935475653" 360 | dependencies = [ 361 | "proc-macro2", 362 | "quote", 363 | "syn", 364 | ] 365 | 366 | [[package]] 367 | name = "digest" 368 | version = "0.10.6" 369 | source = "registry+https://github.com/rust-lang/crates.io-index" 370 | checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" 371 | dependencies = [ 372 | "block-buffer", 373 | "crypto-common", 374 | ] 375 | 376 | [[package]] 377 | name = "doc-comment" 378 | version = "0.3.3" 379 | source = "registry+https://github.com/rust-lang/crates.io-index" 380 | checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" 381 | 382 | [[package]] 383 | name = "either" 384 | version = "1.8.0" 385 | source = "registry+https://github.com/rust-lang/crates.io-index" 386 | checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" 387 | 388 | [[package]] 389 | name = "elsa" 390 | version = "1.7.0" 391 | source = "registry+https://github.com/rust-lang/crates.io-index" 392 | checksum = "2b4b5d23ed6b6948d68240aafa4ac98e568c9a020efd9d4201a6288bc3006e09" 393 | dependencies = [ 394 | "stable_deref_trait", 395 | ] 396 | 397 | [[package]] 398 | name = "encoding_rs" 399 | version = "0.8.31" 400 | source = "registry+https://github.com/rust-lang/crates.io-index" 401 | checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" 402 | dependencies = [ 403 | "cfg-if", 404 | ] 405 | 406 | [[package]] 407 | name = "fastrand" 408 | version = "1.8.0" 409 | source = "registry+https://github.com/rust-lang/crates.io-index" 410 | checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" 411 | dependencies = [ 412 | "instant", 413 | ] 414 | 415 | [[package]] 416 | name = "flate2" 417 | version = "1.0.25" 418 | source = "registry+https://github.com/rust-lang/crates.io-index" 419 | checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" 420 | dependencies = [ 421 | "crc32fast", 422 | "miniz_oxide", 423 | ] 424 | 425 | [[package]] 426 | name = "fnv" 427 | version = "1.0.7" 428 | source = "registry+https://github.com/rust-lang/crates.io-index" 429 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 430 | 431 | [[package]] 432 | name = "foreign-types" 433 | version = "0.3.2" 434 | source = "registry+https://github.com/rust-lang/crates.io-index" 435 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 436 | dependencies = [ 437 | "foreign-types-shared", 438 | ] 439 | 440 | [[package]] 441 | name = "foreign-types-shared" 442 | version = "0.1.1" 443 | source = "registry+https://github.com/rust-lang/crates.io-index" 444 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 445 | 446 | [[package]] 447 | name = "form_urlencoded" 448 | version = "1.1.0" 449 | source = "registry+https://github.com/rust-lang/crates.io-index" 450 | checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" 451 | dependencies = [ 452 | "percent-encoding", 453 | ] 454 | 455 | [[package]] 456 | name = "futures-channel" 457 | version = "0.3.25" 458 | source = "registry+https://github.com/rust-lang/crates.io-index" 459 | checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" 460 | dependencies = [ 461 | "futures-core", 462 | ] 463 | 464 | [[package]] 465 | name = "futures-core" 466 | version = "0.3.25" 467 | source = "registry+https://github.com/rust-lang/crates.io-index" 468 | checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" 469 | 470 | [[package]] 471 | name = "futures-io" 472 | version = "0.3.25" 473 | source = "registry+https://github.com/rust-lang/crates.io-index" 474 | checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" 475 | 476 | [[package]] 477 | name = "futures-sink" 478 | version = "0.3.25" 479 | source = "registry+https://github.com/rust-lang/crates.io-index" 480 | checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" 481 | 482 | [[package]] 483 | name = "futures-task" 484 | version = "0.3.25" 485 | source = "registry+https://github.com/rust-lang/crates.io-index" 486 | checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" 487 | 488 | [[package]] 489 | name = "futures-util" 490 | version = "0.3.25" 491 | source = "registry+https://github.com/rust-lang/crates.io-index" 492 | checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" 493 | dependencies = [ 494 | "futures-core", 495 | "futures-io", 496 | "futures-task", 497 | "memchr", 498 | "pin-project-lite", 499 | "pin-utils", 500 | "slab", 501 | ] 502 | 503 | [[package]] 504 | name = "generic-array" 505 | version = "0.14.6" 506 | source = "registry+https://github.com/rust-lang/crates.io-index" 507 | checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" 508 | dependencies = [ 509 | "typenum", 510 | "version_check", 511 | ] 512 | 513 | [[package]] 514 | name = "getrandom" 515 | version = "0.2.8" 516 | source = "registry+https://github.com/rust-lang/crates.io-index" 517 | checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" 518 | dependencies = [ 519 | "cfg-if", 520 | "libc", 521 | "wasi", 522 | ] 523 | 524 | [[package]] 525 | name = "h2" 526 | version = "0.3.15" 527 | source = "registry+https://github.com/rust-lang/crates.io-index" 528 | checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4" 529 | dependencies = [ 530 | "bytes", 531 | "fnv", 532 | "futures-core", 533 | "futures-sink", 534 | "futures-util", 535 | "http", 536 | "indexmap", 537 | "slab", 538 | "tokio", 539 | "tokio-util", 540 | "tracing", 541 | ] 542 | 543 | [[package]] 544 | name = "half" 545 | version = "1.8.2" 546 | source = "registry+https://github.com/rust-lang/crates.io-index" 547 | checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" 548 | 549 | [[package]] 550 | name = "half" 551 | version = "2.2.0" 552 | source = "registry+https://github.com/rust-lang/crates.io-index" 553 | checksum = "6c467d36af040b7b2681f5fddd27427f6da8d3d072f575a265e181d2f8e8d157" 554 | dependencies = [ 555 | "crunchy", 556 | ] 557 | 558 | [[package]] 559 | name = "hashbrown" 560 | version = "0.12.3" 561 | source = "registry+https://github.com/rust-lang/crates.io-index" 562 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 563 | 564 | [[package]] 565 | name = "hdrhistogram" 566 | version = "7.5.2" 567 | source = "registry+https://github.com/rust-lang/crates.io-index" 568 | checksum = "7f19b9f54f7c7f55e31401bb647626ce0cf0f67b0004982ce815b3ee72a02aa8" 569 | dependencies = [ 570 | "byteorder", 571 | "num-traits", 572 | ] 573 | 574 | [[package]] 575 | name = "headers" 576 | version = "0.3.8" 577 | source = "registry+https://github.com/rust-lang/crates.io-index" 578 | checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" 579 | dependencies = [ 580 | "base64", 581 | "bitflags 1.3.2", 582 | "bytes", 583 | "headers-core", 584 | "http", 585 | "httpdate", 586 | "mime", 587 | "sha1", 588 | ] 589 | 590 | [[package]] 591 | name = "headers-core" 592 | version = "0.2.0" 593 | source = "registry+https://github.com/rust-lang/crates.io-index" 594 | checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" 595 | dependencies = [ 596 | "http", 597 | ] 598 | 599 | [[package]] 600 | name = "heck" 601 | version = "0.4.1" 602 | source = "registry+https://github.com/rust-lang/crates.io-index" 603 | checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 604 | 605 | [[package]] 606 | name = "hermit-abi" 607 | version = "0.2.6" 608 | source = "registry+https://github.com/rust-lang/crates.io-index" 609 | checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" 610 | dependencies = [ 611 | "libc", 612 | ] 613 | 614 | [[package]] 615 | name = "hex" 616 | version = "0.4.3" 617 | source = "registry+https://github.com/rust-lang/crates.io-index" 618 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 619 | 620 | [[package]] 621 | name = "home" 622 | version = "0.5.4" 623 | source = "registry+https://github.com/rust-lang/crates.io-index" 624 | checksum = "747309b4b440c06d57b0b25f2aee03ee9b5e5397d288c60e21fc709bb98a7408" 625 | dependencies = [ 626 | "winapi", 627 | ] 628 | 629 | [[package]] 630 | name = "http" 631 | version = "0.2.8" 632 | source = "registry+https://github.com/rust-lang/crates.io-index" 633 | checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" 634 | dependencies = [ 635 | "bytes", 636 | "fnv", 637 | "itoa", 638 | ] 639 | 640 | [[package]] 641 | name = "http-body" 642 | version = "0.4.5" 643 | source = "registry+https://github.com/rust-lang/crates.io-index" 644 | checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" 645 | dependencies = [ 646 | "bytes", 647 | "http", 648 | "pin-project-lite", 649 | ] 650 | 651 | [[package]] 652 | name = "http-range-header" 653 | version = "0.3.0" 654 | source = "registry+https://github.com/rust-lang/crates.io-index" 655 | checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29" 656 | 657 | [[package]] 658 | name = "httparse" 659 | version = "1.8.0" 660 | source = "registry+https://github.com/rust-lang/crates.io-index" 661 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 662 | 663 | [[package]] 664 | name = "httpdate" 665 | version = "1.0.2" 666 | source = "registry+https://github.com/rust-lang/crates.io-index" 667 | checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" 668 | 669 | [[package]] 670 | name = "hyper" 671 | version = "0.14.23" 672 | source = "registry+https://github.com/rust-lang/crates.io-index" 673 | checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c" 674 | dependencies = [ 675 | "bytes", 676 | "futures-channel", 677 | "futures-core", 678 | "futures-util", 679 | "h2", 680 | "http", 681 | "http-body", 682 | "httparse", 683 | "httpdate", 684 | "itoa", 685 | "pin-project-lite", 686 | "socket2", 687 | "tokio", 688 | "tower-service", 689 | "tracing", 690 | "want", 691 | ] 692 | 693 | [[package]] 694 | name = "hyper-tls" 695 | version = "0.5.0" 696 | source = "registry+https://github.com/rust-lang/crates.io-index" 697 | checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" 698 | dependencies = [ 699 | "bytes", 700 | "hyper", 701 | "native-tls", 702 | "tokio", 703 | "tokio-native-tls", 704 | ] 705 | 706 | [[package]] 707 | name = "idna" 708 | version = "0.3.0" 709 | source = "registry+https://github.com/rust-lang/crates.io-index" 710 | checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" 711 | dependencies = [ 712 | "unicode-bidi", 713 | "unicode-normalization", 714 | ] 715 | 716 | [[package]] 717 | name = "indexmap" 718 | version = "1.9.2" 719 | source = "registry+https://github.com/rust-lang/crates.io-index" 720 | checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" 721 | dependencies = [ 722 | "autocfg", 723 | "hashbrown", 724 | ] 725 | 726 | [[package]] 727 | name = "instant" 728 | version = "0.1.12" 729 | source = "registry+https://github.com/rust-lang/crates.io-index" 730 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 731 | dependencies = [ 732 | "cfg-if", 733 | ] 734 | 735 | [[package]] 736 | name = "ipnet" 737 | version = "2.7.0" 738 | source = "registry+https://github.com/rust-lang/crates.io-index" 739 | checksum = "11b0d96e660696543b251e58030cf9787df56da39dab19ad60eae7353040917e" 740 | 741 | [[package]] 742 | name = "iri-string" 743 | version = "0.4.1" 744 | source = "registry+https://github.com/rust-lang/crates.io-index" 745 | checksum = "8f0f7638c1e223529f1bfdc48c8b133b9e0b434094d1d28473161ee48b235f78" 746 | dependencies = [ 747 | "nom", 748 | ] 749 | 750 | [[package]] 751 | name = "itertools" 752 | version = "0.10.5" 753 | source = "registry+https://github.com/rust-lang/crates.io-index" 754 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 755 | dependencies = [ 756 | "either", 757 | ] 758 | 759 | [[package]] 760 | name = "itoa" 761 | version = "1.0.5" 762 | source = "registry+https://github.com/rust-lang/crates.io-index" 763 | checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" 764 | 765 | [[package]] 766 | name = "js-sys" 767 | version = "0.3.60" 768 | source = "registry+https://github.com/rust-lang/crates.io-index" 769 | checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" 770 | dependencies = [ 771 | "wasm-bindgen", 772 | ] 773 | 774 | [[package]] 775 | name = "lazy_static" 776 | version = "1.4.0" 777 | source = "registry+https://github.com/rust-lang/crates.io-index" 778 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 779 | 780 | [[package]] 781 | name = "libc" 782 | version = "0.2.149" 783 | source = "registry+https://github.com/rust-lang/crates.io-index" 784 | checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" 785 | 786 | [[package]] 787 | name = "lock_api" 788 | version = "0.4.9" 789 | source = "registry+https://github.com/rust-lang/crates.io-index" 790 | checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" 791 | dependencies = [ 792 | "autocfg", 793 | "scopeguard", 794 | ] 795 | 796 | [[package]] 797 | name = "log" 798 | version = "0.4.17" 799 | source = "registry+https://github.com/rust-lang/crates.io-index" 800 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 801 | dependencies = [ 802 | "cfg-if", 803 | ] 804 | 805 | [[package]] 806 | name = "matchit" 807 | version = "0.7.0" 808 | source = "registry+https://github.com/rust-lang/crates.io-index" 809 | checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40" 810 | 811 | [[package]] 812 | name = "maud" 813 | version = "0.24.0" 814 | source = "git+https://github.com/Xe/maud?rev=a40596c42c7603cc4610bbeddea04c4bd8b312d9#a40596c42c7603cc4610bbeddea04c4bd8b312d9" 815 | dependencies = [ 816 | "axum-core", 817 | "http", 818 | "itoa", 819 | "maud_macros", 820 | ] 821 | 822 | [[package]] 823 | name = "maud_macros" 824 | version = "0.24.0" 825 | source = "git+https://github.com/Xe/maud?rev=a40596c42c7603cc4610bbeddea04c4bd8b312d9#a40596c42c7603cc4610bbeddea04c4bd8b312d9" 826 | dependencies = [ 827 | "proc-macro-error", 828 | "proc-macro2", 829 | "quote", 830 | "syn", 831 | ] 832 | 833 | [[package]] 834 | name = "memchr" 835 | version = "2.5.0" 836 | source = "registry+https://github.com/rust-lang/crates.io-index" 837 | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" 838 | 839 | [[package]] 840 | name = "mime" 841 | version = "0.3.16" 842 | source = "registry+https://github.com/rust-lang/crates.io-index" 843 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 844 | 845 | [[package]] 846 | name = "mime_guess" 847 | version = "2.0.4" 848 | source = "registry+https://github.com/rust-lang/crates.io-index" 849 | checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" 850 | dependencies = [ 851 | "mime", 852 | "unicase", 853 | ] 854 | 855 | [[package]] 856 | name = "minicbor" 857 | version = "0.18.0" 858 | source = "registry+https://github.com/rust-lang/crates.io-index" 859 | checksum = "2a20020e8e2d1881d8736f64011bb5ff99f1db9947ce3089706945c8915695cb" 860 | dependencies = [ 861 | "half 1.8.2", 862 | "minicbor-derive", 863 | ] 864 | 865 | [[package]] 866 | name = "minicbor-derive" 867 | version = "0.12.0" 868 | source = "registry+https://github.com/rust-lang/crates.io-index" 869 | checksum = "8608fb1c805b5b6b3d5ab7bd95c40c396df622b64d77b2d621a5eae1eed050ee" 870 | dependencies = [ 871 | "proc-macro2", 872 | "quote", 873 | "syn", 874 | ] 875 | 876 | [[package]] 877 | name = "minimal-lexical" 878 | version = "0.2.1" 879 | source = "registry+https://github.com/rust-lang/crates.io-index" 880 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 881 | 882 | [[package]] 883 | name = "miniz_oxide" 884 | version = "0.6.2" 885 | source = "registry+https://github.com/rust-lang/crates.io-index" 886 | checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" 887 | dependencies = [ 888 | "adler", 889 | ] 890 | 891 | [[package]] 892 | name = "mio" 893 | version = "0.8.5" 894 | source = "registry+https://github.com/rust-lang/crates.io-index" 895 | checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" 896 | dependencies = [ 897 | "libc", 898 | "log", 899 | "wasi", 900 | "windows-sys 0.42.0", 901 | ] 902 | 903 | [[package]] 904 | name = "native-tls" 905 | version = "0.2.11" 906 | source = "registry+https://github.com/rust-lang/crates.io-index" 907 | checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" 908 | dependencies = [ 909 | "lazy_static", 910 | "libc", 911 | "log", 912 | "openssl", 913 | "openssl-probe", 914 | "openssl-sys", 915 | "schannel", 916 | "security-framework", 917 | "security-framework-sys", 918 | "tempfile", 919 | ] 920 | 921 | [[package]] 922 | name = "nix" 923 | version = "0.27.1" 924 | source = "registry+https://github.com/rust-lang/crates.io-index" 925 | checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" 926 | dependencies = [ 927 | "bitflags 2.4.0", 928 | "cfg-if", 929 | "libc", 930 | ] 931 | 932 | [[package]] 933 | name = "nom" 934 | version = "7.1.2" 935 | source = "registry+https://github.com/rust-lang/crates.io-index" 936 | checksum = "e5507769c4919c998e69e49c839d9dc6e693ede4cc4290d6ad8b41d4f09c548c" 937 | dependencies = [ 938 | "memchr", 939 | "minimal-lexical", 940 | ] 941 | 942 | [[package]] 943 | name = "num-traits" 944 | version = "0.2.15" 945 | source = "registry+https://github.com/rust-lang/crates.io-index" 946 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 947 | dependencies = [ 948 | "autocfg", 949 | ] 950 | 951 | [[package]] 952 | name = "num_cpus" 953 | version = "1.15.0" 954 | source = "registry+https://github.com/rust-lang/crates.io-index" 955 | checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" 956 | dependencies = [ 957 | "hermit-abi", 958 | "libc", 959 | ] 960 | 961 | [[package]] 962 | name = "once_cell" 963 | version = "1.17.0" 964 | source = "registry+https://github.com/rust-lang/crates.io-index" 965 | checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" 966 | 967 | [[package]] 968 | name = "openssl" 969 | version = "0.10.45" 970 | source = "registry+https://github.com/rust-lang/crates.io-index" 971 | checksum = "b102428fd03bc5edf97f62620f7298614c45cedf287c271e7ed450bbaf83f2e1" 972 | dependencies = [ 973 | "bitflags 1.3.2", 974 | "cfg-if", 975 | "foreign-types", 976 | "libc", 977 | "once_cell", 978 | "openssl-macros", 979 | "openssl-sys", 980 | ] 981 | 982 | [[package]] 983 | name = "openssl-macros" 984 | version = "0.1.0" 985 | source = "registry+https://github.com/rust-lang/crates.io-index" 986 | checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" 987 | dependencies = [ 988 | "proc-macro2", 989 | "quote", 990 | "syn", 991 | ] 992 | 993 | [[package]] 994 | name = "openssl-probe" 995 | version = "0.1.5" 996 | source = "registry+https://github.com/rust-lang/crates.io-index" 997 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 998 | 999 | [[package]] 1000 | name = "openssl-sys" 1001 | version = "0.9.80" 1002 | source = "registry+https://github.com/rust-lang/crates.io-index" 1003 | checksum = "23bbbf7854cd45b83958ebe919f0e8e516793727652e27fda10a8384cfc790b7" 1004 | dependencies = [ 1005 | "autocfg", 1006 | "cc", 1007 | "libc", 1008 | "pkg-config", 1009 | "vcpkg", 1010 | ] 1011 | 1012 | [[package]] 1013 | name = "parking_lot" 1014 | version = "0.12.1" 1015 | source = "registry+https://github.com/rust-lang/crates.io-index" 1016 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 1017 | dependencies = [ 1018 | "lock_api", 1019 | "parking_lot_core", 1020 | ] 1021 | 1022 | [[package]] 1023 | name = "parking_lot_core" 1024 | version = "0.9.5" 1025 | source = "registry+https://github.com/rust-lang/crates.io-index" 1026 | checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba" 1027 | dependencies = [ 1028 | "cfg-if", 1029 | "libc", 1030 | "redox_syscall", 1031 | "smallvec", 1032 | "windows-sys 0.42.0", 1033 | ] 1034 | 1035 | [[package]] 1036 | name = "percent-encoding" 1037 | version = "2.2.0" 1038 | source = "registry+https://github.com/rust-lang/crates.io-index" 1039 | checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" 1040 | 1041 | [[package]] 1042 | name = "pest" 1043 | version = "2.5.2" 1044 | source = "registry+https://github.com/rust-lang/crates.io-index" 1045 | checksum = "0f6e86fb9e7026527a0d46bc308b841d73170ef8f443e1807f6ef88526a816d4" 1046 | dependencies = [ 1047 | "thiserror", 1048 | "ucd-trie", 1049 | ] 1050 | 1051 | [[package]] 1052 | name = "pest_consume" 1053 | version = "1.1.3" 1054 | source = "registry+https://github.com/rust-lang/crates.io-index" 1055 | checksum = "79447402d15d18e7142e14c72f2e63fa3d155be1bc5b70b3ccbb610ac55f536b" 1056 | dependencies = [ 1057 | "pest", 1058 | "pest_consume_macros", 1059 | "pest_derive", 1060 | ] 1061 | 1062 | [[package]] 1063 | name = "pest_consume_macros" 1064 | version = "1.1.0" 1065 | source = "registry+https://github.com/rust-lang/crates.io-index" 1066 | checksum = "9d8630a7a899cb344ec1c16ba0a6b24240029af34bdc0a21f84e411d7f793f29" 1067 | dependencies = [ 1068 | "proc-macro2", 1069 | "quote", 1070 | "syn", 1071 | ] 1072 | 1073 | [[package]] 1074 | name = "pest_derive" 1075 | version = "2.5.2" 1076 | source = "registry+https://github.com/rust-lang/crates.io-index" 1077 | checksum = "96504449aa860c8dcde14f9fba5c58dc6658688ca1fe363589d6327b8662c603" 1078 | dependencies = [ 1079 | "pest", 1080 | "pest_generator", 1081 | ] 1082 | 1083 | [[package]] 1084 | name = "pest_generator" 1085 | version = "2.5.2" 1086 | source = "registry+https://github.com/rust-lang/crates.io-index" 1087 | checksum = "798e0220d1111ae63d66cb66a5dcb3fc2d986d520b98e49e1852bfdb11d7c5e7" 1088 | dependencies = [ 1089 | "pest", 1090 | "pest_meta", 1091 | "proc-macro2", 1092 | "quote", 1093 | "syn", 1094 | ] 1095 | 1096 | [[package]] 1097 | name = "pest_meta" 1098 | version = "2.5.2" 1099 | source = "registry+https://github.com/rust-lang/crates.io-index" 1100 | checksum = "984298b75898e30a843e278a9f2452c31e349a073a0ce6fd950a12a74464e065" 1101 | dependencies = [ 1102 | "once_cell", 1103 | "pest", 1104 | "sha1", 1105 | ] 1106 | 1107 | [[package]] 1108 | name = "pin-project" 1109 | version = "1.0.12" 1110 | source = "registry+https://github.com/rust-lang/crates.io-index" 1111 | checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" 1112 | dependencies = [ 1113 | "pin-project-internal", 1114 | ] 1115 | 1116 | [[package]] 1117 | name = "pin-project-internal" 1118 | version = "1.0.12" 1119 | source = "registry+https://github.com/rust-lang/crates.io-index" 1120 | checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" 1121 | dependencies = [ 1122 | "proc-macro2", 1123 | "quote", 1124 | "syn", 1125 | ] 1126 | 1127 | [[package]] 1128 | name = "pin-project-lite" 1129 | version = "0.2.9" 1130 | source = "registry+https://github.com/rust-lang/crates.io-index" 1131 | checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" 1132 | 1133 | [[package]] 1134 | name = "pin-utils" 1135 | version = "0.1.0" 1136 | source = "registry+https://github.com/rust-lang/crates.io-index" 1137 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1138 | 1139 | [[package]] 1140 | name = "pkg-config" 1141 | version = "0.3.26" 1142 | source = "registry+https://github.com/rust-lang/crates.io-index" 1143 | checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" 1144 | 1145 | [[package]] 1146 | name = "ppv-lite86" 1147 | version = "0.2.17" 1148 | source = "registry+https://github.com/rust-lang/crates.io-index" 1149 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 1150 | 1151 | [[package]] 1152 | name = "pretty" 1153 | version = "0.11.3" 1154 | source = "registry+https://github.com/rust-lang/crates.io-index" 1155 | checksum = "83f3aa1e3ca87d3b124db7461265ac176b40c277f37e503eaa29c9c75c037846" 1156 | dependencies = [ 1157 | "arrayvec", 1158 | "log", 1159 | "typed-arena", 1160 | "unicode-segmentation", 1161 | ] 1162 | 1163 | [[package]] 1164 | name = "proc-macro-error" 1165 | version = "1.0.4" 1166 | source = "registry+https://github.com/rust-lang/crates.io-index" 1167 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 1168 | dependencies = [ 1169 | "proc-macro-error-attr", 1170 | "proc-macro2", 1171 | "quote", 1172 | "syn", 1173 | "version_check", 1174 | ] 1175 | 1176 | [[package]] 1177 | name = "proc-macro-error-attr" 1178 | version = "1.0.4" 1179 | source = "registry+https://github.com/rust-lang/crates.io-index" 1180 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 1181 | dependencies = [ 1182 | "proc-macro2", 1183 | "quote", 1184 | "version_check", 1185 | ] 1186 | 1187 | [[package]] 1188 | name = "proc-macro2" 1189 | version = "1.0.49" 1190 | source = "registry+https://github.com/rust-lang/crates.io-index" 1191 | checksum = "57a8eca9f9c4ffde41714334dee777596264c7825420f521abc92b5b5deb63a5" 1192 | dependencies = [ 1193 | "unicode-ident", 1194 | ] 1195 | 1196 | [[package]] 1197 | name = "pronouns" 1198 | version = "0.1.0" 1199 | dependencies = [ 1200 | "anyhow", 1201 | "axum", 1202 | "axum-extra", 1203 | "axum-macros", 1204 | "ctrlc", 1205 | "heck", 1206 | "maud", 1207 | "serde", 1208 | "serde_dhall", 1209 | "serde_json", 1210 | "tokio", 1211 | "tower", 1212 | "tower-http", 1213 | ] 1214 | 1215 | [[package]] 1216 | name = "quote" 1217 | version = "1.0.23" 1218 | source = "registry+https://github.com/rust-lang/crates.io-index" 1219 | checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" 1220 | dependencies = [ 1221 | "proc-macro2", 1222 | ] 1223 | 1224 | [[package]] 1225 | name = "rand" 1226 | version = "0.8.5" 1227 | source = "registry+https://github.com/rust-lang/crates.io-index" 1228 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1229 | dependencies = [ 1230 | "libc", 1231 | "rand_chacha", 1232 | "rand_core", 1233 | ] 1234 | 1235 | [[package]] 1236 | name = "rand_chacha" 1237 | version = "0.3.1" 1238 | source = "registry+https://github.com/rust-lang/crates.io-index" 1239 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1240 | dependencies = [ 1241 | "ppv-lite86", 1242 | "rand_core", 1243 | ] 1244 | 1245 | [[package]] 1246 | name = "rand_core" 1247 | version = "0.6.4" 1248 | source = "registry+https://github.com/rust-lang/crates.io-index" 1249 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1250 | dependencies = [ 1251 | "getrandom", 1252 | ] 1253 | 1254 | [[package]] 1255 | name = "redox_syscall" 1256 | version = "0.2.16" 1257 | source = "registry+https://github.com/rust-lang/crates.io-index" 1258 | checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" 1259 | dependencies = [ 1260 | "bitflags 1.3.2", 1261 | ] 1262 | 1263 | [[package]] 1264 | name = "remove_dir_all" 1265 | version = "0.5.3" 1266 | source = "registry+https://github.com/rust-lang/crates.io-index" 1267 | checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" 1268 | dependencies = [ 1269 | "winapi", 1270 | ] 1271 | 1272 | [[package]] 1273 | name = "reqwest" 1274 | version = "0.11.13" 1275 | source = "registry+https://github.com/rust-lang/crates.io-index" 1276 | checksum = "68cc60575865c7831548863cc02356512e3f1dc2f3f82cb837d7fc4cc8f3c97c" 1277 | dependencies = [ 1278 | "base64", 1279 | "bytes", 1280 | "encoding_rs", 1281 | "futures-core", 1282 | "futures-util", 1283 | "h2", 1284 | "http", 1285 | "http-body", 1286 | "hyper", 1287 | "hyper-tls", 1288 | "ipnet", 1289 | "js-sys", 1290 | "log", 1291 | "mime", 1292 | "native-tls", 1293 | "once_cell", 1294 | "percent-encoding", 1295 | "pin-project-lite", 1296 | "serde", 1297 | "serde_json", 1298 | "serde_urlencoded", 1299 | "tokio", 1300 | "tokio-native-tls", 1301 | "tower-service", 1302 | "url", 1303 | "wasm-bindgen", 1304 | "wasm-bindgen-futures", 1305 | "web-sys", 1306 | "winreg", 1307 | ] 1308 | 1309 | [[package]] 1310 | name = "rustversion" 1311 | version = "1.0.11" 1312 | source = "registry+https://github.com/rust-lang/crates.io-index" 1313 | checksum = "5583e89e108996506031660fe09baa5011b9dd0341b89029313006d1fb508d70" 1314 | 1315 | [[package]] 1316 | name = "ryu" 1317 | version = "1.0.12" 1318 | source = "registry+https://github.com/rust-lang/crates.io-index" 1319 | checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" 1320 | 1321 | [[package]] 1322 | name = "schannel" 1323 | version = "0.1.20" 1324 | source = "registry+https://github.com/rust-lang/crates.io-index" 1325 | checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" 1326 | dependencies = [ 1327 | "lazy_static", 1328 | "windows-sys 0.36.1", 1329 | ] 1330 | 1331 | [[package]] 1332 | name = "scopeguard" 1333 | version = "1.1.0" 1334 | source = "registry+https://github.com/rust-lang/crates.io-index" 1335 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 1336 | 1337 | [[package]] 1338 | name = "security-framework" 1339 | version = "2.7.0" 1340 | source = "registry+https://github.com/rust-lang/crates.io-index" 1341 | checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" 1342 | dependencies = [ 1343 | "bitflags 1.3.2", 1344 | "core-foundation", 1345 | "core-foundation-sys", 1346 | "libc", 1347 | "security-framework-sys", 1348 | ] 1349 | 1350 | [[package]] 1351 | name = "security-framework-sys" 1352 | version = "2.6.1" 1353 | source = "registry+https://github.com/rust-lang/crates.io-index" 1354 | checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" 1355 | dependencies = [ 1356 | "core-foundation-sys", 1357 | "libc", 1358 | ] 1359 | 1360 | [[package]] 1361 | name = "serde" 1362 | version = "1.0.152" 1363 | source = "registry+https://github.com/rust-lang/crates.io-index" 1364 | checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" 1365 | dependencies = [ 1366 | "serde_derive", 1367 | ] 1368 | 1369 | [[package]] 1370 | name = "serde_derive" 1371 | version = "1.0.152" 1372 | source = "registry+https://github.com/rust-lang/crates.io-index" 1373 | checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" 1374 | dependencies = [ 1375 | "proc-macro2", 1376 | "quote", 1377 | "syn", 1378 | ] 1379 | 1380 | [[package]] 1381 | name = "serde_dhall" 1382 | version = "0.12.0" 1383 | source = "registry+https://github.com/rust-lang/crates.io-index" 1384 | checksum = "8e1875f011ba1a37810617c9325b590a2539f44adae194578eafa681a276ec98" 1385 | dependencies = [ 1386 | "dhall", 1387 | "dhall_proc_macros", 1388 | "doc-comment", 1389 | "serde", 1390 | "url", 1391 | ] 1392 | 1393 | [[package]] 1394 | name = "serde_json" 1395 | version = "1.0.91" 1396 | source = "registry+https://github.com/rust-lang/crates.io-index" 1397 | checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883" 1398 | dependencies = [ 1399 | "itoa", 1400 | "ryu", 1401 | "serde", 1402 | ] 1403 | 1404 | [[package]] 1405 | name = "serde_path_to_error" 1406 | version = "0.1.9" 1407 | source = "registry+https://github.com/rust-lang/crates.io-index" 1408 | checksum = "26b04f22b563c91331a10074bda3dd5492e3cc39d56bd557e91c0af42b6c7341" 1409 | dependencies = [ 1410 | "serde", 1411 | ] 1412 | 1413 | [[package]] 1414 | name = "serde_urlencoded" 1415 | version = "0.7.1" 1416 | source = "registry+https://github.com/rust-lang/crates.io-index" 1417 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1418 | dependencies = [ 1419 | "form_urlencoded", 1420 | "itoa", 1421 | "ryu", 1422 | "serde", 1423 | ] 1424 | 1425 | [[package]] 1426 | name = "sha1" 1427 | version = "0.10.5" 1428 | source = "registry+https://github.com/rust-lang/crates.io-index" 1429 | checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" 1430 | dependencies = [ 1431 | "cfg-if", 1432 | "cpufeatures", 1433 | "digest", 1434 | ] 1435 | 1436 | [[package]] 1437 | name = "sha2" 1438 | version = "0.10.6" 1439 | source = "registry+https://github.com/rust-lang/crates.io-index" 1440 | checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" 1441 | dependencies = [ 1442 | "cfg-if", 1443 | "cpufeatures", 1444 | "digest", 1445 | ] 1446 | 1447 | [[package]] 1448 | name = "signal-hook-registry" 1449 | version = "1.4.0" 1450 | source = "registry+https://github.com/rust-lang/crates.io-index" 1451 | checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" 1452 | dependencies = [ 1453 | "libc", 1454 | ] 1455 | 1456 | [[package]] 1457 | name = "slab" 1458 | version = "0.4.7" 1459 | source = "registry+https://github.com/rust-lang/crates.io-index" 1460 | checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" 1461 | dependencies = [ 1462 | "autocfg", 1463 | ] 1464 | 1465 | [[package]] 1466 | name = "smallvec" 1467 | version = "1.10.0" 1468 | source = "registry+https://github.com/rust-lang/crates.io-index" 1469 | checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" 1470 | 1471 | [[package]] 1472 | name = "socket2" 1473 | version = "0.4.7" 1474 | source = "registry+https://github.com/rust-lang/crates.io-index" 1475 | checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" 1476 | dependencies = [ 1477 | "libc", 1478 | "winapi", 1479 | ] 1480 | 1481 | [[package]] 1482 | name = "stable_deref_trait" 1483 | version = "1.2.0" 1484 | source = "registry+https://github.com/rust-lang/crates.io-index" 1485 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1486 | 1487 | [[package]] 1488 | name = "syn" 1489 | version = "1.0.107" 1490 | source = "registry+https://github.com/rust-lang/crates.io-index" 1491 | checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" 1492 | dependencies = [ 1493 | "proc-macro2", 1494 | "quote", 1495 | "unicode-ident", 1496 | ] 1497 | 1498 | [[package]] 1499 | name = "sync_wrapper" 1500 | version = "0.1.1" 1501 | source = "registry+https://github.com/rust-lang/crates.io-index" 1502 | checksum = "20518fe4a4c9acf048008599e464deb21beeae3d3578418951a189c235a7a9a8" 1503 | 1504 | [[package]] 1505 | name = "tempfile" 1506 | version = "3.3.0" 1507 | source = "registry+https://github.com/rust-lang/crates.io-index" 1508 | checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" 1509 | dependencies = [ 1510 | "cfg-if", 1511 | "fastrand", 1512 | "libc", 1513 | "redox_syscall", 1514 | "remove_dir_all", 1515 | "winapi", 1516 | ] 1517 | 1518 | [[package]] 1519 | name = "thiserror" 1520 | version = "1.0.38" 1521 | source = "registry+https://github.com/rust-lang/crates.io-index" 1522 | checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" 1523 | dependencies = [ 1524 | "thiserror-impl", 1525 | ] 1526 | 1527 | [[package]] 1528 | name = "thiserror-impl" 1529 | version = "1.0.38" 1530 | source = "registry+https://github.com/rust-lang/crates.io-index" 1531 | checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" 1532 | dependencies = [ 1533 | "proc-macro2", 1534 | "quote", 1535 | "syn", 1536 | ] 1537 | 1538 | [[package]] 1539 | name = "tinyvec" 1540 | version = "1.6.0" 1541 | source = "registry+https://github.com/rust-lang/crates.io-index" 1542 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 1543 | dependencies = [ 1544 | "tinyvec_macros", 1545 | ] 1546 | 1547 | [[package]] 1548 | name = "tinyvec_macros" 1549 | version = "0.1.0" 1550 | source = "registry+https://github.com/rust-lang/crates.io-index" 1551 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 1552 | 1553 | [[package]] 1554 | name = "tokio" 1555 | version = "1.24.1" 1556 | source = "registry+https://github.com/rust-lang/crates.io-index" 1557 | checksum = "1d9f76183f91ecfb55e1d7d5602bd1d979e38a3a522fe900241cf195624d67ae" 1558 | dependencies = [ 1559 | "autocfg", 1560 | "bytes", 1561 | "libc", 1562 | "memchr", 1563 | "mio", 1564 | "num_cpus", 1565 | "parking_lot", 1566 | "pin-project-lite", 1567 | "signal-hook-registry", 1568 | "socket2", 1569 | "tokio-macros", 1570 | "windows-sys 0.42.0", 1571 | ] 1572 | 1573 | [[package]] 1574 | name = "tokio-macros" 1575 | version = "1.8.2" 1576 | source = "registry+https://github.com/rust-lang/crates.io-index" 1577 | checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" 1578 | dependencies = [ 1579 | "proc-macro2", 1580 | "quote", 1581 | "syn", 1582 | ] 1583 | 1584 | [[package]] 1585 | name = "tokio-native-tls" 1586 | version = "0.3.0" 1587 | source = "registry+https://github.com/rust-lang/crates.io-index" 1588 | checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" 1589 | dependencies = [ 1590 | "native-tls", 1591 | "tokio", 1592 | ] 1593 | 1594 | [[package]] 1595 | name = "tokio-util" 1596 | version = "0.7.4" 1597 | source = "registry+https://github.com/rust-lang/crates.io-index" 1598 | checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740" 1599 | dependencies = [ 1600 | "bytes", 1601 | "futures-core", 1602 | "futures-sink", 1603 | "pin-project-lite", 1604 | "tokio", 1605 | "tracing", 1606 | ] 1607 | 1608 | [[package]] 1609 | name = "tower" 1610 | version = "0.4.13" 1611 | source = "registry+https://github.com/rust-lang/crates.io-index" 1612 | checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" 1613 | dependencies = [ 1614 | "futures-core", 1615 | "futures-util", 1616 | "hdrhistogram", 1617 | "indexmap", 1618 | "pin-project", 1619 | "pin-project-lite", 1620 | "rand", 1621 | "slab", 1622 | "tokio", 1623 | "tokio-util", 1624 | "tower-layer", 1625 | "tower-service", 1626 | "tracing", 1627 | ] 1628 | 1629 | [[package]] 1630 | name = "tower-http" 1631 | version = "0.3.5" 1632 | source = "registry+https://github.com/rust-lang/crates.io-index" 1633 | checksum = "f873044bf02dd1e8239e9c1293ea39dad76dc594ec16185d0a1bf31d8dc8d858" 1634 | dependencies = [ 1635 | "async-compression", 1636 | "base64", 1637 | "bitflags 1.3.2", 1638 | "bytes", 1639 | "futures-core", 1640 | "futures-util", 1641 | "http", 1642 | "http-body", 1643 | "http-range-header", 1644 | "httpdate", 1645 | "iri-string", 1646 | "mime", 1647 | "mime_guess", 1648 | "percent-encoding", 1649 | "pin-project-lite", 1650 | "tokio", 1651 | "tokio-util", 1652 | "tower", 1653 | "tower-layer", 1654 | "tower-service", 1655 | "tracing", 1656 | "uuid", 1657 | ] 1658 | 1659 | [[package]] 1660 | name = "tower-layer" 1661 | version = "0.3.2" 1662 | source = "registry+https://github.com/rust-lang/crates.io-index" 1663 | checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" 1664 | 1665 | [[package]] 1666 | name = "tower-service" 1667 | version = "0.3.2" 1668 | source = "registry+https://github.com/rust-lang/crates.io-index" 1669 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 1670 | 1671 | [[package]] 1672 | name = "tracing" 1673 | version = "0.1.37" 1674 | source = "registry+https://github.com/rust-lang/crates.io-index" 1675 | checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" 1676 | dependencies = [ 1677 | "cfg-if", 1678 | "log", 1679 | "pin-project-lite", 1680 | "tracing-core", 1681 | ] 1682 | 1683 | [[package]] 1684 | name = "tracing-core" 1685 | version = "0.1.30" 1686 | source = "registry+https://github.com/rust-lang/crates.io-index" 1687 | checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" 1688 | dependencies = [ 1689 | "once_cell", 1690 | ] 1691 | 1692 | [[package]] 1693 | name = "try-lock" 1694 | version = "0.2.4" 1695 | source = "registry+https://github.com/rust-lang/crates.io-index" 1696 | checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" 1697 | 1698 | [[package]] 1699 | name = "typed-arena" 1700 | version = "2.0.1" 1701 | source = "registry+https://github.com/rust-lang/crates.io-index" 1702 | checksum = "0685c84d5d54d1c26f7d3eb96cd41550adb97baed141a761cf335d3d33bcd0ae" 1703 | 1704 | [[package]] 1705 | name = "typenum" 1706 | version = "1.16.0" 1707 | source = "registry+https://github.com/rust-lang/crates.io-index" 1708 | checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" 1709 | 1710 | [[package]] 1711 | name = "ucd-trie" 1712 | version = "0.1.5" 1713 | source = "registry+https://github.com/rust-lang/crates.io-index" 1714 | checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" 1715 | 1716 | [[package]] 1717 | name = "unicase" 1718 | version = "2.6.0" 1719 | source = "registry+https://github.com/rust-lang/crates.io-index" 1720 | checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" 1721 | dependencies = [ 1722 | "version_check", 1723 | ] 1724 | 1725 | [[package]] 1726 | name = "unicode-bidi" 1727 | version = "0.3.8" 1728 | source = "registry+https://github.com/rust-lang/crates.io-index" 1729 | checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" 1730 | 1731 | [[package]] 1732 | name = "unicode-ident" 1733 | version = "1.0.6" 1734 | source = "registry+https://github.com/rust-lang/crates.io-index" 1735 | checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" 1736 | 1737 | [[package]] 1738 | name = "unicode-normalization" 1739 | version = "0.1.22" 1740 | source = "registry+https://github.com/rust-lang/crates.io-index" 1741 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 1742 | dependencies = [ 1743 | "tinyvec", 1744 | ] 1745 | 1746 | [[package]] 1747 | name = "unicode-segmentation" 1748 | version = "1.10.0" 1749 | source = "registry+https://github.com/rust-lang/crates.io-index" 1750 | checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a" 1751 | 1752 | [[package]] 1753 | name = "unicode-width" 1754 | version = "0.1.10" 1755 | source = "registry+https://github.com/rust-lang/crates.io-index" 1756 | checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" 1757 | 1758 | [[package]] 1759 | name = "url" 1760 | version = "2.3.1" 1761 | source = "registry+https://github.com/rust-lang/crates.io-index" 1762 | checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" 1763 | dependencies = [ 1764 | "form_urlencoded", 1765 | "idna", 1766 | "percent-encoding", 1767 | ] 1768 | 1769 | [[package]] 1770 | name = "uuid" 1771 | version = "1.2.2" 1772 | source = "registry+https://github.com/rust-lang/crates.io-index" 1773 | checksum = "422ee0de9031b5b948b97a8fc04e3aa35230001a722ddd27943e0be31564ce4c" 1774 | dependencies = [ 1775 | "getrandom", 1776 | ] 1777 | 1778 | [[package]] 1779 | name = "vcpkg" 1780 | version = "0.2.15" 1781 | source = "registry+https://github.com/rust-lang/crates.io-index" 1782 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 1783 | 1784 | [[package]] 1785 | name = "version_check" 1786 | version = "0.9.4" 1787 | source = "registry+https://github.com/rust-lang/crates.io-index" 1788 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 1789 | 1790 | [[package]] 1791 | name = "want" 1792 | version = "0.3.0" 1793 | source = "registry+https://github.com/rust-lang/crates.io-index" 1794 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 1795 | dependencies = [ 1796 | "log", 1797 | "try-lock", 1798 | ] 1799 | 1800 | [[package]] 1801 | name = "wasi" 1802 | version = "0.11.0+wasi-snapshot-preview1" 1803 | source = "registry+https://github.com/rust-lang/crates.io-index" 1804 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1805 | 1806 | [[package]] 1807 | name = "wasm-bindgen" 1808 | version = "0.2.83" 1809 | source = "registry+https://github.com/rust-lang/crates.io-index" 1810 | checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" 1811 | dependencies = [ 1812 | "cfg-if", 1813 | "wasm-bindgen-macro", 1814 | ] 1815 | 1816 | [[package]] 1817 | name = "wasm-bindgen-backend" 1818 | version = "0.2.83" 1819 | source = "registry+https://github.com/rust-lang/crates.io-index" 1820 | checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" 1821 | dependencies = [ 1822 | "bumpalo", 1823 | "log", 1824 | "once_cell", 1825 | "proc-macro2", 1826 | "quote", 1827 | "syn", 1828 | "wasm-bindgen-shared", 1829 | ] 1830 | 1831 | [[package]] 1832 | name = "wasm-bindgen-futures" 1833 | version = "0.4.33" 1834 | source = "registry+https://github.com/rust-lang/crates.io-index" 1835 | checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" 1836 | dependencies = [ 1837 | "cfg-if", 1838 | "js-sys", 1839 | "wasm-bindgen", 1840 | "web-sys", 1841 | ] 1842 | 1843 | [[package]] 1844 | name = "wasm-bindgen-macro" 1845 | version = "0.2.83" 1846 | source = "registry+https://github.com/rust-lang/crates.io-index" 1847 | checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" 1848 | dependencies = [ 1849 | "quote", 1850 | "wasm-bindgen-macro-support", 1851 | ] 1852 | 1853 | [[package]] 1854 | name = "wasm-bindgen-macro-support" 1855 | version = "0.2.83" 1856 | source = "registry+https://github.com/rust-lang/crates.io-index" 1857 | checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" 1858 | dependencies = [ 1859 | "proc-macro2", 1860 | "quote", 1861 | "syn", 1862 | "wasm-bindgen-backend", 1863 | "wasm-bindgen-shared", 1864 | ] 1865 | 1866 | [[package]] 1867 | name = "wasm-bindgen-shared" 1868 | version = "0.2.83" 1869 | source = "registry+https://github.com/rust-lang/crates.io-index" 1870 | checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" 1871 | 1872 | [[package]] 1873 | name = "web-sys" 1874 | version = "0.3.60" 1875 | source = "registry+https://github.com/rust-lang/crates.io-index" 1876 | checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" 1877 | dependencies = [ 1878 | "js-sys", 1879 | "wasm-bindgen", 1880 | ] 1881 | 1882 | [[package]] 1883 | name = "winapi" 1884 | version = "0.3.9" 1885 | source = "registry+https://github.com/rust-lang/crates.io-index" 1886 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1887 | dependencies = [ 1888 | "winapi-i686-pc-windows-gnu", 1889 | "winapi-x86_64-pc-windows-gnu", 1890 | ] 1891 | 1892 | [[package]] 1893 | name = "winapi-i686-pc-windows-gnu" 1894 | version = "0.4.0" 1895 | source = "registry+https://github.com/rust-lang/crates.io-index" 1896 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1897 | 1898 | [[package]] 1899 | name = "winapi-x86_64-pc-windows-gnu" 1900 | version = "0.4.0" 1901 | source = "registry+https://github.com/rust-lang/crates.io-index" 1902 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1903 | 1904 | [[package]] 1905 | name = "windows-sys" 1906 | version = "0.36.1" 1907 | source = "registry+https://github.com/rust-lang/crates.io-index" 1908 | checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" 1909 | dependencies = [ 1910 | "windows_aarch64_msvc 0.36.1", 1911 | "windows_i686_gnu 0.36.1", 1912 | "windows_i686_msvc 0.36.1", 1913 | "windows_x86_64_gnu 0.36.1", 1914 | "windows_x86_64_msvc 0.36.1", 1915 | ] 1916 | 1917 | [[package]] 1918 | name = "windows-sys" 1919 | version = "0.42.0" 1920 | source = "registry+https://github.com/rust-lang/crates.io-index" 1921 | checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" 1922 | dependencies = [ 1923 | "windows_aarch64_gnullvm 0.42.0", 1924 | "windows_aarch64_msvc 0.42.0", 1925 | "windows_i686_gnu 0.42.0", 1926 | "windows_i686_msvc 0.42.0", 1927 | "windows_x86_64_gnu 0.42.0", 1928 | "windows_x86_64_gnullvm 0.42.0", 1929 | "windows_x86_64_msvc 0.42.0", 1930 | ] 1931 | 1932 | [[package]] 1933 | name = "windows-sys" 1934 | version = "0.48.0" 1935 | source = "registry+https://github.com/rust-lang/crates.io-index" 1936 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 1937 | dependencies = [ 1938 | "windows-targets", 1939 | ] 1940 | 1941 | [[package]] 1942 | name = "windows-targets" 1943 | version = "0.48.5" 1944 | source = "registry+https://github.com/rust-lang/crates.io-index" 1945 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 1946 | dependencies = [ 1947 | "windows_aarch64_gnullvm 0.48.5", 1948 | "windows_aarch64_msvc 0.48.5", 1949 | "windows_i686_gnu 0.48.5", 1950 | "windows_i686_msvc 0.48.5", 1951 | "windows_x86_64_gnu 0.48.5", 1952 | "windows_x86_64_gnullvm 0.48.5", 1953 | "windows_x86_64_msvc 0.48.5", 1954 | ] 1955 | 1956 | [[package]] 1957 | name = "windows_aarch64_gnullvm" 1958 | version = "0.42.0" 1959 | source = "registry+https://github.com/rust-lang/crates.io-index" 1960 | checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" 1961 | 1962 | [[package]] 1963 | name = "windows_aarch64_gnullvm" 1964 | version = "0.48.5" 1965 | source = "registry+https://github.com/rust-lang/crates.io-index" 1966 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 1967 | 1968 | [[package]] 1969 | name = "windows_aarch64_msvc" 1970 | version = "0.36.1" 1971 | source = "registry+https://github.com/rust-lang/crates.io-index" 1972 | checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" 1973 | 1974 | [[package]] 1975 | name = "windows_aarch64_msvc" 1976 | version = "0.42.0" 1977 | source = "registry+https://github.com/rust-lang/crates.io-index" 1978 | checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" 1979 | 1980 | [[package]] 1981 | name = "windows_aarch64_msvc" 1982 | version = "0.48.5" 1983 | source = "registry+https://github.com/rust-lang/crates.io-index" 1984 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 1985 | 1986 | [[package]] 1987 | name = "windows_i686_gnu" 1988 | version = "0.36.1" 1989 | source = "registry+https://github.com/rust-lang/crates.io-index" 1990 | checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" 1991 | 1992 | [[package]] 1993 | name = "windows_i686_gnu" 1994 | version = "0.42.0" 1995 | source = "registry+https://github.com/rust-lang/crates.io-index" 1996 | checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" 1997 | 1998 | [[package]] 1999 | name = "windows_i686_gnu" 2000 | version = "0.48.5" 2001 | source = "registry+https://github.com/rust-lang/crates.io-index" 2002 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2003 | 2004 | [[package]] 2005 | name = "windows_i686_msvc" 2006 | version = "0.36.1" 2007 | source = "registry+https://github.com/rust-lang/crates.io-index" 2008 | checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" 2009 | 2010 | [[package]] 2011 | name = "windows_i686_msvc" 2012 | version = "0.42.0" 2013 | source = "registry+https://github.com/rust-lang/crates.io-index" 2014 | checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" 2015 | 2016 | [[package]] 2017 | name = "windows_i686_msvc" 2018 | version = "0.48.5" 2019 | source = "registry+https://github.com/rust-lang/crates.io-index" 2020 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2021 | 2022 | [[package]] 2023 | name = "windows_x86_64_gnu" 2024 | version = "0.36.1" 2025 | source = "registry+https://github.com/rust-lang/crates.io-index" 2026 | checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" 2027 | 2028 | [[package]] 2029 | name = "windows_x86_64_gnu" 2030 | version = "0.42.0" 2031 | source = "registry+https://github.com/rust-lang/crates.io-index" 2032 | checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" 2033 | 2034 | [[package]] 2035 | name = "windows_x86_64_gnu" 2036 | version = "0.48.5" 2037 | source = "registry+https://github.com/rust-lang/crates.io-index" 2038 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2039 | 2040 | [[package]] 2041 | name = "windows_x86_64_gnullvm" 2042 | version = "0.42.0" 2043 | source = "registry+https://github.com/rust-lang/crates.io-index" 2044 | checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" 2045 | 2046 | [[package]] 2047 | name = "windows_x86_64_gnullvm" 2048 | version = "0.48.5" 2049 | source = "registry+https://github.com/rust-lang/crates.io-index" 2050 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2051 | 2052 | [[package]] 2053 | name = "windows_x86_64_msvc" 2054 | version = "0.36.1" 2055 | source = "registry+https://github.com/rust-lang/crates.io-index" 2056 | checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" 2057 | 2058 | [[package]] 2059 | name = "windows_x86_64_msvc" 2060 | version = "0.42.0" 2061 | source = "registry+https://github.com/rust-lang/crates.io-index" 2062 | checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" 2063 | 2064 | [[package]] 2065 | name = "windows_x86_64_msvc" 2066 | version = "0.48.5" 2067 | source = "registry+https://github.com/rust-lang/crates.io-index" 2068 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2069 | 2070 | [[package]] 2071 | name = "winreg" 2072 | version = "0.10.1" 2073 | source = "registry+https://github.com/rust-lang/crates.io-index" 2074 | checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" 2075 | dependencies = [ 2076 | "winapi", 2077 | ] 2078 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "pronouns" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | anyhow = "1" 10 | axum = { version = "0.6", features = ["headers"] } 11 | axum-macros = "0.3" 12 | axum-extra = { version = "0.4", features = ["spa"] } 13 | ctrlc = "3.4.1" 14 | serde = { version = "1", features = ["derive"] } 15 | serde_json = "1" 16 | serde_dhall = "0.12.0" 17 | heck = "0.4.1" 18 | tokio = { version = "1", features = ["full"] } 19 | 20 | [dependencies.maud] 21 | git = "https://github.com/Xe/maud" 22 | rev = "a40596c42c7603cc4610bbeddea04c4bd8b312d9" 23 | features = [ "axum" ] 24 | 25 | [dependencies.tower] 26 | version = "0.4" 27 | features = [ "full" ] 28 | 29 | [dependencies.tower-http] 30 | version = "0.3" 31 | features = [ "full" ] 32 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM rust:1 AS build 2 | WORKDIR /app 3 | COPY . . 4 | ENV XESS_PATH=/app/static/css 5 | RUN cargo install --path . 6 | 7 | FROM debian:bookworm 8 | WORKDIR /app 9 | ENV XESS_PATH=/app/static/css 10 | COPY --from=build /app/target/release/pronouns /app/bin/pronouns 11 | COPY --from=build /app/static/css /app/static/css 12 | COPY --from=build /app/dhall /app/dhall 13 | RUN apt-get update \ 14 | && apt-get -y install libssl3 15 | CMD ["/app/bin/pronouns"] -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2023 Xe 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | The Software shall be used for Good, not Evil. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 20 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 22 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # pronouns 2 | 3 | A little service to help people with remembering how to use pronouns. This is a 4 | spiritual successor to https://pronoun.is, which seems to have not survived the 5 | Heroku free app purge. 6 | 7 | ## Build 8 | 9 | ```console 10 | $ nix build 11 | ``` 12 | -------------------------------------------------------------------------------- /deploy.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -ex 4 | 5 | nix build .#docker 6 | docker load < ./result 7 | docker push registry.fly.io/xe-pronouns:latest 8 | flyctl deploy 9 | -------------------------------------------------------------------------------- /dhall/package.dhall: -------------------------------------------------------------------------------- 1 | [ 2 | , ./pronouns/she-her-her-hers-herself.dhall 3 | , ./pronouns/he-him-his-his-himself.dhall 4 | , ./pronouns/they-them-their-theirs-themselves.dhall 5 | , ./pronouns/ze-hir-hir-hirs-hirself.dhall 6 | , ./pronouns/ze-zir-zir-zirs-zirself.dhall 7 | , ./pronouns/xey-xem-xyr-xyrs-xemself.dhall 8 | , ./pronouns/ae-aer-aer-aers-aerself.dhall 9 | , ./pronouns/bun-bun-buns-buns-bunself.dhall 10 | , ./pronouns/e-em-eir-eirs-emself.dhall 11 | , ./pronouns/ey-em-eir-eirs-eirself.dhall 12 | , ./pronouns/fae-faer-faer-faers-faerself.dhall 13 | , ./pronouns/fey-fem-feir-feirs-feirself.dhall 14 | , ./pronouns/hu-hum-hus-hus-humself.dhall 15 | , ./pronouns/it-it-its-its-itself.dhall 16 | , ./pronouns/jee-jem-jeir-jeirs-jemself.dhall 17 | , ./pronouns/kit-kit-kits-kits-kitself.dhall 18 | , ./pronouns/ne-nem-nir-nirs-nemself.dhall 19 | , ./pronouns/peh-pehm-peh_s-peh_s-pehself.dhall 20 | , ./pronouns/per-per-per-pers-perself.dhall 21 | , ./pronouns/sie-hir-hir-hirs-hirself.dhall 22 | , ./pronouns/se-sim-ser-sers-serself.dhall 23 | , ./pronouns/shi-hir-hir-hirs-hirself.dhall 24 | , ./pronouns/si-hyr-hyr-hyrs-hyrself.dhall 25 | , ./pronouns/star-star-stars-stars-starself.dhall 26 | , ./pronouns/they-them-their-theirs-themself.dhall 27 | , ./pronouns/thon-thon-thons-thons-thonself.dhall 28 | , ./pronouns/ve-ver-vis-vis-verself.dhall 29 | , ./pronouns/ve-vem-vir-virs-vemself.dhall 30 | , ./pronouns/vi-ver-ver-vers-verself.dhall 31 | , ./pronouns/vi-vim-vir-virs-vimself.dhall 32 | , ./pronouns/vi-vim-vim-vims-vimself.dhall 33 | , ./pronouns/xae-xaer-xaer-xaers-xaerself.dhall 34 | , ./pronouns/xae-xem-xaer-xaers-xaerself.dhall 35 | , ./pronouns/xae-xaem-xaer-xaers-xaerself.dhall 36 | , ./pronouns/xie-xer-xer-xers-xerself.dhall 37 | , ./pronouns/xe-xem-xyr-xyrs-xemself.dhall 38 | , ./pronouns/xe-xer-xer-xers-xerself.dhall 39 | , ./pronouns/xey-xem-xeir-xeirs-xemself.dhall 40 | , ./pronouns/yo-yo-yos-yos-yosself.dhall 41 | , ./pronouns/ze-zem-zes-zes-zirself.dhall 42 | , ./pronouns/ze-mer-zer-zers-zemself.dhall 43 | , ./pronouns/zee-zed-zeta-zetas-zedself.dhall 44 | , ./pronouns/zie-zir-zir-zirs-zirself.dhall 45 | , ./pronouns/zie-zem-zes-zes-zirself.dhall 46 | , ./pronouns/zie-hir-hir-hirs-hirself.dhall 47 | , ./pronouns/zme-zmyr-zmyr-zmyrs-zmyrself.dhall 48 | ] -------------------------------------------------------------------------------- /dhall/pronouns.tab: -------------------------------------------------------------------------------- 1 | she her her hers herself True 2 | he him his his himself True 3 | they them their theirs themselves False 4 | ze hir hir hirs hirself True 5 | ze zir zir zirs zirself True 6 | xey xem xyr xyrs xemself True 7 | ae aer aer aers aerself True 8 | bun bun buns buns bunself True 9 | e em eir eirs emself True 10 | ey em eir eirs eirself True 11 | fae faer faer faers faerself True 12 | fey fem feir feirs feirself True 13 | hu hum hus hus humself True 14 | it it its its itself True 15 | jee jem jeir jeirs jemself True 16 | kit kit kits kits kitself True 17 | ne nem nir nirs nemself True 18 | peh pehm peh's peh's pehself True 19 | per per per pers perself True 20 | sie hir hir hirs hirself True 21 | se sim ser sers serself True 22 | shi hir hir hirs hirself True 23 | si hyr hyr hyrs hyrself True 24 | star star stars stars starself True 25 | they them their theirs themself True 26 | thon thon thons thons thonself True 27 | ve ver vis vis verself True 28 | ve vem vir virs vemself True 29 | vi ver ver vers verself True 30 | vi vim vir virs vimself True 31 | vi vim vim vims vimself True 32 | xae xaer xaer xaers xaerself True 33 | xae xem xaer xaers xaerself True 34 | xae xaem xaer xaers xaerself True 35 | xie xer xer xers xerself True 36 | xe xem xyr xyrs xemself True 37 | xe xer xer xers xerself True 38 | xey xem xeir xeirs xemself True 39 | yo yo yos yos yosself True 40 | ze zem zes zes zirself True 41 | ze mer zer zers zemself True 42 | zee zed zeta zetas zedself True 43 | zie zir zir zirs zirself True 44 | zie zem zes zes zirself True 45 | zie hir hir hirs hirself True 46 | zme zmyr zmyr zmyrs zmyrself True 47 | -------------------------------------------------------------------------------- /dhall/pronouns/ae-aer-aer-aers-aerself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "ae" 5 | , accusative = "aer" 6 | , determiner = "aer" 7 | , possessive = "aers" 8 | , reflexive = "aerself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/bun-bun-buns-buns-bunself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "bun" 5 | , accusative = "bun" 6 | , determiner = "buns" 7 | , possessive = "buns" 8 | , reflexive = "bunself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/e-em-eir-eirs-emself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "e" 5 | , accusative = "em" 6 | , determiner = "eir" 7 | , possessive = "eirs" 8 | , reflexive = "emself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/ey-em-eir-eirs-eirself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "ey" 5 | , accusative = "em" 6 | , determiner = "eir" 7 | , possessive = "eirs" 8 | , reflexive = "eirself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/fae-faer-faer-faers-faerself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "fae" 5 | , accusative = "faer" 6 | , determiner = "faer" 7 | , possessive = "faers" 8 | , reflexive = "faerself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/fey-fem-feir-feirs-feirself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "fey" 5 | , accusative = "fem" 6 | , determiner = "feir" 7 | , possessive = "feirs" 8 | , reflexive = "feirself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/he-him-his-his-himself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "he" 5 | , accusative = "him" 6 | , determiner = "his" 7 | , possessive = "his" 8 | , reflexive = "himself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/hu-hum-hus-hus-humself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "hu" 5 | , accusative = "hum" 6 | , determiner = "hus" 7 | , possessive = "hus" 8 | , reflexive = "humself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/it-it-its-its-itself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "it" 5 | , accusative = "it" 6 | , determiner = "its" 7 | , possessive = "its" 8 | , reflexive = "itself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/jee-jem-jeir-jeirs-jemself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "jee" 5 | , accusative = "jem" 6 | , determiner = "jeir" 7 | , possessive = "jeirs" 8 | , reflexive = "jemself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/kit-kit-kits-kits-kitself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "kit" 5 | , accusative = "kit" 6 | , determiner = "kits" 7 | , possessive = "kits" 8 | , reflexive = "kitself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/ne-nem-nir-nirs-nemself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "ne" 5 | , accusative = "nem" 6 | , determiner = "nir" 7 | , possessive = "nirs" 8 | , reflexive = "nemself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/peh-pehm-peh_s-peh_s-pehself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "peh" 5 | , accusative = "pehm" 6 | , determiner = "peh's" 7 | , possessive = "peh's" 8 | , reflexive = "pehself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/per-per-per-pers-perself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "per" 5 | , accusative = "per" 6 | , determiner = "per" 7 | , possessive = "pers" 8 | , reflexive = "perself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/se-sim-ser-sers-serself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "se" 5 | , accusative = "sim" 6 | , determiner = "ser" 7 | , possessive = "sers" 8 | , reflexive = "serself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/she-her-her-hers-herself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "she" 5 | , accusative = "her" 6 | , determiner = "her" 7 | , possessive = "hers" 8 | , reflexive = "herself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/shi-hir-hir-hirs-hirself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "shi" 5 | , accusative = "hir" 6 | , determiner = "hir" 7 | , possessive = "hirs" 8 | , reflexive = "hirself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/si-hyr-hyr-hyrs-hyrself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "si" 5 | , accusative = "hyr" 6 | , determiner = "hyr" 7 | , possessive = "hyrs" 8 | , reflexive = "hyrself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/sie-hir-hir-hirs-hirself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "sie" 5 | , accusative = "hir" 6 | , determiner = "hir" 7 | , possessive = "hirs" 8 | , reflexive = "hirself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/star-star-stars-stars-starself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "star" 5 | , accusative = "star" 6 | , determiner = "stars" 7 | , possessive = "stars" 8 | , reflexive = "starself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/they-them-their-theirs-themself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "they" 5 | , accusative = "them" 6 | , determiner = "their" 7 | , possessive = "theirs" 8 | , reflexive = "themself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/they-them-their-theirs-themselves.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "they" 5 | , accusative = "them" 6 | , determiner = "their" 7 | , possessive = "theirs" 8 | , reflexive = "themselves" 9 | , singular = False 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/thon-thon-thons-thons-thonself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "thon" 5 | , accusative = "thon" 6 | , determiner = "thons" 7 | , possessive = "thons" 8 | , reflexive = "thonself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/ve-vem-vir-virs-vemself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "ve" 5 | , accusative = "vem" 6 | , determiner = "vir" 7 | , possessive = "virs" 8 | , reflexive = "vemself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/ve-ver-vis-vis-verself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "ve" 5 | , accusative = "ver" 6 | , determiner = "vis" 7 | , possessive = "vis" 8 | , reflexive = "verself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/vi-ver-ver-vers-verself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "vi" 5 | , accusative = "ver" 6 | , determiner = "ver" 7 | , possessive = "vers" 8 | , reflexive = "verself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/vi-vim-vim-vims-vimself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "vi" 5 | , accusative = "vim" 6 | , determiner = "vim" 7 | , possessive = "vims" 8 | , reflexive = "vimself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/vi-vim-vir-virs-vimself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "vi" 5 | , accusative = "vim" 6 | , determiner = "vir" 7 | , possessive = "virs" 8 | , reflexive = "vimself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/xae-xaem-xaer-xaers-xaerself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "xae" 5 | , accusative = "xaem" 6 | , determiner = "xaer" 7 | , possessive = "xaers" 8 | , reflexive = "xaerself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/xae-xaer-xaer-xaers-xaerself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "xae" 5 | , accusative = "xaer" 6 | , determiner = "xaer" 7 | , possessive = "xaers" 8 | , reflexive = "xaerself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/xae-xem-xaer-xaers-xaerself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "xae" 5 | , accusative = "xem" 6 | , determiner = "xaer" 7 | , possessive = "xaers" 8 | , reflexive = "xaerself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/xe-xem-xyr-xyrs-xemself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "xe" 5 | , accusative = "xem" 6 | , determiner = "xyr" 7 | , possessive = "xyrs" 8 | , reflexive = "xemself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/xe-xer-xer-xers-xerself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "xe" 5 | , accusative = "xer" 6 | , determiner = "xer" 7 | , possessive = "xers" 8 | , reflexive = "xerself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/xey-xem-xeir-xeirs-xemself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "xey" 5 | , accusative = "xem" 6 | , determiner = "xeir" 7 | , possessive = "xeirs" 8 | , reflexive = "xemself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/xey-xem-xyr-xyrs-xemself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "xey" 5 | , accusative = "xem" 6 | , determiner = "xyr" 7 | , possessive = "xyrs" 8 | , reflexive = "xemself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/xie-xer-xer-xers-xerself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "xie" 5 | , accusative = "xer" 6 | , determiner = "xer" 7 | , possessive = "xers" 8 | , reflexive = "xerself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/yo-yo-yos-yos-yosself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "yo" 5 | , accusative = "yo" 6 | , determiner = "yos" 7 | , possessive = "yos" 8 | , reflexive = "yosself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/ze-hir-hir-hirs-hirself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "ze" 5 | , accusative = "hir" 6 | , determiner = "hir" 7 | , possessive = "hirs" 8 | , reflexive = "hirself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/ze-mer-zer-zers-zemself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "ze" 5 | , accusative = "mer" 6 | , determiner = "zer" 7 | , possessive = "zers" 8 | , reflexive = "zemself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/ze-zem-zes-zes-zirself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "ze" 5 | , accusative = "zem" 6 | , determiner = "zes" 7 | , possessive = "zes" 8 | , reflexive = "zirself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/ze-zir-zir-zirs-zirself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "ze" 5 | , accusative = "zir" 6 | , determiner = "zir" 7 | , possessive = "zirs" 8 | , reflexive = "zirself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/zee-zed-zeta-zetas-zedself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "zee" 5 | , accusative = "zed" 6 | , determiner = "zeta" 7 | , possessive = "zetas" 8 | , reflexive = "zedself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/zie-hir-hir-hirs-hirself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "zie" 5 | , accusative = "hir" 6 | , determiner = "hir" 7 | , possessive = "hirs" 8 | , reflexive = "hirself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/zie-zem-zes-zes-zirself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "zie" 5 | , accusative = "zem" 6 | , determiner = "zes" 7 | , possessive = "zes" 8 | , reflexive = "zirself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/zie-zir-zir-zirs-zirself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "zie" 5 | , accusative = "zir" 6 | , determiner = "zir" 7 | , possessive = "zirs" 8 | , reflexive = "zirself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns/zme-zmyr-zmyr-zmyrs-zmyrself.dhall: -------------------------------------------------------------------------------- 1 | let PronounSet = ../types/PronounSet.dhall 2 | 3 | in PronounSet::{ 4 | , nominative = "zme" 5 | , accusative = "zmyr" 6 | , determiner = "zmyr" 7 | , possessive = "zmyrs" 8 | , reflexive = "zmyrself" 9 | , singular = True 10 | } -------------------------------------------------------------------------------- /dhall/pronouns2dhall.py: -------------------------------------------------------------------------------- 1 | import csv 2 | 3 | files = [] 4 | 5 | with open("./pronouns.tab") as fin: 6 | rdr = csv.reader(fin, delimiter="\t") 7 | for row in rdr: 8 | nom, acc, gen, pos, ref, singular = row 9 | 10 | fname = f"pronouns/{nom}-{acc}-{gen}-{pos}-{ref}.dhall" 11 | fname = fname.replace("'", "_") 12 | 13 | with open(fname, "w") as fout: 14 | fout.write(f"""let PronounSet = ../types/PronounSet.dhall 15 | 16 | in PronounSet::{{ 17 | , nominative = "{nom}" 18 | , accusative = "{acc}" 19 | , determiner = "{gen}" 20 | , possessive = "{pos}" 21 | , reflexive = "{ref}" 22 | , singular = {singular} 23 | }}""") 24 | 25 | files.append(fname) 26 | 27 | print(files) 28 | 29 | with open("./package.dhall", "w") as fout: 30 | fout.write("[\n") 31 | 32 | for fname in files: 33 | fout.write(f", ./{fname}\n") 34 | 35 | fout.write("]") 36 | -------------------------------------------------------------------------------- /dhall/types/PronounSet.dhall: -------------------------------------------------------------------------------- 1 | { Type = 2 | { nominative : Text 3 | , accusative : Text 4 | , determiner : Text 5 | , possessive : Text 6 | , reflexive : Text 7 | , singular : Bool 8 | } 9 | , default = 10 | { nominative = "xe" 11 | , accusative = "xer" 12 | , determiner = "xer" 13 | , possessive = "xers" 14 | , reflexive = "xerself" 15 | , singular = True 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /manifest/deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: pronouns 5 | spec: 6 | selector: 7 | matchLabels: 8 | app: pronouns 9 | replicas: 2 10 | template: 11 | metadata: 12 | labels: 13 | app: pronouns 14 | spec: 15 | containers: 16 | - name: web 17 | image: reg.xeiaso.net/xe/pronouns 18 | imagePullPolicy: Always 19 | ports: 20 | - containerPort: 3000 21 | livenessProbe: 22 | httpGet: 23 | path: /.within/health 24 | port: 3000 25 | initialDelaySeconds: 3 26 | periodSeconds: 3 27 | resources: 28 | limits: 29 | cpu: "250m" 30 | memory: "256Mi" 31 | requests: 32 | cpu: "100m" 33 | memory: "128Mi" 34 | -------------------------------------------------------------------------------- /manifest/ingress.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: networking.k8s.io/v1 2 | kind: Ingress 3 | metadata: 4 | name: pronouns 5 | annotations: 6 | cert-manager.io/cluster-issuer: "letsencrypt-prod" 7 | spec: 8 | ingressClassName: nginx 9 | tls: 10 | - hosts: 11 | - pronouns.within.lgbt 12 | secretName: pronouns-within-lgbt-tls 13 | rules: 14 | - host: pronouns.within.lgbt 15 | http: 16 | paths: 17 | - path: / 18 | pathType: Prefix 19 | backend: 20 | service: 21 | name: pronouns 22 | port: 23 | number: 80 -------------------------------------------------------------------------------- /manifest/kustomization.yaml: -------------------------------------------------------------------------------- 1 | resources: 2 | - deployment.yaml 3 | - ingress.yaml 4 | - service.yaml -------------------------------------------------------------------------------- /manifest/service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: pronouns 5 | spec: 6 | ports: 7 | - name: http 8 | port: 80 9 | targetPort: 3000 10 | protocol: TCP 11 | selector: 12 | app: pronouns -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | use heck::ToTitleCase; 2 | use maud::{html, Markup, Render}; 3 | use serde::{Deserialize, Serialize}; 4 | 5 | mod trie; 6 | 7 | pub use trie::PronounTrie; 8 | 9 | #[derive(Clone, Deserialize, Serialize, Default, Debug)] 10 | pub struct PronounSet { 11 | pub nominative: String, 12 | pub accusative: String, 13 | pub determiner: String, 14 | pub possessive: String, 15 | pub reflexive: String, 16 | #[serde(default)] 17 | pub singular: bool, 18 | } 19 | 20 | impl Render for PronounSet { 21 | fn render(&self) -> Markup { 22 | html! { 23 | table { 24 | tr { 25 | th { "Subject" } 26 | td {(self.nominative)} 27 | } 28 | tr { 29 | th { "Object" } 30 | td {(self.accusative)} 31 | } 32 | tr { 33 | th { "Dependent Possessive" } 34 | td {(self.determiner)} 35 | } 36 | tr { 37 | th { "Independent Possessive" } 38 | td {(self.possessive)} 39 | } 40 | tr { 41 | th { "Reflexive" } 42 | td {(self.reflexive)} 43 | } 44 | } 45 | p {"Here are some example sentences with these pronouns:"} 46 | ul { 47 | li { em{(self.nominative.to_title_case())} " went to the park." } 48 | li { "I went with " i{(self.accusative)} "." } 49 | li { em{(self.nominative.to_title_case())} " brought " em{(self.determiner)} " frisbee." } 50 | li { "At least I think it was " em{(self.possessive)} "." } 51 | li { 52 | em{(self.nominative.to_title_case())} 53 | " threw the frisbee " 54 | @if self.singular { 55 | "to" 56 | } @else { 57 | "between" 58 | } 59 | " " 60 | em{(self.reflexive)} 61 | "." 62 | } 63 | } 64 | p { 65 | "This pronoun should be inflected as a " 66 | @if self.singular { 67 | "singular" 68 | } @else { 69 | "plural" 70 | } 71 | " pronoun." 72 | } 73 | } 74 | } 75 | } 76 | 77 | impl PronounSet { 78 | pub fn url(&self) -> String { 79 | format!( 80 | "/{}/{}/{}/{}/{}", 81 | self.nominative, self.accusative, self.determiner, self.possessive, self.reflexive 82 | ) 83 | } 84 | 85 | pub fn title(&self) -> String { 86 | format!("{}/{}", self.nominative, self.accusative) 87 | } 88 | 89 | pub fn plural(&self) -> bool { 90 | self.determiner.ends_with('s') 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use axum::{ 2 | extract::{Path, State}, 3 | http::StatusCode, 4 | routing::get, 5 | Json, Router, 6 | }; 7 | use axum_extra::routing::SpaRouter; 8 | use maud::{html, Markup, DOCTYPE}; 9 | use serde::Serialize; 10 | use std::{net::SocketAddr, sync::Mutex, sync::Arc}; 11 | 12 | use pronouns::{PronounSet, PronounTrie}; 13 | 14 | #[tokio::main] 15 | async fn main() -> anyhow::Result<()> { 16 | let pronouns: Vec = serde_dhall::from_file("./dhall/package.dhall").parse()?; 17 | 18 | let pron_trie = PronounTrie::build(pronouns); 19 | 20 | let files = SpaRouter::new("/static/css", env!("XESS_PATH")); 21 | 22 | let app = Router::new() 23 | .route("/.within/health", get(health)) 24 | .route("/api/all", get(all_pronouns_json)) 25 | .route("/api/docs", get(api_docs)) 26 | .route("/api/lookup/*pronoun", get(guess_pronouns_json)) 27 | .route( 28 | "/api/exact/:nominative/:accusative/:determiner/:possessive/:reflexive", 29 | get(exact_pronouns_json), 30 | ) 31 | .route("/pronoun-list", get(all_pronouns)) 32 | .route("/", get(handler)) 33 | .route("/they", get(they)) 34 | .route("/*pronoun", get(guess_pronouns)) 35 | .merge(files) 36 | .with_state(Arc::new(pron_trie)); 37 | 38 | // run it 39 | let addr = SocketAddr::from(([0, 0, 0, 0], 3000)); 40 | println!("listening on {}", addr); 41 | let server = axum::Server::bind(&addr).serve(app.into_make_service()); 42 | 43 | // Prepare some signal for when the server should start shutting down... 44 | let (tx, rx) = tokio::sync::oneshot::channel::<()>(); 45 | let graceful = server.with_graceful_shutdown(async { 46 | rx.await.ok(); 47 | }); 48 | 49 | let tx = Mutex::new(Some(tx)); 50 | 51 | // Await the `server` receiving the signal... 52 | if let Err(e) = graceful.await { 53 | eprintln!("server error: {}", e); 54 | } 55 | 56 | Ok(()) 57 | } 58 | 59 | async fn health() -> String { 60 | "OK".into() 61 | } 62 | 63 | async fn all_pronouns_json( 64 | State(prons): State> 65 | ) -> Json> { 66 | Json(prons.gather()) 67 | } 68 | 69 | async fn exact_pronouns_json(Path(ps): Path) -> Json { 70 | let mut ps = ps.clone(); 71 | ps.singular = true; 72 | Json(ps) 73 | } 74 | 75 | #[derive(Serialize, Debug)] 76 | pub struct Error { 77 | pub message: String, 78 | } 79 | 80 | async fn guess_pronouns_json( 81 | Path(pronoun): Path, 82 | State(prons): State>, 83 | ) -> Result<(StatusCode, Json>), (StatusCode, Json)> { 84 | let mut key = url_to_trie_query(pronoun.clone()); 85 | let guessed = prons.guess(&mut key); 86 | 87 | if !guessed.is_empty() { 88 | Ok((StatusCode::OK, Json(guessed))) 89 | } else { 90 | Err(( 91 | StatusCode::NOT_FOUND, 92 | Json(Error { 93 | message: format!("can't find {pronoun} in my database"), 94 | }), 95 | )) 96 | } 97 | } 98 | 99 | async fn they(prons: State>) -> (StatusCode, Markup) { 100 | guess_pronouns(Path("they/.../themselves".to_string()), prons).await 101 | } 102 | 103 | async fn guess_pronouns( 104 | Path(pronoun): Path, 105 | State(prons): State>, 106 | ) -> (StatusCode, Markup) { 107 | let mut key = url_to_trie_query(pronoun.clone()); 108 | let guessed = prons.guess(&mut key); 109 | 110 | if guessed.len() > 1 { 111 | return ( 112 | StatusCode::BAD_REQUEST, 113 | base( 114 | Some("Ambiguous pronouns detected"), 115 | html! { 116 | p { 117 | "The pronoun you are looking up (" 118 | (pronoun) 119 | ") has multiple hits in the database. Please try one of the following options:" 120 | } 121 | 122 | ul { 123 | @for hit in guessed { 124 | li { a href=(hit.url()) {(hit.title())} } 125 | } 126 | } 127 | }, 128 | ), 129 | ); 130 | } 131 | 132 | // If we have at least one allowed guess, let's just show the first. This means that 133 | // ambiguities are resolved in alphabetical order. (Note that the API will return all matches, 134 | // we want a fuzzier/friendlier interface on the web.) 135 | if let Some(v) = guessed.last() { 136 | let title = format!("{}/{}", v.nominative, v.accusative); 137 | return ( 138 | StatusCode::OK, 139 | base( 140 | Some(&title), 141 | html! { 142 | (v) 143 | }, 144 | ), 145 | ); 146 | } 147 | 148 | let sp = pronoun.split('/').collect::>(); 149 | if sp.len() == 5 { 150 | let ps = PronounSet { 151 | nominative: sp[0].to_string(), 152 | accusative: sp[1].to_string(), 153 | determiner: sp[2].to_string(), 154 | possessive: sp[3].to_string(), 155 | reflexive: sp[4].to_string(), 156 | singular: !sp[4].ends_with('s'), 157 | }; 158 | 159 | let title = format!("{}/{}", ps.nominative, ps.accusative); 160 | return ( 161 | StatusCode::OK, 162 | base( 163 | Some(&title), 164 | html! { 165 | (ps) 166 | }, 167 | ), 168 | ); 169 | } 170 | 171 | ( 172 | StatusCode::NOT_FOUND, 173 | base( 174 | Some("Can't find that pronoun"), 175 | html! { 176 | p { 177 | "oopsie whoopsie uwu u did a fucky-wucky a widdle fucko boingo! This service doesn't have pronouns for " 178 | (pronoun) 179 | " on file. If this is a bug, please contact " 180 | a href="https://pony.social/@cadey" { "@cadey@pony.social" } 181 | " for help." 182 | } 183 | }, 184 | ), 185 | ) 186 | } 187 | 188 | async fn all_pronouns(State(prons): State>) -> Markup { 189 | let pronouns = prons.gather(); 190 | let dsp = pronouns.iter().map(|v| (v.title(), v.url())); 191 | 192 | base( 193 | Some("All pronouns"), 194 | html! { 195 | ul { 196 | @for (title, link) in dsp { 197 | li { 198 | a href=(link) {(title)} 199 | } 200 | } 201 | } 202 | 203 | p { 204 | "If your pronouns are not listed here, you can construct a custom URL like this:" 205 | br;br; 206 | code { 207 | pre { 208 | "https://pronouns.within.lgbt/subject/object/determiner/possessive/reflexive" 209 | } 210 | } 211 | "If you want that set added to the website, please contact " 212 | a href="https://pony.social/@cadey" { "@cadey@pony.social" } 213 | " to get them added." 214 | } 215 | }, 216 | ) 217 | } 218 | 219 | async fn api_docs() -> Markup { 220 | base( 221 | Some("API Documentation"), 222 | html! { 223 | p { 224 | "This service offers API calls for looking up pronoun information. All URLs are offered as " 225 | a href="https://www.rfc-editor.org/rfc/rfc6570" { "RFC 6570" } 226 | " URL templates. All results will return JSON-formatted values. Here are the calls offered by this service:" 227 | } 228 | 229 | h3 { "PronounSet type" } 230 | p { 231 | "The core datatype of the API is the PronounSet. It contains information on all the grammatical cases for each pronoun set. It always has five fields that are as follows:" 232 | dl { 233 | dt { "nominative" } 234 | dd { "The nominative case or subject form of a pronoun. This is the case that is used when the person or object being referred to is the subject of the sentence." } 235 | dt { "accusative" } 236 | dd { "The accusative case or object form of a pronoun. This is the case that is used when the person or object being referred to is the object of the sentence." } 237 | dt { "dependent" } 238 | dd { "The dependent possessive case. This is the case that is used when the person or object being referred to is the owner of an object or possesses it somehow. This is used as an adjective." } 239 | dt { "possessive" } 240 | dd { "The possessive case. This is the case that is used when the pronoun replaces a noun or a noun phrase." } 241 | dt { "reflexive" } 242 | dd { "The reflexive case. This is the case used when one is referring to themselves." } 243 | dt { "singular" } 244 | dd { "This is true if the pronoun should be used in a singular way. This is false if it should be used in a plural way." } 245 | } 246 | "PronounSet responses are only returned when the HTTP status is 200." 247 | } 248 | h4 { "Example" } 249 | pre { 250 | code { 251 | "{\n \"nominative\": \"she\",\n \"accusative\": \"her\",\n \"determiner\": \"her\",\n \"possessive\": \"hers\",\n \"reflexive\": \"herself\",\n \"singular\": true\n}" 252 | } 253 | } 254 | 255 | h3 { "Error type" } 256 | p { 257 | "Sometimes the service may return an error if it can't find what you're asking it. This error type will only contain a field named " 258 | code { "message" } 259 | " that contains a human-readable message to explain the failure. This will accompany a non-200 response." 260 | } 261 | h4 { "Example" } 262 | pre { 263 | code { 264 | "{\n \"message\": \"can't find she/his in my database\"\n}" 265 | } 266 | } 267 | 268 | h3 { code { "/api/all" } } 269 | p { 270 | "This returns all information on all pronouns in the database in a list of PronounSet values." 271 | } 272 | h4 { "Example" } 273 | pre { 274 | code { 275 | "curl https://pronouns.within.lgbt/api/all" 276 | } 277 | } 278 | 279 | h3 { code { "/api/lookup/{pronouns*}" } } 280 | p { 281 | "This attempts to figure out which pronoun you want and returns information about each PronounSet matching that description. It returns a list of PronounSet's." 282 | br;br; 283 | "For example: " 284 | a href="/api/lookup/she/her" { "/api/lookup/she/her" } 285 | " will return the same information as " 286 | a href="/she/her" { "/she/her" } 287 | "." 288 | } 289 | h4 { "Example" } 290 | pre { 291 | code { 292 | "curl https://pronouns.within.lgbt/api/lookup/she" 293 | "\n[\n {\n \"nominative\": \"she\",\n \"accusative\": \"her\",\n \"determiner\": \"her\",\n \"possessive\": \"hers\",\n \"reflexive\": \"herself\",\n \"singular\": true\n }\n]" 294 | } 295 | } 296 | 297 | h3 { code { "/api/exact/{nom}/{acc}/{det}/{pos}/{ref}" } } 298 | p { 299 | "This route will give you a PronounSet based on the exact set of pronouns that you give it." 300 | br;br; 301 | "For example: " 302 | a href="/api/exact/char/char/char/chars/charself" { "/api/exact/char/char/char/chars/charself" } 303 | " will return the same information as " 304 | a href="/char/char/char/chars/charself" { "/char/char/char/chars/charself" } 305 | "." 306 | } 307 | h4 { "Example" } 308 | pre { 309 | code { 310 | "curl https://pronouns.within.lgbt/api/exact/char/char/char/chars/charself" 311 | "\n{\n \"nominative\": \"char\",\n \"accusative\": \"char\",\n \"determiner\": \"char\",\n \"possessive\": \"chars\",\n \"reflexive\": \"charself\",\n \"singular\": true\n}" 312 | } 313 | } 314 | }, 315 | ) 316 | } 317 | 318 | async fn handler() -> Markup { 319 | base( 320 | None, 321 | html! { 322 | p { 323 | "Hello, this is a service that lets you demonstrate how various third-person pronouns are used. It will list all of the grammatical forms for each pronoun set." 324 | } 325 | 326 | a href="/pronoun-list" { "All the pronouns in the database" } 327 | br; 328 | a href="/api/docs" { "API Documentation" } 329 | 330 | p { 331 | "If your pronouns are not listed here, you can construct a custom URL like this:" 332 | br;br; 333 | code { 334 | pre { 335 | "https://pronouns.within.lgbt/subject/object/determiner/possessive/reflexive" 336 | } 337 | } 338 | "This is a bit verbose, but it will work." 339 | } 340 | }, 341 | ) 342 | } 343 | 344 | fn base(title: Option<&str>, body: Markup) -> Markup { 345 | html! { 346 | (DOCTYPE) 347 | html { 348 | head { 349 | @if let Some(title) = title { 350 | title { (format!("{title} - Pronouns")) } 351 | } @else { 352 | title { "Pronouns" } 353 | } 354 | link rel="stylesheet" href="/static/css/xess.css"; 355 | meta name="viewport" content="width=device-width, initial-scale=1.0"; 356 | } 357 | 358 | body #top { 359 | main { 360 | nav { 361 | a href="/" {"Pronouns"} 362 | " - " 363 | a href="/pronoun-list" {"All Pronouns"} 364 | " - " 365 | a href="/api/docs" {"API Documentation"} 366 | } 367 | 368 | @if let Some(title) = title { 369 | h1 { (title) } 370 | } @else { 371 | h1 { "Pronouns" } 372 | } 373 | 374 | (body) 375 | 376 | footer { 377 | p { 378 | "From " 379 | a href="https://xeiaso.net" { "Within" } 380 | "." 381 | } 382 | } 383 | } 384 | } 385 | } 386 | } 387 | } 388 | 389 | fn url_to_trie_query(url: String) -> Vec> { 390 | url.split('/') 391 | .map(|x| match x { 392 | "..." | "" => None, 393 | x => Some(x.to_owned()), 394 | }) 395 | .collect() 396 | } 397 | -------------------------------------------------------------------------------- /src/trie.rs: -------------------------------------------------------------------------------- 1 | use super::PronounSet; 2 | 3 | /// An intermediate pronoun is either complete and stores an ordered Vec of nominative, 4 | /// accusative, &c strings, and a boolean plurality indicator. If it is incomplete, the plurality 5 | /// indicator is None and Vec has fewer than 5 elements. 6 | type IntPron = (Vec, Option); 7 | 8 | #[derive(Debug)] 9 | pub struct PronounTrie { 10 | inner: String, 11 | left: Option>, 12 | right: Option>, 13 | next: Option>, 14 | 15 | /// If this node terminates a PronounSet, store whether or not the pronoun is singular. 16 | singular: Option, 17 | } 18 | 19 | impl PronounTrie { 20 | /// Build a trie out of a vector of pronouns. 21 | pub fn build(pronouns: Vec) -> Self { 22 | let mut base: Option> = None; 23 | 24 | for pronoun in pronouns { 25 | let key = vec![ 26 | pronoun.nominative, 27 | pronoun.accusative, 28 | pronoun.determiner, 29 | pronoun.possessive, 30 | pronoun.reflexive, 31 | ]; 32 | 33 | Self::insert(&mut base, key, pronoun.singular); 34 | } 35 | 36 | *base.expect("non-empty input list") 37 | } 38 | 39 | /// Take a vector of optional strings and return a list of matching pronouns. If None is passed 40 | /// as one of the key element,s it may match any string. 41 | pub fn guess(&self, key: &mut Vec>) -> Vec { 42 | // Expand wildcards to fill length 5. Not the prettiest code. 43 | let expansion = 5 - key.len(); 44 | for (i, word) in key.iter().enumerate() { 45 | if word.is_none() { 46 | for _ in 0..expansion { 47 | key.insert(i, None); 48 | } 49 | break; 50 | } 51 | } 52 | 53 | let mut strings = self.guess_strings(key); 54 | 55 | strings.drain(..).filter_map(|(x, singular)| if x.len() == 5 { 56 | Some(PronounSet { 57 | nominative: x[0].clone(), 58 | accusative: x[1].clone(), 59 | determiner: x[2].clone(), 60 | possessive: x[3].clone(), 61 | reflexive: x[4].clone(), 62 | singular: singular.unwrap(), 63 | }) 64 | } else { 65 | None 66 | }).collect() 67 | } 68 | 69 | /// Get all strings in the set. 70 | pub fn gather(&self) -> Vec { 71 | self.guess(&mut Vec::new()) 72 | } 73 | 74 | fn new(inner: String) -> Self { 75 | Self { 76 | inner, 77 | left: None, 78 | right: None, 79 | next: None, 80 | singular: None, 81 | } 82 | } 83 | 84 | fn insert(s: &mut Option>, mut key: Vec, singular: bool) { 85 | match s { 86 | None => { 87 | let car = key[0].clone(); 88 | key.remove(0); 89 | let cons = key; 90 | 91 | let mut child = Self::new(car); 92 | 93 | if !cons.is_empty() { 94 | Self::insert(&mut child.next, cons, singular); 95 | } else { 96 | child.singular = Some(singular); 97 | } 98 | 99 | s.replace(Box::new(child)); 100 | }, 101 | Some(s) => { 102 | let car = &key[0]; 103 | 104 | let s = if car < &s.inner { 105 | &mut s.left 106 | } else if car > &s.inner { 107 | &mut s.right 108 | } else { 109 | // We found where to insert, advance the key. 110 | key.remove(0); 111 | &mut s.next 112 | }; 113 | 114 | Self::insert(s, key, singular); 115 | }, 116 | }; 117 | } 118 | 119 | fn guess_strings(&self, key: &mut Vec>) -> Vec { 120 | let car = key.get(0).and_then(|x| x.as_ref()); 121 | 122 | let wildcard = car.is_none(); 123 | 124 | let mut result = Vec::new(); 125 | 126 | let search_left = wildcard || car.unwrap() < &self.inner; 127 | let search_right = wildcard || car.unwrap() > &self.inner; 128 | let search_down = wildcard || car.unwrap() == &self.inner; 129 | 130 | if search_left { 131 | if let Some(left) = self.left.as_ref() { 132 | result.extend(left.guess_strings(key)); 133 | } 134 | } 135 | 136 | if search_down { 137 | if let Some(next) = self.next.as_ref() { 138 | if !key.is_empty() { 139 | key.remove(0); 140 | } 141 | 142 | let mut basket = next.guess_strings(key); 143 | 144 | let basket = basket.drain(..).map(|(x, singular)| { 145 | let mut y = vec![self.inner.clone()]; 146 | y.extend(x); 147 | (y, singular) 148 | }); 149 | 150 | result.extend(basket.collect::, Option)>>()); 151 | } else { 152 | result.extend(vec![(vec![self.inner.clone()], self.singular)]); 153 | } 154 | } 155 | 156 | if search_right { 157 | if let Some(right) = self.right.as_ref() { 158 | result.extend(right.guess_strings(key)); 159 | } 160 | } 161 | 162 | result 163 | } 164 | } 165 | -------------------------------------------------------------------------------- /static/css/xess.css: -------------------------------------------------------------------------------- 1 | @import url(https://cdn.xeiaso.net/static/css/iosevka/family.css); 2 | @import url(https://cdn.xeiaso.net/static/css/podkova/family.css); 3 | 4 | main { 5 | font-family: Iosevka Aile Iaso, sans-serif; 6 | max-width: 50rem; 7 | padding: 2rem; 8 | margin: auto; 9 | } 10 | 11 | @media only screen and (max-device-width: 736px) { 12 | main { 13 | padding: 0; 14 | } 15 | } 16 | 17 | ::selection { 18 | background: #d3869b; 19 | } 20 | 21 | body { 22 | background: #1d2021; 23 | color: #f9f5d7; 24 | } 25 | 26 | pre { 27 | background-color: #3c3836; 28 | padding: 1em; 29 | border: 0; 30 | font-family: Iosevka Curly Iaso, monospace; 31 | } 32 | 33 | a, 34 | a:active, 35 | a:visited { 36 | color: #b16286; 37 | background-color: #282828; 38 | } 39 | 40 | h1, 41 | h2, 42 | h3, 43 | h4, 44 | h5 { 45 | margin-bottom: 0.1rem; 46 | font-family: Podkova, serif; 47 | } 48 | 49 | blockquote { 50 | border-left: 1px solid #bdae93; 51 | margin: 0.5em 10px; 52 | padding: 0.5em 10px; 53 | } 54 | 55 | footer { 56 | text-align: center; 57 | } 58 | 59 | @media (prefers-color-scheme: light) { 60 | body { 61 | background: #f9f5d7; 62 | color: #1d2021; 63 | } 64 | 65 | pre { 66 | background-color: #ebdbb2; 67 | padding: 1em; 68 | border: 0; 69 | } 70 | 71 | a, 72 | a:active, 73 | a:visited { 74 | color: #b16286; 75 | background-color: #fbf1c7; 76 | } 77 | 78 | h1, 79 | h2, 80 | h3, 81 | h4, 82 | h5 { 83 | margin-bottom: 0.1rem; 84 | } 85 | 86 | blockquote { 87 | border-left: 1px solid #655c54; 88 | margin: 0.5em 10px; 89 | padding: 0.5em 10px; 90 | } 91 | } 92 | --------------------------------------------------------------------------------