diff --git a/Cargo.lock b/Cargo.lock index c9bc84c..f642953 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,12 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "accept-language" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f27d075294830fcab6f66e320dab524bc6d048f4a151698e153205559113772" + [[package]] name = "addr2line" version = "0.21.0" @@ -26,27 +32,18 @@ dependencies = [ "memchr", ] -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - [[package]] name = "anyhow" version = "1.0.80" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" +[[package]] +name = "arc-swap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" + [[package]] name = "async-stream" version = "0.3.5" @@ -200,40 +197,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "chrono" -version = "0.4.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "num-traits", - "windows-targets 0.52.3", -] - -[[package]] -name = "chrono-tz" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59ae0466b83e838b81a54256c39d5d7c20b9d7daa10510a242d9b75abd5936e" -dependencies = [ - "chrono", - "chrono-tz-build", - "phf", -] - -[[package]] -name = "chrono-tz-build" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "433e39f13c9a060046954e0592a8d0a4bcb1040125cbf91cb8ee58964cfb350f" -dependencies = [ - "parse-zoneinfo", - "phf", - "phf_codegen", -] - [[package]] name = "cookie" version = "0.18.0" @@ -270,15 +233,6 @@ dependencies = [ "libc", ] -[[package]] -name = "crossbeam-channel" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" -dependencies = [ - "crossbeam-utils", -] - [[package]] name = "crossbeam-deque" version = "0.8.5" @@ -323,12 +277,6 @@ dependencies = [ "powerfmt", ] -[[package]] -name = "deunicode" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6e854126756c496b8c81dec88f9a706b15b875c5849d4097a3854476b9fdf94" - [[package]] name = "devise" version = "0.4.1" @@ -404,6 +352,17 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "displaydoc" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "either" version = "1.10.0" @@ -456,15 +415,104 @@ dependencies = [ ] [[package]] -name = "filetime" -version = "0.2.23" +name = "fluent" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" +checksum = "61f69378194459db76abd2ce3952b790db103ceb003008d3d50d97c41ff847a7" dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "windows-sys 0.52.0", + "fluent-bundle", + "unic-langid", +] + +[[package]] +name = "fluent-bundle" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e242c601dec9711505f6d5bbff5bedd4b61b2469f2e8bb8e57ee7c9747a87ffd" +dependencies = [ + "fluent-langneg", + "fluent-syntax", + "intl-memoizer", + "intl_pluralrules", + "rustc-hash", + "self_cell 0.10.3", + "smallvec", + "unic-langid", +] + +[[package]] +name = "fluent-langneg" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ad0989667548f06ccd0e306ed56b61bd4d35458d54df5ec7587c0e8ed5e94" +dependencies = [ + "unic-langid", +] + +[[package]] +name = "fluent-syntax" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0abed97648395c902868fee9026de96483933faa54ea3b40d652f7dfe61ca78" +dependencies = [ + "thiserror", +] + +[[package]] +name = "fluent-template-macros" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6ed4e698f4d91b4c8e8e21779fea045709f399057c470cb8fa5f3369b2e19fd" +dependencies = [ + "flume 0.10.14", + "ignore", + "once_cell", + "proc-macro2", + "quote", + "syn", + "unic-langid", +] + +[[package]] +name = "fluent-templates" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ce2bb37143b7e57115052cea4fc552f4e98462af54c36cf1303af1d5e231be0" +dependencies = [ + "arc-swap", + "fluent", + "fluent-bundle", + "fluent-langneg", + "fluent-syntax", + "fluent-template-macros", + "flume 0.11.0", + "heck", + "ignore", + "intl-memoizer", + "log", + "once_cell", + "serde_json", + "tera", + "thiserror", + "unic-langid", +] + +[[package]] +name = "flume" +version = "0.10.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" +dependencies = [ + "spin", +] + +[[package]] +name = "flume" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +dependencies = [ + "spin", ] [[package]] @@ -482,15 +530,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "fsevent-sys" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" -dependencies = [ - "libc", -] - [[package]] name = "futures" version = "0.3.30" @@ -651,6 +690,12 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "hermit-abi" version = "0.3.8" @@ -691,15 +736,6 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" -[[package]] -name = "humansize" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cb51c9a029ddc91b07a787f1d86b53ccfa49b0e86688c946ebe8d3555685dd7" -dependencies = [ - "libm", -] - [[package]] name = "hyper" version = "0.14.28" @@ -738,29 +774,6 @@ dependencies = [ "tokio-rustls", ] -[[package]] -name = "iana-time-zone" -version = "0.1.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - [[package]] name = "idna" version = "0.5.0" @@ -805,23 +818,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" [[package]] -name = "inotify" -version = "0.9.6" +name = "intl-memoizer" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" +checksum = "c310433e4a310918d6ed9243542a6b83ec1183df95dff8f23f87bb88a264a66f" dependencies = [ - "bitflags 1.3.2", - "inotify-sys", - "libc", + "type-map", + "unic-langid", ] [[package]] -name = "inotify-sys" -version = "0.1.5" +name = "intl_pluralrules" +version = "7.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +checksum = "078ea7b7c29a2b4df841a7f6ac8775ff6074020c6776d48491ce2268e068f972" dependencies = [ - "libc", + "unic-langid", ] [[package]] @@ -856,26 +868,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "kqueue" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c" -dependencies = [ - "kqueue-sys", - "libc", -] - -[[package]] -name = "kqueue-sys" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" -dependencies = [ - "bitflags 1.3.2", - "libc", -] - [[package]] name = "lazy_static" version = "1.4.0" @@ -888,12 +880,6 @@ version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - [[package]] name = "libsqlite3-sys" version = "0.27.0" @@ -984,7 +970,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" dependencies = [ "libc", - "log", "wasi", "windows-sys 0.48.0", ] @@ -1019,34 +1004,6 @@ dependencies = [ "minimal-lexical", ] -[[package]] -name = "normpath" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5831952a9476f2fed74b77d74182fa5ddc4d21c72ec45a333b250e3ed0272804" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "notify" -version = "6.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" -dependencies = [ - "bitflags 2.4.2", - "crossbeam-channel", - "filetime", - "fsevent-sys", - "inotify", - "kqueue", - "libc", - "log", - "mio", - "walkdir", - "windows-sys 0.48.0", -] - [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -1063,15 +1020,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" -[[package]] -name = "num-traits" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" -dependencies = [ - "autocfg", -] - [[package]] name = "num_cpus" version = "1.16.0" @@ -1126,15 +1074,6 @@ dependencies = [ "windows-targets 0.48.5", ] -[[package]] -name = "parse-zoneinfo" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c705f256449c60da65e11ff6626e0c16a0a0b96aaa348de61376b249bc340f41" -dependencies = [ - "regex", -] - [[package]] name = "pear" version = "0.2.8" @@ -1209,44 +1148,6 @@ dependencies = [ "sha2", ] -[[package]] -name = "phf" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" -dependencies = [ - "phf_shared", -] - -[[package]] -name = "phf_codegen" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" -dependencies = [ - "phf_generator", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" -dependencies = [ - "phf_shared", - "rand", -] - -[[package]] -name = "phf_shared" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" -dependencies = [ - "siphasher", -] - [[package]] name = "pin-project-lite" version = "0.2.13" @@ -1277,6 +1178,12 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + [[package]] name = "proc-macro2" version = "1.0.78" @@ -1505,6 +1412,17 @@ dependencies = [ "yansi", ] +[[package]] +name = "rocket-accept-language" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "948e5f96a6a959aec6e05fb3140a1f7fde523055239bc19aa77e639d99e66c66" +dependencies = [ + "accept-language", + "rocket", + "unic-langid", +] + [[package]] name = "rocket_codegen" version = "0.5.0" @@ -1522,19 +1440,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "rocket_dyn_templates" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04bfc006e547e4f72b760ab861f5943b688aed8a82c4977b5500c98f5d17dbfa" -dependencies = [ - "normpath", - "notify", - "rocket", - "tera", - "walkdir", -] - [[package]] name = "rocket_http" version = "0.5.0" @@ -1568,6 +1473,12 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustix" version = "0.38.31" @@ -1655,6 +1566,21 @@ dependencies = [ "untrusted", ] +[[package]] +name = "self_cell" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14e4d63b804dc0c7ec4a1e52bcb63f02c7ac94476755aa579edac21e01f915d" +dependencies = [ + "self_cell 1.0.3", +] + +[[package]] +name = "self_cell" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58bf37232d3bb9a2c4e641ca2a11d83b5062066f88df7fed36c28772046d65ba" + [[package]] name = "serde" version = "1.0.197" @@ -1677,9 +1603,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.114" +version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" dependencies = [ "itoa", "ryu", @@ -1712,12 +1638,16 @@ name = "services" version = "0.1.0" dependencies = [ "diesel", + "fluent-templates", "reqwest", "rocket", - "rocket_dyn_templates", + "rocket-accept-language", "serde", + "serde_json", + "tera", "texting_robots", "tokio", + "unic-langid", ] [[package]] @@ -1749,12 +1679,6 @@ dependencies = [ "libc", ] -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - [[package]] name = "slab" version = "0.4.9" @@ -1764,16 +1688,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "slug" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd94acec9c8da640005f8e135a39fc0372e74535e6b368b7a04b875f784c8c4" -dependencies = [ - "deunicode", - "wasm-bindgen", -] - [[package]] name = "smallvec" version = "1.13.1" @@ -1795,6 +1709,9 @@ name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] [[package]] name = "stable-pattern" @@ -1870,19 +1787,13 @@ version = "1.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "970dff17c11e884a4a09bc76e3a17ef71e01bb13447a11e85226e254fe6d10b8" dependencies = [ - "chrono", - "chrono-tz", "globwalk", - "humansize", "lazy_static", - "percent-encoding", "pest", "pest_derive", - "rand", "regex", "serde", "serde_json", - "slug", "unic-segment", ] @@ -1904,18 +1815,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", @@ -1963,6 +1874,15 @@ dependencies = [ "time-core", ] +[[package]] +name = "tinystr" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83c02bf3c538ab32ba913408224323915f4ef9a6d61c0e85d493f355921c0ece" +dependencies = [ + "displaydoc", +] + [[package]] name = "tinyvec" version = "1.6.0" @@ -2161,6 +2081,15 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "type-map" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d3364c5e96cb2ad1603037ab253ddd34d7fb72a58bdddf4b7350760fc69a46" +dependencies = [ + "rustc-hash", +] + [[package]] name = "typenum" version = "1.17.0" @@ -2213,6 +2142,49 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" +[[package]] +name = "unic-langid" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "238722e6d794ed130f91f4ea33e01fcff4f188d92337a21297892521c72df516" +dependencies = [ + "unic-langid-impl", + "unic-langid-macros", +] + +[[package]] +name = "unic-langid-impl" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd55a2063fdea4ef1f8633243a7b0524cbeef1905ae04c31a1c9b9775c55bc6" +dependencies = [ + "tinystr", +] + +[[package]] +name = "unic-langid-macros" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c854cefb82ff2816410ce606acbad1b3af065140907b29be9229040752b83ec" +dependencies = [ + "proc-macro-hack", + "tinystr", + "unic-langid-impl", + "unic-langid-macros-impl", +] + +[[package]] +name = "unic-langid-macros-impl" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea2a4c80deb4fb3ca51f66b5e2dd91e3642bbce52234bcf22e41668281208e4" +dependencies = [ + "proc-macro-hack", + "quote", + "syn", + "unic-langid-impl", +] + [[package]] name = "unic-segment" version = "0.9.0" @@ -2451,15 +2423,6 @@ dependencies = [ "windows-targets 0.48.5", ] -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.3", -] - [[package]] name = "windows-sys" version = "0.48.0" diff --git a/Cargo.toml b/Cargo.toml index 5f99b4c..abbbeb1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,12 +7,24 @@ edition = "2021" name = "updater" path = "src/updater.rs" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] -serde = "1.0.197" -texting_robots = "0.2.2" -tokio = "1.36.0" +rocket-accept-language = { version = "0.8.6", default-features = false } +serde = { version = "1.0.197", default-features = false } +serde_json = { version = "1.0.116", default-features = false } +tera = { version = "1.19.1", default-features = false } +texting_robots = { version = "0.2.2", default-features = false } +tokio = { version = "1.36.0", default-features = false } +unic-langid = { version = "0.9.4", default-features = false } + +[dependencies.fluent-templates] +version = "0.9.2" +default-features = false +features = ["tera", "use-ignore", "macros"] + +[dependencies.diesel] +version = "2.1.4" +default-features = false +features = ["sqlite"] [dependencies.reqwest] version = "0.11.24" @@ -22,20 +34,10 @@ features = [ "socks", ] -[dependencies.diesel] -version = "2.1.4" -default-features = false -features = ["sqlite"] - [dependencies.rocket] version = "0.5.0" default-features = false -[dependencies.rocket_dyn_templates] -version = "0.1.0" -default-features = false -features = ["tera"] - [profile.release] opt-level = "z" lto = true diff --git a/locales/en/services.ftl b/locales/en/services.ftl new file mode 100644 index 0000000..2ebd391 --- /dev/null +++ b/locales/en/services.ftl @@ -0,0 +1,22 @@ +brand = Services + +count-scans = Displaying { $nb } scans: +count-services = Displaying { $nb } services: +-ipv6 = IPv6 +-ipv4 = IPv4 + +title-list-scans = Scans list +title-list-services = Services list +title-add-service = Add service +title-error = Error + +table-url = URL +table-software = Software +table-server = Server +table-timestamp = Timestamp +table-ipv6 = { -ipv6 } +table-ipv4 = { -ipv4 } +table-ipv6-availability = { -ipv6 } availability +table-ipv4-availability = { -ipv4 } availability + +field-url = Service URL diff --git a/locales/fr/services.ftl b/locales/fr/services.ftl new file mode 100644 index 0000000..3e2c373 --- /dev/null +++ b/locales/fr/services.ftl @@ -0,0 +1,22 @@ +brand = Services + +count-scans = Affichage de { $nb } scans : +count-services = Affichage de { $nb } services : +-ipv6 = IPv6 +-ipv4 = IPv4 + +title-list-scans = Liste des scans +title-list-services = Liste des services +title-add-service = Ajouter un service +title-error = Erreur + +table-url = URL +table-software = Logiciel +table-server = Serveur +table-timestamp = Timestamp +table-ipv6 = { -ipv6 } +table-ipv4 = { -ipv4 } +table-ipv6-availability = Disponibilité { -ipv6 } +table-ipv4-availability = Disponibilité { -ipv4 } + +field-url = URL du service diff --git a/src/main.rs b/src/main.rs index 8731abf..610aff6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,55 +3,100 @@ extern crate rocket; mod check; use crate::check::check; - use ::services::establish_connection; -use diesel::prelude::*; -use rocket::form; -use rocket::form::*; -use rocket_dyn_templates::Template; use services::models::*; +use diesel::prelude::*; +use fluent_templates::FluentLoader; +use rocket::{ + form::{self, Error, Form, Strict}, + response::content::RawHtml, + State, +}; +use rocket_accept_language::{language, AcceptLanguage, LanguageIdentifier}; +use serde_json::json; +use tera::{Context, Tera, Value}; +use unic_langid::{langid, subtags::Language}; + +const LANGUAGE_DEFAULT: Language = language!("en"); + +const SL: [LanguageIdentifier; 2] = [langid!("en"), langid!("fr")]; + +fluent_templates::static_loader! { + static LOCALES = { + locales: "./locales", + fallback_language: "en", + }; +} + +fn gen_context(accept_language: &AcceptLanguage, values: Value) -> Context { + let mut cont: Context = Context::from_value(json!({ + "ln": &accept_language + .get_appropriate_language_region(&SL) + .unwrap_or((LANGUAGE_DEFAULT, None)).0.as_str() + })) + .unwrap(); + cont.extend(Context::from_value(values).unwrap()); + cont +} + #[launch] fn rocket() -> _ { - rocket::build() - .attach(Template::fairing()) - .mount("/", routes![list_services]) - .mount("/", routes![list_scans]) - .mount("/", routes![add_service_get]) - .mount("/", routes![add_service_post]) + let mut tera = Tera::new("templates/*.html.tera").unwrap(); + tera.register_function("fluent", FluentLoader::new(&*LOCALES)); + + rocket::build().manage(tera).mount( + "/", + routes![list_services, list_scans, add_service_get, add_service_post], + ) } -#[get("/list-services")] -fn list_services() -> Template { - Template::render( - "list-services", - rocket_dyn_templates::context! { - services: services::schema::services::dsl::services - .limit(300) - .select(Services::as_select()) - .load(&mut establish_connection()) - .unwrap(), - }, +#[get("/")] +fn list_services(tera: &State, al: &AcceptLanguage) -> RawHtml { + RawHtml( + tera.render( + "list-services.html.tera", + &gen_context( + al, + json!({ + "services": &services::schema::services::dsl::services + .limit(300) + .select(Services::as_select()) + .load(&mut establish_connection()) + .unwrap() + }), + ), + ) + .unwrap(), ) } #[get("/list-scans")] -fn list_scans() -> Template { - Template::render( - "list-scans", - rocket_dyn_templates::context! { - scans: services::schema::scans::dsl::scans - .limit(1000) - .select(Scans::as_select()) - .load(&mut establish_connection()) - .unwrap(), - }, +fn list_scans(tera: &State, al: &AcceptLanguage) -> RawHtml { + RawHtml( + tera.render( + "list-scans.html.tera", + &gen_context( + al, + json!({ + "scans": services::schema::scans::dsl::scans + .limit(1000) + .select(Scans::as_select()) + .load(&mut establish_connection()) + .unwrap() + }), + ), + ) + .unwrap(), ) } #[get("/add-service")] -fn add_service_get() -> Template { - Template::render("add-service", rocket_dyn_templates::context! {}) +fn add_service_get(tera: &State, al: &AcceptLanguage) -> RawHtml { + RawHtml( + tera.render("add-service.html.tera", &gen_context(al, json!({}))) + .unwrap(), + ) } fn check_url<'v>(url: &str) -> form::Result<'v, ()> { @@ -78,18 +123,23 @@ struct Submission<'r> { } #[post("/add-service", data = "")] -async fn add_service_post(submission: Form>>) -> Template { +async fn add_service_post( + submission: Form>>, + tera: &State, + al: &AcceptLanguage, +) -> RawHtml { use ::services::schema::services::dsl::*; use diesel::associations::HasTable; let service = match check(submission.url, None).await { Ok(service) => service, Err(err) => { - return Template::render( - "error", - rocket_dyn_templates::context! { - error_message: err, - }, + return RawHtml( + tera.render( + "error.html.tera", + &gen_context(al, json!({"error_message": &err})), + ) + .unwrap(), ); } }; @@ -107,5 +157,8 @@ async fn add_service_post(submission: Form>>) -> Template .execute(&mut establish_connection()) .unwrap(); - Template::render("add-service", rocket_dyn_templates::context! {}) + RawHtml( + tera.render("add-service.html.tera", &gen_context(al, json!({}))) + .unwrap(), + ) } diff --git a/src/models.rs b/src/models.rs index 0e4438d..0e3cd63 100644 --- a/src/models.rs +++ b/src/models.rs @@ -1,5 +1,5 @@ use diesel::prelude::*; -use rocket_dyn_templates::serde::Serialize; +use serde::Serialize; #[derive(Queryable, Selectable, Insertable, Serialize, Debug)] #[diesel(table_name = crate::schema::services)] diff --git a/templates/add-service.html.tera b/templates/add-service.html.tera index aad6699..cb31b84 100644 --- a/templates/add-service.html.tera +++ b/templates/add-service.html.tera @@ -1,9 +1,9 @@ -{% extends "base" %} -{% block title %}Add service{% endblock title %} +{% extends "base.html.tera" %} +{% block title %}{{ fluent(key="title-add-service", lang=ln) }}{% endblock title %} {% block content %}
- +

