diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e168a7..e2a3660 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ This file contains information about changes in each version of savefile. +## 0.18.6 + +Support for std::net::SocketAddr. + +Support for chrono::DateTime . + ## 0.18.5 Switch parsing library from syn 1 o syn 2. This should have no effect for users. diff --git a/Cargo.lock b/Cargo.lock index a25d8fa..d5dda07 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -26,6 +26,21 @@ dependencies = [ "memchr", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "approx" version = "0.5.1" @@ -49,7 +64,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -114,15 +129,21 @@ checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1be3f42a67d6d345ecd59f675f3f012d6974981560836e938c22b424b85ce1be" + +[[package]] +name = "bumpalo" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.20.0" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a" +checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" [[package]] name = "byteorder" @@ -159,9 +180,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.2" +version = "1.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f34d93e62b03caf570cccc334cbc6c2fceca82f39211051345108adcba3eebdc" +checksum = "c8293772165d9345bdaaa39b45b2109591e63fe5e6fbc23c6ff930a048aa310b" dependencies = [ "shlex", ] @@ -172,23 +193,43 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-targets", +] + [[package]] name = "console" -version = "0.15.8" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b" dependencies = [ "encode_unicode", - "lazy_static", "libc", - "windows-sys", + "once_cell", + "windows-sys 0.59.0", ] +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + [[package]] name = "encode_unicode" -version = "0.3.6" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "env_logger" @@ -241,11 +282,34 @@ version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +[[package]] +name = "iana-time-zone" +version = "0.1.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "indexmap" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", "hashbrown", @@ -253,28 +317,32 @@ dependencies = [ [[package]] name = "insta" -version = "1.41.1" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9ffc4d4892617c50a928c52b2961cb5174b6fc6ebf252b2fac9d21955c48b8" +checksum = "6513e4067e16e69ed1db5ab56048ed65db32d10ba5fc1217f5393f8f17d8b5a5" dependencies = [ "console", - "lazy_static", "linked-hash-map", + "once_cell", "serde", "similar", ] [[package]] -name = "lazy_static" -version = "1.5.0" +name = "js-sys" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] [[package]] name = "libc" -version = "0.2.167" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libloading" @@ -304,9 +372,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" [[package]] name = "matrixmultiply" @@ -335,9 +403,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" dependencies = [ "adler2", ] @@ -350,7 +418,7 @@ checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", "wasi", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -377,7 +445,7 @@ checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -430,13 +498,19 @@ dependencies = [ [[package]] name = "object" -version = "0.36.5" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + [[package]] name = "parking_lot" version = "0.12.3" @@ -468,9 +542,9 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pin-project-lite" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pkg-config" @@ -506,14 +580,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] @@ -542,9 +616,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -587,9 +661,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ "bitflags", ] @@ -635,7 +709,7 @@ dependencies = [ "libc", "spin", "untrusted", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -646,9 +720,9 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" [[package]] name = "rustc_version" @@ -659,18 +733,24 @@ dependencies = [ "semver", ] +[[package]] +name = "rustversion" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" + [[package]] name = "safe_arch" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3460605018fdc9612bce72735cba0d27efbcd9904780d44c7e3a9948f96148a" +checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323" dependencies = [ "bytemuck", ] [[package]] name = "savefile" -version = "0.18.5" +version = "0.18.6" dependencies = [ "arrayvec", "bit-set 0.5.3", @@ -679,6 +759,7 @@ dependencies = [ "bit-vec 0.8.0", "byteorder", "bzip2", + "chrono", "indexmap", "memoffset", "nalgebra", @@ -696,7 +777,7 @@ dependencies = [ [[package]] name = "savefile-abi" -version = "0.18.5" +version = "0.18.6" dependencies = [ "async-trait", "byteorder", @@ -744,12 +825,12 @@ dependencies = [ [[package]] name = "savefile-derive" -version = "0.18.5" +version = "0.18.6" dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -773,6 +854,7 @@ dependencies = [ "bit-vec 0.8.0", "byteorder", "bytes", + "chrono", "indexmap", "insta", "nalgebra", @@ -799,28 +881,28 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "semver" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" [[package]] name = "serde" -version = "1.0.215" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.215" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -870,7 +952,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -892,9 +974,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.90" +version = "2.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" dependencies = [ "proc-macro2", "quote", @@ -903,9 +985,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.41.1" +version = "1.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" +checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" dependencies = [ "backtrace", "bytes", @@ -916,25 +998,25 @@ dependencies = [ "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] name = "tokio-util" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", @@ -967,16 +1049,83 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.96", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + [[package]] name = "wide" -version = "0.7.30" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58e6db2670d2be78525979e9a5f9c69d296fd7d670549fe9ebf70f8708cb5019" +checksum = "41b5576b9a81633f3e8df296ce0063042a73507636cbe956c61133dd7034ab22" dependencies = [ "bytemuck", "safe_arch", ] +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets", +] + [[package]] name = "windows-sys" version = "0.52.0" @@ -986,6 +1135,15 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + [[package]] name = "windows-targets" version = "0.52.6" @@ -1068,5 +1226,5 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] diff --git a/savefile-abi/Cargo.toml b/savefile-abi/Cargo.toml index 90c3722..053e0d5 100644 --- a/savefile-abi/Cargo.toml +++ b/savefile-abi/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "savefile-abi" -version = "0.18.5" +version = "0.18.6" edition = "2021" authors = ["Anders Musikka "] documentation = "https://docs.rs/savefile-abi/" @@ -17,8 +17,8 @@ keywords = ["dylib", "dlopen", "ffi"] license = "MIT/Apache-2.0" [dependencies] -savefile = { path="../savefile", version = "=0.18.5" } -savefile-derive = { path="../savefile-derive", version = "=0.18.5" } +savefile = { path="../savefile", version = "=0.18.6" } +savefile-derive = { path="../savefile-derive", version = "=0.18.6" } byteorder = "1.4" libloading = "0.8" bytes = {version = "1.8", optional = true } diff --git a/savefile-derive/Cargo.toml b/savefile-derive/Cargo.toml index c7f3ec3..dd66dd6 100644 --- a/savefile-derive/Cargo.toml +++ b/savefile-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "savefile-derive" -version = "0.18.5" +version = "0.18.6" authors = ["Anders Musikka "] repository = "https://github.com/avl/savefile" rust-version = "1.74" diff --git a/savefile-test/Cargo.toml b/savefile-test/Cargo.toml index 84e48c0..6566c7b 100644 --- a/savefile-test/Cargo.toml +++ b/savefile-test/Cargo.toml @@ -14,7 +14,7 @@ nightly=["savefile/nightly"] [dependencies] savefile = { path = "../savefile", features = ["size_sanity_checks", "encryption", "compression","bit-set","bit-vec","rustc-hash","serde_derive", "quickcheck", "nalgebra"]} -savefile-derive = { path = "../savefile-derive", version = "=0.18.5"} +savefile-derive = { path = "../savefile-derive", version = "=0.18.6"} savefile-abi = { path = "../savefile-abi" , features = ["bytes"]} bit-vec = "0.8" arrayvec="0.7" @@ -35,6 +35,7 @@ nalgebra="0.33" tokio= { version = "1.40", features = ["test-util", "rt-multi-thread", "full"] } async-trait = "0.1" bytes="1.8" +chrono="*" [build-dependencies] rustc_version="0.4" diff --git a/savefile-test/src/lib.rs b/savefile-test/src/lib.rs index dc8a271..e561299 100644 --- a/savefile-test/src/lib.rs +++ b/savefile-test/src/lib.rs @@ -851,6 +851,7 @@ use smallvec::alloc::collections::BTreeMap; use std::borrow::Cow; use std::collections::{BTreeSet, HashSet}; use std::convert::TryInto; +use std::net::{IpAddr, SocketAddr}; use std::path::PathBuf; use std::string::ToString; use std::sync::atomic::{AtomicI16, AtomicI32, AtomicI64, AtomicI8, AtomicIsize, AtomicU16, AtomicU32, AtomicU64}; @@ -1764,3 +1765,43 @@ fn test_vector() { ]; assert_roundtrip(a); } + +#[test] +fn test_ipv4_sockaddr(){ + + assert_roundtrip::("0.0.0.0:0".parse().unwrap()); + assert_roundtrip::("127.0.0.1:32".parse().unwrap()); + assert_roundtrip::("255.255.255.255:65535".parse().unwrap()); + +} +#[test] +fn test_ipv6_sockaddr(){ + + assert_roundtrip::("[fe80::1ff:fe23:4567:890a]:32".parse().unwrap()); + assert_roundtrip::("[fe80::1ff:fe23:4567:890a%3]:32".parse().unwrap()); + assert_roundtrip::("[::]:1".parse().unwrap()); + +} + +#[test] +fn test_ipv4(){ + + assert_roundtrip::("0.0.0.0".parse().unwrap()); + assert_roundtrip::("127.0.0.1".parse().unwrap()); + assert_roundtrip::("255.255.255.255".parse().unwrap()); + +} +#[test] +fn test_ipv6(){ + + assert_roundtrip::("fe80::1ff:fe23:4567:890a".parse().unwrap()); + assert_roundtrip::("fe80::1ff:fe23:4567:890a".parse().unwrap()); + assert_roundtrip::("::1".parse().unwrap()); + +} +#[test] +fn chrono_datetime(){ + + let now = chrono::Utc::now(); + assert_roundtrip(now); +} diff --git a/savefile/Cargo.toml b/savefile/Cargo.toml index 1456ca0..f6cd343 100644 --- a/savefile/Cargo.toml +++ b/savefile/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "savefile" -version = "0.18.5" +version = "0.18.6" authors = ["Anders Musikka "] documentation = "https://docs.rs/savefile/" homepage = "https://github.com/avl/savefile/" @@ -25,7 +25,7 @@ edition = "2021" rust-version = "1.74" [features] -default = ["indexmap", "arrayvec", "smallvec", "bit-vec", "parking_lot","bit-set", "bit-set08", "bit-vec08"] +default = ["indexmap", "arrayvec", "smallvec", "bit-vec", "parking_lot","bit-set", "bit-set08", "bit-vec08", "chrono"] bit-set = ["dep:bit-set", "bit-vec"] bit-set08 = ["dep:bit-set08", "bit-vec08"] serde_derive = ["dep:serde_derive", "serde"] @@ -56,6 +56,7 @@ bit-vec08 = { package="bit-vec", version = "0.8", optional = true} arrayvec = { version = "0.7", optional = true} smallvec = { version = "1.11", optional = true} indexmap = { version = "2.6", optional = true} +chrono = { version = "0.4.39", optional = true} parking_lot = { version = "0.12", optional = true } ring = {version = "0.17.8", optional = true} rand = { version = "0.8", optional = true} @@ -65,13 +66,13 @@ bit-set08 = {package="bit-set", version = "0.8", optional = true} rustc-hash = {version = "2.0", optional = true} memoffset = "0.9" byteorder = "1.4" -savefile-derive = {path="../savefile-derive", version = "=0.18.5", optional = true } +savefile-derive = {path="../savefile-derive", version = "=0.18.6", optional = true } serde_derive = {version= "1.0", optional = true} serde = {version= "1.0", optional = true} quickcheck = {version= "1.0", optional = true} [dev-dependencies] -savefile-derive = { path="../savefile-derive", version = "=0.18.5" } +savefile-derive = { path="../savefile-derive", version = "=0.18.6" } [build-dependencies] rustc_version="0.4" diff --git a/savefile/src/lib.rs b/savefile/src/lib.rs index 6f59b1f..c2414ef 100644 --- a/savefile/src/lib.rs +++ b/savefile/src/lib.rs @@ -1014,6 +1014,8 @@ pub enum SavefileError { /// Possible descriptive message msg: String, }, + /// A timestamp was encountered which is out of range for the Savefile timestamp type + TimestampOutOfRange } impl From for SavefileError { fn from(value: Utf8Error) -> Self { @@ -1086,6 +1088,9 @@ impl Display for SavefileError { symbol, libname, msg ) } + SavefileError::TimestampOutOfRange => { + write!(f, "A timestamp value outside the range 1677-09-21T00:12:43.145224192 .. 2262-04-11T23:47:16.854775807 was encountered.") + } } } } @@ -1305,6 +1310,181 @@ impl From> for SavefileError { } } +impl Introspect for IpAddr { + fn introspect_value(&self) -> String { + self.to_string() + } + + fn introspect_child<'a>(&'a self, _index: usize) -> Option + 'a>> { + None + } +} + +impl Introspect for SocketAddr { + fn introspect_value(&self) -> String { + self.to_string() + } + + fn introspect_child<'a>(&'a self, _index: usize) -> Option + 'a>> { + None + } +} + +impl WithSchema for IpAddr { + fn schema(_version: u32, _context: &mut WithSchemaContext) -> Schema { + Schema::Enum(SchemaEnum{ + dbg_name: "IpAddr".to_string(), + variants: vec![ + Variant { + name: "IPV4".to_string(), + discriminant: 0, + fields: vec![ + Field { + name: "0".to_string(), + value: Box::new(Schema::Primitive(SchemaPrimitive::schema_u32)), + offset: None, + } + ], + }, + Variant { + name: "IPV6".to_string(), + discriminant: 0, + fields: vec![ + Field { + name: "0".to_string(), + value: Box::new(Schema::Primitive(SchemaPrimitive::schema_u128)), + offset: None, + } + ], + } + + ], + discriminant_size: 1, + has_explicit_repr: false, + size: None, + alignment: None, + }) + } +} +impl Packed for IpAddr{} +impl Serialize for IpAddr { + fn serialize(&self, serializer: &mut Serializer) -> Result<(), SavefileError> { + match self { + IpAddr::V4(v4) => { + serializer.write_u8(0)?; + serializer.write_u32(v4.to_bits())?; + } + IpAddr::V6(v6) => { + serializer.write_u8(1)?; + serializer.write_u128(v6.to_bits())?; + } + } + Ok(()) + } +} +impl Deserialize for IpAddr { + fn deserialize(deserializer: &mut Deserializer) -> Result { + let variant = deserializer.read_u8()?; + match variant { + 0 => { + let ip = deserializer.read_u32()?; + Ok(IpAddr::V4(Ipv4Addr::from_bits(ip))) + } + 1 => { + let ip = deserializer.read_u128()?; + Ok(IpAddr::V6(Ipv6Addr::from_bits(ip))) + } + _ => { + Err(SavefileError::GeneralError { + msg: "corrupt stream: invalid ip address type".to_string(), + }) + } + } + } +} + +impl WithSchema for SocketAddr { + fn schema(_version: u32, _context: &mut WithSchemaContext) -> Schema { + Schema::Enum(SchemaEnum{ + dbg_name: "SocketAddr".to_string(), + variants: vec![ + Variant { + name: "IPV4".to_string(), + discriminant: 0, + fields: vec![ + Field { + name: "0".to_string(), + value: Box::new(Schema::Primitive(SchemaPrimitive::schema_u32)), + offset: None, + } + ], + }, + Variant { + name: "IPV6".to_string(), + discriminant: 0, + fields: vec![ + Field { + name: "0".to_string(), + value: Box::new(Schema::Primitive(SchemaPrimitive::schema_u128)), + offset: None, + } + ], + } + + ], + discriminant_size: 1, + has_explicit_repr: false, + size: None, + alignment: None, + }) + } +} +impl Packed for SocketAddr {} + +impl Serialize for SocketAddr { + fn serialize(&self, serializer: &mut Serializer) -> Result<(), SavefileError> { + match self { + SocketAddr::V4(v4) => { + serializer.write_u8(0)?; + serializer.write_u16(v4.port())?; + serializer.write_u32(v4.ip().to_bits())?; + } + SocketAddr::V6(v6) => { + serializer.write_u8(1)?; + serializer.write_u16(v6.port())?; + serializer.write_u128(v6.ip().to_bits())?; + serializer.write_u32(v6.flowinfo())?; + serializer.write_u32(v6.scope_id())?; + } + } + Ok(()) + } +} +impl Deserialize for SocketAddr { + fn deserialize(deserializer: &mut Deserializer) -> Result { + let variant = deserializer.read_u8()?; + match variant { + 0 => { + let port = deserializer.read_u16()?; + let ip = deserializer.read_u32()?; + Ok(SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::from_bits(ip), port))) + } + 1 => { + let port = deserializer.read_u16()?; + let ip = deserializer.read_u128()?; + let flowinfo = deserializer.read_u32()?; + let scope_id = deserializer.read_u32()?; + Ok(SocketAddr::V6(SocketAddrV6::new(Ipv6Addr::from_bits(ip), port, flowinfo, scope_id))) + } + _ => { + Err(SavefileError::GeneralError { + msg: "corrupt stream: invalid ip address type".to_string(), + }) + } + } + } +} + impl WithSchema for PathBuf { fn schema(_version: u32, _context: &mut WithSchemaContext) -> Schema { Schema::Primitive(SchemaPrimitive::schema_string(VecOrStringLayout::Unknown)) @@ -3554,6 +3734,9 @@ pub enum Schema { ), /// UninitSlice from 'bytes' crate UninitSlice, + /// A signed unix timestamp, with nanosecond precision. Range: + /// 1677-09-21T00:12:43.145224192 .. 2262-04-11T23:47:16.854775807. + UtcTimestamp } /// Introspect is not implemented for Schema, though it could be impl Introspect for Schema { @@ -3592,6 +3775,7 @@ impl Schema { Schema::StdIoError => "stdioerror".into(), Schema::Future(_, _, _, _) => "future".into(), Schema::UninitSlice => {"UninitSlice".into()} + Schema::UtcTimestamp => {"UtcTimestamp".into()} } } /// Determine if the two fields are laid out identically in memory, in their parent objects. @@ -3749,6 +3933,7 @@ impl Schema { Schema::StdIoError => None, Schema::Future(_, _, _, _) => None, Schema::UninitSlice => None, + Schema::UtcTimestamp => Some(8), } } } @@ -3901,6 +4086,9 @@ pub fn diff_schema(a: &Schema, b: &Schema, path: String, is_return_pos: bool) -> (Schema::Str, Schema::Str) => { return None; } + (Schema::UtcTimestamp, Schema::UtcTimestamp) => { + return None; + } (Schema::StdIoError, Schema::StdIoError) => { return None; } @@ -4502,6 +4690,10 @@ impl Serialize for Schema { serializer.write_u8(19)?; Ok(()) } + Schema::UtcTimestamp => { + serializer.write_u8(20)?; + Ok(()) + } } } } @@ -4551,6 +4743,9 @@ impl Deserialize for Schema { 19 => { Schema::UninitSlice } + 20 => { + Schema::UtcTimestamp + } c => { return Err(SavefileError::GeneralError { msg: format!("Corrupt, or future schema, schema variant {} encountered", c), @@ -5723,6 +5918,48 @@ impl Deserialize for Result { } } + +#[cfg(feature = "chrono")] +impl Introspect for chrono::DateTime { + fn introspect_value(&self) -> String { + self.to_string() + } + + fn introspect_child<'a>(&'a self, _index: usize) -> Option + 'a>> { + None + } +} + +#[cfg(feature = "chrono")] +impl Packed for chrono::DateTime { +} + +#[cfg(feature = "chrono")] +impl WithSchema for chrono::DateTime { + fn schema(_version: u32, _context: &mut WithSchemaContext) -> Schema { + Schema::UtcTimestamp + } +} + +#[cfg(feature = "chrono")] +impl Serialize for chrono::DateTime { + fn serialize(&self, serializer: &mut Serializer) -> Result<(), SavefileError> { + let Some(t) = self.timestamp_nanos_opt() else { + return Err(SavefileError::TimestampOutOfRange) + }; + Ok(serializer.write_i64(t)?) + } +} +#[cfg(feature = "chrono")] +impl Deserialize for chrono::DateTime { + fn deserialize(deserializer: &mut Deserializer) -> Result { + let t = deserializer.read_i64()?; + Ok(chrono::DateTime::::from_timestamp_nanos(t)) + } +} + + + #[cfg(any(feature = "bit-vec", feature = "bit-vec08"))] #[cfg(target_endian = "big")] compile_error!("savefile bit-vec feature does not support big-endian machines"); @@ -7336,6 +7573,7 @@ use std::collections::hash_map::Entry; use std::convert::{TryFrom, TryInto}; use std::fmt::{Debug, Display, Formatter}; use std::marker::PhantomData; +use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6}; use std::path::{Path, PathBuf}; use std::ptr::NonNull; use std::slice;