Merge "Update toml to 0.8.19" into main
diff --git a/crates/toml/.android-checksum.json b/crates/toml/.android-checksum.json
index 2fa6ba0..244af8b 100644
--- a/crates/toml/.android-checksum.json
+++ b/crates/toml/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"ed1c18522ca0521813573494f165af5d269b35868ff6340b8826bed5a3e9de5c","Android.bp":"807148b0d8d65b5dc7f1055fbe6b3c1738863e3bda709369636f58a7e5dafc75","Cargo.lock":"e0ebe89b99a999b15f65db29d4729b6e5151ad717a2e248a6b6ca32a94b68d16","Cargo.toml":"1ec6907d38acbff1a663f08c4828d68f69142a044a2c0ba6cc4cd87ccb5444ae","LICENSE":"ca8c108c730bc014297428bf42afe28d87791ecc5e7c6302233ab041bc20815b","LICENSE-APACHE":"e4493d0badd82c469fd611cf0c31ea8a74cce85c52c4a4c2579e344226f0602e","LICENSE-MIT":"538f704e6bc384de6dd775d81e9df89f9d718f0e2808a24a789eaa03beb129d3","METADATA":"5fd1c52b74cf5b1f9989a53f3dfb31dae007b7bc54735769863113caf8f2ed22","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"88c1bcea6c3dc175ab2ef2e6b99ba78f98d9470a93f115f4f0da1205ef71428a","cargo_embargo.json":"239d8e8ee49ab8854b0c7e906cc1c6b0f2bdbd081cb19156345a353c69bf93ff","examples/decode.rs":"16df4cdb0d28f075eae95d480fa3bfcf4729b33720d77358133c181ea7b05939","examples/enum_external.rs":"1ccc93149e9157e04e964bb844aaa369aaf6e449208594f2b2df76d885f14be1","examples/toml2json.rs":"aec95608ef2ef5c655404e5ab27918dad3a94a251ab67c8a385a8ac8a3dad488","patches/LICENSE.patch":"67bfc7706d9a957a3b06ec11a323c95eb50826cec49c1749ed0fc3581bef2299","src/de.rs":"1c5bbd16e20d7817fd57b2a75a3b8821c3f18d09b9003ab72098b49ff1463e7b","src/edit.rs":"fa7d7c416425e41ead117721ded65aa202647acced6e4a0d2adb522184242068","src/fmt.rs":"24069082b6fab0cde8516df4e8fd40fdb4d88bda77a5cd7a4b32326a7cb6e99c","src/lib.rs":"98ff092c5c5efdb6de4105c827dc4e2e8cba2b11d925548cc9ba048b736a77fa","src/macros.rs":"8346a51d6490052ed75246d034aaf5b19141c89d35f25ee58014fc21b096e3d5","src/map.rs":"1fc8f234df86a651a88260635a38428c60efd7ab470f80fd58fdb879be7a4a5a","src/ser.rs":"2a96efc34e9d5338321252c3101bced8941015472b521475d11e68fc0d5631c4","src/table.rs":"faa6de32a49afa6dba904e7954d132a7ac14eaf14af2b96d507339c4654c9b53","src/value.rs":"92348270c77aba2a1debdbaaf538751edbd739b2816e5b5a6640248580d29ed4","tests/decoder.rs":"92dd7b7ecb62486ce629f642822dbfe58baa4c9884e80a711e475bc7b73e98e6","tests/decoder_compliance.rs":"a07e99d9d125a460a048d7340ce3c9214ac7d9c93f982c4f827bb0caafb26803","tests/encoder.rs":"1e538845c38f8731474a9b5339c03c1916d421043d622539e43942e2b815e1b0","tests/encoder_compliance.rs":"587f8a8a7faf3f81b6bbef4c6a5ecf723fcea0b82b706db7d3cdb8f251aef804","tests/testsuite/de_errors.rs":"8167099b34ea9fdbc24934dbc56f7c1634798c29108d8e9348524a0e29ac07f9","tests/testsuite/display.rs":"07f35baf286775b08070f3319eaa205368ff495b8d3af06c84a4d1049845273a","tests/testsuite/display_tricky.rs":"39d3c1182376517f575df3897bfdc4c9478d442c3d2ddf49c13a1a90ffedf611","tests/testsuite/enum_external_deserialize.rs":"49cdcebf6aa274745f3f7d6eeb35905d27948339a30d1dabd7d286e929f5ac74","tests/testsuite/float.rs":"c2bfceade5ee18e87bef6e20696b533bff3249441b4d3d2820c54d874542868c","tests/testsuite/formatting.rs":"39796affb2f0d5dc28b536b5eeea7800944e1cbbd1f20ab8a0fb01a9e541e484","tests/testsuite/macros.rs":"d02c01593fb379f42da155cbf26054061328feb485966207ead8329ad93b9552","tests/testsuite/main.rs":"b2b919ee6c39999e014793461677f5e3342f4352cfdccff871ca6e295ce62613","tests/testsuite/pretty.rs":"2a7dac71a9584e783b45444ba16310b4b016f96709bd8e21b04f97f35a9f1106","tests/testsuite/serde.rs":"baa8c35ed0bfaf295b719179dccf39092e1a58622986c594a4ad129e18d6944a","tests/testsuite/spanned.rs":"a064ba02c8e473d950429ad72cbafff62f70def9a01cbf3ada9e6f6266d80c83","tests/testsuite/spanned_impls.rs":"019aedd5e31d72edd1a1697b745f5c2fecf28a71204810a9a74f03b30c5662ac","tests/testsuite/tables_last.rs":"4774c76ed7569f9bc80ad0f84708ebc4f156a8c2c69c1722b155ecefb1fd235d"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"8d998aa2aafc5b97bac79ef3720ca2b3e8721cd907ce4e53ced21043862a9564","Android.bp":"11d60a1dbab17e9a52a211ab4236e1d0ab217aebb39c23537b6e5f707f5c483a","Cargo.lock":"a87a8d00b7e1d43b03ec61b564d77941567fbaa6c7a132c3b583f7681bc39911","Cargo.toml":"0537aaa2e1ea61c9491175c67884623158200fa33403bc7dd2aa92dd64cb7b58","LICENSE":"ca8c108c730bc014297428bf42afe28d87791ecc5e7c6302233ab041bc20815b","LICENSE-APACHE":"e4493d0badd82c469fd611cf0c31ea8a74cce85c52c4a4c2579e344226f0602e","LICENSE-MIT":"538f704e6bc384de6dd775d81e9df89f9d718f0e2808a24a789eaa03beb129d3","METADATA":"f4e9e6126788c7568fb074f760737bcba4f1352ae8f6c11a50a4d38892908f59","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"88c1bcea6c3dc175ab2ef2e6b99ba78f98d9470a93f115f4f0da1205ef71428a","cargo_embargo.json":"239d8e8ee49ab8854b0c7e906cc1c6b0f2bdbd081cb19156345a353c69bf93ff","examples/decode.rs":"16df4cdb0d28f075eae95d480fa3bfcf4729b33720d77358133c181ea7b05939","examples/enum_external.rs":"1ccc93149e9157e04e964bb844aaa369aaf6e449208594f2b2df76d885f14be1","examples/toml2json.rs":"7d8b8b1a41a7e6bdab780747c2b827a02279123a0660c692c75d1d8cb1478d81","patches/LICENSE.patch":"67bfc7706d9a957a3b06ec11a323c95eb50826cec49c1749ed0fc3581bef2299","src/de.rs":"c7422c2db6e13e2a6dc76e527a8dffef0c3509076c89a8323ca8e88a0025c05c","src/edit.rs":"fa7d7c416425e41ead117721ded65aa202647acced6e4a0d2adb522184242068","src/fmt.rs":"f2ebad7e60510f9c392f1d018af07e3c5a953106e0e826d9267f801a4de2876c","src/lib.rs":"a848ae0391d55ab2417788215df587a1df4e7504b5d924cc4839ca51951a6ef3","src/macros.rs":"7ca07c3aede6b376e5abc709bbb89dfe4559ae95efec1de0522736342d9d2ea8","src/map.rs":"4edddb4dbd3ab5ed59578ee5871b0b0cd32f3989c3123b64f6705b7990548abb","src/ser.rs":"d127e7d56281a28b919d1fef539a946ead205aa7a4b98087b00fc7e295cb2189","src/table.rs":"faa6de32a49afa6dba904e7954d132a7ac14eaf14af2b96d507339c4654c9b53","src/value.rs":"81466e4b3ac24cb848519da5028cd0526639ff5903b0b0e2db5f7df07d1f48f2","tests/decoder.rs":"04ec9cc023c26e03c4e3b09a45b1f1df5d2db74800558bbd6bdda675a5485af3","tests/decoder_compliance.rs":"a07e99d9d125a460a048d7340ce3c9214ac7d9c93f982c4f827bb0caafb26803","tests/encoder.rs":"8041caf86be24bfa88525aa042da7351c4b5309d7563f0c4a3802ddea32440b2","tests/encoder_compliance.rs":"587f8a8a7faf3f81b6bbef4c6a5ecf723fcea0b82b706db7d3cdb8f251aef804","tests/testsuite/de_errors.rs":"4c1507c90789ed16221183b8a2dadfedcd792496beb87a8559dfa182333fa14d","tests/testsuite/display.rs":"a408a3147cd33151de032f539c503e788815c6877629aaff4155683a19fbf50a","tests/testsuite/display_tricky.rs":"8fd273503b20fee0b647f6d6203db194e921b36dd14e7ea9b66a7932c0c52570","tests/testsuite/enum_external_deserialize.rs":"21db0f2a324b27ca1968f1e6da67323d244e173599c0d98ee5d7a9b63bfb0703","tests/testsuite/float.rs":"c2bfceade5ee18e87bef6e20696b533bff3249441b4d3d2820c54d874542868c","tests/testsuite/formatting.rs":"bde71ab906aa662548410f158a995865f21468568ef7778f101a5d4656f0f147","tests/testsuite/macros.rs":"0e2b6f9f91ae632b8c599fc6ee6d1310cf263c7b3eac45d749fced4d76312814","tests/testsuite/main.rs":"b2b919ee6c39999e014793461677f5e3342f4352cfdccff871ca6e295ce62613","tests/testsuite/pretty.rs":"5f14338143929d733c37e51c98cf9ae69325d23d64e830fc8b34f0e840a4883c","tests/testsuite/serde.rs":"47e86e84fe0b8eb2ca244e6279e9cba5bd1a6d2e1c71fc82aa5d9ce235706f0e","tests/testsuite/spanned.rs":"22601496dc92f9805bd61348bbff7b39e9bf5082b932230c2bb3838e08c8491e","tests/testsuite/spanned_impls.rs":"019aedd5e31d72edd1a1697b745f5c2fecf28a71204810a9a74f03b30c5662ac","tests/testsuite/tables_last.rs":"530915b4b0999eaa711036fc0004ed5fc54f9f441a312de7220507de4f111688"}}
\ No newline at end of file
diff --git a/crates/toml/.cargo-checksum.json b/crates/toml/.cargo-checksum.json
index 5cf73e9..94e482f 100644
--- a/crates/toml/.cargo-checksum.json
+++ b/crates/toml/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.lock":"e9ac6868f92eaf3b5e08a5aee959fe88371579dfa2cd3b174767a697078ca874","Cargo.toml":"29bd75a7c5312f6925a1d1d23e926d348110f02cbf4d9a71e167b44bcbb4015f","LICENSE-APACHE":"c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08","LICENSE-MIT":"6efb0476a1cc085077ed49357026d8c173bf33017278ef440f222fb9cbcb66e6","README.md":"a915ead738822da2d74b883c7519d8e558299286bb823e26c7fdece901c3267e","examples/decode.rs":"ebb019364720589b634fa47a3fc4c8ca7ae14c9a6df8c89cd086e421d442cd77","examples/enum_external.rs":"4878e249aa095264c7824fc7b6fd30f9b0ec6891b16fff734a0490d906e1abbe","examples/toml2json.rs":"f69cf930e7e16f57288c27a57de5bf8e4f991abb483114a6c226ac5a3bddef44","src/de.rs":"faf32d0e29f8140c1b62f175dffa3ac4ffbf13034b74222a9c26d0477cd2e2a3","src/edit.rs":"52f1959a6e5c177097372ea04439662262960f2eb41c2b9ef0ce9ce77ed43f60","src/fmt.rs":"eb19258f004a403da7fd310b30c8964bdf5867ecd145bf4fcba708af51cb378f","src/lib.rs":"21982e43114486005dd9a1d31b7e5da425b3fea0e724a437d89fe42d674b4696","src/macros.rs":"a2f320170bfc8e59e5dfda129bb953a15d8efc6b622c3894dce87db541ede413","src/map.rs":"7a1b97ee1a2ab3fa933d24497066191a6760d118e6e4c8ba42cc891e4668c177","src/ser.rs":"f9c91c2f70c42152531143ae231c6130e4ce930c97b378011e5595ea123ff31b","src/table.rs":"7402b17dbb8d956a321af74df6f62b3eed0b7e500b7faa22337633857bf20fa6","src/value.rs":"1fb23e59a61456a3ec5fa1727674b28eb1141e9e056cdeb794ec2647c4a55b71","tests/decoder.rs":"114e708adc1467c03212e52e2ffef42d08233ab74f69c553a6db73ddbb874414","tests/decoder_compliance.rs":"b0ed26b0762d8dfc23532efb724789366ca343f7354a76216b3fb426c6915e5a","tests/encoder.rs":"4c2430ad514fe64e28b89d0bd7ad7d299fbda8df903304ddcda704ce5db20382","tests/encoder_compliance.rs":"eeaa92f9cb4ee008830006e78277dfea9c041bc923a0ef5538d79aeb95f022c0","tests/testsuite/de_errors.rs":"1bc8521181f9fbe884db3313a8e8a044b4a1cf4b8956530a3cc8be9bcb5468f8","tests/testsuite/display.rs":"164de8f7108ce1055159a19884d23f770bd25cf0ead6b23f6ff4340931c7afc5","tests/testsuite/display_tricky.rs":"9806743d670e5cc46ee0ffda3f4c1f8ac63ee1e702250f07b7cd2098750d25d1","tests/testsuite/enum_external_deserialize.rs":"28b4705d904b58a973ef27c6cdc948f8d404105f98a55efa111cce9e7b4b1a67","tests/testsuite/float.rs":"6be604bb11adb315ad01fdf7117db620508d38caedaaea63e777d7ed2e5e4973","tests/testsuite/formatting.rs":"3b279ab1f24ebeb07537764107c42be9a84731ead1a88596785186777aafd1ee","tests/testsuite/macros.rs":"cf99ad3b191b68e044d0b01aa01ae959ed8b98ae466b9b0491bae1939af3832c","tests/testsuite/main.rs":"4e40c82147ccfc7094f2c4795b51b575c7d231a7da75814a08fd8e0c52d93f8b","tests/testsuite/pretty.rs":"e03df1f3ebe5bb98f6cc0888f0c6bcdcdb92c9c7ea2cd5acaa33ca751bf260e7","tests/testsuite/serde.rs":"a292fcdf4f2b9d1cd2d5476db770d8d5a15fdc990c0dada4a02e3515733cb5db","tests/testsuite/spanned.rs":"b7522afd8101ba5dd539118a43bccefef66fedef41926d9515f67590961ac7e3","tests/testsuite/spanned_impls.rs":"666c65679365451f67234d50bb3198ac52418ad7ef1dae6916faba78f92c9d02","tests/testsuite/tables_last.rs":"42271f9df94b28f36b934686d4a5c6196140a2975733d1344b6415cb9f1b92ed"},"package":"9a9aad4a3066010876e8dcf5a8a06e70a558751117a145c6ce2b82c2e2054290"}
\ No newline at end of file
+{"files":{"Cargo.lock":"f4b3b23a7222cc98e424c53c8b1c7db2542b4deece22b970b4041d83f5f226c7","Cargo.toml":"aaad74d52b869b6494de6a2ea5b9bda57ae06248a3adb67f2332a8b82758ca6d","LICENSE-APACHE":"c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08","LICENSE-MIT":"6efb0476a1cc085077ed49357026d8c173bf33017278ef440f222fb9cbcb66e6","README.md":"a915ead738822da2d74b883c7519d8e558299286bb823e26c7fdece901c3267e","examples/decode.rs":"ebb019364720589b634fa47a3fc4c8ca7ae14c9a6df8c89cd086e421d442cd77","examples/enum_external.rs":"4878e249aa095264c7824fc7b6fd30f9b0ec6891b16fff734a0490d906e1abbe","examples/toml2json.rs":"ef8a783e525264faec4e6c6087a37c6310b606119a7a5785548e8981ea129ed2","src/de.rs":"bd3c1b35e5bdc796d1cbff1f2bdd4e6d4c3a4ef9f34c7dcb775ce8236e45b965","src/edit.rs":"52f1959a6e5c177097372ea04439662262960f2eb41c2b9ef0ce9ce77ed43f60","src/fmt.rs":"b6b14bcfaaf6a283d0bdc7b43d9d13c127cf94c9de41efb4a3a9e1eb02bdc799","src/lib.rs":"78c26d36a5c2b888470f8eaacede1841662edf372143b76af0283a1fc1f9f528","src/macros.rs":"a7214ed97b1c15391748a3d5b904b31963130ee19ecd6ed3dc705649737f3b29","src/map.rs":"18a0bf5677441514d0a9dbf29beeaf7f797f95a1ba566d845f2b90e3b14722c8","src/ser.rs":"b5cbb35af51ffb8975306e76df19ea64951bc97a28857d696aaeb2251cdcd93f","src/table.rs":"7402b17dbb8d956a321af74df6f62b3eed0b7e500b7faa22337633857bf20fa6","src/value.rs":"74c0596230bcf88483005a8907f875e32f5eab29d538cd78ad39031919884596","tests/decoder.rs":"3036f5963c8c547dc47121188a8b7ebaacb154025ca641f3281a3881bdcf7605","tests/decoder_compliance.rs":"b0ed26b0762d8dfc23532efb724789366ca343f7354a76216b3fb426c6915e5a","tests/encoder.rs":"06d4325dc35f4fd40571d8ae50fb86c0ca0bb216aa407497950d01097fdbf043","tests/encoder_compliance.rs":"eeaa92f9cb4ee008830006e78277dfea9c041bc923a0ef5538d79aeb95f022c0","tests/testsuite/de_errors.rs":"2ceb148f1f80ac42b88804dae7cca02c724010917570a08f484e5a7ccd922d95","tests/testsuite/display.rs":"1ae6faac1f1a9a53b14ce0c0bd2c16618d0e42afbf6f92d8107ca944c9abac57","tests/testsuite/display_tricky.rs":"e1b5007506e4f52eb73024c889b36f54694e9d955a737cd2e48a99657691fe21","tests/testsuite/enum_external_deserialize.rs":"4136d1c42dd4c255bb4d6b01e4072c6575a3a2f93d8da31aa18b954b321b3aa7","tests/testsuite/float.rs":"6be604bb11adb315ad01fdf7117db620508d38caedaaea63e777d7ed2e5e4973","tests/testsuite/formatting.rs":"58d469e194e34f04e526db62cebd381dd096115d81b98a4dcbe8d801fc250142","tests/testsuite/macros.rs":"31a083541fab24554fce1f8529f047af6f20f25a5ffa3e9a9b115f5a8ef23080","tests/testsuite/main.rs":"4e40c82147ccfc7094f2c4795b51b575c7d231a7da75814a08fd8e0c52d93f8b","tests/testsuite/pretty.rs":"596c42698dcd727d1111689d64bad925b7111c536a7e608c75e7b8d82c26b413","tests/testsuite/serde.rs":"84355f892999dc4105752a8835664b8e696830fe1793d81bad7dcfda745dfa3f","tests/testsuite/spanned.rs":"6008e2c9fd82e4df6f307f88bd1169b1c0413f75d0f3975fcce05ebdd9f6094a","tests/testsuite/spanned_impls.rs":"666c65679365451f67234d50bb3198ac52418ad7ef1dae6916faba78f92c9d02","tests/testsuite/tables_last.rs":"0fdc71c450d6187a2dfc2de84d213eb867db9673f84e655c2322f95615a41a87"},"package":"a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e"}
\ No newline at end of file
diff --git a/crates/toml/Android.bp b/crates/toml/Android.bp
index 97ce950..560ad03 100644
--- a/crates/toml/Android.bp
+++ b/crates/toml/Android.bp
@@ -17,7 +17,7 @@
     name: "libtoml",
     crate_name: "toml",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.8.10",