diff --git a/templates/base.html.tera b/templates/base.html.tera index 8073c40..c9a193a 100644 --- a/templates/base.html.tera +++ b/templates/base.html.tera @@ -1,15 +1,15 @@ - + - {% block title %}{% endblock title %} • Services + {% block title %}{% endblock title %} • {{ fluent(key="brand", lang=ln) }}
diff --git a/templates/error.html.tera b/templates/error.html.tera index 2a35e54..17218f4 100644 --- a/templates/error.html.tera +++ b/templates/error.html.tera @@ -1,5 +1,5 @@ -{% extends "base" %} -{% block title %}Error{% endblock title %} +{% extends "base.html.tera" %} +{% block title %}{{ fluent(key="title-error", lang=ln) }}{% endblock title %} {% block content %}

diff --git a/templates/list-scans.html.tera b/templates/list-scans.html.tera index b74222f..aab6ab1 100644 --- a/templates/list-scans.html.tera +++ b/templates/list-scans.html.tera @@ -1,18 +1,18 @@ -{% extends "base" %} -{% block title %}Scans list{% endblock title %} +{% extends "base.html.tera" %} +{% block title %}{{ fluent(key="title-list-scans", lang=ln) }}{% endblock title %} {% block content %}

- Displaying {{ scans | length }} scans: + {{ fluent(key="count-scans", lang=ln, nb=scans|length) }}

