From 6d9a860a9fde670b0b0b1444ff7a299e1d75ef2e Mon Sep 17 00:00:00 2001 From: Bryan Malyn Date: Fri, 18 Jul 2025 01:23:35 -0500 Subject: [PATCH] Updated icu4x deps to 2.x `icu_locid` has been replaced with `icu_locale_core`. Removed direct dependency on `icu_calendar`. Added `precision` argument to `datetime` formatter to specify the precision of the datetime. --- Cargo.lock | 351 ++++++++++++++------------- Cargo.toml | 7 +- cspell.yaml | 3 + src/blocks/time.rs | 3 +- src/formatting.rs | 10 +- src/formatting/formatter/datetime.rs | 129 +++++++--- 6 files changed, 294 insertions(+), 209 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 625ed9a7e0..a5b8a37d6f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -178,7 +178,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] @@ -195,7 +195,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] @@ -257,7 +257,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] @@ -314,9 +314,9 @@ checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" [[package]] name = "calendrical_calculations" -version = "0.1.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cec493b209a1b81fa32312d7ceca1b547d341c7b5f16a3edbf32b1d8b455bbdf" +checksum = "3a0b39595c6ee54a8d0900204ba4c401d0ab4eb45adaf07178e8d017541529e7" dependencies = [ "core_maths", "displaydoc", @@ -470,7 +470,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] @@ -649,7 +649,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] @@ -691,7 +691,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] @@ -774,9 +774,9 @@ dependencies = [ [[package]] name = "fixed_decimal" -version = "0.5.6" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0febbeb1118a9ecdee6e4520ead6b54882e843dd0592ad233247dbee84c53db8" +checksum = "35eabf480f94d69182677e37571d3be065822acfafd12f2f085db44fbbcc8e57" dependencies = [ "displaydoc", "smallvec", @@ -1156,9 +1156,8 @@ dependencies = [ "glob", "iana-time-zone", "icalendar", - "icu_calendar", "icu_datetime", - "icu_locid", + "icu_locale_core", "indexmap", "inotify", "itertools 0.13.0", @@ -1235,34 +1234,35 @@ dependencies = [ [[package]] name = "icu_calendar" -version = "1.5.2" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7265b2137f9a36f7634a308d91f984574bbdba8cfd95ceffe1c345552275a8ff" +checksum = "d6f0e52e009b6b16ba9c0693578796f2dd4aaa59a7f8f920423706714a89ac4e" dependencies = [ "calendrical_calculations", "displaydoc", "icu_calendar_data", - "icu_locid", - "icu_locid_transform", + "icu_locale", + "icu_locale_core", "icu_provider", + "ixdtf", "tinystr", - "writeable", "zerovec", ] [[package]] name = "icu_calendar_data" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e009b7f0151ee6fb28c40b1283594397e0b7183820793e9ace3dcd13db126d0" +checksum = "527f04223b17edfe0bd43baf14a0cb1b017830db65f3950dc00224860a9a446d" [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", @@ -1270,22 +1270,22 @@ dependencies = [ [[package]] name = "icu_datetime" -version = "1.5.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d115efb85e08df3fd77e77f52e7e087545a783fffba8be80bfa2102f306b1780" +checksum = "1b9d49f41ded8e63761b6b4c3120dfdc289415a1ed10107db6198eb311057ca5" dependencies = [ "displaydoc", - "either", "fixed_decimal", "icu_calendar", "icu_datetime_data", "icu_decimal", - "icu_locid", - "icu_locid_transform", + "icu_locale", + "icu_locale_core", + "icu_pattern", "icu_plurals", "icu_provider", - "icu_timezone", - "smallvec", + "icu_time", + "potential_utf", "tinystr", "writeable", "zerovec", @@ -1293,96 +1293,107 @@ dependencies = [ [[package]] name = "icu_datetime_data" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ba7e7f7a01269b9afb0a39eff4f8676f693b55f509b3120e43a0350a9f88bea" +checksum = "0bf2a384725c67fcd32d27737bc7ba9dc5fe21311dfe3ba530f4b4d53e72bacc" [[package]] name = "icu_decimal" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb8fd98f86ec0448d85e1edf8884e4e318bb2e121bd733ec929a05c0a5e8b0eb" +checksum = "a38c52231bc348f9b982c1868a2af3195199623007ba2c7650f432038f5b3e8e" dependencies = [ - "displaydoc", "fixed_decimal", "icu_decimal_data", - "icu_locid_transform", + "icu_locale", + "icu_locale_core", "icu_provider", "writeable", + "zerovec", ] [[package]] name = "icu_decimal_data" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d424c994071c6f5644f999925fc868c85fec82295326e75ad5017bc94b41523" +checksum = "2905b4044eab2dd848fe84199f9195567b63ab3a93094711501363f63546fef7" [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "532b11722e350ab6bf916ba6eb0efe3ee54b932666afec989465f9243fe6dd60" dependencies = [ - "displaydoc", - "litemap", + "icu_collections", + "icu_locale_core", + "icu_locale_data", + "icu_provider", + "potential_utf", "tinystr", - "writeable", "zerovec", ] [[package]] -name = "icu_locid_transform" -version = "1.5.0" +name = "icu_locale_core" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", + "litemap", + "serde", "tinystr", + "writeable", "zerovec", ] [[package]] -name = "icu_locid_transform_data" -version = "1.5.0" +name = "icu_locale_data" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" +checksum = "f03e2fcaefecdf05619f3d6f91740e79ab969b4dd54f77cbf546b1d0d28e3147" [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" dependencies = [ - "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] -name = "icu_plurals" -version = "1.5.0" +name = "icu_pattern" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a70e7c025dbd5c501b0a5c188cd11666a424f0dadcd4f0a95b7dafde3b114" +checksum = "7a7ff8c0ff6f61cdce299dcb54f557b0a251adbc78f6f0c35a21332c452b4a1b" dependencies = [ "displaydoc", + "either", + "serde", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_plurals" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f9cfe49f5b1d1163cc58db451562339916a9ca5cbcaae83924d41a0bf839474" +dependencies = [ "fixed_decimal", - "icu_locid_transform", + "icu_locale", "icu_plurals_data", "icu_provider", "zerovec", @@ -1390,79 +1401,70 @@ dependencies = [ [[package]] name = "icu_plurals_data" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3e8f775b215d45838814a090a2227247a7431d74e9156407d9c37f6ef0f208" +checksum = "f018a98dccf7f0eb02ba06ac0ff67d102d8ded80734724305e924de304e12ff0" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" dependencies = [ - "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", + "icu_locale_core", + "serde", "stable_deref_trait", - "tinystr", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] [[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "icu_timezone" -version = "1.5.0" +name = "icu_time" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa91ba6a585939a020c787235daa8aee856d9bceebd6355e283c0c310bc6de96" +checksum = "8242b00da3b3b6678f731437a11c8833a43c821ae081eca60ba1b7579d45b6d8" dependencies = [ + "calendrical_calculations", "displaydoc", "icu_calendar", + "icu_locale_core", "icu_provider", - "icu_timezone_data", - "tinystr", + "icu_time_data", + "ixdtf", + "serde", "zerotrie", "zerovec", ] [[package]] -name = "icu_timezone_data" -version = "1.5.0" +name = "icu_time_data" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c588878c508a3e2ace333b3c50296053e6483c6a7541251b546cc59dcd6ced8e" +checksum = "3e10b0e5e87a2c84bd5fa407705732052edebe69291d347d0c3033785470edbf" [[package]] name = "ident_case" @@ -1483,9 +1485,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -1579,6 +1581,12 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +[[package]] +name = "ixdtf" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84de9d95a6d2547d9b77ee3f25fa0ee32e3c3a6484d47a55adebc0439c077992" + [[package]] name = "js-sys" version = "0.3.77" @@ -1711,9 +1719,9 @@ checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "litemap" -version = "0.7.3" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "log" @@ -2000,7 +2008,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] @@ -2177,6 +2185,17 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "serde_core", + "writeable", + "zerovec", +] + [[package]] name = "ppv-lite86" version = "0.2.20" @@ -2197,9 +2216,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.89" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] @@ -2222,9 +2241,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] @@ -2497,22 +2516,32 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.215" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.215" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] @@ -2545,7 +2574,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] @@ -2655,7 +2684,7 @@ checksum = "0eb01866308440fc64d6c44d9e86c5cc17adfe33c4d6eed55da9145044d0ffc1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] @@ -2670,9 +2699,9 @@ dependencies = [ [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "static_assertions" @@ -2745,9 +2774,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.87" +version = "2.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" dependencies = [ "proc-macro2", "quote", @@ -2765,13 +2794,13 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] @@ -2853,7 +2882,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] @@ -2864,16 +2893,17 @@ checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ "displaydoc", + "serde_core", "zerovec", ] @@ -2903,7 +2933,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] @@ -3038,7 +3068,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] @@ -3075,9 +3105,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-segmentation" @@ -3109,12 +3139,6 @@ dependencies = [ "serde", ] -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -3202,7 +3226,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", "wasm-bindgen-shared", ] @@ -3236,7 +3260,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3532,17 +3556,14 @@ dependencies = [ "memchr", ] -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +dependencies = [ + "either", +] [[package]] name = "x11rb" @@ -3600,11 +3621,10 @@ dependencies = [ [[package]] name = "yoke" -version = "0.7.4" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ - "serde", "stable_deref_trait", "yoke-derive", "zerofrom", @@ -3612,13 +3632,13 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.4" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", "synstructure", ] @@ -3661,7 +3681,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", "zbus_names", "zvariant", "zvariant_utils", @@ -3697,27 +3717,27 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] name = "zerofrom" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", "synstructure", ] @@ -3729,9 +3749,9 @@ checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" [[package]] name = "zerotrie" -version = "0.1.3" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb594dd55d87335c5f60177cee24f19457a5ec10a065e0a3014722ad252d0a1f" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" dependencies = [ "displaydoc", "yoke", @@ -3740,10 +3760,11 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.10.4" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" dependencies = [ + "serde", "yoke", "zerofrom", "zerovec-derive", @@ -3751,13 +3772,13 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", ] [[package]] @@ -3784,7 +3805,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.111", "zvariant_utils", ] @@ -3798,6 +3819,6 @@ dependencies = [ "quote", "serde", "static_assertions", - "syn 2.0.87", + "syn 2.0.111", "winnow", ] diff --git a/Cargo.toml b/Cargo.toml index 6fa042b2ac..41ffb2a4bd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,7 +21,7 @@ pulseaudio = ["libpulse-binding"] pipewire = ["dep:pipewire"] notmuch = ["dep:notmuch"] maildir = ["dep:maildir", "glob"] -icu_calendar = ["dep:icu_datetime", "dep:icu_calendar", "dep:icu_locid"] +icu_calendar = ["dep:icu_datetime", "dep:icu_locale_core"] debug_borders = [] # Make widgets' borders visible [package.metadata.docs.rs] @@ -44,9 +44,8 @@ futures = { version = "0.3.31", default-features = false } glob = { version = "0.3.1", optional = true } iana-time-zone = "0.1.60" icalendar = { version = "0.16.2", features = ["chrono-tz"] } -icu_calendar = { version = "1.3.0", optional = true } -icu_datetime = { version = "1.3.0", optional = true } -icu_locid = { version = "1.3.0", optional = true } +icu_datetime = { version = "2.1.1", optional = true } +icu_locale_core = { version = "2.1.1", optional = true } indexmap = { version = "2.0", features = ["serde"] } inotify = "0.11" itertools = "0.13" diff --git a/cspell.yaml b/cspell.yaml index 54da2958f9..efd487ec3c 100644 --- a/cspell.yaml +++ b/cspell.yaml @@ -197,6 +197,9 @@ words: - xrandr - xresources - xtask + - YMDE + - YMDET + - YMDT - zbus - zram - zswap diff --git a/src/blocks/time.rs b/src/blocks/time.rs index 4f0fca5da8..e645a9da2e 100644 --- a/src/blocks/time.rs +++ b/src/blocks/time.rs @@ -34,6 +34,7 @@ //! You can use calendars other than the Gregorian calendar by adding the calendar specifier in the locale string. When using //! this feature you can't use chrono style format string, and you should use one of the options provided by //! the `icu4x` crate: `short`, `medium`, `long`, `full`. +//! If you set `precision` to `hours`/`hour`/`h`, `minutes`/`minute`/`m`, or `seconds`/`second`/`s` then then the datetime will be formatted accordingly, otherwise only the date with be displayed. //! //! ** Only available using feature `icu_calendar`. ** //! @@ -43,7 +44,7 @@ //! [[block]] //! block = "time" //! interval = 60 -//! format = "$timestamp.datetime(locale:'fa_IR-u-ca-persian', f:'full')" +//! format = "$timestamp.datetime(locale:'fa_IR-u-ca-persian', f:'full', precision: minutes)" //! ``` //! //! # Icons Used diff --git a/src/formatting.rs b/src/formatting.rs index 8468b2f661..407005a5b3 100644 --- a/src/formatting.rs +++ b/src/formatting.rs @@ -79,11 +79,11 @@ //! No arguments. //! //! ## `datetime` - Display datetime -//! -//! Argument | Description |Default value -//! -----------------------|-----------------------------------------------------------------------------------------------------------|------------- -//! `format` or `f` | [chrono docs](https://docs.rs/chrono/0.3.0/chrono/format/strftime/index.html#specifiers) for all options. | `'%a %d/%m %R'` -//! `locale` or `l` | Locale to apply when formatting the time | System locale +//! Argument | Description |Default value +//! -----------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------- +//! `format` or `f` | [chrono docs](https://docs.rs/chrono/0.3.0/chrono/format/strftime/index.html#specifiers) for all options, or `short`, `medium`, `long`, or `full` for icu datetimes | `'%a %d/%m %R'` +//! `locale` or `l` | Locale to apply when formatting the time | System locale +//! `precision` or `p` | Precision to apply when formatting an icu datetime (`hours`/`hour`/`h`, `minutes`/`minute`/`m`, or `seconds`/`second`/`s`), if none is specified then only the date will be displayed | None //! //! //! ## `duration`/`dur` - Format durations diff --git a/src/formatting/formatter/datetime.rs b/src/formatting/formatter/datetime.rs index 77a3361631..95ba4e2df1 100644 --- a/src/formatting/formatter/datetime.rs +++ b/src/formatting/formatter/datetime.rs @@ -12,7 +12,7 @@ make_log_macro!(error, "datetime"); const DEFAULT_DATETIME_FORMAT: &str = "%a %d/%m %R"; pub static DEFAULT_DATETIME_FORMATTER: LazyLock = - LazyLock::new(|| DatetimeFormatter::new(Some(DEFAULT_DATETIME_FORMAT), None).unwrap()); + LazyLock::new(|| DatetimeFormatter::new(Some(DEFAULT_DATETIME_FORMAT), None, None).unwrap()); #[derive(Debug)] pub enum DatetimeFormatter { @@ -22,8 +22,8 @@ pub enum DatetimeFormatter { }, #[cfg(feature = "icu_calendar")] Icu { - length: icu_datetime::options::length::Date, - locale: icu_locid::Locale, + fieldset: icu_datetime::fieldsets::enums::CompositeDateTimeFieldSet, + locale: icu_locale_core::Locale, }, } @@ -31,6 +31,7 @@ impl DatetimeFormatter { pub(super) fn from_args(args: &[Arg]) -> Result { let mut format = None; let mut locale = None; + let mut precision = None; for arg in args { match arg.key { "format" | "f" => { @@ -39,6 +40,9 @@ impl DatetimeFormatter { "locale" | "l" => { locale = Some(arg.val.error("locale must be specified")?); } + "precision" | "p" => { + precision = Some(arg.val.error("precision must be specified")?); + } other => { return Err(Error::new(format!( "Unknown argument for 'datetime': '{other}'" @@ -46,30 +50,73 @@ impl DatetimeFormatter { } } } - Self::new(format, locale) + Self::new(format, locale, precision) } - fn new(format: Option<&str>, locale: Option<&str>) -> Result { + fn new(format: Option<&str>, locale: Option<&str>, precision: Option<&str>) -> Result { let (items, locale) = match locale { Some(locale) => { #[cfg(feature = "icu_calendar")] let Ok(locale) = locale.try_into() else { - use std::str::FromStr as _; // try with icu4x - let locale = icu_locid::Locale::from_str(locale) + use icu_datetime::fieldsets::{ + self, + enums::{CompositeDateTimeFieldSet, DateAndTimeFieldSet, DateFieldSet}, + }; + use icu_datetime::options::{Length, TimePrecision}; + use std::str::FromStr as _; + + let precision = match precision { + Some("seconds" | "second" | "s") => Some(TimePrecision::Second), + Some("minutes" | "minute" | "m") => Some(TimePrecision::Minute), + Some("hours" | "hour" | "h") => Some(TimePrecision::Hour), + None => None, + _ => Err(Error::new("Invalid precision value"))?, + }; + let locale = icu_locale_core::Locale::from_str(locale) .ok() .error("invalid locale")?; - let length = match format { - Some("full") => icu_datetime::options::length::Date::Full, - None | Some("long") => icu_datetime::options::length::Date::Long, - Some("medium") => icu_datetime::options::length::Date::Medium, - Some("short") => icu_datetime::options::length::Date::Short, - _ => return Err(Error::new("Unknown format option for icu based locale")), + let fieldset = match format { + Some("full") => match precision { + Some(precision) => { + CompositeDateTimeFieldSet::DateTime(DateAndTimeFieldSet::YMDET( + fieldsets::YMDET::long().with_time_precision(precision), + )) + } + None => CompositeDateTimeFieldSet::Date(DateFieldSet::YMDE( + fieldsets::YMDE::long(), + )), + }, + length => { + let length = match length { + Some("short") => Length::Short, + Some("medium") => Length::Medium, + Some("long") | None => Length::Long, + _ => Err(Error::new("Invalid length value"))?, + }; + match precision { + Some(precision) => { + CompositeDateTimeFieldSet::DateTime(DateAndTimeFieldSet::YMDT( + fieldsets::YMDT::for_length(length) + .with_time_precision(precision), + )) + } + None => CompositeDateTimeFieldSet::Date(DateFieldSet::YMD( + fieldsets::YMD::for_length(length), + )), + } + } }; - return Ok(Self::Icu { locale, length }); + + return Ok(Self::Icu { locale, fieldset }); }; #[cfg(not(feature = "icu_calendar"))] let locale = locale.try_into().ok().error("invalid locale")?; + if precision.is_some() { + return Err(Error::new( + "`precision` is only available for icu datetimes", + )); + } ( StrftimeItems::new_with_locale( format.unwrap_or(DEFAULT_DATETIME_FORMAT), @@ -78,10 +125,17 @@ impl DatetimeFormatter { Some(locale), ) } - None => ( - StrftimeItems::new(format.unwrap_or(DEFAULT_DATETIME_FORMAT)), - None, - ), + None => { + if precision.is_some() { + return Err(Error::new( + "`precision` is only available for icu datetimes", + )); + } + ( + StrftimeItems::new(format.unwrap_or(DEFAULT_DATETIME_FORMAT)), + None, + ) + } }; Ok(Self::Chrono { @@ -164,23 +218,30 @@ impl Formatter for DatetimeFormatter { } } #[cfg(feature = "icu_calendar")] - DatetimeFormatter::Icu { locale, length } => { - use chrono::Datelike as _; - let date = icu_calendar::Date::try_new_iso_date( - datetime.year(), - datetime.month() as u8, - datetime.day() as u8, - ) - .ok() - .error("Current date should be a valid date")?; - let date = date.to_any(); - let dft = - icu_datetime::DateFormatter::try_new_with_length(&locale.into(), *length) - .ok() - .error("locale should be present in compiled data")?; - dft.format_to_string(&date) + DatetimeFormatter::Icu { + locale, + fieldset: length, + } => { + use chrono::{Datelike as _, Timelike as _}; + let datetime = icu_datetime::input::DateTime { + date: icu_datetime::input::Date::try_new_iso( + datetime.year(), + datetime.month() as u8, + datetime.day() as u8, + ) + .error("Current date should be a valid date")?, + time: icu_datetime::input::Time::try_new( + datetime.hour() as u8, + datetime.minute() as u8, + datetime.second() as u8, + datetime.nanosecond(), + ) + .error("Current time should be a valid time")?, + }; + let dft = icu_datetime::DateTimeFormatter::try_new(locale.into(), *length) .ok() - .error("formatting date using icu failed")? + .error("locale should be present in compiled data")?; + dft.format(&datetime).to_string() } }) }