+    cargo_pkg_version: "0.8.19",
     crate_root: "src/lib.rs",
     edition: "2021",
     features: [
diff --git a/crates/toml/Cargo.lock b/crates/toml/Cargo.lock
index 1cc97be..84fb9f5 100644
--- a/crates/toml/Cargo.lock
+++ b/crates/toml/Cargo.lock
@@ -4,88 +4,102 @@
 
 [[package]]
 name = "aho-corasick"
-version = "0.7.19"
+version = "1.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e"
+checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
 dependencies = [
  "memchr",
 ]
 
 [[package]]
 name = "anstream"
-version = "0.3.1"
+version = "0.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6342bd4f5a1205d7f41e94a41a901f5647c938cdfa96036338e8533c9d6c2450"
+checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163"
 dependencies = [
  "anstyle",
  "anstyle-parse",
  "anstyle-query",
- "anstyle-wincon",
+ "anstyle-wincon 1.0.2",
  "colorchoice",
  "is-terminal",
  "utf8parse",
 ]
 
 [[package]]
-name = "anstyle"
-version = "1.0.0"
+name = "anstream"
+version = "0.6.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d"
+checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b"
+dependencies = [
+ "anstyle",
+ "anstyle-parse",
+ "anstyle-query",
+ "anstyle-wincon 3.0.3",
+ "colorchoice",
+ "is_terminal_polyfill",
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b"
 
 [[package]]
 name = "anstyle-parse"
-version = "0.2.0"
+version = "0.2.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee"
+checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4"
 dependencies = [
  "utf8parse",
 ]
 
 [[package]]
 name = "anstyle-query"
-version = "1.0.0"
+version = "1.0.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b"
+checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5"
 dependencies = [
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
 name = "anstyle-wincon"
-version = "1.0.1"
+version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188"
+checksum = "c677ab05e09154296dd37acecd46420c17b9713e8366facafa8fc0885167cf4c"
 dependencies = [
  "anstyle",
  "windows-sys 0.48.0",
 ]
 
 [[package]]
-name = "autocfg"
-version = "1.1.0"
+name = "anstyle-wincon"
+version = "3.0.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
-
-[[package]]
-name = "bitflags"
-version = "1.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
-
-[[package]]
-name = "bstr"
-version = "0.2.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223"
+checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19"
 dependencies = [
- "memchr",
+ "anstyle",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
-name = "cc"
-version = "1.0.73"
+name = "autocfg"
+version = "1.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11"
+checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
+
+[[package]]
+name = "bstr"
+version = "1.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706"
+dependencies = [
+ "memchr",
+ "serde",
+]
 
 [[package]]
 name = "cfg-if"
@@ -95,147 +109,112 @@
 
 [[package]]
 name = "chrono"
-version = "0.4.22"
+version = "0.4.38"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfd4d1b31faaa3a89d7934dbded3111da0d2ef28e3ebccdb4f0179f5929d1ef1"
+checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401"
 dependencies = [
- "num-integer",
  "num-traits",
 ]
 
 [[package]]
 name = "clap"
-version = "4.0.32"
+version = "4.3.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7db700bc935f9e43e88d00b0850dae18a63773cfbec6d8e070fccf7fef89a39"
+checksum = "fb690e81c7840c0d7aade59f242ea3b41b9bc27bcd5997890e7702ae4b32e487"
 dependencies = [
- "bitflags",
+ "clap_builder",
  "clap_derive",
- "clap_lex",
- "is-terminal",
  "once_cell",
+]
+
+[[package]]
+name = "clap_builder"
+version = "4.3.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ed2e96bc16d8d740f6f48d663eddf4b8a0983e79210fd55479b7bcd0a69860e"
+dependencies = [
+ "anstream 0.3.2",
+ "anstyle",
+ "clap_lex",
  "strsim",
- "termcolor",
 ]
 
 [[package]]
 name = "clap_derive"
-version = "4.0.21"
+version = "4.3.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0177313f9f02afc995627906bbd8967e2be069f5261954222dac78290c2b9014"
+checksum = "54a9bb5758fc5dfe728d1019941681eccaf0cf8a4189b692a0ee2f2ecf90a050"
 dependencies = [
  "heck",
- "proc-macro-error",
  "proc-macro2",
  "quote",
- "syn 1.0.105",
+ "syn",
 ]
 
 [[package]]
 name = "clap_lex"
-version = "0.3.0"
+version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d4198f73e42b4936b35b5bb248d81d2b595ecb170da0bac7655c54eedfa8da8"
-dependencies = [
- "os_str_bytes",
-]
+checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b"
 
 [[package]]
 name = "colorchoice"
-version = "1.0.0"
+version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
-
-[[package]]
-name = "crossbeam-utils"
-version = "0.8.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc"
-dependencies = [
- "cfg-if",
- "once_cell",
-]
+checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422"
 
 [[package]]
 name = "equivalent"
-version = "1.0.0"
+version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88bffebc5d80432c9b140ee17875ff173a8ab62faad5b257da912bd2f6c1c0a1"
+checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
 
 [[package]]
-name = "errno"
-version = "0.3.1"
+name = "escape8259"
+version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
+checksum = "ba4f4911e3666fcd7826997b4745c8224295a6f3072f1418c3067b97a67557ee"
 dependencies = [
- "errno-dragonfly",
- "libc",
- "windows-sys 0.48.0",
+ "rustversion",
 ]
 
 [[package]]
-name = "errno-dragonfly"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
-dependencies = [
- "cc",
- "libc",
-]
-
-[[package]]
-name = "fnv"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
-
-[[package]]
 name = "globset"
-version = "0.4.9"
+version = "0.4.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a1e17342619edbc21a964c2afbeb6c820c6a2560032872f397bb97ea127bd0a"
+checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1"
 dependencies = [
  "aho-corasick",
  "bstr",
- "fnv",
  "log",
- "regex",
+ "regex-automata",
+ "regex-syntax",
 ]
 
 [[package]]
 name = "hashbrown"
-version = "0.14.0"
+version = "0.14.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a"
+checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
 
 [[package]]
 name = "heck"
-version = "0.4.0"
+version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9"
+checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
 
 [[package]]
 name = "hermit-abi"
-version = "0.1.19"
+version = "0.3.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "hermit-abi"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286"
+checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
 
 [[package]]
 name = "ignore"
-version = "0.4.18"
+version = "0.4.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "713f1b139373f96a2e0ce3ac931cd01ee973c3c5dd7c40c0c2efe96ad2b6751d"
+checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492"
 dependencies = [
- "crossbeam-utils",
  "globset",
  "lazy_static",
  "log",
@@ -268,41 +247,39 @@
 
 [[package]]
 name = "indexmap"
-version = "2.0.0"
+version = "2.2.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d"
+checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
 dependencies = [
  "equivalent",
  "hashbrown",
 ]
 
 [[package]]
-name = "io-lifetimes"
-version = "1.0.3"
+name = "is-terminal"
+version = "0.4.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46112a93252b123d31a119a8d1a1ac19deac4fac6e0e8b0df58f0d4e5870e63c"
+checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b"
 dependencies = [
+ "hermit-abi",
  "libc",
- "windows-sys 0.42.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
-name = "is-terminal"
-version = "0.4.7"
+name = "is_terminal_polyfill"
+version = "1.48.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f"
+checksum = "b52b2de84ed0341893ce61ca1af04fa54eea0a764ecc38c6855cc5db84dc1927"
 dependencies = [
- "hermit-abi 0.3.1",
- "io-lifetimes",
- "rustix",
- "windows-sys 0.48.0",
+ "is-terminal",
 ]
 
 [[package]]
 name = "itoa"
-version = "1.0.3"
+version = "1.0.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754"
+checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
 
 [[package]]
 name = "lazy_static"
@@ -312,41 +289,33 @@
 
 [[package]]
 name = "libc"
-version = "0.2.142"
+version = "0.2.154"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317"
+checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346"
 
 [[package]]
 name = "libtest-mimic"
-version = "0.6.0"
+version = "0.7.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7b603516767d1ab23d0de09d023e62966c3322f7148297c35cf3d97aa8b37fa"
+checksum = "cc0bda45ed5b3a2904262c1bb91e526127aa70e7ef3758aba2ef93cf896b9b58"
 dependencies = [
  "clap",
+ "escape8259",
  "termcolor",
  "threadpool",
 ]
 
 [[package]]
-name = "linux-raw-sys"
-version = "0.3.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b64f40e5e03e0d54f03845c8197d0291253cdbedfb1cb46b13c2c117554a9f4c"
-
-[[package]]
 name = "log"
-version = "0.4.17"
+version = "0.4.21"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
-dependencies = [
- "cfg-if",
-]
+checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c"
 
 [[package]]
 name = "memchr"
-version = "2.5.0"
+version = "2.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
 
 [[package]]
 name = "normalize-line-endings"
@@ -355,93 +324,65 @@
 checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be"
 
 [[package]]
-name = "num-integer"
-version = "0.1.45"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
-dependencies = [
- "autocfg",
- "num-traits",
-]
-
-[[package]]
 name = "num-traits"
-version = "0.2.15"
+version = "0.2.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
+checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
 dependencies = [
  "autocfg",
 ]
 
 [[package]]
 name = "num_cpus"
-version = "1.13.1"
+version = "1.16.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1"
+checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
 dependencies = [
- "hermit-abi 0.1.19",
+ "hermit-abi",
  "libc",
 ]
 
 [[package]]
 name = "once_cell"
-version = "1.15.0"
+version = "1.19.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1"
-
-[[package]]
-name = "os_str_bytes"
-version = "6.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff"
-
-[[package]]
-name = "proc-macro-error"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
-dependencies = [
- "proc-macro-error-attr",
- "proc-macro2",
- "quote",
- "syn 1.0.105",
- "version_check",
-]
-
-[[package]]
-name = "proc-macro-error-attr"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
-dependencies = [
- "proc-macro2",
- "quote",
- "version_check",
-]
+checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.67"
+version = "1.0.82"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328"
+checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b"
 dependencies = [
  "unicode-ident",
 ]
 
 [[package]]
 name = "quote"
-version = "1.0.33"
+version = "1.0.36"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
+checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
 dependencies = [
  "proc-macro2",
 ]
 
 [[package]]
 name = "regex"
-version = "1.6.0"
+version = "1.10.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b"
+checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea"
 dependencies = [
  "aho-corasick",
  "memchr",
@@ -450,29 +391,21 @@
 
 [[package]]
 name = "regex-syntax"
-version = "0.6.27"
+version = "0.8.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244"
+checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56"
 
 [[package]]
-name = "rustix"
-version = "0.37.7"
+name = "rustversion"
+version = "1.0.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2aae838e49b3d63e9274e1c01833cc8139d3fec468c3b84688c628f44b1ae11d"
-dependencies = [
- "bitflags",
- "errno",
- "io-lifetimes",
- "libc",
- "linux-raw-sys",
- "windows-sys 0.45.0",
-]
+checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6"
 
 [[package]]
 name = "ryu"
-version = "1.0.15"
+version = "1.0.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
+checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
 
 [[package]]
 name = "same-file"
@@ -485,29 +418,29 @@
 
 [[package]]
 name = "serde"
-version = "1.0.193"
+version = "1.0.203"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89"
+checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.193"
+version = "1.0.203"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3"
+checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.41",
+ "syn",
 ]
 
 [[package]]
 name = "serde_json"
-version = "1.0.96"
+version = "1.0.119"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1"
+checksum = "e8eddb61f0697cc3989c5d64b452f5488e2b8a60fd7d5076a3045076ffef8cb0"
 dependencies = [
  "itoa",
  "ryu",
@@ -516,26 +449,26 @@
 
 [[package]]
 name = "serde_spanned"
-version = "0.6.5"
+version = "0.6.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1"
+checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d"
 dependencies = [
  "serde",
 ]
 
 [[package]]
 name = "similar"
-version = "2.2.0"
+version = "2.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62ac7f900db32bf3fd12e0117dd3dc4da74bc52ebaac97f39668446d89694803"
+checksum = "fa42c91313f1d05da9b26f267f931cf178d4aba455b4c4622dd7355eb80c6640"
 
 [[package]]
 name = "snapbox"
-version = "0.4.11"
+version = "0.6.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f6bccd62078347f89a914e3004d94582e13824d4e3d8a816317862884c423835"
+checksum = "40e14d10e4c2b4331ac24c33baa5a03e1fbca81c045b285b53b2a612d28569fb"
 dependencies = [
- "anstream",
+ "anstream 0.6.14",
  "anstyle",
  "normalize-line-endings",
  "similar",
@@ -544,11 +477,11 @@
 
 [[package]]
 name = "snapbox-macros"
-version = "0.3.4"
+version = "0.3.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eaaf09df9f0eeae82be96290918520214530e738a7fe5a351b0f24cf77c0ca31"
+checksum = "b1f4c14672714436c09254801c934b203196a51182a5107fb76591c7cc56424d"
 dependencies = [
- "anstream",
+ "anstream 0.6.14",
 ]
 
 [[package]]
@@ -559,20 +492,9 @@
 
 [[package]]
 name = "syn"
-version = "1.0.105"
+version = "2.0.63"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60b9b43d45702de4c839cb9b51d9f529c5dd26a4aff255b42b1ebc03e88ee908"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "syn"
-version = "2.0.41"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44c8b28c477cc3bf0e7966561e3460130e1255f7a1cf71931075f1c5e7a7e269"
+checksum = "bf5be731623ca1a1fb7d8be6f261a3be6d3e2337b8a1f97be944d020c8fcb704"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -581,19 +503,20 @@
 
 [[package]]
 name = "termcolor"
-version = "1.1.3"
+version = "1.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755"
+checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755"
 dependencies = [
  "winapi-util",
 ]
 
 [[package]]
 name = "thread_local"
-version = "1.1.4"
+version = "1.1.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180"
+checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c"
 dependencies = [
+ "cfg-if",
  "once_cell",
 ]
 
@@ -608,7 +531,7 @@
 
 [[package]]
 name = "toml"
-version = "0.8.10"
+version = "0.8.19"
 dependencies = [
  "indexmap",
  "serde",
@@ -623,9 +546,9 @@
 
 [[package]]
 name = "toml-test"
-version = "1.0.0"
+version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ec3892835fb31e181a87e1758275a64b0d7c6c9e9618aeb61a647bd487314c0"
+checksum = "f9e26681e9154ffb40044019b6bb374f6ed7fef1e367d3d314f0daf2b00faba9"
 dependencies = [
  "chrono",
  "ryu",
@@ -635,18 +558,18 @@
 
 [[package]]
 name = "toml-test-data"
-version = "1.8.0"
+version = "1.12.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c6b5bad99e813ce8c67d1d67c9b9f37c8451933f45eae0ab2b3583975f1cc15d"
+checksum = "13bb6bf962107303ade738a8f729f4f92c29b2d84c0772cc376f7001602afa1a"
 dependencies = [
  "include_dir",
 ]
 
 [[package]]
 name = "toml-test-harness"
-version = "0.4.8"
+version = "0.4.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1be4b8d761dee51b4694e9f1d622a1d7f9c135a8b8265459e16d09ac5b16a05d"
+checksum = "0ad65271b9325d4727b1afb346e2eb4cade8e998797682da4e73b7b6d902f2b2"
 dependencies = [
  "ignore",
  "libtest-mimic",
@@ -656,18 +579,18 @@
 
 [[package]]
 name = "toml_datetime"
-version = "0.6.5"
+version = "0.6.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1"
+checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
 dependencies = [
  "serde",
 ]
 
 [[package]]
 name = "toml_edit"
-version = "0.22.0"
+version = "0.22.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8dc77def39ce6079c2d0c866cc20848f591b1898f153c9fe7c4f29e1154510b"
+checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d"
 dependencies = [
  "indexmap",
  "serde",
@@ -678,9 +601,9 @@
 
 [[package]]
 name = "unicode-ident"
-version = "1.0.4"
+version = "1.0.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcc811dc4066ac62f84f11307873c4850cb653bfa9b1719cee2bd2204a4bc5dd"
+checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
 
 [[package]]
 name = "utf8parse"
@@ -689,75 +612,22 @@
 checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
 
 [[package]]
-name = "version_check"
-version = "0.9.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
-
-[[package]]
 name = "walkdir"
-version = "2.3.2"
+version = "2.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56"
+checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
 dependencies = [
  "same-file",
- "winapi",
  "winapi-util",
 ]
 
 [[package]]
-name = "winapi"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
-dependencies = [
- "winapi-i686-pc-windows-gnu",
- "winapi-x86_64-pc-windows-gnu",
-]
-
-[[package]]
-name = "winapi-i686-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
-
-[[package]]
 name = "winapi-util"
-version = "0.1.5"
+version = "0.1.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b"
 dependencies = [
- "winapi",
-]
-
-[[package]]
-name = "winapi-x86_64-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
-
-[[package]]
-name = "windows-sys"
-version = "0.42.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
-dependencies = [
- "windows_aarch64_gnullvm 0.42.1",
- "windows_aarch64_msvc 0.42.1",
- "windows_i686_gnu 0.42.1",
- "windows_i686_msvc 0.42.1",
- "windows_x86_64_gnu 0.42.1",
- "windows_x86_64_gnullvm 0.42.1",
- "windows_x86_64_msvc 0.42.1",
-]
-
-[[package]]
-name = "windows-sys"
-version = "0.45.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
-dependencies = [
- "windows-targets 0.42.1",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -766,128 +636,144 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
 dependencies = [
- "windows-targets 0.48.0",
+ "windows-targets 0.48.5",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+dependencies = [
+ "windows-targets 0.52.5",
 ]
 
 [[package]]
 name = "windows-targets"
-version = "0.42.1"
+version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7"
+checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
 dependencies = [
- "windows_aarch64_gnullvm 0.42.1",
- "windows_aarch64_msvc 0.42.1",
- "windows_i686_gnu 0.42.1",
- "windows_i686_msvc 0.42.1",
- "windows_x86_64_gnu 0.42.1",
- "windows_x86_64_gnullvm 0.42.1",
- "windows_x86_64_msvc 0.42.1",
+ "windows_aarch64_gnullvm 0.48.5",
+ "windows_aarch64_msvc 0.48.5",
+ "windows_i686_gnu 0.48.5",
+ "windows_i686_msvc 0.48.5",
+ "windows_x86_64_gnu 0.48.5",
+ "windows_x86_64_gnullvm 0.48.5",
+ "windows_x86_64_msvc 0.48.5",
 ]
 
 [[package]]
 name = "windows-targets"
-version = "0.48.0"
+version = "0.52.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5"
+checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb"
 dependencies = [
- "windows_aarch64_gnullvm 0.48.0",
- "windows_aarch64_msvc 0.48.0",
- "windows_i686_gnu 0.48.0",
- "windows_i686_msvc 0.48.0",
- "windows_x86_64_gnu 0.48.0",
- "windows_x86_64_gnullvm 0.48.0",
- "windows_x86_64_msvc 0.48.0",
+ "windows_aarch64_gnullvm 0.52.5",
+ "windows_aarch64_msvc 0.52.5",
+ "windows_i686_gnu 0.52.5",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc 0.52.5",
+ "windows_x86_64_gnu 0.52.5",
+ "windows_x86_64_gnullvm 0.52.5",
+ "windows_x86_64_msvc 0.52.5",
 ]
 
 [[package]]
 name = "windows_aarch64_gnullvm"
-version = "0.42.1"
+version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608"
+checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
 
 [[package]]
 name = "windows_aarch64_gnullvm"
-version = "0.48.0"
+version = "0.52.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
+checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263"
 
 [[package]]
 name = "windows_aarch64_msvc"
-version = "0.42.1"
+version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7"
+checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
 
 [[package]]
 name = "windows_aarch64_msvc"
-version = "0.48.0"
+version = "0.52.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
+checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6"
 
 [[package]]
 name = "windows_i686_gnu"
-version = "0.42.1"
+version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640"
+checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
 
 [[package]]
 name = "windows_i686_gnu"
-version = "0.48.0"
+version = "0.52.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
+checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9"
 
 [[package]]
 name = "windows_i686_msvc"
-version = "0.42.1"
+version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605"
+checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
 
 [[package]]
 name = "windows_i686_msvc"
-version = "0.48.0"
+version = "0.52.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
+checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf"
 
 [[package]]
 name = "windows_x86_64_gnu"
-version = "0.42.1"
+version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45"
+checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
 
 [[package]]
 name = "windows_x86_64_gnu"
-version = "0.48.0"
+version = "0.52.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
+checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9"
 
 [[package]]
 name = "windows_x86_64_gnullvm"
-version = "0.42.1"
+version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463"
+checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
 
 [[package]]
 name = "windows_x86_64_gnullvm"
-version = "0.48.0"
+version = "0.52.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
+checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596"
 
 [[package]]
 name = "windows_x86_64_msvc"
-version = "0.42.1"
+version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd"
+checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
 
 [[package]]
 name = "windows_x86_64_msvc"
-version = "0.48.0"
+version = "0.52.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
+checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0"
 
 [[package]]
 name = "winnow"
-version = "0.5.0"
+version = "0.6.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81fac9742fd1ad1bd9643b991319f72dd031016d44b77039a26977eb667141e7"
+checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f"
 dependencies = [
  "memchr",
 ]
diff --git a/crates/toml/Cargo.toml b/crates/toml/Cargo.toml
index 77f028d..796cddf 100644
--- a/crates/toml/Cargo.toml
+++ b/crates/toml/Cargo.toml
@@ -11,10 +11,11 @@
 
 [package]
 edition = "2021"
-rust-version = "1.69"
+rust-version = "1.65"
 name = "toml"
-version = "0.8.10"
+version = "0.8.19"
 authors = ["Alex Crichton <[email protected]>"]
+build = false
 include = [
     "build.rs",
     "src/**/*",
@@ -26,6 +27,10 @@
     "examples/**/*",
     "tests/**/*",
 ]
+autobins = false
+autoexamples = false
+autotests = false
+autobenches = false
 description = """
 A native Rust encoder and decoder of TOML-formatted files and streams. Provides
 implementations of the standard Serialize/Deserialize traits for TOML data to
@@ -88,8 +93,13 @@
 [Unreleased]: https://github.com/toml-rs/toml/compare/{{tag_name}}...HEAD"""
 search = "<!-- next-url -->"
 
+[lib]
+name = "toml"
+path = "src/lib.rs"
+
 [[example]]
 name = "decode"
+path = "examples/decode.rs"
 required-features = [
     "parse",
     "display",
@@ -97,6 +107,7 @@
 
 [[example]]
 name = "enum_external"
+path = "examples/enum_external.rs"
 required-features = [
     "parse",
     "display",
@@ -104,19 +115,34 @@
 
 [[example]]
 name = "toml2json"
+path = "examples/toml2json.rs"
 required-features = [
     "parse",
     "display",
 ]
 
 [[test]]
+name = "decoder"
+path = "tests/decoder.rs"
+
+[[test]]
 name = "decoder_compliance"
+path = "tests/decoder_compliance.rs"
 harness = false
 
 [[test]]
+name = "encoder"
+path = "tests/encoder.rs"
+
+[[test]]
 name = "encoder_compliance"
+path = "tests/encoder_compliance.rs"
 harness = false
 
+[[test]]
+name = "testsuite"
+path = "tests/testsuite/main.rs"
+
 [dependencies.indexmap]
 version = "2.0.0"
 optional = true
@@ -125,31 +151,31 @@
 version = "1.0.145"
 
 [dependencies.serde_spanned]
-version = "0.6.5"
+version = "0.6.7"
 features = ["serde"]
 
 [dependencies.toml_datetime]
-version = "0.6.5"
+version = "0.6.8"
 features = ["serde"]
 
 [dependencies.toml_edit]
-version = "0.22.0"
+version = "0.22.20"
 features = ["serde"]
 optional = true
 default-features = false
 
 [dev-dependencies.serde]
-version = "1.0.160"
+version = "1.0.199"
 features = ["derive"]
 
 [dev-dependencies.serde_json]
-version = "1.0.96"
+version = "1.0.116"
 
 [dev-dependencies.snapbox]
-version = "0.4.11"
+version = "0.6.0"
 
 [dev-dependencies.toml-test-data]
-version = "1.8.0"
+version = "1.11.0"
 
 [dev-dependencies.toml-test-harness]
 version = "0.4.8"
@@ -168,3 +194,73 @@
     "toml_edit?/parse",
 ]
 preserve_order = ["indexmap"]
+
+[lints.clippy]
+bool_assert_comparison = "allow"
+branches_sharing_code = "allow"
+checked_conversions = "warn"
+collapsible_else_if = "allow"
+create_dir = "warn"
+dbg_macro = "warn"
+debug_assert_with_mut_call = "warn"
+doc_markdown = "warn"
+empty_enum = "warn"
+enum_glob_use = "warn"
+expl_impl_clone_on_copy = "warn"
+explicit_deref_methods = "warn"
+explicit_into_iter_loop = "warn"
+fallible_impl_from = "warn"
+filter_map_next = "warn"
+flat_map_option = "warn"
+float_cmp_const = "warn"
+fn_params_excessive_bools = "warn"
+from_iter_instead_of_collect = "warn"
+if_same_then_else = "allow"
+implicit_clone = "warn"
+imprecise_flops = "warn"
+inconsistent_struct_constructor = "warn"
+inefficient_to_string = "warn"
+infinite_loop = "warn"
+invalid_upcast_comparisons = "warn"
+large_digit_groups = "warn"
+large_stack_arrays = "warn"
+large_types_passed_by_value = "warn"
+let_and_return = "allow"
+linkedlist = "warn"
+lossy_float_literal = "warn"
+macro_use_imports = "warn"
+mem_forget = "warn"
+mutex_integer = "warn"
+needless_continue = "warn"
+needless_for_each = "warn"
+negative_feature_names = "warn"
+path_buf_push_overwrite = "warn"
+ptr_as_ptr = "warn"
+rc_mutex = "warn"
+redundant_feature_names = "warn"
+ref_option_ref = "warn"
+rest_pat_in_fully_bound_structs = "warn"
+same_functions_in_if_condition = "warn"
+self_named_module_files = "warn"
+semicolon_if_nothing_returned = "warn"
+str_to_string = "warn"
+string_add = "warn"
+string_add_assign = "warn"
+string_lit_as_bytes = "warn"
+string_to_string = "warn"
+todo = "warn"
+trait_duplication_in_bounds = "warn"
+verbose_file_reads = "warn"
+wildcard_imports = "warn"
+zero_sized_map_values = "warn"
+
+[lints.rust]
+unreachable_pub = "warn"
+unsafe_op_in_unsafe_fn = "warn"
+unused_lifetimes = "warn"
+unused_macro_rules = "warn"
+unused_qualifications = "warn"
+
+[lints.rust.rust_2018_idioms]
+level = "warn"
+priority = -1
diff --git a/crates/toml/METADATA b/crates/toml/METADATA
index 9caed4b..0d6645f 100644
--- a/crates/toml/METADATA
+++ b/crates/toml/METADATA
@@ -1,17 +1,17 @@
 name: "toml"
 description: "()"
 third_party {
-  version: "0.8.10"
+  version: "0.8.19"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2024
-    month: 2
-    day: 7
+    year: 2025
+    month: 1
+    day: 15
   }
   homepage: "https://crates.io/crates/toml"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/toml/toml-0.8.10.crate"
-    version: "0.8.10"
+    value: "https://static.crates.io/crates/toml/toml-0.8.19.crate"
+    version: "0.8.19"
   }
 }
diff --git a/crates/toml/examples/toml2json.rs b/crates/toml/examples/toml2json.rs
index 3660611..56a912c 100644
--- a/crates/toml/examples/toml2json.rs
+++ b/crates/toml/examples/toml2json.rs
@@ -1,7 +1,4 @@
-#![deny(warnings)]
-
 use std::env;
-use std::fs::File;
 use std::io;
 use std::io::prelude::*;
 
@@ -10,15 +7,14 @@
 
 fn main() {
     let mut args = env::args();
-    let mut input = String::new();
-    if args.len() > 1 {
+    let input = if args.len() > 1 {
         let name = args.nth(1).unwrap();
-        File::open(name)
-            .and_then(|mut f| f.read_to_string(&mut input))
-            .unwrap();
+        std::fs::read_to_string(name).unwrap()
     } else {
+        let mut input = String::new();
         io::stdin().read_to_string(&mut input).unwrap();
-    }
+        input
+    };
 
     match input.parse() {
         Ok(toml) => {
diff --git a/crates/toml/src/de.rs b/crates/toml/src/de.rs
index 9eb4c41..1a0929e 100644
--- a/crates/toml/src/de.rs
+++ b/crates/toml/src/de.rs
@@ -57,7 +57,7 @@
     }
 
     pub(crate) fn add_key(&mut self, key: String) {
-        self.inner.add_key(key)
+        self.inner.add_key(key);
     }
 
     /// What went wrong
@@ -113,10 +113,7 @@
     where
         V: serde::de::Visitor<'de>,
     {
-        let inner = self
-            .input
-            .parse::<toml_edit::de::Deserializer>()
-            .map_err(Error::new)?;
+        let inner = toml_edit::de::Deserializer::parse(self.input).map_err(Error::new)?;
         inner.deserialize_any(visitor).map_err(Error::new)
     }
 
@@ -126,10 +123,7 @@
     where
         V: serde::de::Visitor<'de>,
     {
-        let inner = self
-            .input
-            .parse::<toml_edit::de::Deserializer>()
-            .map_err(Error::new)?;
+        let inner = toml_edit::de::Deserializer::parse(self.input).map_err(Error::new)?;
         inner.deserialize_option(visitor).map_err(Error::new)
     }
 
@@ -141,10 +135,7 @@
     where
         V: serde::de::Visitor<'de>,
     {
-        let inner = self
-            .input
-            .parse::<toml_edit::de::Deserializer>()
-            .map_err(Error::new)?;
+        let inner = toml_edit::de::Deserializer::parse(self.input).map_err(Error::new)?;
         inner
             .deserialize_newtype_struct(name, visitor)
             .map_err(Error::new)
@@ -159,10 +150,7 @@
     where
         V: serde::de::Visitor<'de>,
     {
-        let inner = self
-            .input
-            .parse::<toml_edit::de::Deserializer>()
-            .map_err(Error::new)?;
+        let inner = toml_edit::de::Deserializer::parse(self.input).map_err(Error::new)?;
         inner
             .deserialize_struct(name, fields, visitor)
             .map_err(Error::new)
@@ -178,10 +166,7 @@
     where
         V: serde::de::Visitor<'de>,
     {
-        let inner = self
-            .input
-            .parse::<toml_edit::de::Deserializer>()
-            .map_err(Error::new)?;
+        let inner = toml_edit::de::Deserializer::parse(self.input).map_err(Error::new)?;
         inner
             .deserialize_enum(name, variants, visitor)
             .map_err(Error::new)
diff --git a/crates/toml/src/fmt.rs b/crates/toml/src/fmt.rs
index 281cb59..650ba4d 100644
--- a/crates/toml/src/fmt.rs
+++ b/crates/toml/src/fmt.rs
@@ -5,7 +5,7 @@
 }
 
 impl toml_edit::visit_mut::VisitMut for DocumentFormatter {
-    fn visit_document_mut(&mut self, node: &mut toml_edit::Document) {
+    fn visit_document_mut(&mut self, node: &mut toml_edit::DocumentMut) {
         toml_edit::visit_mut::visit_document_mut(self, node);
     }
 
diff --git a/crates/toml/src/lib.rs b/crates/toml/src/lib.rs
index 61e6a4c..276e617 100644
--- a/crates/toml/src/lib.rs
+++ b/crates/toml/src/lib.rs
@@ -5,8 +5,6 @@
 //! ```toml
 //! [package]
 //! name = "toml"
-//! version = "0.4.2"
-//! authors = ["Alex Crichton <[email protected]>"]
 //!
 //! [dependencies]
 //! serde = "1.0"
@@ -140,14 +138,15 @@
 //! [`serde`]: https://serde.rs/
 //! [serde]: https://serde.rs/
 
-#![deny(missing_docs)]
-#![warn(rust_2018_idioms)]
+#![cfg_attr(docsrs, feature(doc_auto_cfg))]
 // Makes rustc abort compilation if there are any unsafe blocks in the crate.
 // Presence of this annotation is picked up by tools such as cargo-geiger
 // and lets them ensure that there is indeed no unsafe code as opposed to
 // something they couldn't detect (e.g. unsafe added via macro expansion, etc).
 #![forbid(unsafe_code)]
-#![cfg_attr(docsrs, feature(doc_auto_cfg))]
+#![warn(missing_docs)]
+#![warn(clippy::print_stderr)]
+#![warn(clippy::print_stdout)]
 
 pub mod map;
 pub mod value;
diff --git a/crates/toml/src/macros.rs b/crates/toml/src/macros.rs
index a295970..d993ca9 100644
--- a/crates/toml/src/macros.rs
+++ b/crates/toml/src/macros.rs
@@ -8,11 +8,6 @@
 /// let cargo_toml = toml::toml! {
 ///     [package]
 ///     name = "toml"
-///     version = "0.4.5"
-///     authors = ["Alex Crichton <[email protected]>"]
-///
-///     [badges]
-///     travis-ci = { repository = "alexcrichton/toml-rs" }
 ///
 ///     [dependencies]
 ///     serde = "1.0"
diff --git a/crates/toml/src/map.rs b/crates/toml/src/map.rs
index bd720a7..f7d5c38 100644
--- a/crates/toml/src/map.rs
+++ b/crates/toml/src/map.rs
@@ -70,7 +70,7 @@
     /// Clears the map, removing all values.
     #[inline]
     pub fn clear(&mut self) {
-        self.map.clear()
+        self.map.clear();
     }
 
     /// Returns a reference to the value corresponding to the key.
@@ -78,10 +78,10 @@
     /// The key may be any borrowed form of the map's key type, but the ordering
     /// on the borrowed form *must* match the ordering on the key type.
     #[inline]
-    pub fn get<Q: ?Sized>(&self, key: &Q) -> Option<&Value>
+    pub fn get<Q>(&self, key: &Q) -> Option<&Value>
     where
         String: Borrow<Q>,
-        Q: Ord + Eq + Hash,
+        Q: Ord + Eq + Hash + ?Sized,
     {
         self.map.get(key)
     }
@@ -91,10 +91,10 @@
     /// The key may be any borrowed form of the map's key type, but the ordering
     /// on the borrowed form *must* match the ordering on the key type.
     #[inline]
-    pub fn contains_key<Q: ?Sized>(&self, key: &Q) -> bool
+    pub fn contains_key<Q>(&self, key: &Q) -> bool
     where
         String: Borrow<Q>,
-        Q: Ord + Eq + Hash,
+        Q: Ord + Eq + Hash + ?Sized,
     {
         self.map.contains_key(key)
     }
@@ -104,10 +104,10 @@
     /// The key may be any borrowed form of the map's key type, but the ordering
     /// on the borrowed form *must* match the ordering on the key type.
     #[inline]
-    pub fn get_mut<Q: ?Sized>(&mut self, key: &Q) -> Option<&mut Value>
+    pub fn get_mut<Q>(&mut self, key: &Q) -> Option<&mut Value>
     where
         String: Borrow<Q>,
-        Q: Ord + Eq + Hash,
+        Q: Ord + Eq + Hash + ?Sized,
     {
         self.map.get_mut(key)
     }
@@ -130,10 +130,10 @@
     /// The key may be any borrowed form of the map's key type, but the ordering
     /// on the borrowed form *must* match the ordering on the key type.
     #[inline]
-    pub fn remove<Q: ?Sized>(&mut self, key: &Q) -> Option<Value>
+    pub fn remove<Q>(&mut self, key: &Q) -> Option<Value>
     where
         String: Borrow<Q>,
-        Q: Ord + Eq + Hash,
+        Q: Ord + Eq + Hash + ?Sized,
     {
         self.map.remove(key)
     }
@@ -241,10 +241,10 @@
 
 /// Access an element of this map. Panics if the given key is not present in the
 /// map.
-impl<'a, Q: ?Sized> ops::Index<&'a Q> for Map<String, Value>
+impl<'a, Q> ops::Index<&'a Q> for Map<String, Value>
 where
     String: Borrow<Q>,
-    Q: Ord + Eq + Hash,
+    Q: Ord + Eq + Hash + ?Sized,
 {
     type Output = Value;
 
@@ -255,10 +255,10 @@
 
 /// Mutably access an element of this map. Panics if the given key is not
 /// present in the map.
-impl<'a, Q: ?Sized> ops::IndexMut<&'a Q> for Map<String, Value>
+impl<'a, Q> ops::IndexMut<&'a Q> for Map<String, Value>
 where
     String: Borrow<Q>,
-    Q: Ord + Eq + Hash,
+    Q: Ord + Eq + Hash + ?Sized,
 {
     fn index_mut(&mut self, index: &Q) -> &mut Value {
         self.map.get_mut(index).expect("no entry found for key")
@@ -452,13 +452,13 @@
 
 impl<'a> VacantEntry<'a> {
     /// Gets a reference to the key that would be used when inserting a value
-    /// through the VacantEntry.
+    /// through the `VacantEntry`.
     #[inline]
     pub fn key(&self) -> &String {
         self.vacant.key()
     }
 
-    /// Sets the value of the entry with the VacantEntry's key, and returns a
+    /// Sets the value of the entry with the `VacantEntry`'s key, and returns a
     /// mutable reference to it.
     #[inline]
     pub fn insert(self, value: Value) -> &'a mut Value {
@@ -518,7 +518,7 @@
     }
 }
 
-/// An iterator over a toml::Map's entries.
+/// An iterator over a `toml::Map`'s entries.
 pub struct Iter<'a> {
     iter: IterImpl<'a>,
 }
@@ -543,7 +543,7 @@
     }
 }
 
-/// A mutable iterator over a toml::Map's entries.
+/// A mutable iterator over a `toml::Map`'s entries.
 pub struct IterMut<'a> {
     iter: IterMutImpl<'a>,
 }
@@ -568,7 +568,7 @@
     }
 }
 
-/// An owning iterator over a toml::Map's entries.
+/// An owning iterator over a `toml::Map`'s entries.
 pub struct IntoIter {
     iter: IntoIterImpl,
 }
@@ -582,7 +582,7 @@
 
 //////////////////////////////////////////////////////////////////////////////
 
-/// An iterator over a toml::Map's keys.
+/// An iterator over a `toml::Map`'s keys.
 pub struct Keys<'a> {
     iter: KeysImpl<'a>,
 }
@@ -596,7 +596,7 @@
 
 //////////////////////////////////////////////////////////////////////////////
 
-/// An iterator over a toml::Map's values.
+/// An iterator over a `toml::Map`'s values.
 pub struct Values<'a> {
     iter: ValuesImpl<'a>,
 }
diff --git a/crates/toml/src/ser.rs b/crates/toml/src/ser.rs
index f1ab24b..b64271a 100644
--- a/crates/toml/src/ser.rs
+++ b/crates/toml/src/ser.rs
@@ -43,9 +43,9 @@
 /// println!("{}", toml)
 /// ```
 #[cfg(feature = "display")]
-pub fn to_string<T: ?Sized>(value: &T) -> Result<String, Error>
+pub fn to_string<T>(value: &T) -> Result<String, Error>
 where
-    T: serde::ser::Serialize,
+    T: serde::ser::Serialize + ?Sized,
 {
     let mut output = String::new();
     let serializer = Serializer::new(&mut output);
@@ -61,11 +61,11 @@
 /// To serialize TOML values, instead of documents, see [`ValueSerializer`].
 ///
 /// For greater customization, instead serialize to a
-/// [`toml_edit::Document`](https://docs.rs/toml_edit/latest/toml_edit/struct.Document.html).
+/// [`toml_edit::DocumentMut`](https://docs.rs/toml_edit/latest/toml_edit/struct.DocumentMut.html).
 #[cfg(feature = "display")]
-pub fn to_string_pretty<T: ?Sized>(value: &T) -> Result<String, Error>
+pub fn to_string_pretty<T>(value: &T) -> Result<String, Error>
 where
-    T: serde::ser::Serialize,
+    T: serde::ser::Serialize + ?Sized,
 {
     let mut output = String::new();
     let serializer = Serializer::pretty(&mut output);
@@ -161,7 +161,7 @@
     /// Apply a default "pretty" policy to the document
     ///
     /// For greater customization, instead serialize to a
-    /// [`toml_edit::Document`](https://docs.rs/toml_edit/latest/toml_edit/struct.Document.html).
+    /// [`toml_edit::DocumentMut`](https://docs.rs/toml_edit/latest/toml_edit/struct.DocumentMut.html).
     pub fn pretty(dst: &'d mut String) -> Self {
         let mut ser = Serializer::new(dst);
         ser.settings.multiline_array = true;
@@ -301,9 +301,9 @@
         )
     }
 
-    fn serialize_some<T: ?Sized>(self, v: &T) -> Result<Self::Ok, Self::Error>
+    fn serialize_some<T>(self, v: &T) -> Result<Self::Ok, Self::Error>
     where
-        T: serde::ser::Serialize,
+        T: serde::ser::Serialize + ?Sized,
     {
         write_document(
             self.dst,
@@ -345,13 +345,9 @@
         )
     }
 
-    fn serialize_newtype_struct<T: ?Sized>(
-        self,
-        name: &'static str,
-        v: &T,
-    ) -> Result<Self::Ok, Self::Error>
+    fn serialize_newtype_struct<T>(self, name: &'static str, v: &T) -> Result<Self::Ok, Self::Error>
     where
-        T: serde::ser::Serialize,
+        T: serde::ser::Serialize + ?Sized,
     {
         write_document(
             self.dst,
@@ -360,7 +356,7 @@
         )
     }
 
-    fn serialize_newtype_variant<T: ?Sized>(
+    fn serialize_newtype_variant<T>(
         self,
         name: &'static str,
         variant_index: u32,
@@ -368,7 +364,7 @@
         value: &T,
     ) -> Result<Self::Ok, Self::Error>
     where
-        T: serde::ser::Serialize,
+        T: serde::ser::Serialize + ?Sized,
     {
         write_document(
             self.dst,
@@ -617,9 +613,9 @@
         )
     }
 
-    fn serialize_some<T: ?Sized>(self, v: &T) -> Result<Self::Ok, Self::Error>
+    fn serialize_some<T>(self, v: &T) -> Result<Self::Ok, Self::Error>
     where
-        T: serde::ser::Serialize,
+        T: serde::ser::Serialize + ?Sized,
     {
         write_value(
             self.dst,
@@ -657,13 +653,9 @@
         )
     }
 
-    fn serialize_newtype_struct<T: ?Sized>(
-        self,
-        name: &'static str,
-        v: &T,
-    ) -> Result<Self::Ok, Self::Error>
+    fn serialize_newtype_struct<T>(self, name: &'static str, v: &T) -> Result<Self::Ok, Self::Error>
     where
-        T: serde::ser::Serialize,
+        T: serde::ser::Serialize + ?Sized,
     {
         write_value(
             self.dst,
@@ -671,7 +663,7 @@
         )
     }
 
-    fn serialize_newtype_variant<T: ?Sized>(
+    fn serialize_newtype_variant<T>(
         self,
         name: &'static str,
         variant_index: u32,
@@ -679,7 +671,7 @@
         value: &T,
     ) -> Result<Self::Ok, Self::Error>
     where
-        T: serde::ser::Serialize,
+        T: serde::ser::Serialize + ?Sized,
     {
         write_value(
             self.dst,
@@ -750,11 +742,14 @@
 }
 
 #[cfg(feature = "display")]
-use internal::*;
+use internal::{
+    write_document, write_value, SerializeDocumentArray, SerializeDocumentTable,
+    SerializeValueArray, SerializeValueTable,
+};
 
 #[cfg(feature = "display")]
 mod internal {
-    use super::*;
+    use super::{Error, Serializer, ValueSerializer};
 
     use crate::fmt::DocumentFormatter;
 
@@ -782,9 +777,9 @@
         type Ok = ();
         type Error = Error;
 
-        fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
+        fn serialize_element<T>(&mut self, value: &T) -> Result<(), Error>
         where
-            T: serde::ser::Serialize,
+            T: serde::ser::Serialize + ?Sized,
         {
             self.inner.serialize_element(value).map_err(Error::wrap)
         }
@@ -798,9 +793,9 @@
         type Ok = ();
         type Error = Error;
 
-        fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
+        fn serialize_element<T>(&mut self, value: &T) -> Result<(), Error>
         where
-            T: serde::ser::Serialize,
+            T: serde::ser::Serialize + ?Sized,
         {
             self.inner.serialize_element(value).map_err(Error::wrap)
         }
@@ -814,9 +809,9 @@
         type Ok = ();
         type Error = Error;
 
-        fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
+        fn serialize_field<T>(&mut self, value: &T) -> Result<(), Error>
         where
-            T: serde::ser::Serialize,
+            T: serde::ser::Serialize + ?Sized,
         {
             self.inner.serialize_field(value).map_err(Error::wrap)
         }
@@ -830,9 +825,9 @@
         type Ok = ();
         type Error = Error;
 
-        fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
+        fn serialize_field<T>(&mut self, value: &T) -> Result<(), Error>
         where
-            T: serde::ser::Serialize,
+            T: serde::ser::Serialize + ?Sized,
         {
             self.inner.serialize_field(value).map_err(Error::wrap)
         }
@@ -866,16 +861,16 @@
         type Ok = ();
         type Error = Error;
 
-        fn serialize_key<T: ?Sized>(&mut self, input: &T) -> Result<(), Self::Error>
+        fn serialize_key<T>(&mut self, input: &T) -> Result<(), Self::Error>
         where
-            T: serde::ser::Serialize,
+            T: serde::ser::Serialize + ?Sized,
         {
             self.inner.serialize_key(input).map_err(Error::wrap)
         }
 
-        fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
+        fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
         where
-            T: serde::ser::Serialize,
+            T: serde::ser::Serialize + ?Sized,
         {
             self.inner.serialize_value(value).map_err(Error::wrap)
         }
@@ -889,13 +884,9 @@
         type Ok = ();
         type Error = Error;
 
-        fn serialize_field<T: ?Sized>(
-            &mut self,
-            key: &'static str,
-            value: &T,
-        ) -> Result<(), Self::Error>
+        fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
         where
-            T: serde::ser::Serialize,
+            T: serde::ser::Serialize + ?Sized,
         {
             self.inner.serialize_field(key, value).map_err(Error::wrap)
         }
@@ -911,6 +902,7 @@
         value: Result<toml_edit::Value, crate::edit::ser::Error>,
     ) -> Result<(), Error> {
         use std::fmt::Write;
+        use toml_edit::visit_mut::VisitMut as _;
 
         let value = value.map_err(Error::wrap)?;
         let mut table = match toml_edit::Item::Value(value).into_table() {
@@ -920,10 +912,9 @@
             }
         };
 
-        use toml_edit::visit_mut::VisitMut as _;
         settings.visit_table_mut(&mut table);
 
-        let doc: toml_edit::Document = table.into();
+        let doc: toml_edit::DocumentMut = table.into();
         write!(dst, "{}", doc).unwrap();
 
         Ok(())
@@ -951,9 +942,9 @@
         type Ok = ();
         type Error = Error;
 
-        fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
+        fn serialize_element<T>(&mut self, value: &T) -> Result<(), Error>
         where
-            T: serde::ser::Serialize,
+            T: serde::ser::Serialize + ?Sized,
         {
             self.inner.serialize_element(value).map_err(Error::wrap)
         }
@@ -967,9 +958,9 @@
         type Ok = ();
         type Error = Error;
 
-        fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
+        fn serialize_element<T>(&mut self, value: &T) -> Result<(), Error>
         where
-            T: serde::ser::Serialize,
+            T: serde::ser::Serialize + ?Sized,
         {
             self.inner.serialize_element(value).map_err(Error::wrap)
         }
@@ -983,9 +974,9 @@
         type Ok = ();
         type Error = Error;
 
-        fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
+        fn serialize_field<T>(&mut self, value: &T) -> Result<(), Error>
         where
-            T: serde::ser::Serialize,
+            T: serde::ser::Serialize + ?Sized,
         {
             self.inner.serialize_field(value).map_err(Error::wrap)
         }
@@ -999,9 +990,9 @@
         type Ok = ();
         type Error = Error;
 
-        fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
+        fn serialize_field<T>(&mut self, value: &T) -> Result<(), Error>
         where
-            T: serde::ser::Serialize,
+            T: serde::ser::Serialize + ?Sized,
         {
             self.inner.serialize_field(value).map_err(Error::wrap)
         }
@@ -1033,16 +1024,16 @@
         type Ok = ();
         type Error = Error;
 
-        fn serialize_key<T: ?Sized>(&mut self, input: &T) -> Result<(), Self::Error>
+        fn serialize_key<T>(&mut self, input: &T) -> Result<(), Self::Error>
         where
-            T: serde::ser::Serialize,
+            T: serde::ser::Serialize + ?Sized,
         {
             self.inner.serialize_key(input).map_err(Error::wrap)
         }
 
-        fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
+        fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
         where
-            T: serde::ser::Serialize,
+            T: serde::ser::Serialize + ?Sized,
         {
             self.inner.serialize_value(value).map_err(Error::wrap)
         }
@@ -1056,13 +1047,9 @@
         type Ok = ();
         type Error = Error;
 
-        fn serialize_field<T: ?Sized>(
-            &mut self,
-            key: &'static str,
-            value: &T,
-        ) -> Result<(), Self::Error>
+        fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
         where
-            T: serde::ser::Serialize,
+            T: serde::ser::Serialize + ?Sized,
         {
             self.inner.serialize_field(key, value).map_err(Error::wrap)
         }
diff --git a/crates/toml/src/value.rs b/crates/toml/src/value.rs
index e6f832a..c689b38 100644
--- a/crates/toml/src/value.rs
+++ b/crates/toml/src/value.rs
@@ -248,7 +248,7 @@
 impl<'a> From<&'a str> for Value {
     #[inline]
     fn from(val: &'a str) -> Value {
-        Value::String(val.to_string())
+        Value::String(val.to_owned())
     }
 }
 
@@ -362,9 +362,9 @@
     }
 }
 
-impl<'s, T: ?Sized> Index for &'s T
+impl<'s, T> Index for &'s T
 where
-    T: Index,
+    T: Index + ?Sized,
 {
     fn index<'a>(&self, val: &'a Value) -> Option<&'a Value> {
         (**self).index(val)
@@ -465,7 +465,7 @@
             }
 
             fn visit_u64<E: de::Error>(self, value: u64) -> Result<Value, E> {
-                if value <= i64::max_value() as u64 {
+                if i64::try_from(value).is_ok() {
                     Ok(Value::Integer(value as i64))
                 } else {
                     Err(de::Error::custom("u64 value was too large"))
@@ -733,7 +733,7 @@
 
     fn variant_seed<V>(mut self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
     where
-        V: serde::de::DeserializeSeed<'de>,
+        V: de::DeserializeSeed<'de>,
     {
         use de::Error;
         let (key, value) = match self.iter.next() {
@@ -764,7 +764,7 @@
     }
 }
 
-impl<'de> serde::de::VariantAccess<'de> for MapEnumDeserializer {
+impl<'de> de::VariantAccess<'de> for MapEnumDeserializer {
     type Error = crate::de::Error;
 
     fn unit_variant(self) -> Result<(), Self::Error> {
@@ -793,20 +793,20 @@
 
     fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
     where
-        T: serde::de::DeserializeSeed<'de>,
+        T: de::DeserializeSeed<'de>,
     {
         seed.deserialize(self.value.into_deserializer())
     }
 
     fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
     where
-        V: serde::de::Visitor<'de>,
+        V: de::Visitor<'de>,
     {
         use de::Error;
         match self.value {
             Value::Array(values) => {
                 if values.len() == len {
-                    serde::de::Deserializer::deserialize_seq(values.into_deserializer(), visitor)
+                    de::Deserializer::deserialize_seq(values.into_deserializer(), visitor)
                 } else {
                     Err(Error::custom(format!("expected tuple with length {}", len)))
                 }
@@ -826,10 +826,7 @@
                 let tuple_values = tuple_values?;
 
                 if tuple_values.len() == len {
-                    serde::de::Deserializer::deserialize_seq(
-                        tuple_values.into_deserializer(),
-                        visitor,
-                    )
+                    de::Deserializer::deserialize_seq(tuple_values.into_deserializer(), visitor)
                 } else {
                     Err(Error::custom(format!("expected tuple with length {}", len)))
                 }
@@ -847,9 +844,9 @@
         visitor: V,
     ) -> Result<V::Value, Self::Error>
     where
-        V: serde::de::Visitor<'de>,
+        V: de::Visitor<'de>,
     {
-        serde::de::Deserializer::deserialize_struct(
+        de::Deserializer::deserialize_struct(
             self.value.into_deserializer(),
             "", // TODO: this should be the variant name
             fields,
@@ -858,7 +855,7 @@
     }
 }
 
-impl<'de> de::IntoDeserializer<'de, crate::de::Error> for Value {
+impl<'de> IntoDeserializer<'de, crate::de::Error> for Value {
     type Deserializer = Self;
 
     fn into_deserializer(self) -> Self {
@@ -913,7 +910,7 @@
     }
 
     fn serialize_u64(self, value: u64) -> Result<Value, crate::ser::Error> {
-        if value <= i64::max_value() as u64 {
+        if i64::try_from(value).is_ok() {
             self.serialize_i64(value as i64)
         } else {
             Err(ser::Error::custom("u64 value was too large"))
@@ -964,18 +961,18 @@
         self.serialize_str(_variant)
     }
 
-    fn serialize_newtype_struct<T: ?Sized>(
+    fn serialize_newtype_struct<T>(
         self,
         _name: &'static str,
         value: &T,
     ) -> Result<Value, crate::ser::Error>
     where
-        T: ser::Serialize,
+        T: ser::Serialize + ?Sized,
     {
         value.serialize(self)
     }
 
-    fn serialize_newtype_variant<T: ?Sized>(
+    fn serialize_newtype_variant<T>(
         self,
         _name: &'static str,
         _variant_index: u32,
@@ -983,7 +980,7 @@
         value: &T,
     ) -> Result<Value, crate::ser::Error>
     where
-        T: ser::Serialize,
+        T: ser::Serialize + ?Sized,
     {
         let value = value.serialize(ValueSerializer)?;
         let mut table = Table::new();
@@ -995,9 +992,9 @@
         Err(crate::ser::Error::unsupported_none())
     }
 
-    fn serialize_some<T: ?Sized>(self, value: &T) -> Result<Value, crate::ser::Error>
+    fn serialize_some<T>(self, value: &T) -> Result<Value, crate::ser::Error>
     where
-        T: ser::Serialize,
+        T: ser::Serialize + ?Sized,
     {
         value.serialize(self)
     }
@@ -1145,18 +1142,18 @@
         Err(crate::ser::Error::unsupported_type(Some(name)))
     }
 
-    fn serialize_newtype_struct<T: ?Sized>(
+    fn serialize_newtype_struct<T>(
         self,
         _name: &'static str,
         value: &T,
     ) -> Result<Table, crate::ser::Error>
     where
-        T: ser::Serialize,
+        T: ser::Serialize + ?Sized,
     {
         value.serialize(self)
     }
 
-    fn serialize_newtype_variant<T: ?Sized>(
+    fn serialize_newtype_variant<T>(
         self,
         _name: &'static str,
         _variant_index: u32,
@@ -1164,7 +1161,7 @@
         value: &T,
     ) -> Result<Table, crate::ser::Error>
     where
-        T: ser::Serialize,
+        T: ser::Serialize + ?Sized,
     {
         let value = value.serialize(ValueSerializer)?;
         let mut table = Table::new();
@@ -1176,9 +1173,9 @@
         Err(crate::ser::Error::unsupported_none())
     }
 
-    fn serialize_some<T: ?Sized>(self, value: &T) -> Result<Table, crate::ser::Error>
+    fn serialize_some<T>(self, value: &T) -> Result<Table, crate::ser::Error>
     where
-        T: ser::Serialize,
+        T: ser::Serialize + ?Sized,
     {
         value.serialize(self)
     }
@@ -1243,9 +1240,9 @@
     type Ok = Value;
     type Error = crate::ser::Error;
 
-    fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), crate::ser::Error>
+    fn serialize_element<T>(&mut self, value: &T) -> Result<(), crate::ser::Error>
     where
-        T: ser::Serialize,
+        T: ser::Serialize + ?Sized,
     {
         self.vec.push(Value::try_from(value)?);
         Ok(())
@@ -1260,9 +1257,9 @@
     type Ok = Value;
     type Error = crate::ser::Error;
 
-    fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), crate::ser::Error>
+    fn serialize_element<T>(&mut self, value: &T) -> Result<(), crate::ser::Error>
     where
-        T: ser::Serialize,
+        T: ser::Serialize + ?Sized,
     {
         ser::SerializeSeq::serialize_element(self, value)
     }
@@ -1276,9 +1273,9 @@
     type Ok = Value;
     type Error = crate::ser::Error;
 
-    fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), crate::ser::Error>
+    fn serialize_field<T>(&mut self, value: &T) -> Result<(), crate::ser::Error>
     where
-        T: ser::Serialize,
+        T: ser::Serialize + ?Sized,
     {
         ser::SerializeSeq::serialize_element(self, value)
     }
@@ -1292,9 +1289,9 @@
     type Ok = Value;
     type Error = crate::ser::Error;
 
-    fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), crate::ser::Error>
+    fn serialize_field<T>(&mut self, value: &T) -> Result<(), crate::ser::Error>
     where
-        T: ser::Serialize,
+        T: ser::Serialize + ?Sized,
     {
         ser::SerializeSeq::serialize_element(self, value)
     }
@@ -1313,9 +1310,9 @@
     type Ok = Table;
     type Error = crate::ser::Error;
 
-    fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), crate::ser::Error>
+    fn serialize_key<T>(&mut self, key: &T) -> Result<(), crate::ser::Error>
     where
-        T: ser::Serialize,
+        T: ser::Serialize + ?Sized,
     {
         match Value::try_from(key)? {
             Value::String(s) => self.next_key = Some(s),
@@ -1324,9 +1321,9 @@
         Ok(())
     }
 
-    fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), crate::ser::Error>
+    fn serialize_value<T>(&mut self, value: &T) -> Result<(), crate::ser::Error>
     where
-        T: ser::Serialize,
+        T: ser::Serialize + ?Sized,
     {
         let key = self.next_key.take();
         let key = key.expect("serialize_value called before serialize_key");
@@ -1351,13 +1348,9 @@
     type Ok = Table;
     type Error = crate::ser::Error;
 
-    fn serialize_field<T: ?Sized>(
-        &mut self,
-        key: &'static str,
-        value: &T,
-    ) -> Result<(), crate::ser::Error>
+    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), crate::ser::Error>
     where
-        T: ser::Serialize,
+        T: ser::Serialize + ?Sized,
     {
         ser::SerializeMap::serialize_key(self, key)?;
         ser::SerializeMap::serialize_value(self, value)
@@ -1376,16 +1369,16 @@
     type Ok = Value;
     type Error = crate::ser::Error;
 
-    fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), crate::ser::Error>
+    fn serialize_key<T>(&mut self, key: &T) -> Result<(), crate::ser::Error>
     where
-        T: ser::Serialize,
+        T: ser::Serialize + ?Sized,
     {
         self.ser.serialize_key(key)
     }
 
-    fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), crate::ser::Error>
+    fn serialize_value<T>(&mut self, value: &T) -> Result<(), crate::ser::Error>
     where
-        T: ser::Serialize,
+        T: ser::Serialize + ?Sized,
     {
         self.ser.serialize_value(value)
     }
@@ -1399,13 +1392,9 @@
     type Ok = Value;
     type Error = crate::ser::Error;
 
-    fn serialize_field<T: ?Sized>(
-        &mut self,
-        key: &'static str,
-        value: &T,
-    ) -> Result<(), crate::ser::Error>
+    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), crate::ser::Error>
     where
-        T: ser::Serialize,
+        T: ser::Serialize + ?Sized,
     {
         ser::SerializeMap::serialize_key(self, key)?;
         ser::SerializeMap::serialize_value(self, value)
@@ -1496,40 +1485,40 @@
     }
 }
 
-impl serde::ser::SerializeTupleVariant for ValueSerializeVariant<ValueSerializeVec> {
-    type Ok = crate::Value;
+impl ser::SerializeTupleVariant for ValueSerializeVariant<ValueSerializeVec> {
+    type Ok = Value;
     type Error = crate::ser::Error;
 
-    fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
+    fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
     where
-        T: serde::ser::Serialize,
+        T: ser::Serialize + ?Sized,
     {
-        serde::ser::SerializeSeq::serialize_element(&mut self.inner, value)
+        ser::SerializeSeq::serialize_element(&mut self.inner, value)
     }
 
     fn end(self) -> Result<Self::Ok, Self::Error> {
-        let inner = serde::ser::SerializeSeq::end(self.inner)?;
+        let inner = ser::SerializeSeq::end(self.inner)?;
         let mut table = Table::new();
         table.insert(self.variant.to_owned(), inner);
         Ok(Value::Table(table))
     }
 }
 
-impl serde::ser::SerializeStructVariant for ValueSerializeVariant<ValueSerializeMap> {
-    type Ok = crate::Value;
+impl ser::SerializeStructVariant for ValueSerializeVariant<ValueSerializeMap> {
+    type Ok = Value;
     type Error = crate::ser::Error;
 
     #[inline]
     fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
     where
-        T: serde::ser::Serialize + ?Sized,
+        T: ser::Serialize + ?Sized,
     {
-        serde::ser::SerializeStruct::serialize_field(&mut self.inner, key, value)
+        ser::SerializeStruct::serialize_field(&mut self.inner, key, value)
     }
 
     #[inline]
     fn end(self) -> Result<Self::Ok, Self::Error> {
-        let inner = serde::ser::SerializeStruct::end(self.inner)?;
+        let inner = ser::SerializeStruct::end(self.inner)?;
         let mut table = Table::new();
         table.insert(self.variant.to_owned(), inner);
         Ok(Value::Table(table))
diff --git a/crates/toml/tests/decoder.rs b/crates/toml/tests/decoder.rs
index 5af906f..399c1dd 100644
--- a/crates/toml/tests/decoder.rs
+++ b/crates/toml/tests/decoder.rs
@@ -1,7 +1,8 @@
 #![cfg(all(feature = "parse", feature = "display"))]
+#![allow(dead_code)]
 
 #[derive(Copy, Clone)]
-pub struct Decoder;
+pub(crate) struct Decoder;
 
 impl toml_test_harness::Decoder for Decoder {
     fn name(&self) -> &str {
diff --git a/crates/toml/tests/encoder.rs b/crates/toml/tests/encoder.rs
index e76a74a..2f7ceae 100644
--- a/crates/toml/tests/encoder.rs
+++ b/crates/toml/tests/encoder.rs
@@ -1,7 +1,8 @@
 #![cfg(all(feature = "parse", feature = "display"))]
+#![allow(dead_code)]
 
 #[derive(Copy, Clone)]
-pub struct Encoder;
+pub(crate) struct Encoder;
 
 impl toml_test_harness::Encoder for Encoder {
     fn name(&self) -> &str {
diff --git a/crates/toml/tests/testsuite/de_errors.rs b/crates/toml/tests/testsuite/de_errors.rs
index b3630bd..3600f98 100644
--- a/crates/toml/tests/testsuite/de_errors.rs
+++ b/crates/toml/tests/testsuite/de_errors.rs
@@ -1,11 +1,15 @@
-use serde::{de, Deserialize};
 use std::fmt;
 
+use serde::{de, Deserialize};
+use snapbox::assert_data_eq;
+use snapbox::prelude::*;
+use snapbox::str;
+
 macro_rules! bad {
     ($toml:expr, $ty:ty, $msg:expr) => {
         match toml::from_str::<$ty>($toml) {
             Ok(s) => panic!("parsed to: {:#?}", s),
-            Err(e) => snapbox::assert_eq($msg, e.to_string()),
+            Err(e) => assert_data_eq!(e.to_string(), $msg.raw()),
         }
     };
 }
@@ -29,7 +33,7 @@
     Uppercase(String),
 }
 
-impl<'de> de::Deserialize<'de> for CasedString {
+impl<'de> Deserialize<'de> for CasedString {
     fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
     where
         D: de::Deserializer<'de>,
@@ -39,7 +43,7 @@
         impl<'de> de::Visitor<'de> for CasedStringVisitor {
             type Value = CasedString;
 
-            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+            fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
                 formatter.write_str("a string")
             }
 
@@ -50,9 +54,9 @@
                 if s.is_empty() {
                     Err(de::Error::invalid_length(0, &"a non-empty string"))
                 } else if s.chars().all(|x| x.is_ascii_lowercase()) {
-                    Ok(CasedString::Lowercase(s.to_string()))
+                    Ok(CasedString::Lowercase(s.to_owned()))
                 } else if s.chars().all(|x| x.is_ascii_uppercase()) {
-                    Ok(CasedString::Uppercase(s.to_string()))
+                    Ok(CasedString::Uppercase(s.to_owned()))
                 } else {
                     Err(de::Error::invalid_value(
                         de::Unexpected::Str(s),
@@ -83,13 +87,14 @@
                 # ^
         ",
         Parent<CasedString>,
-        "\
+        str![[r#"
 TOML parse error at line 2, column 19
   |
 2 |             p_a = ''
   |                   ^^
 invalid length 0, expected a non-empty string
-"
+
+"#]]
     );
 
     // Missing field in table.
@@ -99,13 +104,14 @@
           # ^
         ",
         Parent<CasedString>,
-        "\
+        str![[r#"
 TOML parse error at line 1, column 1
   |
 1 | 
   | ^
 missing field `p_b`
-"
+
+"#]]
     );
 
     // Invalid type in p_b.
@@ -116,13 +122,14 @@
                 # ^
         ",
         Parent<CasedString>,
-        "\
+        str![[r#"
 TOML parse error at line 3, column 19
   |
 3 |             p_b = 1
   |                   ^
 invalid type: integer `1`, expected a sequence
-"
+
+"#]]
     );
 
     // Sub-table in Vec is missing a field.
@@ -135,13 +142,14 @@
             ]
         ",
         Parent<CasedString>,
-        "\
+        str![[r#"
 TOML parse error at line 4, column 17
   |
 4 |                 {c_a = 'a'}
   |                 ^^^^^^^^^^^
 missing field `c_b`
-"
+
+"#]]
     );
 
     // Sub-table in Vec has a field with a bad value.
@@ -154,13 +162,14 @@
             ]
         ",
         Parent<CasedString>,
-        "\
+        str![[r#"
 TOML parse error at line 4, column 35
   |
 4 |                 {c_a = 'a', c_b = '*'}
   |                                   ^^^
-invalid value: string \"*\", expected all lowercase or all uppercase
-"
+invalid value: string "*", expected all lowercase or all uppercase
+
+"#]]
     );
 
     // Sub-table in Vec is missing a field.
@@ -174,13 +183,14 @@
             ]
         ",
         Parent<CasedString>,
-        "\
+        str![[r#"
 TOML parse error at line 5, column 17
   |
 5 |                 {c_a = 'aa'}
   |                 ^^^^^^^^^^^^
 missing field `c_b`
-"
+
+"#]]
     );
 
     // Sub-table in the middle of a Vec is missing a field.
@@ -195,13 +205,14 @@
             ]
         ",
         Parent<CasedString>,
-        "\
+        str![[r#"
 TOML parse error at line 5, column 17
   |
 5 |                 {c_a = 'aa'},
   |                 ^^^^^^^^^^^^
 missing field `c_b`
-"
+
+"#]]
     );
 
     // Sub-table in the middle of a Vec has a field with a bad value.
@@ -216,13 +227,14 @@
             ]
         ",
         Parent<CasedString>,
-        "\
+        str![[r#"
 TOML parse error at line 5, column 36
   |
 5 |                 {c_a = 'aa', c_b = 1},
   |                                    ^
 invalid type: integer `1`, expected a string
-"
+
+"#]]
     );
 
     // Sub-table in the middle of a Vec has an extra field.
@@ -238,13 +250,14 @@
             ]
         ",
         Parent<CasedString>,
-        "\
+        str![[r#"
 TOML parse error at line 5, column 42
   |
 5 |                 {c_a = 'aa', c_b = 'bb', c_d = 'd'},
   |                                          ^^^
 unknown field `c_d`, expected `c_a` or `c_b`
-"
+
+"#]]
     );
 
     // Sub-table in the middle of a Vec is missing a field.
@@ -267,13 +280,14 @@
             c_b = 'bbbb'
         ",
         Parent<CasedString>,
-        "\
+        str![[r#"
 TOML parse error at line 6, column 13
   |
 6 |             [[p_b]]
-  |             ^^^^^^^^^^^^^^^^^^^
+  |             ^^^^^^^
 missing field `c_b`
-"
+
+"#]]
     );
 
     // Sub-table in the middle of a Vec has a field with a bad value.
@@ -292,13 +306,14 @@
             c_b = 'bbb'
         ",
         Parent<CasedString>,
-        "\
+        str![[r#"
 TOML parse error at line 8, column 19
   |
 8 |             c_b = '*'
   |                   ^^^
-invalid value: string \"*\", expected all lowercase or all uppercase
-"
+invalid value: string "*", expected all lowercase or all uppercase
+
+"#]]
     );
 
     // Sub-table in the middle of a Vec has an extra field.
@@ -320,13 +335,14 @@
             c_b = 'bbbb'
         ",
         Parent<CasedString>,
-        "\
+        str![[r#"
 TOML parse error at line 8, column 13
   |
 8 |             c_d = 'dd' # unknown field
   |             ^^^
 unknown field `c_d`, expected `c_a` or `c_b`
-"
+
+"#]]
     );
 }
 
@@ -338,13 +354,14 @@
           # ^
         ",
         Parent<String>,
-        "\
+        str![[r#"
 TOML parse error at line 1, column 1
   |
 1 | 
   | ^
 missing field `p_b`
-"
+
+"#]]
     );
 
     bad!(
@@ -356,13 +373,14 @@
             ]
         ",
         Parent<String>,
-        "\
+        str![[r#"
 TOML parse error at line 4, column 17
   |
 4 |                 {c_a = ''}
   |                 ^^^^^^^^^^
 missing field `c_b`
-"
+
+"#]]
     );
 
     bad!(
@@ -374,13 +392,14 @@
             ]
         ",
         Parent<String>,
-        "\
+        str![[r#"
 TOML parse error at line 4, column 34
   |
 4 |                 {c_a = '', c_b = 1}
   |                                  ^
 invalid type: integer `1`, expected a string
-"
+
+"#]]
     );
 
     // FIXME: This location could be better.
@@ -393,13 +412,14 @@
             ]
         ",
         Parent<String>,
-        "\
+        str![[r#"
 TOML parse error at line 4, column 38
   |
 4 |                 {c_a = '', c_b = '', c_d = ''},
   |                                      ^^^
 unknown field `c_d`, expected `c_a` or `c_b`
-"
+
+"#]]
     );
 
     bad!(
@@ -411,13 +431,14 @@
             ]
         ",
         Parent<String>,
-        "\
+        str![[r#"
 TOML parse error at line 4, column 34
   |
 4 |                 {c_a = '', c_b = 1, c_d = ''},
   |                                  ^
 invalid type: integer `1`, expected a string
-"
+
+"#]]
     );
 }
 
@@ -431,13 +452,14 @@
          a = 2\r\n\
          ",
         toml::Value,
-        "\
+        str![[r#"
 TOML parse error at line 5, column 1
   |
 5 | a = 2
   | ^
 duplicate key `a` in table `t2`
-"
+
+"#]]
     );
 
     // Should be the same as above.
@@ -449,12 +471,13 @@
          a = 2\n\
          ",
         toml::Value,
-        "\
+        str![[r#"
 TOML parse error at line 5, column 1
   |
 5 | a = 2
   | ^
 duplicate key `a` in table `t2`
-"
+
+"#]]
     );
 }
diff --git a/crates/toml/tests/testsuite/display.rs b/crates/toml/tests/testsuite/display.rs
index 7430fac..a0e0cff 100644
--- a/crates/toml/tests/testsuite/display.rs
+++ b/crates/toml/tests/testsuite/display.rs
@@ -3,13 +3,13 @@
 
 macro_rules! map( ($($k:expr => $v:expr),*) => ({
     let mut _m = Map::new();
-    $(_m.insert($k.to_string(), $v);)*
+    $(_m.insert($k.to_owned(), $v);)*
     _m
 }) );
 
 #[test]
 fn simple_show() {
-    assert_eq!(String("foo".to_string()).to_string(), "\"foo\"");
+    assert_eq!(String("foo".to_owned()).to_string(), "\"foo\"");
     assert_eq!(Integer(10).to_string(), "10");
     assert_eq!(Float(10.0).to_string(), "10.0");
     assert_eq!(Float(2.4).to_string(), "2.4");
@@ -32,7 +32,7 @@
         map! {
              "test" => Integer(2),
              "test2" => Table(map! {
-                 "test" => String("wut".to_string())
+                 "test" => String("wut".to_owned())
              })
         }
         .to_string(),
@@ -45,7 +45,7 @@
         map! {
              "test" => Integer(2),
              "test2" => Table(map! {
-                 "test" => String("wut".to_string())
+                 "test" => String("wut".to_owned())
              })
         }
         .to_string(),
@@ -58,7 +58,7 @@
         map! {
              "test" => Integer(2),
              "test2" => Array(vec![Table(map! {
-                 "test" => String("wut".to_string())
+                 "test" => String("wut".to_owned())
              })])
         }
         .to_string(),
@@ -75,7 +75,7 @@
         }
         .to_string(),
         "\"foo.bar\" = 2\n\
-         \"foo\\\"bar\" = 2\n"
+         'foo\"bar' = 2\n"
     );
     assert_eq!(
         map! {
@@ -94,7 +94,7 @@
         "test" => Integer(2),
         "test2" => Array(vec![Table(map! {
             "test" => Array(vec![Array(vec![Integer(2), Integer(3)]),
-            Array(vec![String("foo".to_string()), String("bar".to_string())])])
+            Array(vec![String("foo".to_owned()), String("bar".to_owned())])])
         })])
     };
     assert_eq!(
diff --git a/crates/toml/tests/testsuite/display_tricky.rs b/crates/toml/tests/testsuite/display_tricky.rs
index 379ae91..a75e00e 100644
--- a/crates/toml/tests/testsuite/display_tricky.rs
+++ b/crates/toml/tests/testsuite/display_tricky.rs
@@ -2,25 +2,25 @@
 use serde::Serialize;
 
 #[derive(Debug, Serialize, Deserialize)]
-pub struct Recipe {
-    pub name: String,
-    pub description: Option<String>,
+pub(crate) struct Recipe {
+    pub(crate) name: String,
+    pub(crate) description: Option<String>,
     #[serde(default)]
-    pub modules: Vec<Modules>,
+    pub(crate) modules: Vec<Modules>,
     #[serde(default)]
-    pub packages: Vec<Packages>,
+    pub(crate) packages: Vec<Packages>,
 }
 
 #[derive(Debug, Serialize, Deserialize)]
-pub struct Modules {
-    pub name: String,
-    pub version: Option<String>,
+pub(crate) struct Modules {
+    pub(crate) name: String,
+    pub(crate) version: Option<String>,
 }
 
 #[derive(Debug, Serialize, Deserialize)]
-pub struct Packages {
-    pub name: String,
-    pub version: Option<String>,
+pub(crate) struct Packages {
+    pub(crate) name: String,
+    pub(crate) version: Option<String>,
 }
 
 #[test]
diff --git a/crates/toml/tests/testsuite/enum_external_deserialize.rs b/crates/toml/tests/testsuite/enum_external_deserialize.rs
index 6e0c2f7..247a2c9 100644
--- a/crates/toml/tests/testsuite/enum_external_deserialize.rs
+++ b/crates/toml/tests/testsuite/enum_external_deserialize.rs
@@ -1,4 +1,7 @@
 use serde::Deserialize;
+use snapbox::assert_data_eq;
+use snapbox::prelude::*;
+use snapbox::str;
 
 #[derive(Debug, Deserialize, PartialEq)]
 struct OuterStruct {
@@ -33,63 +36,81 @@
 #[test]
 fn invalid_variant_returns_error_with_good_message_string() {
     let error = value_from_str::<TheEnum>("\"NonExistent\"").unwrap_err();
-    snapbox::assert_eq(
-        r#"unknown variant `NonExistent`, expected one of `Plain`, `Tuple`, `NewType`, `Struct`
-"#,
+    assert_data_eq!(
         error.to_string(),
+        str![[r#"
+unknown variant `NonExistent`, expected one of `Plain`, `Tuple`, `NewType`, `Struct`
+
+"#]]
+        .raw()
     );
 
     let error = toml::from_str::<Val>("val = \"NonExistent\"").unwrap_err();
-    snapbox::assert_eq(
-        r#"TOML parse error at line 1, column 7
+    assert_data_eq!(
+        error.to_string(),
+        str![[r#"
+TOML parse error at line 1, column 7
   |
 1 | val = "NonExistent"
   |       ^^^^^^^^^^^^^
 unknown variant `NonExistent`, expected one of `Plain`, `Tuple`, `NewType`, `Struct`
-"#,
-        error.to_string(),
+
+"#]]
+        .raw()
     );
 }
 
 #[test]
 fn invalid_variant_returns_error_with_good_message_inline_table() {
     let error = value_from_str::<TheEnum>("{ NonExistent = {} }").unwrap_err();
-    snapbox::assert_eq(
-        r#"unknown variant `NonExistent`, expected one of `Plain`, `Tuple`, `NewType`, `Struct`
-"#,
+    assert_data_eq!(
         error.to_string(),
+        str![[r#"
+unknown variant `NonExistent`, expected one of `Plain`, `Tuple`, `NewType`, `Struct`
+
+"#]]
+        .raw()
     );
 
     let error = toml::from_str::<Val>("val = { NonExistent = {} }").unwrap_err();
-    snapbox::assert_eq(
-        r#"TOML parse error at line 1, column 9
+    assert_data_eq!(
+        error.to_string(),
+        str![[r#"
+TOML parse error at line 1, column 9
   |
 1 | val = { NonExistent = {} }
   |         ^^^^^^^^^^^
 unknown variant `NonExistent`, expected one of `Plain`, `Tuple`, `NewType`, `Struct`
-"#,
-        error.to_string(),
+
+"#]]
+        .raw()
     );
 }
 
 #[test]
 fn extra_field_returns_expected_empty_table_error() {
     let error = value_from_str::<TheEnum>("{ Plain = { extra_field = 404 } }").unwrap_err();
-    snapbox::assert_eq(
-        r#"expected empty table
-"#,
+    assert_data_eq!(
         error.to_string(),
+        str![[r#"
+expected empty table
+
+"#]]
+        .raw()
     );
 
     let error = toml::from_str::<Val>("val = { Plain = { extra_field = 404 } }").unwrap_err();
-    snapbox::assert_eq(
-        r#"TOML parse error at line 1, column 17
+    assert_data_eq!(
+        error.to_string(),
+        str![[r#"
+TOML parse error at line 1, column 17
   |
 1 | val = { Plain = { extra_field = 404 } }
   |                 ^^^^^^^^^^^^^^^^^^^^^
 expected empty table
-"#,
-        error.to_string(),
+
+"#]]
+        .raw()
     );
 }
 
@@ -97,25 +118,29 @@
 fn extra_field_returns_expected_empty_table_error_struct_variant() {
     let error = value_from_str::<TheEnum>("{ Struct = { value = 123, extra_0 = 0, extra_1 = 1 } }")
         .unwrap_err();
-
-    snapbox::assert_eq(
-        r#"unexpected keys in table: extra_0, extra_1, available keys: value
-"#,
+    assert_data_eq!(
         error.to_string(),
+        str![[r#"
+unexpected keys in table: extra_0, extra_1, available keys: value
+
+"#]]
+        .raw()
     );
 
     let error =
         toml::from_str::<Val>("val = { Struct = { value = 123, extra_0 = 0, extra_1 = 1 } }")
             .unwrap_err();
-
-    snapbox::assert_eq(
-        r#"TOML parse error at line 1, column 33
+    assert_data_eq!(
+        error.to_string(),
+        str![[r#"
+TOML parse error at line 1, column 33
   |
 1 | val = { Struct = { value = 123, extra_0 = 0, extra_1 = 1 } }
   |                                 ^^^^^^^
 unexpected keys in table: extra_0, extra_1, available keys: value
-"#,
-        error.to_string(),
+
+"#]]
+        .raw()
     );
 }
 
@@ -189,12 +214,12 @@
     #[test]
     fn from_inline_table() {
         assert_eq!(
-            TheEnum::NewType("value".to_string()),
+            TheEnum::NewType("value".to_owned()),
             value_from_str(r#"{ NewType = "value" }"#).unwrap()
         );
         assert_eq!(
             Val {
-                val: TheEnum::NewType("value".to_string()),
+                val: TheEnum::NewType("value".to_owned()),
             },
             toml::from_str(r#"val = { NewType = "value" }"#).unwrap()
         );
@@ -203,12 +228,12 @@
     #[test]
     fn from_std_table() {
         assert_eq!(
-            TheEnum::NewType("value".to_string()),
+            TheEnum::NewType("value".to_owned()),
             toml::from_str(r#"NewType = "value""#).unwrap()
         );
         assert_eq!(
             Val {
-                val: TheEnum::NewType("value".to_string()),
+                val: TheEnum::NewType("value".to_owned()),
             },
             toml::from_str(
                 r#"[val]
@@ -283,7 +308,7 @@
                 enums: vec![
                     TheEnum::Plain,
                     TheEnum::Tuple(-123, true),
-                    TheEnum::NewType("value".to_string()),
+                    TheEnum::NewType("value".to_owned()),
                     TheEnum::Struct { value: -123 },
                 ]
             },
@@ -310,7 +335,7 @@
                 enums: vec![
                     TheEnum::Plain,
                     TheEnum::Tuple(-123, true),
-                    TheEnum::NewType("value".to_string()),
+                    TheEnum::NewType("value".to_owned()),
                     TheEnum::Struct { value: -123 },
                 ]
             },
diff --git a/crates/toml/tests/testsuite/formatting.rs b/crates/toml/tests/testsuite/formatting.rs
index 8240d1d..195d60e 100644
--- a/crates/toml/tests/testsuite/formatting.rs
+++ b/crates/toml/tests/testsuite/formatting.rs
@@ -4,19 +4,19 @@
 
 #[derive(Debug, Clone, Hash, PartialEq, Eq, Serialize, Deserialize)]
 struct User {
-    pub name: String,
-    pub surname: String,
+    pub(crate) name: String,
+    pub(crate) surname: String,
 }
 
 #[derive(Debug, Clone, Hash, PartialEq, Eq, Serialize, Deserialize)]
 struct Users {
-    pub user: Vec<User>,
+    pub(crate) user: Vec<User>,
 }
 
 #[derive(Debug, Clone, Hash, PartialEq, Eq, Serialize, Deserialize)]
 struct TwoUsers {
-    pub user0: User,
-    pub user1: User,
+    pub(crate) user0: User,
+    pub(crate) user1: User,
 }
 
 #[test]
@@ -24,12 +24,12 @@
     assert!(!to_string(&Users {
         user: vec![
             User {
-                name: "John".to_string(),
-                surname: "Doe".to_string(),
+                name: "John".to_owned(),
+                surname: "Doe".to_owned(),
             },
             User {
-                name: "Jane".to_string(),
-                surname: "Dough".to_string(),
+                name: "Jane".to_owned(),
+                surname: "Dough".to_owned(),
             },
         ],
     })
@@ -41,12 +41,12 @@
 fn no_unnecessary_newlines_table() {
     assert!(!to_string(&TwoUsers {
         user0: User {
-            name: "John".to_string(),
-            surname: "Doe".to_string(),
+            name: "John".to_owned(),
+            surname: "Doe".to_owned(),
         },
         user1: User {
-            name: "Jane".to_string(),
-            surname: "Dough".to_string(),
+            name: "Jane".to_owned(),
+            surname: "Dough".to_owned(),
         },
     })
     .unwrap()
diff --git a/crates/toml/tests/testsuite/macros.rs b/crates/toml/tests/testsuite/macros.rs
index e002cd9..97e933d 100644
--- a/crates/toml/tests/testsuite/macros.rs
+++ b/crates/toml/tests/testsuite/macros.rs
@@ -8,7 +8,7 @@
         #[allow(unused_mut)]
         let mut table = toml::value::Table::new();
         $(
-            table.insert($key.to_string(), $value.into());
+            table.insert($key.to_owned(), $value.into());
         )*
         toml::Value::Table(table)
     }};
diff --git a/crates/toml/tests/testsuite/pretty.rs b/crates/toml/tests/testsuite/pretty.rs
index 369888f..e8b9626 100644
--- a/crates/toml/tests/testsuite/pretty.rs
+++ b/crates/toml/tests/testsuite/pretty.rs
@@ -1,5 +1,6 @@
 use serde::ser::Serialize;
-use snapbox::assert_eq;
+use snapbox::assert_data_eq;
+use snapbox::prelude::*;
 
 const NO_PRETTY: &str = "\
 [example]
@@ -18,7 +19,7 @@
     let value: toml::Value = toml::from_str(toml).unwrap();
     let mut result = String::with_capacity(128);
     value.serialize(toml::Serializer::new(&mut result)).unwrap();
-    assert_eq(toml, &result);
+    assert_data_eq!(&result, toml.raw());
 }
 
 const PRETTY_STD: &str = "\
@@ -44,7 +45,7 @@
     value
         .serialize(toml::Serializer::pretty(&mut result))
         .unwrap();
-    assert_eq(toml, &result);
+    assert_data_eq!(&result, toml.raw());
 }
 
 const PRETTY_TRICKY: &str = r#"[example]
@@ -82,7 +83,7 @@
     value
         .serialize(toml::Serializer::pretty(&mut result))
         .unwrap();
-    assert_eq(toml, &result);
+    assert_data_eq!(&result, toml.raw());
 }
 
 const PRETTY_TABLE_ARRAY: &str = r#"[[array]]
@@ -106,7 +107,7 @@
     value
         .serialize(toml::Serializer::pretty(&mut result))
         .unwrap();
-    assert_eq(toml, &result);
+    assert_data_eq!(&result, toml.raw());
 }
 
 const TABLE_ARRAY: &str = r#"[[array]]
@@ -128,7 +129,7 @@
     let value: toml::Value = toml::from_str(toml).unwrap();
     let mut result = String::with_capacity(128);
     value.serialize(toml::Serializer::new(&mut result)).unwrap();
-    assert_eq(toml, &result);
+    assert_data_eq!(&result, toml.raw());
 }
 
 const PRETTY_EMPTY_TABLE: &str = r#"[example]
@@ -140,7 +141,7 @@
     let value: toml::Value = toml::from_str(toml).unwrap();
     let mut result = String::with_capacity(128);
     value.serialize(toml::Serializer::new(&mut result)).unwrap();
-    assert_eq(toml, &result);
+    assert_data_eq!(&result, toml.raw());
 }
 
 #[test]
@@ -165,7 +166,7 @@
 
     #[derive(Clone, Debug, serde::Deserialize, serde::Serialize, Eq, PartialEq)]
     #[serde(untagged, expecting = "expected a boolean or an integer")]
-    pub enum U32OrBool {
+    pub(crate) enum U32OrBool {
         U32(u32),
         Bool(bool),
     }
@@ -180,5 +181,5 @@
 
     let pkg: Package = toml::from_str(raw).unwrap();
     let pretty = toml::to_string_pretty(&pkg).unwrap();
-    assert_eq(raw, pretty);
+    assert_data_eq!(pretty, raw.raw());
 }
diff --git a/crates/toml/tests/testsuite/serde.rs b/crates/toml/tests/testsuite/serde.rs
index d7f8bc4..a2a63cd 100644
--- a/crates/toml/tests/testsuite/serde.rs
+++ b/crates/toml/tests/testsuite/serde.rs
@@ -1,8 +1,11 @@
+use std::collections::BTreeMap;
+
 use serde::Deserialize;
 use serde::Deserializer;
 use serde::Serialize;
-use std::collections::BTreeMap;
-
+use snapbox::assert_data_eq;
+use snapbox::prelude::*;
+use snapbox::str;
 use toml::map::Map;
 use toml::Table;
 use toml::Value;
@@ -23,7 +26,10 @@
 
         // Through a string equivalent
         println!("to_string");
-        snapbox::assert_eq(t!(toml::to_string(&literal)), t!(toml::to_string(&toml)));
+        assert_data_eq!(
+            t!(toml::to_string(&toml)),
+            t!(toml::to_string(&literal)).raw()
+        );
         println!("literal, from_str(toml)");
         assert_eq!(literal, t!(toml::from_str(&t!(toml::to_string(&toml)))));
         println!("toml, from_str(literal)");
@@ -49,20 +55,20 @@
         println!("attempting parsing");
         match toml::from_str::<$ty>(&$toml.to_string()) {
             Ok(_) => panic!("successful"),
-            Err(e) => snapbox::assert_eq($msg_parse, e.to_string()),
+            Err(e) => assert_data_eq!(e.to_string(), $msg_parse.raw()),
         }
 
         println!("attempting toml decoding");
         match $toml.try_into::<$ty>() {
             Ok(_) => panic!("successful"),
-            Err(e) => snapbox::assert_eq($msg_decode, e.to_string()),
+            Err(e) => assert_data_eq!(e.to_string(), $msg_decode.raw()),
         }
     }};
 }
 
 macro_rules! map( ($($k:ident: $v:expr),*) => ({
     let mut _m = Map::new();
-    $(_m.insert(stringify!($k).to_string(), t!(Value::try_from($v)));)*
+    $(_m.insert(stringify!($k).to_owned(), t!(Value::try_from($v)));)*
     _m
 }) );
 
@@ -83,19 +89,19 @@
         a_b: isize,
     }
 
-    equivalent! {
-        Foo { a_b: 2 },
-        map! { a_b: Value::Integer(2)},
-    }
-
     #[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
     struct Foo2 {
         #[serde(rename = "a-b")]
         a_b: isize,
     }
 
+    equivalent! {
+        Foo { a_b: 2 },
+        map! { a_b: Value::Integer(2)},
+    }
+
     let mut m = Map::new();
-    m.insert("a-b".to_string(), Value::Integer(2));
+    m.insert("a-b".to_owned(), Value::Integer(2));
     equivalent! {
         Foo2 { a_b: 2 },
         m,
@@ -115,11 +121,11 @@
     }
 
     equivalent! {
-        Foo { a: 2, b: Bar { a: "test".to_string() } },
+        Foo { a: 2, b: Bar { a: "test".to_owned() } },
         map! {
             a: Value::Integer(2),
             b: map! {
-                a: Value::String("test".to_string())
+                a: Value::String("test".to_owned())
             }
         },
     }
@@ -129,9 +135,9 @@
 fn application_decode_error() {
     #[derive(PartialEq, Debug)]
     struct Range10(usize);
-    impl<'de> serde::Deserialize<'de> for Range10 {
+    impl<'de> Deserialize<'de> for Range10 {
         fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Range10, D::Error> {
-            let x: usize = serde::Deserialize::deserialize(d)?;
+            let x: usize = Deserialize::deserialize(d)?;
             if x > 10 {
                 Err(serde::de::Error::custom("more than 10"))
             } else {
@@ -140,7 +146,7 @@
         }
     }
     let d_good = Value::Integer(5);
-    let d_bad1 = Value::String("not an isize".to_string());
+    let d_bad1 = Value::String("not an isize".to_owned());
     let d_bad2 = Value::Integer(11);
 
     assert_eq!(Range10(5), d_good.try_into().unwrap());
@@ -188,19 +194,19 @@
         Foo {
             a: Some(Box::new(Foo {
                 a: None,
-                b: Bar { a: "foo".to_string(), b: 4.5 },
+                b: Bar { a: "foo".to_owned(), b: 4.5 },
             })),
-            b: Bar { a: "bar".to_string(), b: 1.0 },
+            b: Bar { a: "bar".to_owned(), b: 1.0 },
         },
         map! {
             a: map! {
                 b: map! {
-                    a: Value::String("foo".to_string()),
+                    a: Value::String("foo".to_owned()),
                     b: Value::Float(4.5)
                 }
             },
             b: map! {
-                a: Value::String("bar".to_string()),
+                a: Value::String("bar".to_owned()),
                 b: Value::Float(1.0)
             }
         },
@@ -227,13 +233,13 @@
             },
             map: {
                 let mut m = BTreeMap::new();
-                m.insert("bar".to_string(), 4);
-                m.insert("foo".to_string(), 10);
+                m.insert("bar".to_owned(), 4);
+                m.insert("foo".to_owned(), 10);
                 m
             }
         },
         map! {
-            set: Value::Array(vec![Value::String("a".to_string())]),
+            set: Value::Array(vec![Value::String("a".to_owned())]),
             map: map! {
                 bar: Value::Integer(4),
                 foo: Value::Integer(10)
@@ -272,20 +278,6 @@
         bar: isize,
     }
 
-    error! {
-        Foo,
-        map! {
-            bar: Value::String("a".to_string())
-        },
-        r#"TOML parse error at line 1, column 7
-  |
-1 | bar = "a"
-  |       ^^^
-invalid type: string "a", expected isize
-"#,
-        "invalid type: string \"a\", expected isize\nin `bar`\n"
-    }
-
     #[derive(Deserialize)]
     #[allow(dead_code)]
     struct Bar {
@@ -293,19 +285,45 @@
     }
 
     error! {
+        Foo,
+        map! {
+            bar: Value::String("a".to_owned())
+        },
+        str![[r#"
+TOML parse error at line 1, column 7
+  |
+1 | bar = "a"
+  |       ^^^
+invalid type: string "a", expected isize
+
+"#]],
+        str![[r#"
+invalid type: string "a", expected isize
+in `bar`
+
+"#]]
+    }
+
+    error! {
         Bar,
         map! {
             foo: map! {
-                bar: Value::String("a".to_string())
+                bar: Value::String("a".to_owned())
             }
         },
-        r#"TOML parse error at line 2, column 7
+        str![[r#"
+TOML parse error at line 2, column 7
   |
 2 | bar = "a"
   |       ^^^
 invalid type: string "a", expected isize
-"#,
-        "invalid type: string \"a\", expected isize\nin `foo.bar`\n"
+
+"#]],
+        str![[r#"
+invalid type: string "a", expected isize
+in `foo.bar`
+
+"#]]
     }
 }
 
@@ -319,13 +337,18 @@
     error! {
         Foo,
         map! { },
-        r#"TOML parse error at line 1, column 1
+        str![[r#"
+TOML parse error at line 1, column 1
   |
 1 | 
   | ^
 missing field `bar`
-"#,
-        "missing field `bar`\n"
+
+"#]],
+        str![[r#"
+missing field `bar`
+
+"#]]
     }
 }
 
@@ -353,13 +376,13 @@
     }
 
     equivalent! {
-        Foo { a: E::Baz("foo".to_string()) },
-        map! { a: Value::String("foo".to_string()) },
+        Foo { a: E::Baz("foo".to_owned()) },
+        map! { a: Value::String("foo".to_owned()) },
     }
 
     equivalent! {
-        Foo { a: E::Last(Foo2 { test: "test".to_string() }) },
-        map! { a: map! { test: Value::String("test".to_string()) } },
+        Foo { a: E::Last(Foo2 { test: "test".to_owned() }) },
+        map! { a: map! { test: Value::String("test".to_owned()) } },
     }
 }
 
@@ -379,7 +402,7 @@
 
     equivalent! {
         Foo { a: Sort::Desc },
-        map! { a: Value::String("desc".to_string()) },
+        map! { a: Value::String("desc".to_owned()) },
     }
 }
 
@@ -402,14 +425,19 @@
             Enum::String("2".to_owned(), "2".to_owned()),
         ],
     };
-    let expected = "[[inner]]
+    let raw = toml::to_string(&input).unwrap();
+    assert_data_eq!(
+        raw,
+        str![[r#"
+[[inner]]
 Int = [1, 1]
 
 [[inner]]
-String = [\"2\", \"2\"]
-";
-    let raw = toml::to_string(&input).unwrap();
-    snapbox::assert_eq(expected, raw);
+String = ["2", "2"]
+
+"#]]
+        .raw()
+    );
 
     equivalent! {
         Document {
@@ -452,7 +480,11 @@
             },
         ],
     };
-    let expected = "[[inner]]
+    let raw = toml::to_string(&input).unwrap();
+    assert_data_eq!(
+        raw,
+        str![[r#"
+[[inner]]
 
 [inner.Int]
 first = 1
@@ -461,11 +493,12 @@
 [[inner]]
 
 [inner.String]
-first = \"2\"
-second = \"2\"
-";
-    let raw = toml::to_string(&input).unwrap();
-    snapbox::assert_eq(expected, raw);
+first = "2"
+second = "2"
+
+"#]]
+        .raw()
+    );
 
     equivalent! {
         Document {
@@ -566,10 +599,10 @@
 //     #[derive(Serialize, Deserialize, PartialEq, Debug)]
 //     struct Foo { a: BTreeMap<String, String> }
 //
-//     let v = Foo { a: map! { a, "foo".to_string() } };
+//     let v = Foo { a: map! { a, "foo".to_owned() } };
 //     let mut d = Decoder::new(Table(map! {
 //         a, Table(map! {
-//             a, Value::String("foo".to_string())
+//             a, Value::String("foo".to_owned())
 //         })
 //     }));
 //     assert_eq!(v, t!(Deserialize::deserialize(&mut d)));
@@ -582,9 +615,9 @@
 //     #[derive(Serialize, Deserialize, PartialEq, Debug)]
 //     struct Foo { a: Vec<String> }
 //
-//     let v = Foo { a: vec!["a".to_string()] };
+//     let v = Foo { a: vec!["a".to_owned()] };
 //     let mut d = Decoder::new(Table(map! {
-//         a, Array(vec![Value::String("a".to_string())])
+//         a, Array(vec![Value::String("a".to_owned())])
 //     }));
 //     assert_eq!(v, t!(Deserialize::deserialize(&mut d)));
 //
@@ -747,7 +780,7 @@
     #[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Clone, Serialize, Deserialize)]
     struct NewType(String);
 
-    type CustomKeyMap = std::collections::BTreeMap<NewType, u32>;
+    type CustomKeyMap = BTreeMap<NewType, u32>;
 
     equivalent! {
         [
@@ -772,18 +805,18 @@
     let text = "[bar]\n\n[baz]\n\n[bazv]\na = \"foo\"\n\n[foo]\n";
     let value: BTreeMap<String, CanBeEmpty> = toml::from_str(text).unwrap();
     let mut expected: BTreeMap<String, CanBeEmpty> = BTreeMap::new();
-    expected.insert("bar".to_string(), CanBeEmpty::default());
-    expected.insert("baz".to_string(), CanBeEmpty::default());
+    expected.insert("bar".to_owned(), CanBeEmpty::default());
+    expected.insert("baz".to_owned(), CanBeEmpty::default());
     expected.insert(
-        "bazv".to_string(),
+        "bazv".to_owned(),
         CanBeEmpty {
-            a: Some("foo".to_string()),
+            a: Some("foo".to_owned()),
             b: None,
         },
     );
-    expected.insert("foo".to_string(), CanBeEmpty::default());
+    expected.insert("foo".to_owned(), CanBeEmpty::default());
     assert_eq!(value, expected);
-    snapbox::assert_eq(text, toml::to_string(&value).unwrap());
+    assert_data_eq!(toml::to_string(&value).unwrap(), text.raw());
 }
 
 #[test]
@@ -830,17 +863,17 @@
 
     equivalent! {
         map! {
-            obj: Object(vec!["foo".to_string()], vec![], vec!["bar".to_string(), "baz".to_string()])
+            obj: Object(vec!["foo".to_owned()], vec![], vec!["bar".to_owned(), "baz".to_owned()])
         },
         map! {
             obj: Value::Array(vec![
                 Value::Array(vec![
-                    Value::String("foo".to_string()),
+                    Value::String("foo".to_owned()),
                 ]),
                 Value::Array(vec![]),
                 Value::Array(vec![
-                    Value::String("bar".to_string()),
-                    Value::String("baz".to_string()),
+                    Value::String("bar".to_owned()),
+                    Value::String("baz".to_owned()),
                 ]),
             ])
         },
@@ -851,7 +884,7 @@
 fn json_interoperability() {
     #[derive(Serialize, Deserialize)]
     struct Foo {
-        any: toml::Value,
+        any: Value,
     }
 
     let _foo: Foo = serde_json::from_str(
@@ -884,7 +917,7 @@
 
     #[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
     #[serde(untagged, expecting = "expected a boolean or an integer")]
-    pub enum U32OrBool {
+    pub(crate) enum U32OrBool {
         U32(u32),
         Bool(bool),
     }
@@ -901,14 +934,16 @@
 "#,
     );
     let err = res.unwrap_err();
-    snapbox::assert_eq(
-        r#"TOML parse error at line 8, column 9
+    assert_data_eq!(
+        err.to_string(),
+        str![[r#"
+TOML parse error at line 8, column 9
   |
 8 | debug = 'a'
   |         ^^^
 expected a boolean or an integer
-"#,
-        err.to_string(),
+
+"#]]
     );
 
     let res: Result<Package, _> = toml::from_str(
@@ -923,14 +958,16 @@
 "#,
     );
     let err = res.unwrap_err();
-    snapbox::assert_eq(
-        r#"TOML parse error at line 8, column 17
+    assert_data_eq!(
+        err.to_string(),
+        str![[r#"
+TOML parse error at line 8, column 17
   |
 8 | dev = { debug = 'a' }
   |                 ^^^
 expected a boolean or an integer
-"#,
-        err.to_string(),
+
+"#]]
     );
 }
 
@@ -945,10 +982,12 @@
         name: "foo".to_owned(),
     };
     let raw = toml::to_string_pretty(&package).unwrap();
-    snapbox::assert_eq(
-        r#"name = "foo"
-"#,
+    assert_data_eq!(
         raw,
+        str![[r#"
+name = "foo"
+
+"#]]
     );
 }
 
@@ -970,11 +1009,13 @@
         },
     };
     let raw = toml::to_string_pretty(&package).unwrap();
-    snapbox::assert_eq(
-        r#"[package]
-name = "foo"
-"#,
+    assert_data_eq!(
         raw,
+        str![[r#"
+[package]
+name = "foo"
+
+"#]]
     );
 }
 
@@ -997,7 +1038,7 @@
 
     #[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
     #[serde(untagged, expecting = "expected a boolean or an integer")]
-    pub enum U32OrBool {
+    pub(crate) enum U32OrBool {
         U32(u32),
         Bool(bool),
     }
@@ -1010,11 +1051,13 @@
         },
     };
     let raw = toml::to_string_pretty(&package).unwrap();
-    snapbox::assert_eq(
-        r#"[profile.dev]
-debug = true
-"#,
+    assert_data_eq!(
         raw,
+        str![[r#"
+[profile.dev]
+debug = true
+
+"#]]
     );
 }
 
@@ -1046,7 +1089,7 @@
 
     #[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
     #[serde(untagged, expecting = "expected a boolean or an integer")]
-    pub enum U32OrBool {
+    pub(crate) enum U32OrBool {
         U32(u32),
         Bool(bool),
     }
@@ -1065,8 +1108,10 @@
         },
     };
     let raw = toml::to_string_pretty(&package).unwrap();
-    snapbox::assert_eq(
-        r#"cargo_features = []
+    assert_data_eq!(
+        raw,
+        str![[r#"
+cargo_features = []
 
 [package]
 name = "foo"
@@ -1075,8 +1120,8 @@
 
 [profile.dev]
 debug = true
-"#,
-        raw,
+
+"#]]
     );
 }
 
@@ -1102,9 +1147,12 @@
 
     let native = Foo { a_b: u64::MAX };
     let err = Table::try_from(native.clone()).unwrap_err();
-    snapbox::assert_eq("u64 value was too large", err.to_string());
+    assert_data_eq!(err.to_string(), str!["u64 value was too large"].raw());
     let err = toml::to_string(&native).unwrap_err();
-    snapbox::assert_eq("out-of-range value for u64 type", err.to_string());
+    assert_data_eq!(
+        err.to_string(),
+        str!["out-of-range value for u64 type"].raw()
+    );
 }
 
 #[test]
@@ -1150,7 +1198,7 @@
 fn unsupported_root_type() {
     let native = "value";
     let err = toml::to_string_pretty(&native).unwrap_err();
-    snapbox::assert_eq("unsupported rust type", err.to_string());
+    assert_data_eq!(err.to_string(), str!["unsupported rust type"].raw());
 }
 
 #[test]
@@ -1162,7 +1210,7 @@
 
     let native = Foo { unused: () };
     let err = toml::to_string_pretty(&native).unwrap_err();
-    snapbox::assert_eq("unsupported unit type", err.to_string());
+    assert_data_eq!(err.to_string(), str!["unsupported unit type"].raw());
 }
 
 #[test]
@@ -1174,6 +1222,7 @@
     }
 
     #[derive(Deserialize)]
+    #[allow(dead_code)]
     enum Compare {
         Gt(u32),
     }
@@ -1216,9 +1265,117 @@
 #[test]
 fn datetime_offset_issue_496() {
     let original = "value = 1911-01-01T10:11:12-00:36\n";
-    let toml = original.parse::<toml::Table>().unwrap();
+    let toml = original.parse::<Table>().unwrap();
     let output = toml.to_string();
-    snapbox::assert_eq(original, output);
+    assert_data_eq!(output, original.raw());
+}
+
+#[test]
+fn serialize_date() {
+    use toml::value::Date;
+
+    #[derive(Serialize)]
+    struct Document {
+        date: Date,
+    }
+
+    let input = Document {
+        date: Date {
+            year: 2024,
+            month: 1,
+            day: 1,
+        },
+    };
+    let raw = toml::to_string(&input).unwrap();
+    assert_data_eq!(
+        raw,
+        str![[r#"
+date = 2024-01-01
+
+"#]]
+        .raw()
+    );
+}
+
+#[test]
+fn serialize_time() {
+    use toml::value::Time;
+
+    #[derive(Serialize)]
+    struct Document {
+        date: Time,
+    }
+
+    let input = Document {
+        date: Time {
+            hour: 5,
+            minute: 0,
+            second: 0,
+            nanosecond: 0,
+        },
+    };
+    let raw = toml::to_string(&input).unwrap();
+    assert_data_eq!(
+        raw,
+        str![[r#"
+date = 05:00:00
+
+"#]]
+        .raw()
+    );
+}
+
+#[test]
+fn deserialize_date() {
+    use toml::value::Date;
+
+    #[derive(Debug, Deserialize)]
+    struct Document {
+        date: Date,
+    }
+
+    let document: Document = toml::from_str("date = 2024-01-01").unwrap();
+    assert_eq!(
+        document.date,
+        Date {
+            year: 2024,
+            month: 1,
+            day: 1
+        }
+    );
+
+    let err = toml::from_str::<Document>("date = 2024-01-01T05:00:00").unwrap_err();
+    assert_data_eq!(
+        err.message(),
+        str!["invalid type: local datetime, expected local date"]
+    );
+}
+
+#[test]
+fn deserialize_time() {
+    use toml::value::Time;
+
+    #[derive(Debug, Deserialize)]
+    struct Document {
+        time: Time,
+    }
+
+    let document: Document = toml::from_str("time = 05:00:00").unwrap();
+    assert_eq!(
+        document.time,
+        Time {
+            hour: 5,
+            minute: 0,
+            second: 0,
+            nanosecond: 0,
+        }
+    );
+
+    let err = toml::from_str::<Document>("time = 2024-01-01T05:00:00").unwrap_err();
+    assert_data_eq!(
+        err.message(),
+        str!["invalid type: local datetime, expected local time"]
+    );
 }
 
 #[test]
@@ -1231,15 +1388,21 @@
     let input = Document {
         values: vec![Some(1), Some(2), Some(3)],
     };
-    let expected = "values = [1, 2, 3]\n";
     let raw = toml::to_string(&input).unwrap();
-    snapbox::assert_eq(expected, raw);
+    assert_data_eq!(
+        raw,
+        str![[r#"
+values = [1, 2, 3]
+
+"#]]
+        .raw()
+    );
 
     let input = Document {
         values: vec![Some(1), None, Some(3)],
     };
     let err = toml::to_string(&input).unwrap_err();
-    snapbox::assert_eq("unsupported None value", err.to_string());
+    assert_data_eq!(err.to_string(), str!["unsupported None value"].raw());
 }
 
 #[test]
@@ -1262,7 +1425,10 @@
             OptionalField { x: 3, y: Some(7) },
         ],
     };
-    let expected = "\
+    let raw = toml::to_string(&input).unwrap();
+    assert_data_eq!(
+        raw,
+        str![[r#"
 [[values]]
 x = 0
 y = 4
@@ -1274,9 +1440,10 @@
 [[values]]
 x = 3
 y = 7
-";
-    let raw = toml::to_string(&input).unwrap();
-    snapbox::assert_eq(expected, raw);
+
+"#]]
+        .raw()
+    );
 
     let input = Document {
         values: vec![
@@ -1285,7 +1452,10 @@
             OptionalField { x: 3, y: Some(7) },
         ],
     };
-    let expected = "\
+    let raw = toml::to_string(&input).unwrap();
+    assert_data_eq!(
+        raw,
+        str![[r#"
 [[values]]
 x = 0
 y = 4
@@ -1296,9 +1466,10 @@
 [[values]]
 x = 3
 y = 7
-";
-    let raw = toml::to_string(&input).unwrap();
-    snapbox::assert_eq(expected, raw);
+
+"#]]
+        .raw()
+    );
 }
 
 #[test]
@@ -1328,10 +1499,11 @@
             Choice::Optional(OptionalField { x: 3, y: Some(7) }),
         ],
     };
-    let expected = "values = [{ Optional = { x = 0, y = 4 } }, \"Empty\", { Optional = { x = 2, y = 5 } }, { Optional = { x = 3, y = 7 } }]
-";
     let raw = toml::to_string(&input).unwrap();
-    snapbox::assert_eq(expected, raw);
+    assert_data_eq!(raw, str![[r#"
+values = [{ Optional = { x = 0, y = 4 } }, "Empty", { Optional = { x = 2, y = 5 } }, { Optional = { x = 3, y = 7 } }]
+
+"#]].raw());
 
     let input = Document {
         values: vec![
@@ -1341,10 +1513,11 @@
             Choice::Optional(OptionalField { x: 3, y: Some(7) }),
         ],
     };
-    let expected = "values = [{ Optional = { x = 0, y = 4 } }, \"Empty\", { Optional = { x = 2 } }, { Optional = { x = 3, y = 7 } }]
-";
     let raw = toml::to_string(&input).unwrap();
-    snapbox::assert_eq(expected, raw);
+    assert_data_eq!(raw, str![[r#"
+values = [{ Optional = { x = 0, y = 4 } }, "Empty", { Optional = { x = 2 } }, { Optional = { x = 3, y = 7 } }]
+
+"#]].raw());
 }
 
 #[test]
diff --git a/crates/toml/tests/testsuite/spanned.rs b/crates/toml/tests/testsuite/spanned.rs
index 760c73aa..daf7601 100644
--- a/crates/toml/tests/testsuite/spanned.rs
+++ b/crates/toml/tests/testsuite/spanned.rs
@@ -5,11 +5,14 @@
 use std::fmt::Debug;
 
 use serde::Deserialize;
+use snapbox::assert_data_eq;
+use snapbox::prelude::*;
+use snapbox::str;
 use toml::value::Datetime;
 use toml::Spanned;
 
 /// A set of good datetimes.
-pub fn good_datetimes() -> Vec<&'static str> {
+pub(crate) fn good_datetimes() -> Vec<&'static str> {
     vec![
         "1997-09-09T09:09:09Z",
         "1997-09-09T09:09:09+09:09",
@@ -248,14 +251,16 @@
 fake = 1"#,
     )
     .unwrap_err();
-    snapbox::assert_eq(
-        "\
+    assert_data_eq!(
+        error.to_string(),
+        str![[r#"
 TOML parse error at line 3, column 1
   |
 3 | fake = 1
   | ^^^^
 unknown field `fake`, expected `real`
-",
-        error.to_string(),
+
+"#]]
+        .raw()
     );
 }
diff --git a/crates/toml/tests/testsuite/tables_last.rs b/crates/toml/tests/testsuite/tables_last.rs
index b003557..d94f2b1 100644
--- a/crates/toml/tests/testsuite/tables_last.rs
+++ b/crates/toml/tests/testsuite/tables_last.rs
@@ -54,11 +54,11 @@
     }
 
     let comp1 = Component {
-        base: "b".to_string(),
+        base: "b".to_owned(),
         transform: (1.0, 0.0, 0.0, 1.0, 0.0, 0.0),
     };
     let comp2 = Component {
-        base: "c".to_string(),
+        base: "c".to_owned(),
         transform: (1.0, 0.0, 0.0, 1.0, 0.0, 0.0),
     };
     let components = vec![comp1, comp2];
@@ -68,40 +68,40 @@
             Point {
                 x: 3.0,
                 y: 4.0,
-                pt_type: "line".to_string(),
+                pt_type: "line".to_owned(),
             },
             Point {
                 x: 5.0,
                 y: 6.0,
-                pt_type: "line".to_string(),
+                pt_type: "line".to_owned(),
             },
         ],
         vec![
             Point {
                 x: 0.0,
                 y: 0.0,
-                pt_type: "move".to_string(),
+                pt_type: "move".to_owned(),
             },
             Point {
                 x: 7.0,
                 y: 9.0,
-                pt_type: "offcurve".to_string(),
+                pt_type: "offcurve".to_owned(),
             },
             Point {
                 x: 8.0,
                 y: 10.0,
-                pt_type: "offcurve".to_string(),
+                pt_type: "offcurve".to_owned(),
             },
             Point {
                 x: 11.0,
                 y: 12.0,
-                pt_type: "curve".to_string(),
+                pt_type: "curve".to_owned(),
             },
         ],
     ];
     let g1 = Glyph {
-        contours,
         components,
+        contours,
     };
 
     let s = toml::to_string_pretty(&g1).unwrap();
@@ -149,13 +149,13 @@
     }
     toml::to_string(&C {
         a: A {
-            a: "aa".to_string(),
-            b: "ab".to_string(),
+            a: "aa".to_owned(),
+            b: "ab".to_owned(),
         },
-        b: vec!["b".to_string()],
+        b: vec!["b".to_owned()],
         c: vec![B {
-            a: "cba".to_string(),
-            b: vec!["cbb".to_string()],
+            a: "cba".to_owned(),
+            b: vec!["cbb".to_owned()],
         }],
     })
     .unwrap();
diff --git a/pseudo_crate/Cargo.lock b/pseudo_crate/Cargo.lock
index 60885f6..6b41d7f 100644
--- a/pseudo_crate/Cargo.lock
+++ b/pseudo_crate/Cargo.lock
@@ -420,7 +420,7 @@
  "tokio-stream",
  "tokio-test",
  "tokio-util",
- "toml 0.8.10",
+ "toml 0.8.19",
  "toml_datetime",
  "toml_edit 0.22.20",
  "tonic",
@@ -5315,9 +5315,9 @@
 
 [[package]]
 name = "toml"
-version = "0.8.10"
+version = "0.8.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a9aad4a3066010876e8dcf5a8a06e70a558751117a145c6ce2b82c2e2054290"
+checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e"
 dependencies = [
  "serde",
  "serde_spanned",
diff --git a/pseudo_crate/Cargo.toml b/pseudo_crate/Cargo.toml
index c30ca3d..c374ef4 100644
--- a/pseudo_crate/Cargo.toml
+++ b/pseudo_crate/Cargo.toml
@@ -335,7 +335,7 @@
 tokio-stream = "=0.1.17"
 tokio-test = "=0.4.2"
 tokio-util = "=0.7.13"
-toml = "=0.8.10"
+toml = "=0.8.19"
 toml_datetime = "=0.6.8"
 toml_edit = "=0.22.20"
 tonic = "=0.11.0"