- - - - + + + + diff --git a/templates/list-services.html.tera b/templates/list-services.html.tera index 226240d..672315f 100644 --- a/templates/list-services.html.tera +++ b/templates/list-services.html.tera @@ -1,21 +1,21 @@ -{% extends "base" %} -{% block title %}List services{% endblock title %} +{% extends "base.html.tera" %} +{% block title %}{{ fluent(key="title-list-services", lang=ln) }}{% endblock title %} {% block content %}

- Displaying {{ services | length }} services: + {{ fluent(key="count-services", lang=ln, nb=services|length) }}

InstallationTimestampIPv6IPv4{{ fluent(key="table-url", lang=ln) }}{{ fluent(key="table-timestamp", lang=ln) }}{{ fluent(key="table-ipv6", lang=ln) }}{{ fluent(key="table-ipv4", lang=ln) }}
- - - - - - - + + + + + + +
URLSoftwareServerIPv6IPv4IPv6 availabilityIPv4 availability{{ fluent(key="table-url", lang=ln) }}{{ fluent(key="table-software", lang=ln) }}{{ fluent(key="table-server", lang=ln) }}{{ fluent(key="table-ipv6", lang=ln) }}{{ fluent(key="table-ipv4", lang=ln) }}{{ fluent(key="table-ipv6-availability", lang=ln) }}{{ fluent(key="table-ipv4-availability", lang=ln) }}