Bug 1504507 - Re-vendor rust dependencies. r=kats

Depends on D10889

Differential Revision: https://phabricator.services.mozilla.com/D10890

--HG--
extra : moz-landing-system : lando
This commit is contained in:
WR Updater Bot 2018-11-05 13:14:49 +00:00
Родитель 0b6d11eb7f
Коммит 5f0e43a33a
29 изменённых файлов: 715 добавлений и 420 удалений

70
Cargo.lock сгенерированный
Просмотреть файл

@ -34,7 +34,7 @@ version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
@ -96,8 +96,8 @@ dependencies = [
"log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
"memmap 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "memmap 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
"scoped-tls 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "scoped-tls 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.66 (git+https://github.com/servo/serde?branch=deserialize_from_enums8)", "serde_derive 1.0.80 (git+https://github.com/servo/serde?branch=deserialize_from_enums9)",
"tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
"tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
"tokio-uds 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
@ -209,7 +209,7 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
@ -740,8 +740,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
"regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.66 (git+https://github.com/servo/serde?branch=deserialize_from_enums8)", "serde_derive 1.0.80 (git+https://github.com/servo/serde?branch=deserialize_from_enums9)",
"strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
@ -772,8 +772,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.66 (git+https://github.com/servo/serde?branch=deserialize_from_enums8)", "serde_derive 1.0.80 (git+https://github.com/servo/serde?branch=deserialize_from_enums9)",
"winapi 0.3.6 (git+https://github.com/froydnj/winapi-rs?branch=aarch64)", "winapi 0.3.6 (git+https://github.com/froydnj/winapi-rs?branch=aarch64)",
] ]
@ -839,7 +839,7 @@ version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
@ -971,8 +971,8 @@ dependencies = [
"mozrunner 0.8.0", "mozrunner 0.8.0",
"mozversion 0.1.3", "mozversion 0.1.3",
"regex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.66 (git+https://github.com/servo/serde?branch=deserialize_from_enums8)", "serde_derive 1.0.80 (git+https://github.com/servo/serde?branch=deserialize_from_enums9)",
"serde_json 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)",
"uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
"webdriver 0.38.0", "webdriver 0.38.0",
@ -1267,8 +1267,8 @@ dependencies = [
"petgraph 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)", "petgraph 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)",
"regex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"regex-syntax 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "regex-syntax 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.66 (git+https://github.com/servo/serde?branch=deserialize_from_enums8)", "serde_derive 1.0.80 (git+https://github.com/servo/serde?branch=deserialize_from_enums9)",
"sha2 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
"string_cache 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
"term 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "term 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
@ -1548,8 +1548,8 @@ dependencies = [
"log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
"proc-macro2 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
"quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.66 (git+https://github.com/servo/serde?branch=deserialize_from_enums8)", "serde_derive 1.0.80 (git+https://github.com/servo/serde?branch=deserialize_from_enums9)",
"syn 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "syn 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)",
"void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.6 (git+https://github.com/froydnj/winapi-rs?branch=aarch64)", "winapi 0.3.6 (git+https://github.com/froydnj/winapi-rs?branch=aarch64)",
@ -2072,7 +2072,7 @@ dependencies = [
"lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
"lmdb-rkv 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "lmdb-rkv 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
"ordered-float 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "ordered-float 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
"url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
@ -2082,7 +2082,7 @@ name = "ron"
version = "0.1.7" version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
@ -2090,8 +2090,8 @@ name = "rsdparsa"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.66 (git+https://github.com/servo/serde?branch=deserialize_from_enums8)", "serde_derive 1.0.80 (git+https://github.com/servo/serde?branch=deserialize_from_enums9)",
] ]
[[package]] [[package]]
@ -2211,10 +2211,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.66" version = "1.0.80"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"serde_derive 1.0.66 (git+https://github.com/servo/serde?branch=deserialize_from_enums8)", "serde_derive 1.0.80 (git+https://github.com/servo/serde?branch=deserialize_from_enums9)",
] ]
[[package]] [[package]]
@ -2222,17 +2222,17 @@ name = "serde_bytes"
version = "0.10.4" version = "0.10.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.66" version = "1.0.80"
source = "git+https://github.com/servo/serde?branch=deserialize_from_enums8#c4457d804b38b14e699b45c01d1909f93f25ab5e" source = "git+https://github.com/servo/serde?branch=deserialize_from_enums9#e0cc925c259cb74ce41377e4fe02713adfa6d836"
dependencies = [ dependencies = [
"proc-macro2 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)",
"quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
"syn 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "syn 0.15.7 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
@ -2242,7 +2242,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
"ryu 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "ryu 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
@ -2320,7 +2320,7 @@ dependencies = [
"new_debug_unreachable 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "new_debug_unreachable 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
"phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", "phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)",
"precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
"string_cache_codegen 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_codegen 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
@ -2756,7 +2756,7 @@ name = "toml"
version = "0.4.5" version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
@ -2910,8 +2910,8 @@ dependencies = [
"lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
"regex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.66 (git+https://github.com/servo/serde?branch=deserialize_from_enums8)", "serde_derive 1.0.80 (git+https://github.com/servo/serde?branch=deserialize_from_enums9)",
"serde_json 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)",
"time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
"tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2951,7 +2951,7 @@ dependencies = [
"plane-split 0.13.3 (registry+https://github.com/rust-lang/crates.io-index)", "plane-split 0.13.3 (registry+https://github.com/rust-lang/crates.io-index)",
"rayon 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"ron 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "ron 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
"smallvec 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
"thread_profiler 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "thread_profiler 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
"time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2970,9 +2970,9 @@ dependencies = [
"core-graphics 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)", "core-graphics 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)",
"dwrote 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "dwrote 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
"euclid 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", "euclid 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_bytes 0.10.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde_bytes 0.10.4 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.66 (git+https://github.com/servo/serde?branch=deserialize_from_enums8)", "serde_derive 1.0.80 (git+https://github.com/servo/serde?branch=deserialize_from_enums9)",
"time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
@ -3326,9 +3326,9 @@ dependencies = [
"checksum scroll_derive 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8f1aa96c45e7f5a91cb7fabe7b279f02fea7126239fc40b732316e8b6a2d0fcb" "checksum scroll_derive 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8f1aa96c45e7f5a91cb7fabe7b279f02fea7126239fc40b732316e8b6a2d0fcb"
"checksum semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" "checksum semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537"
"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
"checksum serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)" = "e9a2d9a9ac5120e0f768801ca2b58ad6eec929dc9d1d616c162f208869c2ce95" "checksum serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)" = "15c141fc7027dd265a47c090bf864cf62b42c4d228bbcf4e51a0c9e2b0d3f7ef"
"checksum serde_bytes 0.10.4 (registry+https://github.com/rust-lang/crates.io-index)" = "adb6e51a6b3696b301bc221d785f898b4457c619b51d7ce195a6d20baecb37b3" "checksum serde_bytes 0.10.4 (registry+https://github.com/rust-lang/crates.io-index)" = "adb6e51a6b3696b301bc221d785f898b4457c619b51d7ce195a6d20baecb37b3"
"checksum serde_derive 1.0.66 (git+https://github.com/servo/serde?branch=deserialize_from_enums8)" = "<none>" "checksum serde_derive 1.0.80 (git+https://github.com/servo/serde?branch=deserialize_from_enums9)" = "<none>"
"checksum serde_json 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)" = "44dd2cfde475037451fa99b7e5df77aa3cfd1536575fa8e7a538ab36dcde49ae" "checksum serde_json 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)" = "44dd2cfde475037451fa99b7e5df77aa3cfd1536575fa8e7a538ab36dcde49ae"
"checksum sha2 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9eb6be24e4c23a84d7184280d2722f7f2731fcdd4a9d886efbfe4413e4847ea0" "checksum sha2 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9eb6be24e4c23a84d7184280d2722f7f2731fcdd4a9d886efbfe4413e4847ea0"
"checksum simd 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0048b17eb9577ac545c61d85c3559b41dfb4cbea41c9bd9ca6a4f73ff05fda84" "checksum simd 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0048b17eb9577ac545c61d85c3559b41dfb4cbea41c9bd9ca6a4f73ff05fda84"

2
third_party/rust/serde/.cargo-checksum.json поставляемый
Просмотреть файл

@ -1 +1 @@
{"files":{"Cargo.toml":"844ca61f123bafc3da9cf0409d3425f20d3796e38607e88f33fe328c277589e9","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"fe0d3aa328d0e26c76f646c45197bc8c518257d31f3640baed096915b9bdf642","build.rs":"8a7c78d54d7a36e31b21014a9818a3847d6e4e6ee439ecc1d34e6fdef3927ae7","crates-io.md":"4de7b932987feadedd392855d166d0346e8f405190e8085a2e2f84c936a68959","src/de/from_primitive.rs":"3cf03cb47d884ff32555673831d79de8f6bf0c58a22783d73077d1f694c1494d","src/de/ignored_any.rs":"ea47caa53548c394a70bb512afd75b2de7fc9937b33518606282e4084dc70a77","src/de/impls.rs":"19fe62cd61cf74d58eebcec1ad7f96aa5f0824d0173c214d9b0784affd00ab35","src/de/mod.rs":"31466428748f808de1b7f1940047b5c46474604745fc898f39eee182075204aa","src/de/utf8.rs":"956b124b7ce98353cb781b56e43a6fed2e67f1389d35b7a468d5be75b1485853","src/de/value.rs":"5883ea09fb61c30fcb7422a000688481f4fae4c0980ca4618f8b5747b573d545","src/export.rs":"4e3ed8aa2b0e5d9c18f462183dff7fa4772a30e88e6b3cc0fb9712282ecbe0c5","src/integer128.rs":"1bf9e18047a4a3f95a43b8d253e4f844b6be62e71684e47d980582462bce4223","src/lib.rs":"7b24f7fff89cc5122ab1a128285425ad8c287598bbd973a937aa20c5340cacf3","src/macros.rs":"bcffeb59dd91a23368f0c0e5cca5bdbf9dedc7850162c1d571b5d2902a73a309","src/private/de.rs":"3b2dc579aea37c8f231ed2228a584f146f71799f393547583cc7ea182ec551e6","src/private/macros.rs":"6861a4f332ea24d0ed5db1c28fe3105d2716523902f045c0bbbd439ebf9e44de","src/private/mod.rs":"0c774d86042cefdb447857070a1d4d2c0b9f519a7f5db588a1e7fcc16ca5a511","src/private/ser.rs":"56b61986a7c57d37d65d763cb69119889a3dc06eb27a9e95cd5e758acf0e4535","src/ser/impls.rs":"3735a8620dd0e7ff33e33c15f844ecb76207d5101389bf45abca732bd48294eb","src/ser/impossible.rs":"91da408362284ec567b2316050900251ff66a1134413963720154fb70f3919c0","src/ser/mod.rs":"5a1c38bfb1898e7fd41f8f5b53c9fc952edb66d23de1356941050314f37504a0"},"package":"e9a2d9a9ac5120e0f768801ca2b58ad6eec929dc9d1d616c162f208869c2ce95"} {"files":{"Cargo.toml":"d370184a37692fbf66fc20feef381e5ce9a1a7c6e95fd855c03c796b15f28f0e","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"c4218d07d775c036cd50495b0354c5b59435472b12e159042cacb30b6ef1a7c1","build.rs":"f3fdadb2b0f8c9f1568903f47cfc48a8e5ec3f81dd54a067fda5e4fa084d0d30","crates-io.md":"8dce715dfbd2e9bbdd87e401d1f7974a60089f0673f7a84f4c5d840411075d14","src/de/from_primitive.rs":"3cf03cb47d884ff32555673831d79de8f6bf0c58a22783d73077d1f694c1494d","src/de/ignored_any.rs":"90b6b3c79472fd6c8997f4456dae9f28d4dbaa87efdbbc5fb304d6a83c560d00","src/de/impls.rs":"76b2b181e9cd9e748fae1bdb1e30a256f9ea3d5398be191a23fe56164c6792dd","src/de/mod.rs":"5def657ab51bf031c7706b98a19d369abef80a8c1c5b46267dc8223c904ba52b","src/de/utf8.rs":"956b124b7ce98353cb781b56e43a6fed2e67f1389d35b7a468d5be75b1485853","src/de/value.rs":"5883ea09fb61c30fcb7422a000688481f4fae4c0980ca4618f8b5747b573d545","src/export.rs":"4e3ed8aa2b0e5d9c18f462183dff7fa4772a30e88e6b3cc0fb9712282ecbe0c5","src/integer128.rs":"1bf9e18047a4a3f95a43b8d253e4f844b6be62e71684e47d980582462bce4223","src/lib.rs":"d6d7291950ff051c9958a31eb39f34edfbb5fd1692185bf99e0f55b3aa6f802f","src/macros.rs":"953b42721810eb26239231849af2f9f461721497695317e7672001c27d2cb25c","src/private/de.rs":"29a62d208e9439f8ce6dff4bca746a9e85b36b88da13f187a320be84a66cebc0","src/private/macros.rs":"0bebda4a3c1b794280d21581fc0d5e3cf130647f53b6a8ac157164c74e14df51","src/private/mod.rs":"0c774d86042cefdb447857070a1d4d2c0b9f519a7f5db588a1e7fcc16ca5a511","src/private/ser.rs":"56b61986a7c57d37d65d763cb69119889a3dc06eb27a9e95cd5e758acf0e4535","src/ser/impls.rs":"d3bb23bc5860e7ed4b7cdf01c66d22e1ac6e2ec2efb52ba831298fd63a27baed","src/ser/impossible.rs":"91da408362284ec567b2316050900251ff66a1134413963720154fb70f3919c0","src/ser/mod.rs":"feba74b5c928ce00c2fcc5d8602e7255a0731428fefd2de45353170334cdbea4"},"package":"15c141fc7027dd265a47c090bf864cf62b42c4d228bbcf4e51a0c9e2b0d3f7ef"}

2
third_party/rust/serde/Cargo.toml поставляемый
Просмотреть файл

@ -12,7 +12,7 @@
[package] [package]
name = "serde" name = "serde"
version = "1.0.66" version = "1.0.80"
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"] authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
build = "build.rs" build = "build.rs"
include = ["Cargo.toml", "build.rs", "src/**/*.rs", "crates-io.md", "README.md", "LICENSE-APACHE", "LICENSE-MIT"] include = ["Cargo.toml", "build.rs", "src/**/*.rs", "crates-io.md", "README.md", "LICENSE-APACHE", "LICENSE-MIT"]

15
third_party/rust/serde/README.md поставляемый
Просмотреть файл

@ -15,7 +15,7 @@ You may be looking for:
- [An overview of Serde](https://serde.rs/) - [An overview of Serde](https://serde.rs/)
- [Data formats supported by Serde](https://serde.rs/#data-formats) - [Data formats supported by Serde](https://serde.rs/#data-formats)
- [Setting up `#[derive(Serialize, Deserialize)]`](https://serde.rs/codegen.html) - [Setting up `#[derive(Serialize, Deserialize)]`](https://serde.rs/derive.html)
- [Examples](https://serde.rs/examples.html) - [Examples](https://serde.rs/examples.html)
- [API documentation](https://docs.serde.rs/serde/) - [API documentation](https://docs.serde.rs/serde/)
- [Release notes](https://github.com/serde-rs/serde/releases) - [Release notes](https://github.com/serde-rs/serde/releases)
@ -79,12 +79,13 @@ fn main() {
## Getting help ## Getting help
Serde developers live in the #serde channel on Serde developers live in the #serde channel on [`irc.mozilla.org`][irc]. The
[`irc.mozilla.org`](https://wiki.mozilla.org/IRC). The #rust channel is also a \#rust channel is also a good resource with generally faster response time but
good resource with generally faster response time but less specific knowledge less specific knowledge about Serde. If IRC is not your thing or you don't get a
about Serde. If IRC is not your thing or you don't get a good response, we are good response, we are happy to respond to [GitHub issues][issues] as well.
happy to respond to [GitHub issues](https://github.com/serde-rs/serde/issues/new)
as well. [irc]: https://wiki.mozilla.org/IRC
[issues]: https://github.com/serde-rs/serde/issues/new/choose
## License ## License

14
third_party/rust/serde/build.rs поставляемый
Просмотреть файл

@ -11,6 +11,9 @@ fn main() {
None => return, None => return,
}; };
let target = env::var("TARGET").unwrap();
let emscripten = target == "asmjs-unknown-emscripten" || target == "wasm32-unknown-emscripten";
// CString::into_boxed_c_str stabilized in Rust 1.20: // CString::into_boxed_c_str stabilized in Rust 1.20:
// https://doc.rust-lang.org/std/ffi/struct.CString.html#method.into_boxed_c_str // https://doc.rust-lang.org/std/ffi/struct.CString.html#method.into_boxed_c_str
if minor >= 20 { if minor >= 20 {
@ -32,10 +35,19 @@ fn main() {
// 128-bit integers stabilized in Rust 1.26: // 128-bit integers stabilized in Rust 1.26:
// https://blog.rust-lang.org/2018/05/10/Rust-1.26.html // https://blog.rust-lang.org/2018/05/10/Rust-1.26.html
if minor >= 26 { //
// Disabled on Emscripten targets as Emscripten doesn't
// currently support integers larger than 64 bits.
if minor >= 26 && !emscripten {
println!("cargo:rustc-cfg=integer128"); println!("cargo:rustc-cfg=integer128");
} }
// Inclusive ranges methods stabilized in Rust 1.27:
// https://github.com/rust-lang/rust/pull/50758
if minor >= 27 {
println!("cargo:rustc-cfg=range_inclusive");
}
// Non-zero integers stabilized in Rust 1.28: // Non-zero integers stabilized in Rust 1.28:
// https://github.com/rust-lang/rust/pull/50808 // https://github.com/rust-lang/rust/pull/50808
if minor >= 28 { if minor >= 28 {

15
third_party/rust/serde/crates-io.md поставляемый
Просмотреть файл

@ -8,7 +8,7 @@ You may be looking for:
- [An overview of Serde](https://serde.rs/) - [An overview of Serde](https://serde.rs/)
- [Data formats supported by Serde](https://serde.rs/#data-formats) - [Data formats supported by Serde](https://serde.rs/#data-formats)
- [Setting up `#[derive(Serialize, Deserialize)]`](https://serde.rs/codegen.html) - [Setting up `#[derive(Serialize, Deserialize)]`](https://serde.rs/derive.html)
- [Examples](https://serde.rs/examples.html) - [Examples](https://serde.rs/examples.html)
- [API documentation](https://docs.serde.rs/serde/) - [API documentation](https://docs.serde.rs/serde/)
- [Release notes](https://github.com/serde-rs/serde/releases) - [Release notes](https://github.com/serde-rs/serde/releases)
@ -47,9 +47,10 @@ fn main() {
## Getting help ## Getting help
Serde developers live in the #serde channel on Serde developers live in the #serde channel on [`irc.mozilla.org`][irc]. The
[`irc.mozilla.org`](https://wiki.mozilla.org/IRC). The #rust channel is also a \#rust channel is also a good resource with generally faster response time but
good resource with generally faster response time but less specific knowledge less specific knowledge about Serde. If IRC is not your thing or you don't get a
about Serde. If IRC is not your thing or you don't get a good response, we are good response, we are happy to respond to [GitHub issues][issues] as well.
happy to respond to [GitHub issues](https://github.com/serde-rs/serde/issues/new)
as well. [irc]: https://wiki.mozilla.org/IRC
[issues]: https://github.com/serde-rs/serde/issues/new/choose

10
third_party/rust/serde/src/de/ignored_any.rs поставляемый
Просмотреть файл

@ -20,7 +20,9 @@ use de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor};
/// use std::fmt; /// use std::fmt;
/// use std::marker::PhantomData; /// use std::marker::PhantomData;
/// ///
/// use serde::de::{self, Deserialize, DeserializeSeed, Deserializer, Visitor, SeqAccess, IgnoredAny}; /// use serde::de::{
/// self, Deserialize, DeserializeSeed, Deserializer, IgnoredAny, SeqAccess, Visitor,
/// };
/// ///
/// /// A seed that can be used to deserialize only the `n`th element of a sequence /// /// A seed that can be used to deserialize only the `n`th element of a sequence
/// /// while efficiently discarding elements of any type before or after index `n`. /// /// while efficiently discarding elements of any type before or after index `n`.
@ -51,7 +53,11 @@ use de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor};
/// type Value = T; /// type Value = T;
/// ///
/// fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { /// fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
/// write!(formatter, "a sequence in which we care about element {}", self.n) /// write!(
/// formatter,
/// "a sequence in which we care about element {}",
/// self.n
/// )
/// } /// }
/// ///
/// fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error> /// fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>

434
third_party/rust/serde/src/de/impls.rs поставляемый
Просмотреть файл

@ -696,7 +696,6 @@ macro_rules! seq_impl {
( (
$ty:ident < T $(: $tbound1:ident $(+ $tbound2:ident)*)* $(, $typaram:ident : $bound1:ident $(+ $bound2:ident)*)* >, $ty:ident < T $(: $tbound1:ident $(+ $tbound2:ident)*)* $(, $typaram:ident : $bound1:ident $(+ $bound2:ident)*)* >,
$access:ident, $access:ident,
$ctor:expr,
$clear:expr, $clear:expr,
$with_capacity:expr, $with_capacity:expr,
$reserve:expr, $reserve:expr,
@ -793,7 +792,6 @@ fn nop_reserve<T>(_seq: T, _n: usize) {}
seq_impl!( seq_impl!(
BinaryHeap<T: Ord>, BinaryHeap<T: Ord>,
seq, seq,
BinaryHeap::new(),
BinaryHeap::clear, BinaryHeap::clear,
BinaryHeap::with_capacity(size_hint::cautious(seq.size_hint())), BinaryHeap::with_capacity(size_hint::cautious(seq.size_hint())),
BinaryHeap::reserve, BinaryHeap::reserve,
@ -803,7 +801,6 @@ seq_impl!(
seq_impl!( seq_impl!(
BTreeSet<T: Eq + Ord>, BTreeSet<T: Eq + Ord>,
seq, seq,
BTreeSet::new(),
BTreeSet::clear, BTreeSet::clear,
BTreeSet::new(), BTreeSet::new(),
nop_reserve, nop_reserve,
@ -813,7 +810,6 @@ seq_impl!(
seq_impl!( seq_impl!(
LinkedList<T>, LinkedList<T>,
seq, seq,
LinkedList::new(),
LinkedList::clear, LinkedList::clear,
LinkedList::new(), LinkedList::new(),
nop_reserve, nop_reserve,
@ -824,28 +820,15 @@ seq_impl!(
seq_impl!( seq_impl!(
HashSet<T: Eq + Hash, S: BuildHasher + Default>, HashSet<T: Eq + Hash, S: BuildHasher + Default>,
seq, seq,
HashSet::with_hasher(S::default()),
HashSet::clear, HashSet::clear,
HashSet::with_capacity_and_hasher(size_hint::cautious(seq.size_hint()), S::default()), HashSet::with_capacity_and_hasher(size_hint::cautious(seq.size_hint()), S::default()),
HashSet::reserve, HashSet::reserve,
HashSet::insert); HashSet::insert);
#[cfg(any(feature = "std", feature = "alloc"))]
seq_impl!(
Vec<T>,
seq,
Vec::new(),
Vec::clear,
Vec::with_capacity(size_hint::cautious(seq.size_hint())),
Vec::reserve,
Vec::push
);
#[cfg(any(feature = "std", feature = "alloc"))] #[cfg(any(feature = "std", feature = "alloc"))]
seq_impl!( seq_impl!(
VecDeque<T>, VecDeque<T>,
seq, seq,
VecDeque::new(),
VecDeque::clear, VecDeque::clear,
VecDeque::with_capacity(size_hint::cautious(seq.size_hint())), VecDeque::with_capacity(size_hint::cautious(seq.size_hint())),
VecDeque::reserve, VecDeque::reserve,
@ -854,6 +837,97 @@ seq_impl!(
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
#[cfg(any(feature = "std", feature = "alloc"))]
impl<'de, T> Deserialize<'de> for Vec<T>
where
T: Deserialize<'de>,
{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
struct VecVisitor<T> {
marker: PhantomData<T>,
}
impl<'de, T> Visitor<'de> for VecVisitor<T>
where
T: Deserialize<'de>,
{
type Value = Vec<T>;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("a sequence")
}
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
where
A: SeqAccess<'de>,
{
let mut values = Vec::with_capacity(size_hint::cautious(seq.size_hint()));
while let Some(value) = try!(seq.next_element()) {
values.push(value);
}
Ok(values)
}
}
let visitor = VecVisitor { marker: PhantomData };
deserializer.deserialize_seq(visitor)
}
fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error>
where
D: Deserializer<'de>,
{
struct VecInPlaceVisitor<'a, T: 'a>(&'a mut Vec<T>);
impl<'a, 'de, T> Visitor<'de> for VecInPlaceVisitor<'a, T>
where
T: Deserialize<'de>,
{
type Value = ();
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("a sequence")
}
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
where
A: SeqAccess<'de>,
{
let hint = size_hint::cautious(seq.size_hint());
if let Some(additional) = hint.checked_sub(self.0.len()) {
self.0.reserve(additional);
}
for i in 0..self.0.len() {
let next = {
let next_place = InPlaceSeed(&mut self.0[i]);
try!(seq.next_element_seed(next_place))
};
if next.is_none() {
self.0.truncate(i);
return Ok(());
}
}
while let Some(value) = try!(seq.next_element()) {
self.0.push(value);
}
Ok(())
}
}
deserializer.deserialize_seq(VecInPlaceVisitor(place))
}
}
////////////////////////////////////////////////////////////////////////////////
struct ArrayVisitor<A> { struct ArrayVisitor<A> {
marker: PhantomData<A>, marker: PhantomData<A>,
} }
@ -1113,7 +1187,6 @@ macro_rules! map_impl {
( (
$ty:ident < K $(: $kbound1:ident $(+ $kbound2:ident)*)*, V $(, $typaram:ident : $bound1:ident $(+ $bound2:ident)*)* >, $ty:ident < K $(: $kbound1:ident $(+ $kbound2:ident)*)*, V $(, $typaram:ident : $bound1:ident $(+ $bound2:ident)*)* >,
$access:ident, $access:ident,
$ctor:expr,
$with_capacity:expr $with_capacity:expr
) => { ) => {
impl<'de, K, V $(, $typaram)*> Deserialize<'de> for $ty<K, V $(, $typaram)*> impl<'de, K, V $(, $typaram)*> Deserialize<'de> for $ty<K, V $(, $typaram)*>
@ -1168,14 +1241,12 @@ macro_rules! map_impl {
map_impl!( map_impl!(
BTreeMap<K: Ord, V>, BTreeMap<K: Ord, V>,
map, map,
BTreeMap::new(),
BTreeMap::new()); BTreeMap::new());
#[cfg(feature = "std")] #[cfg(feature = "std")]
map_impl!( map_impl!(
HashMap<K: Eq + Hash, V, S: BuildHasher + Default>, HashMap<K: Eq + Hash, V, S: BuildHasher + Default>,
map, map,
HashMap::with_hasher(S::default()),
HashMap::with_capacity_and_hasher(size_hint::cautious(map.size_hint()), S::default())); HashMap::with_capacity_and_hasher(size_hint::cautious(map.size_hint()), S::default()));
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -1602,7 +1673,11 @@ forwarded_impl!((T), Box<[T]>, Vec::into_boxed_slice);
#[cfg(any(feature = "std", feature = "alloc"))] #[cfg(any(feature = "std", feature = "alloc"))]
forwarded_impl!((), Box<str>, String::into_boxed_str); forwarded_impl!((), Box<str>, String::into_boxed_str);
#[cfg(all(not(de_rc_dst), feature = "rc", any(feature = "std", feature = "alloc")))] #[cfg(all(
not(de_rc_dst),
feature = "rc",
any(feature = "std", feature = "alloc")
))]
forwarded_impl! { forwarded_impl! {
/// This impl requires the [`"rc"`] Cargo feature of Serde. /// This impl requires the [`"rc"`] Cargo feature of Serde.
/// ///
@ -1614,7 +1689,11 @@ forwarded_impl! {
(T), Arc<T>, Arc::new (T), Arc<T>, Arc::new
} }
#[cfg(all(not(de_rc_dst), feature = "rc", any(feature = "std", feature = "alloc")))] #[cfg(all(
not(de_rc_dst),
feature = "rc",
any(feature = "std", feature = "alloc")
))]
forwarded_impl! { forwarded_impl! {
/// This impl requires the [`"rc"`] Cargo feature of Serde. /// This impl requires the [`"rc"`] Cargo feature of Serde.
/// ///
@ -1681,7 +1760,11 @@ where
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
#[cfg(all(de_rc_dst, feature = "rc", any(feature = "std", feature = "alloc")))] #[cfg(all(
de_rc_dst,
feature = "rc",
any(feature = "std", feature = "alloc")
))]
macro_rules! box_forwarded_impl { macro_rules! box_forwarded_impl {
( (
$(#[doc = $doc:tt])* $(#[doc = $doc:tt])*
@ -1702,7 +1785,11 @@ macro_rules! box_forwarded_impl {
}; };
} }
#[cfg(all(de_rc_dst, feature = "rc", any(feature = "std", feature = "alloc")))] #[cfg(all(
de_rc_dst,
feature = "rc",
any(feature = "std", feature = "alloc")
))]
box_forwarded_impl! { box_forwarded_impl! {
/// This impl requires the [`"rc"`] Cargo feature of Serde. /// This impl requires the [`"rc"`] Cargo feature of Serde.
/// ///
@ -1714,7 +1801,11 @@ box_forwarded_impl! {
Rc Rc
} }
#[cfg(all(de_rc_dst, feature = "rc", any(feature = "std", feature = "alloc")))] #[cfg(all(
de_rc_dst,
feature = "rc",
any(feature = "std", feature = "alloc")
))]
box_forwarded_impl! { box_forwarded_impl! {
/// This impl requires the [`"rc"`] Cargo feature of Serde. /// This impl requires the [`"rc"`] Cargo feature of Serde.
/// ///
@ -2024,8 +2115,7 @@ impl<'de> Deserialize<'de> for SystemTime {
// start: u64, // start: u64,
// end: u32, // end: u32,
// } // }
#[cfg(feature = "std")] impl<'de, Idx> Deserialize<'de> for Range<Idx>
impl<'de, Idx> Deserialize<'de> for ops::Range<Idx>
where where
Idx: Deserialize<'de>, Idx: Deserialize<'de>,
{ {
@ -2033,134 +2123,165 @@ where
where where
D: Deserializer<'de>, D: Deserializer<'de>,
{ {
// If this were outside of the serde crate, it would just use: let (start, end) = deserializer.deserialize_struct(
//
// #[derive(Deserialize)]
// #[serde(field_identifier, rename_all = "lowercase")]
enum Field {
Start,
End,
};
impl<'de> Deserialize<'de> for Field {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
struct FieldVisitor;
impl<'de> Visitor<'de> for FieldVisitor {
type Value = Field;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("`start` or `end`")
}
fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
where
E: Error,
{
match value {
"start" => Ok(Field::Start),
"end" => Ok(Field::End),
_ => Err(Error::unknown_field(value, FIELDS)),
}
}
fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E>
where
E: Error,
{
match value {
b"start" => Ok(Field::Start),
b"end" => Ok(Field::End),
_ => {
let value = String::from_utf8_lossy(value);
Err(Error::unknown_field(&value, FIELDS))
}
}
}
}
deserializer.deserialize_identifier(FieldVisitor)
}
}
struct RangeVisitor<Idx> {
phantom: PhantomData<Idx>,
}
impl<'de, Idx> Visitor<'de> for RangeVisitor<Idx>
where
Idx: Deserialize<'de>,
{
type Value = ops::Range<Idx>;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("struct Range")
}
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
where
A: SeqAccess<'de>,
{
let start: Idx = match try!(seq.next_element()) {
Some(value) => value,
None => {
return Err(Error::invalid_length(0, &self));
}
};
let end: Idx = match try!(seq.next_element()) {
Some(value) => value,
None => {
return Err(Error::invalid_length(1, &self));
}
};
Ok(start..end)
}
fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
where
A: MapAccess<'de>,
{
let mut start: Option<Idx> = None;
let mut end: Option<Idx> = None;
while let Some(key) = try!(map.next_key()) {
match key {
Field::Start => {
if start.is_some() {
return Err(<A::Error as Error>::duplicate_field("start"));
}
start = Some(try!(map.next_value()));
}
Field::End => {
if end.is_some() {
return Err(<A::Error as Error>::duplicate_field("end"));
}
end = Some(try!(map.next_value()));
}
}
}
let start = match start {
Some(start) => start,
None => return Err(<A::Error as Error>::missing_field("start")),
};
let end = match end {
Some(end) => end,
None => return Err(<A::Error as Error>::missing_field("end")),
};
Ok(start..end)
}
}
const FIELDS: &'static [&'static str] = &["start", "end"];
deserializer.deserialize_struct(
"Range", "Range",
FIELDS, range::FIELDS,
RangeVisitor { range::RangeVisitor {
expecting: "struct Range",
phantom: PhantomData, phantom: PhantomData,
}, },
) )?;
Ok(start..end)
}
}
#[cfg(range_inclusive)]
impl<'de, Idx> Deserialize<'de> for RangeInclusive<Idx>
where
Idx: Deserialize<'de>,
{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let (start, end) = deserializer.deserialize_struct(
"RangeInclusive",
range::FIELDS,
range::RangeVisitor {
expecting: "struct RangeInclusive",
phantom: PhantomData,
},
)?;
Ok(RangeInclusive::new(start, end))
}
}
mod range {
use lib::*;
use de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor};
pub const FIELDS: &'static [&'static str] = &["start", "end"];
// If this were outside of the serde crate, it would just use:
//
// #[derive(Deserialize)]
// #[serde(field_identifier, rename_all = "lowercase")]
enum Field {
Start,
End,
}
impl<'de> Deserialize<'de> for Field {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
struct FieldVisitor;
impl<'de> Visitor<'de> for FieldVisitor {
type Value = Field;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("`start` or `end`")
}
fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
where
E: Error,
{
match value {
"start" => Ok(Field::Start),
"end" => Ok(Field::End),
_ => Err(Error::unknown_field(value, FIELDS)),
}
}
fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E>
where
E: Error,
{
match value {
b"start" => Ok(Field::Start),
b"end" => Ok(Field::End),
_ => {
let value = ::export::from_utf8_lossy(value);
Err(Error::unknown_field(&value, FIELDS))
}
}
}
}
deserializer.deserialize_identifier(FieldVisitor)
}
}
pub struct RangeVisitor<Idx> {
pub expecting: &'static str,
pub phantom: PhantomData<Idx>,
}
impl<'de, Idx> Visitor<'de> for RangeVisitor<Idx>
where
Idx: Deserialize<'de>,
{
type Value = (Idx, Idx);
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str(self.expecting)
}
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
where
A: SeqAccess<'de>,
{
let start: Idx = match try!(seq.next_element()) {
Some(value) => value,
None => {
return Err(Error::invalid_length(0, &self));
}
};
let end: Idx = match try!(seq.next_element()) {
Some(value) => value,
None => {
return Err(Error::invalid_length(1, &self));
}
};
Ok((start, end))
}
fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
where
A: MapAccess<'de>,
{
let mut start: Option<Idx> = None;
let mut end: Option<Idx> = None;
while let Some(key) = try!(map.next_key()) {
match key {
Field::Start => {
if start.is_some() {
return Err(<A::Error as Error>::duplicate_field("start"));
}
start = Some(try!(map.next_value()));
}
Field::End => {
if end.is_some() {
return Err(<A::Error as Error>::duplicate_field("end"));
}
end = Some(try!(map.next_value()));
}
}
}
let start = match start {
Some(start) => start,
None => return Err(<A::Error as Error>::missing_field("start")),
};
let end = match end {
Some(end) => end,
None => return Err(<A::Error as Error>::missing_field("end")),
};
Ok((start, end))
}
} }
} }
@ -2192,10 +2313,17 @@ nonzero_integers! {
NonZeroU16, NonZeroU16,
NonZeroU32, NonZeroU32,
NonZeroU64, NonZeroU64,
// FIXME: https://github.com/serde-rs/serde/issues/1136 NonZeroU128,
NonZeroUsize, NonZeroUsize,
} }
// Currently 128-bit integers do not work on Emscripten targets so we need an
// additional `#[cfg]`
serde_if_integer128! {
nonzero_integers! {
NonZeroU128,
}
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
impl<'de, T, E> Deserialize<'de> for Result<T, E> impl<'de, T, E> Deserialize<'de> for Result<T, E>

63
third_party/rust/serde/src/de/mod.rs поставляемый
Просмотреть файл

@ -24,8 +24,7 @@
//! //!
//! Additionally, Serde provides a procedural macro called [`serde_derive`] to //! Additionally, Serde provides a procedural macro called [`serde_derive`] to
//! automatically generate [`Deserialize`] implementations for structs and enums //! automatically generate [`Deserialize`] implementations for structs and enums
//! in your program. See the [codegen section of the manual] for how to use //! in your program. See the [derive section of the manual] for how to use this.
//! this.
//! //!
//! In rare cases it may be necessary to implement [`Deserialize`] manually for //! In rare cases it may be necessary to implement [`Deserialize`] manually for
//! some type in your program. See the [Implementing `Deserialize`] section of //! some type in your program. See the [Implementing `Deserialize`] section of
@ -97,6 +96,7 @@
//! - Path //! - Path
//! - PathBuf //! - PathBuf
//! - Range\<T\> //! - Range\<T\>
//! - RangeInclusive\<T\>
//! - num::NonZero* //! - num::NonZero*
//! - `!` *(unstable)* //! - `!` *(unstable)*
//! - **Net types**: //! - **Net types**:
@ -116,7 +116,7 @@
//! [`serde_derive`]: https://crates.io/crates/serde_derive //! [`serde_derive`]: https://crates.io/crates/serde_derive
//! [`serde_json`]: https://github.com/serde-rs/json //! [`serde_json`]: https://github.com/serde-rs/json
//! [`serde_yaml`]: https://github.com/dtolnay/serde-yaml //! [`serde_yaml`]: https://github.com/dtolnay/serde-yaml
//! [codegen section of the manual]: https://serde.rs/codegen.html //! [derive section of the manual]: https://serde.rs/derive.html
//! [data formats]: https://serde.rs/#data-formats //! [data formats]: https://serde.rs/#data-formats
use lib::*; use lib::*;
@ -497,7 +497,7 @@ impl<'a> Display for Expected + 'a {
/// ///
/// Additionally, Serde provides a procedural macro called `serde_derive` to /// Additionally, Serde provides a procedural macro called `serde_derive` to
/// automatically generate `Deserialize` implementations for structs and enums /// automatically generate `Deserialize` implementations for structs and enums
/// in your program. See the [codegen section of the manual][codegen] for how to /// in your program. See the [derive section of the manual][derive] for how to
/// use this. /// use this.
/// ///
/// In rare cases it may be necessary to implement `Deserialize` manually for /// In rare cases it may be necessary to implement `Deserialize` manually for
@ -510,7 +510,7 @@ impl<'a> Display for Expected + 'a {
/// provides an implementation of `Deserialize` for it. /// provides an implementation of `Deserialize` for it.
/// ///
/// [de]: https://docs.serde.rs/serde/de/index.html /// [de]: https://docs.serde.rs/serde/de/index.html
/// [codegen]: https://serde.rs/codegen.html /// [derive]: https://serde.rs/derive.html
/// [impl-deserialize]: https://serde.rs/impl-deserialize.html /// [impl-deserialize]: https://serde.rs/impl-deserialize.html
/// ///
/// # Lifetime /// # Lifetime
@ -593,11 +593,7 @@ pub trait Deserialize<'de>: Sized {
/// ///
/// [Understanding deserializer lifetimes]: https://serde.rs/lifetimes.html /// [Understanding deserializer lifetimes]: https://serde.rs/lifetimes.html
pub trait DeserializeOwned: for<'de> Deserialize<'de> {} pub trait DeserializeOwned: for<'de> Deserialize<'de> {}
impl<T> DeserializeOwned for T impl<T> DeserializeOwned for T where T: for<'de> Deserialize<'de> {}
where
T: for<'de> Deserialize<'de>,
{
}
/// `DeserializeSeed` is the stateful form of the `Deserialize` trait. If you /// `DeserializeSeed` is the stateful form of the `Deserialize` trait. If you
/// ever find yourself looking for a way to pass data into a `Deserialize` impl, /// ever find yourself looking for a way to pass data into a `Deserialize` impl,
@ -663,7 +659,7 @@ where
/// use std::fmt; /// use std::fmt;
/// use std::marker::PhantomData; /// use std::marker::PhantomData;
/// ///
/// use serde::de::{Deserialize, DeserializeSeed, Deserializer, Visitor, SeqAccess}; /// use serde::de::{Deserialize, DeserializeSeed, Deserializer, SeqAccess, Visitor};
/// ///
/// // A DeserializeSeed implementation that uses stateful deserialization to /// // A DeserializeSeed implementation that uses stateful deserialization to
/// // append array elements onto the end of an existing vector. The preexisting /// // append array elements onto the end of an existing vector. The preexisting
@ -810,16 +806,16 @@ where
/// - When serializing, all strings are handled equally. When deserializing, /// - When serializing, all strings are handled equally. When deserializing,
/// there are three flavors of strings: transient, owned, and borrowed. /// there are three flavors of strings: transient, owned, and borrowed.
/// - **byte array** - \[u8\] /// - **byte array** - \[u8\]
/// - Similar to strings, during deserialization byte arrays can be transient, /// - Similar to strings, during deserialization byte arrays can be
/// owned, or borrowed. /// transient, owned, or borrowed.
/// - **option** /// - **option**
/// - Either none or some value. /// - Either none or some value.
/// - **unit** /// - **unit**
/// - The type of `()` in Rust. It represents an anonymous value containing no /// - The type of `()` in Rust. It represents an anonymous value containing
/// data. /// no data.
/// - **unit_struct** /// - **unit_struct**
/// - For example `struct Unit` or `PhantomData<T>`. It represents a named value /// - For example `struct Unit` or `PhantomData<T>`. It represents a named
/// containing no data. /// value containing no data.
/// - **unit_variant** /// - **unit_variant**
/// - For example the `E::A` and `E::B` in `enum E { A, B }`. /// - For example the `E::A` and `E::B` in `enum E { A, B }`.
/// - **newtype_struct** /// - **newtype_struct**
@ -827,14 +823,15 @@ where
/// - **newtype_variant** /// - **newtype_variant**
/// - For example the `E::N` in `enum E { N(u8) }`. /// - For example the `E::N` in `enum E { N(u8) }`.
/// - **seq** /// - **seq**
/// - A variably sized heterogeneous sequence of values, for example `Vec<T>` or /// - A variably sized heterogeneous sequence of values, for example `Vec<T>`
/// `HashSet<T>`. When serializing, the length may or may not be known before /// or `HashSet<T>`. When serializing, the length may or may not be known
/// iterating through all the data. When deserializing, the length is determined /// before iterating through all the data. When deserializing, the length
/// by looking at the serialized data. /// is determined by looking at the serialized data.
/// - **tuple** /// - **tuple**
/// - A statically sized heterogeneous sequence of values for which the length /// - A statically sized heterogeneous sequence of values for which the
/// will be known at deserialization time without looking at the serialized /// length will be known at deserialization time without looking at the
/// data, for example `(u8,)` or `(String, u64, Vec<T>)` or `[u64; 10]`. /// serialized data, for example `(u8,)` or `(String, u64, Vec<T>)` or
/// `[u64; 10]`.
/// - **tuple_struct** /// - **tuple_struct**
/// - A named tuple, for example `struct Rgb(u8, u8, u8)`. /// - A named tuple, for example `struct Rgb(u8, u8, u8)`.
/// - **tuple_variant** /// - **tuple_variant**
@ -842,9 +839,9 @@ where
/// - **map** /// - **map**
/// - A heterogeneous key-value pairing, for example `BTreeMap<K, V>`. /// - A heterogeneous key-value pairing, for example `BTreeMap<K, V>`.
/// - **struct** /// - **struct**
/// - A heterogeneous key-value pairing in which the keys are strings and will be /// - A heterogeneous key-value pairing in which the keys are strings and
/// known at deserialization time without looking at the serialized data, for /// will be known at deserialization time without looking at the serialized
/// example `struct S { r: u8, g: u8, b: u8 }`. /// data, for example `struct S { r: u8, g: u8, b: u8 }`.
/// - **struct_variant** /// - **struct_variant**
/// - For example the `E::S` in `enum E { S { r: u8, g: u8, b: u8 } }`. /// - For example the `E::S` in `enum E { S { r: u8, g: u8, b: u8 } }`.
/// ///
@ -859,7 +856,8 @@ where
/// type it sees in the input. JSON uses this approach when deserializing /// type it sees in the input. JSON uses this approach when deserializing
/// `serde_json::Value` which is an enum that can represent any JSON /// `serde_json::Value` which is an enum that can represent any JSON
/// document. Without knowing what is in a JSON document, we can deserialize /// document. Without knowing what is in a JSON document, we can deserialize
/// it to `serde_json::Value` by going through `Deserializer::deserialize_any`. /// it to `serde_json::Value` by going through
/// `Deserializer::deserialize_any`.
/// ///
/// 2. The various `deserialize_*` methods. Non-self-describing formats like /// 2. The various `deserialize_*` methods. Non-self-describing formats like
/// Bincode need to be told what is in the input in order to deserialize it. /// Bincode need to be told what is in the input in order to deserialize it.
@ -869,10 +867,11 @@ where
/// `Deserializer::deserialize_any`. /// `Deserializer::deserialize_any`.
/// ///
/// When implementing `Deserialize`, you should avoid relying on /// When implementing `Deserialize`, you should avoid relying on
/// `Deserializer::deserialize_any` unless you need to be told by the Deserializer /// `Deserializer::deserialize_any` unless you need to be told by the
/// what type is in the input. Know that relying on `Deserializer::deserialize_any` /// Deserializer what type is in the input. Know that relying on
/// means your data type will be able to deserialize from self-describing /// `Deserializer::deserialize_any` means your data type will be able to
/// formats only, ruling out Bincode and many others. /// deserialize from self-describing formats only, ruling out Bincode and many
/// others.
/// ///
/// [Serde data model]: https://serde.rs/data-model.html /// [Serde data model]: https://serde.rs/data-model.html
/// ///

30
third_party/rust/serde/src/lib.rs поставляемый
Просмотреть файл

@ -82,7 +82,7 @@
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Serde types in rustdoc of other crates get linked to here. // Serde types in rustdoc of other crates get linked to here.
#![doc(html_root_url = "https://docs.rs/serde/1.0.66")] #![doc(html_root_url = "https://docs.rs/serde/1.0.80")]
// Support using Serde without the standard library! // Support using Serde without the standard library!
#![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(not(feature = "std"), no_std)]
// Unstable functionality only if the user asks for it. For tracking and // Unstable functionality only if the user asks for it. For tracking and
@ -91,13 +91,21 @@
// https://github.com/serde-rs/serde/issues/812 // https://github.com/serde-rs/serde/issues/812
#![cfg_attr(feature = "unstable", feature(specialization, never_type))] #![cfg_attr(feature = "unstable", feature(specialization, never_type))]
#![cfg_attr(feature = "alloc", feature(alloc))] #![cfg_attr(feature = "alloc", feature(alloc))]
#![cfg_attr(feature = "cargo-clippy", allow(renamed_and_removed_lints))]
#![cfg_attr(feature = "cargo-clippy", deny(clippy, clippy_pedantic))] #![cfg_attr(feature = "cargo-clippy", deny(clippy, clippy_pedantic))]
// Whitelisted clippy lints // Whitelisted clippy lints
#![cfg_attr( #![cfg_attr(
feature = "cargo-clippy", feature = "cargo-clippy",
allow( allow(
cast_lossless, const_static_lifetime, doc_markdown, linkedlist, needless_pass_by_value, cast_lossless,
redundant_field_names, type_complexity, unreadable_literal, zero_prefixed_literal const_static_lifetime,
doc_markdown,
linkedlist,
needless_pass_by_value,
redundant_field_names,
type_complexity,
unreadable_literal,
zero_prefixed_literal
) )
)] )]
// Whitelisted clippy_pedantic lints // Whitelisted clippy_pedantic lints
@ -118,6 +126,7 @@
stutter, stutter,
use_self, use_self,
// not practical // not practical
indexing_slicing,
many_single_char_names, many_single_char_names,
missing_docs_in_private_items, missing_docs_in_private_items,
similar_names, similar_names,
@ -126,7 +135,10 @@
use_debug, use_debug,
))] ))]
// Blacklisted Rust lints. // Blacklisted Rust lints.
#![deny(missing_docs, unused_imports)] //
// Compiler bug involving unused_imports:
// https://github.com/rust-lang/rust/issues/51661
#![deny(missing_docs, /*unused_imports*/)]
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -144,7 +156,7 @@ mod lib {
pub use std::*; pub use std::*;
} }
pub use self::core::{cmp, iter, mem, num, ops, slice, str}; pub use self::core::{cmp, iter, mem, num, slice, str};
pub use self::core::{f32, f64}; pub use self::core::{f32, f64};
pub use self::core::{i16, i32, i64, i8, isize}; pub use self::core::{i16, i32, i64, i8, isize};
pub use self::core::{u16, u32, u64, u8, usize}; pub use self::core::{u16, u32, u64, u8, usize};
@ -155,6 +167,7 @@ mod lib {
pub use self::core::default::{self, Default}; pub use self::core::default::{self, Default};
pub use self::core::fmt::{self, Debug, Display}; pub use self::core::fmt::{self, Debug, Display};
pub use self::core::marker::{self, PhantomData}; pub use self::core::marker::{self, PhantomData};
pub use self::core::ops::Range;
pub use self::core::option::{self, Option}; pub use self::core::option::{self, Option};
pub use self::core::result::{self, Result}; pub use self::core::result::{self, Result};
@ -184,12 +197,12 @@ mod lib {
pub use std::rc::{Rc, Weak as RcWeak}; pub use std::rc::{Rc, Weak as RcWeak};
#[cfg(all(feature = "rc", feature = "alloc", not(feature = "std")))] #[cfg(all(feature = "rc", feature = "alloc", not(feature = "std")))]
pub use alloc::arc::{Arc, Weak as ArcWeak}; pub use alloc::sync::{Arc, Weak as ArcWeak};
#[cfg(all(feature = "rc", feature = "std"))] #[cfg(all(feature = "rc", feature = "std"))]
pub use std::sync::{Arc, Weak as ArcWeak}; pub use std::sync::{Arc, Weak as ArcWeak};
#[cfg(all(feature = "alloc", not(feature = "std")))] #[cfg(all(feature = "alloc", not(feature = "std")))]
pub use alloc::{BTreeMap, BTreeSet, BinaryHeap, LinkedList, VecDeque}; pub use alloc::collections::{BTreeMap, BTreeSet, BinaryHeap, LinkedList, VecDeque};
#[cfg(feature = "std")] #[cfg(feature = "std")]
pub use std::collections::{BTreeMap, BTreeSet, BinaryHeap, LinkedList, VecDeque}; pub use std::collections::{BTreeMap, BTreeSet, BinaryHeap, LinkedList, VecDeque};
@ -215,6 +228,9 @@ mod lib {
#[cfg(any(core_duration, feature = "std"))] #[cfg(any(core_duration, feature = "std"))]
pub use self::core::time::Duration; pub use self::core::time::Duration;
#[cfg(range_inclusive)]
pub use self::core::ops::RangeInclusive;
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////

4
third_party/rust/serde/src/macros.rs поставляемый
Просмотреть файл

@ -128,7 +128,7 @@
/// [`Deserializer`]: trait.Deserializer.html /// [`Deserializer`]: trait.Deserializer.html
/// [`Visitor`]: de/trait.Visitor.html /// [`Visitor`]: de/trait.Visitor.html
/// [`Deserializer::deserialize_any`]: trait.Deserializer.html#tymethod.deserialize_any /// [`Deserializer::deserialize_any`]: trait.Deserializer.html#tymethod.deserialize_any
#[macro_export] #[macro_export(local_inner_macros)]
macro_rules! forward_to_deserialize_any { macro_rules! forward_to_deserialize_any {
(<$visitor:ident: Visitor<$lifetime:tt>> $($func:ident)*) => { (<$visitor:ident: Visitor<$lifetime:tt>> $($func:ident)*) => {
$(forward_to_deserialize_any_helper!{$func<$lifetime, $visitor>})* $(forward_to_deserialize_any_helper!{$func<$lifetime, $visitor>})*
@ -157,7 +157,7 @@ macro_rules! forward_to_deserialize_any_method {
} }
#[doc(hidden)] #[doc(hidden)]
#[macro_export] #[macro_export(local_inner_macros)]
macro_rules! forward_to_deserialize_any_helper { macro_rules! forward_to_deserialize_any_helper {
(bool<$l:tt, $v:ident>) => { (bool<$l:tt, $v:ident>) => {
forward_to_deserialize_any_method!{deserialize_bool<$l, $v>()} forward_to_deserialize_any_method!{deserialize_bool<$l, $v>()}

28
third_party/rust/serde/src/private/de.rs поставляемый
Просмотреть файл

@ -231,8 +231,8 @@ mod content {
use super::size_hint; use super::size_hint;
use de::{ use de::{
self, Deserialize, DeserializeSeed, Deserializer, EnumAccess, Expected, MapAccess, self, Deserialize, DeserializeSeed, Deserializer, EnumAccess, Expected, IgnoredAny,
SeqAccess, Unexpected, Visitor, MapAccess, SeqAccess, Unexpected, Visitor,
}; };
/// Used from generated code to buffer the contents of the Deserializer when /// Used from generated code to buffer the contents of the Deserializer when
@ -832,8 +832,8 @@ mod content {
} }
impl<'de, T> TaggedContentVisitor<'de, T> { impl<'de, T> TaggedContentVisitor<'de, T> {
/// Visitor for the content of an internally tagged enum with the given tag /// Visitor for the content of an internally tagged enum with the given
/// name. /// tag name.
pub fn new(name: &'static str) -> Self { pub fn new(name: &'static str) -> Self {
TaggedContentVisitor { TaggedContentVisitor {
tag_name: name, tag_name: name,
@ -1075,8 +1075,8 @@ mod content {
Ok(value) Ok(value)
} }
/// Used when deserializing an internally tagged enum because the content will /// Used when deserializing an internally tagged enum because the content
/// be used exactly once. /// will be used exactly once.
impl<'de, E> Deserializer<'de> for ContentDeserializer<'de, E> impl<'de, E> Deserializer<'de> for ContentDeserializer<'de, E>
where where
E: de::Error, E: de::Error,
@ -1790,8 +1790,8 @@ mod content {
Ok(value) Ok(value)
} }
/// Used when deserializing an untagged enum because the content may need to be /// Used when deserializing an untagged enum because the content may need
/// used more than once. /// to be used more than once.
impl<'de, 'a, E> Deserializer<'de> for ContentRefDeserializer<'a, 'de, E> impl<'de, 'a, E> Deserializer<'de> for ContentRefDeserializer<'a, 'de, E>
where where
E: de::Error, E: de::Error,
@ -2470,10 +2470,11 @@ mod content {
Ok(()) Ok(())
} }
fn visit_map<M>(self, _: M) -> Result<(), M::Error> fn visit_map<M>(self, mut access: M) -> Result<(), M::Error>
where where
M: MapAccess<'de>, M: MapAccess<'de>,
{ {
while let Some(_) = try!(access.next_entry::<IgnoredAny, IgnoredAny>()) {}
Ok(()) Ok(())
} }
} }
@ -2915,18 +2916,17 @@ where
where where
T: DeserializeSeed<'de>, T: DeserializeSeed<'de>,
{ {
match self.iter.next() { while let Some(item) = self.iter.next() {
Some(item) => { if let Some((ref key, ref content)) = *item {
// Do not take(), instead borrow this entry. The internally tagged // Do not take(), instead borrow this entry. The internally tagged
// enum does its own buffering so we can't tell whether this entry // enum does its own buffering so we can't tell whether this entry
// is going to be consumed. Borrowing here leaves the entry // is going to be consumed. Borrowing here leaves the entry
// available for later flattened fields. // available for later flattened fields.
let (ref key, ref content) = *item.as_ref().unwrap();
self.pending = Some(content); self.pending = Some(content);
seed.deserialize(ContentRefDeserializer::new(key)).map(Some) return seed.deserialize(ContentRefDeserializer::new(key)).map(Some);
} }
None => Ok(None),
} }
Ok(None)
} }
fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error> fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error>

Просмотреть файл

@ -32,7 +32,7 @@ macro_rules! __private_deserialize {
/// Used only by Serde doc tests. Not public API. /// Used only by Serde doc tests. Not public API.
#[doc(hidden)] #[doc(hidden)]
#[macro_export] #[macro_export(local_inner_macros)]
macro_rules! __serialize_unimplemented { macro_rules! __serialize_unimplemented {
($($func:ident)*) => { ($($func:ident)*) => {
$( $(
@ -52,7 +52,7 @@ macro_rules! __serialize_unimplemented_method {
} }
#[doc(hidden)] #[doc(hidden)]
#[macro_export] #[macro_export(local_inner_macros)]
macro_rules! __serialize_unimplemented_helper { macro_rules! __serialize_unimplemented_helper {
(bool) => { (bool) => {
__serialize_unimplemented_method!(serialize_bool(bool) -> Ok); __serialize_unimplemented_method!(serialize_bool(bool) -> Ok);

40
third_party/rust/serde/src/ser/impls.rs поставляемый
Просмотреть файл

@ -69,6 +69,15 @@ impl Serialize for String {
} }
} }
impl<'a> Serialize for fmt::Arguments<'a> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.collect_str(self)
}
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
#[cfg(feature = "std")] #[cfg(feature = "std")]
@ -218,8 +227,7 @@ seq_impl!(VecDeque<T>);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
#[cfg(feature = "std")] impl<Idx> Serialize for Range<Idx>
impl<Idx> Serialize for ops::Range<Idx>
where where
Idx: Serialize, Idx: Serialize,
{ {
@ -237,6 +245,25 @@ where
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
#[cfg(range_inclusive)]
impl<Idx> Serialize for RangeInclusive<Idx>
where
Idx: Serialize,
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
use super::SerializeStruct;
let mut state = try!(serializer.serialize_struct("RangeInclusive", 2));
try!(state.serialize_field("start", &self.start()));
try!(state.serialize_field("end", &self.end()));
state.end()
}
}
////////////////////////////////////////////////////////////////////////////////
impl Serialize for () { impl Serialize for () {
#[inline] #[inline]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
@ -442,10 +469,17 @@ nonzero_integers! {
NonZeroU16, NonZeroU16,
NonZeroU32, NonZeroU32,
NonZeroU64, NonZeroU64,
// FIXME: https://github.com/serde-rs/serde/issues/1136 NonZeroU128,
NonZeroUsize, NonZeroUsize,
} }
// Currently 128-bit integers do not work on Emscripten targets so we need an
// additional `#[cfg]`
serde_if_integer128! {
nonzero_integers! {
NonZeroU128,
}
}
impl<T> Serialize for Cell<T> impl<T> Serialize for Cell<T>
where where
T: Serialize + Copy, T: Serialize + Copy,

81
third_party/rust/serde/src/ser/mod.rs поставляемый
Просмотреть файл

@ -24,8 +24,7 @@
//! //!
//! Additionally, Serde provides a procedural macro called [`serde_derive`] to //! Additionally, Serde provides a procedural macro called [`serde_derive`] to
//! automatically generate [`Serialize`] implementations for structs and enums //! automatically generate [`Serialize`] implementations for structs and enums
//! in your program. See the [codegen section of the manual] for how to use //! in your program. See the [derive section of the manual] for how to use this.
//! this.
//! //!
//! In rare cases it may be necessary to implement [`Serialize`] manually for //! In rare cases it may be necessary to implement [`Serialize`] manually for
//! some type in your program. See the [Implementing `Serialize`] section of the //! some type in your program. See the [Implementing `Serialize`] section of the
@ -92,6 +91,7 @@
//! - Path //! - Path
//! - PathBuf //! - PathBuf
//! - Range\<T\> //! - Range\<T\>
//! - RangeInclusive\<T\>
//! - num::NonZero* //! - num::NonZero*
//! - `!` *(unstable)* //! - `!` *(unstable)*
//! - **Net types**: //! - **Net types**:
@ -111,7 +111,7 @@
//! [`serde_derive`]: https://crates.io/crates/serde_derive //! [`serde_derive`]: https://crates.io/crates/serde_derive
//! [`serde_json`]: https://github.com/serde-rs/json //! [`serde_json`]: https://github.com/serde-rs/json
//! [`serde_yaml`]: https://github.com/dtolnay/serde-yaml //! [`serde_yaml`]: https://github.com/dtolnay/serde-yaml
//! [codegen section of the manual]: https://serde.rs/codegen.html //! [derive section of the manual]: https://serde.rs/derive.html
//! [data formats]: https://serde.rs/#data-formats //! [data formats]: https://serde.rs/#data-formats
use lib::*; use lib::*;
@ -195,7 +195,7 @@ declare_error_trait!(Error: Sized + Debug + Display);
/// ///
/// Additionally, Serde provides a procedural macro called [`serde_derive`] to /// Additionally, Serde provides a procedural macro called [`serde_derive`] to
/// automatically generate `Serialize` implementations for structs and enums in /// automatically generate `Serialize` implementations for structs and enums in
/// your program. See the [codegen section of the manual] for how to use this. /// your program. See the [derive section of the manual] for how to use this.
/// ///
/// In rare cases it may be necessary to implement `Serialize` manually for some /// In rare cases it may be necessary to implement `Serialize` manually for some
/// type in your program. See the [Implementing `Serialize`] section of the /// type in your program. See the [Implementing `Serialize`] section of the
@ -210,7 +210,7 @@ declare_error_trait!(Error: Sized + Debug + Display);
/// [`LinkedHashMap<K, V>`]: https://docs.rs/linked-hash-map/*/linked_hash_map/struct.LinkedHashMap.html /// [`LinkedHashMap<K, V>`]: https://docs.rs/linked-hash-map/*/linked_hash_map/struct.LinkedHashMap.html
/// [`linked-hash-map`]: https://crates.io/crates/linked-hash-map /// [`linked-hash-map`]: https://crates.io/crates/linked-hash-map
/// [`serde_derive`]: https://crates.io/crates/serde_derive /// [`serde_derive`]: https://crates.io/crates/serde_derive
/// [codegen section of the manual]: https://serde.rs/codegen.html /// [derive section of the manual]: https://serde.rs/derive.html
/// [ser]: https://docs.serde.rs/serde/ser/index.html /// [ser]: https://docs.serde.rs/serde/ser/index.html
pub trait Serialize { pub trait Serialize {
/// Serialize this value into the given Serde serializer. /// Serialize this value into the given Serde serializer.
@ -219,7 +219,7 @@ pub trait Serialize {
/// information about how to implement this method. /// information about how to implement this method.
/// ///
/// ```rust /// ```rust
/// use serde::ser::{Serialize, Serializer, SerializeStruct}; /// use serde::ser::{Serialize, SerializeStruct, Serializer};
/// ///
/// struct Person { /// struct Person {
/// name: String, /// name: String,
@ -273,16 +273,16 @@ pub trait Serialize {
/// - When serializing, all strings are handled equally. When deserializing, /// - When serializing, all strings are handled equally. When deserializing,
/// there are three flavors of strings: transient, owned, and borrowed. /// there are three flavors of strings: transient, owned, and borrowed.
/// - **byte array** - \[u8\] /// - **byte array** - \[u8\]
/// - Similar to strings, during deserialization byte arrays can be transient, /// - Similar to strings, during deserialization byte arrays can be
/// owned, or borrowed. /// transient, owned, or borrowed.
/// - **option** /// - **option**
/// - Either none or some value. /// - Either none or some value.
/// - **unit** /// - **unit**
/// - The type of `()` in Rust. It represents an anonymous value containing no /// - The type of `()` in Rust. It represents an anonymous value containing
/// data. /// no data.
/// - **unit_struct** /// - **unit_struct**
/// - For example `struct Unit` or `PhantomData<T>`. It represents a named value /// - For example `struct Unit` or `PhantomData<T>`. It represents a named
/// containing no data. /// value containing no data.
/// - **unit_variant** /// - **unit_variant**
/// - For example the `E::A` and `E::B` in `enum E { A, B }`. /// - For example the `E::A` and `E::B` in `enum E { A, B }`.
/// - **newtype_struct** /// - **newtype_struct**
@ -290,14 +290,15 @@ pub trait Serialize {
/// - **newtype_variant** /// - **newtype_variant**
/// - For example the `E::N` in `enum E { N(u8) }`. /// - For example the `E::N` in `enum E { N(u8) }`.
/// - **seq** /// - **seq**
/// - A variably sized heterogeneous sequence of values, for example `Vec<T>` or /// - A variably sized heterogeneous sequence of values, for example
/// `HashSet<T>`. When serializing, the length may or may not be known before /// `Vec<T>` or `HashSet<T>`. When serializing, the length may or may not
/// iterating through all the data. When deserializing, the length is determined /// be known before iterating through all the data. When deserializing,
/// by looking at the serialized data. /// the length is determined by looking at the serialized data.
/// - **tuple** /// - **tuple**
/// - A statically sized heterogeneous sequence of values for which the length /// - A statically sized heterogeneous sequence of values for which the
/// will be known at deserialization time without looking at the serialized /// length will be known at deserialization time without looking at the
/// data, for example `(u8,)` or `(String, u64, Vec<T>)` or `[u64; 10]`. /// serialized data, for example `(u8,)` or `(String, u64, Vec<T>)` or
/// `[u64; 10]`.
/// - **tuple_struct** /// - **tuple_struct**
/// - A named tuple, for example `struct Rgb(u8, u8, u8)`. /// - A named tuple, for example `struct Rgb(u8, u8, u8)`.
/// - **tuple_variant** /// - **tuple_variant**
@ -305,9 +306,9 @@ pub trait Serialize {
/// - **map** /// - **map**
/// - A heterogeneous key-value pairing, for example `BTreeMap<K, V>`. /// - A heterogeneous key-value pairing, for example `BTreeMap<K, V>`.
/// - **struct** /// - **struct**
/// - A heterogeneous key-value pairing in which the keys are strings and will be /// - A heterogeneous key-value pairing in which the keys are strings and
/// known at deserialization time without looking at the serialized data, for /// will be known at deserialization time without looking at the
/// example `struct S { r: u8, g: u8, b: u8 }`. /// serialized data, for example `struct S { r: u8, g: u8, b: u8 }`.
/// - **struct_variant** /// - **struct_variant**
/// - For example the `E::S` in `enum E { S { r: u8, g: u8, b: u8 } }`. /// - For example the `E::S` in `enum E { S { r: u8, g: u8, b: u8 } }`.
/// ///
@ -1110,7 +1111,7 @@ pub trait Serializer: Sized {
/// ``` /// ```
/// ///
/// ```rust /// ```rust
/// use serde::ser::{Serialize, Serializer, SerializeTuple}; /// use serde::ser::{Serialize, SerializeTuple, Serializer};
/// ///
/// const VRAM_SIZE: usize = 386; /// const VRAM_SIZE: usize = 386;
/// struct Vram([u16; VRAM_SIZE]); /// struct Vram([u16; VRAM_SIZE]);
@ -1138,7 +1139,7 @@ pub trait Serializer: Sized {
/// of data fields that will be serialized. /// of data fields that will be serialized.
/// ///
/// ```rust /// ```rust
/// use serde::ser::{Serialize, Serializer, SerializeTupleStruct}; /// use serde::ser::{Serialize, SerializeTupleStruct, Serializer};
/// ///
/// struct Rgb(u8, u8, u8); /// struct Rgb(u8, u8, u8);
/// ///
@ -1170,7 +1171,7 @@ pub trait Serializer: Sized {
/// and the `len` is the number of data fields that will be serialized. /// and the `len` is the number of data fields that will be serialized.
/// ///
/// ```rust /// ```rust
/// use serde::ser::{Serialize, Serializer, SerializeTupleVariant}; /// use serde::ser::{Serialize, SerializeTupleVariant, Serializer};
/// ///
/// enum E { /// enum E {
/// T(u8, u8), /// T(u8, u8),
@ -1264,7 +1265,7 @@ pub trait Serializer: Sized {
/// data fields that will be serialized. /// data fields that will be serialized.
/// ///
/// ```rust /// ```rust
/// use serde::ser::{Serialize, Serializer, SerializeStruct}; /// use serde::ser::{Serialize, SerializeStruct, Serializer};
/// ///
/// struct Rgb { /// struct Rgb {
/// r: u8, /// r: u8,
@ -1300,10 +1301,10 @@ pub trait Serializer: Sized {
/// and the `len` is the number of data fields that will be serialized. /// and the `len` is the number of data fields that will be serialized.
/// ///
/// ```rust /// ```rust
/// use serde::ser::{Serialize, Serializer, SerializeStructVariant}; /// use serde::ser::{Serialize, SerializeStructVariant, Serializer};
/// ///
/// enum E { /// enum E {
/// S { r: u8, g: u8, b: u8 } /// S { r: u8, g: u8, b: u8 },
/// } /// }
/// ///
/// impl Serialize for E { /// impl Serialize for E {
@ -1312,7 +1313,11 @@ pub trait Serializer: Sized {
/// S: Serializer, /// S: Serializer,
/// { /// {
/// match *self { /// match *self {
/// E::S { ref r, ref g, ref b } => { /// E::S {
/// ref r,
/// ref g,
/// ref b,
/// } => {
/// let mut sv = serializer.serialize_struct_variant("E", 0, "S", 3)?; /// let mut sv = serializer.serialize_struct_variant("E", 0, "S", 3)?;
/// sv.serialize_field("r", r)?; /// sv.serialize_field("r", r)?;
/// sv.serialize_field("g", g)?; /// sv.serialize_field("g", g)?;
@ -1375,8 +1380,8 @@ pub trait Serializer: Sized {
/// method. /// method.
/// ///
/// ```rust /// ```rust
/// use std::collections::BTreeSet;
/// use serde::{Serialize, Serializer}; /// use serde::{Serialize, Serializer};
/// use std::collections::BTreeSet;
/// ///
/// struct MapToUnit { /// struct MapToUnit {
/// keys: BTreeSet<i32>, /// keys: BTreeSet<i32>,
@ -1704,7 +1709,7 @@ pub trait SerializeTuple {
/// # Example use /// # Example use
/// ///
/// ```rust /// ```rust
/// use serde::ser::{Serialize, Serializer, SerializeTupleStruct}; /// use serde::ser::{Serialize, SerializeTupleStruct, Serializer};
/// ///
/// struct Rgb(u8, u8, u8); /// struct Rgb(u8, u8, u8);
/// ///
@ -1749,7 +1754,7 @@ pub trait SerializeTupleStruct {
/// # Example use /// # Example use
/// ///
/// ```rust /// ```rust
/// use serde::ser::{Serialize, Serializer, SerializeTupleVariant}; /// use serde::ser::{Serialize, SerializeTupleVariant, Serializer};
/// ///
/// enum E { /// enum E {
/// T(u8, u8), /// T(u8, u8),
@ -1918,7 +1923,7 @@ pub trait SerializeMap {
/// # Example use /// # Example use
/// ///
/// ```rust /// ```rust
/// use serde::ser::{Serialize, Serializer, SerializeStruct}; /// use serde::ser::{Serialize, SerializeStruct, Serializer};
/// ///
/// struct Rgb { /// struct Rgb {
/// r: u8, /// r: u8,
@ -1978,10 +1983,10 @@ pub trait SerializeStruct {
/// # Example use /// # Example use
/// ///
/// ```rust /// ```rust
/// use serde::ser::{Serialize, Serializer, SerializeStructVariant}; /// use serde::ser::{Serialize, SerializeStructVariant, Serializer};
/// ///
/// enum E { /// enum E {
/// S { r: u8, g: u8, b: u8 } /// S { r: u8, g: u8, b: u8 },
/// } /// }
/// ///
/// impl Serialize for E { /// impl Serialize for E {
@ -1990,7 +1995,11 @@ pub trait SerializeStruct {
/// S: Serializer, /// S: Serializer,
/// { /// {
/// match *self { /// match *self {
/// E::S { ref r, ref g, ref b } => { /// E::S {
/// ref r,
/// ref g,
/// ref b,
/// } => {
/// let mut sv = serializer.serialize_struct_variant("E", 0, "S", 3)?; /// let mut sv = serializer.serialize_struct_variant("E", 0, "S", 3)?;
/// sv.serialize_field("r", r)?; /// sv.serialize_field("r", r)?;
/// sv.serialize_field("g", g)?; /// sv.serialize_field("g", g)?;

Просмотреть файл

@ -1 +1 @@
{"files":{"Cargo.toml":"13802d367c4f23465fb93d2579c1bea247cd7f8310fdd90b2d0f817ad93f17a0","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"fe0d3aa328d0e26c76f646c45197bc8c518257d31f3640baed096915b9bdf642","crates-io.md":"4de7b932987feadedd392855d166d0346e8f405190e8085a2e2f84c936a68959","src/bound.rs":"c85f8a617dcc90e5a9269305665d1610364fbb414c22cb5cadcedbe45f0c86e7","src/de.rs":"3e05e5b898f31c3ef96ed51f4e0a9b529ef6ff3240a980c450f6e4ed637c1ee3","src/fragment.rs":"9a8539d2bda80c62e4fdaf42816f371a2add62f9cf27b4646d90b636de40f56f","src/internals/ast.rs":"47b94e6b3ec03725c2c25e5764dca10286be02e975b11e5fe8e0879a1cbde424","src/internals/attr.rs":"5fc779f293fb33d2977dc0f7e86020acd9ce36fcbc90b199ba579d7a5542281b","src/internals/case.rs":"a07abcf7e2b7e4d72eaa1b3ce97d82b17c94533ed0ea88ea5d13d3cbf4394520","src/internals/check.rs":"ce47c103ec0683bdba07288834008977645b5f2e23382cabc27f6de927b724dc","src/internals/ctxt.rs":"f541083477396a13cf7abd3dab448907112f900a6395ddd42ed0a6717ada1016","src/internals/mod.rs":"414477f6fb187268ec87f917c0db9d328f4e6d188dfde93ab7479763e93e2aca","src/lib.rs":"b35a93042a3c4dec7d7871eb901e514ae28bc88183c49157a3ca4f7732aa7785","src/pretend.rs":"ea5aa1b338038ce1791cef34fd20091abb062cd61c0384ac931d0069413a5302","src/ser.rs":"6ac0b5ab9cd5a93486d7c1ca974afc95abadb11a4b923b33d04f44d1b42ffa5d","src/try.rs":"b9a10c8690d442a57fc7097d42c9a4f13034c7b4a30b7eb02d538fdbf8ae0a8d"},"package":null} {"files":{"Cargo.toml":"32062c9ba07dc467d292a81d4843923933ef60006849646df3f15ea1a9329762","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"c4218d07d775c036cd50495b0354c5b59435472b12e159042cacb30b6ef1a7c1","crates-io.md":"8dce715dfbd2e9bbdd87e401d1f7974a60089f0673f7a84f4c5d840411075d14","src/bound.rs":"3f52688c06ee268f5cea4003acba1dce1631cf2ca04384a1b96845e100a7b5b3","src/de.rs":"534ddd51f8b2b0c29f30319ec553fe20aa717b87e0f5cecf21bbdcdc600c3724","src/fragment.rs":"9a8539d2bda80c62e4fdaf42816f371a2add62f9cf27b4646d90b636de40f56f","src/internals/ast.rs":"3260313fbbd7c8fab2b93710a7b4c806ac3aa4ce364a8bf7e83a5c38006b3f2f","src/internals/attr.rs":"70a87942eee113eadbec9c04cc9a0b7860afe1d25c839a4245ad48322ad11975","src/internals/case.rs":"868d8ddc4adfcd0d55ece44ae7d4de8445cb65ddfd8b0e6b90dd5ab3d23c1e57","src/internals/check.rs":"c325d8b42647689c1eb982e8c878d75a547c698f6040b72ef47d93e312518494","src/internals/ctxt.rs":"1f9d7e385ab188c7716c4d3f1e4c943f45dcb29bab8c42812b9e537deeee0889","src/internals/mod.rs":"414477f6fb187268ec87f917c0db9d328f4e6d188dfde93ab7479763e93e2aca","src/lib.rs":"f1a606372aa7dfaf40791f98e357fa4d4911d6d5b735605dd27db4f481787aed","src/pretend.rs":"2b51a8c14b62735cfc80b3624522a02465820a14a1eab55abebf3a63fd5f150a","src/ser.rs":"9a8e01afdd47641377a24442d92c637eaba061d56a9ff499d91294bba21f2f69","src/try.rs":"b9a10c8690d442a57fc7097d42c9a4f13034c7b4a30b7eb02d538fdbf8ae0a8d"},"package":null}

9
third_party/rust/serde_derive/Cargo.toml поставляемый
Просмотреть файл

@ -1,18 +1,19 @@
[package] [package]
name = "serde_derive" name = "serde_derive"
version = "1.0.66" # remember to update html_root_url version = "1.0.80" # remember to update html_root_url
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"] authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
license = "MIT/Apache-2.0" license = "MIT/Apache-2.0"
description = "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]" description = "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]"
homepage = "https://serde.rs" homepage = "https://serde.rs"
repository = "https://github.com/serde-rs/serde" repository = "https://github.com/serde-rs/serde"
documentation = "https://serde.rs/codegen.html" documentation = "https://serde.rs/derive.html"
keywords = ["serde", "serialization", "no_std"] keywords = ["serde", "serialization", "no_std"]
readme = "crates-io.md" readme = "crates-io.md"
include = ["Cargo.toml", "src/**/*.rs", "crates-io.md", "README.md", "LICENSE-APACHE", "LICENSE-MIT"] include = ["Cargo.toml", "src/**/*.rs", "crates-io.md", "README.md", "LICENSE-APACHE", "LICENSE-MIT"]
[badges] [badges]
travis-ci = { repository = "serde-rs/serde" } travis-ci = { repository = "serde-rs/serde" }
appveyor = { repository = "serde-rs/serde" }
[features] [features]
default = [] default = []
@ -24,8 +25,8 @@ proc-macro = true
[dependencies] [dependencies]
proc-macro2 = "0.4" proc-macro2 = "0.4"
quote = "0.6" quote = "0.6.3"
syn = { version = "0.14", features = ["visit", "extra-traits"] } syn = { version = "0.15", features = ["visit", "extra-traits"] }
[dev-dependencies] [dev-dependencies]
serde = { version = "1.0", path = "../serde" } serde = { version = "1.0", path = "../serde" }

15
third_party/rust/serde_derive/README.md поставляемый
Просмотреть файл

@ -15,7 +15,7 @@ You may be looking for:
- [An overview of Serde](https://serde.rs/) - [An overview of Serde](https://serde.rs/)
- [Data formats supported by Serde](https://serde.rs/#data-formats) - [Data formats supported by Serde](https://serde.rs/#data-formats)
- [Setting up `#[derive(Serialize, Deserialize)]`](https://serde.rs/codegen.html) - [Setting up `#[derive(Serialize, Deserialize)]`](https://serde.rs/derive.html)
- [Examples](https://serde.rs/examples.html) - [Examples](https://serde.rs/examples.html)
- [API documentation](https://docs.serde.rs/serde/) - [API documentation](https://docs.serde.rs/serde/)
- [Release notes](https://github.com/serde-rs/serde/releases) - [Release notes](https://github.com/serde-rs/serde/releases)
@ -79,12 +79,13 @@ fn main() {
## Getting help ## Getting help
Serde developers live in the #serde channel on Serde developers live in the #serde channel on [`irc.mozilla.org`][irc]. The
[`irc.mozilla.org`](https://wiki.mozilla.org/IRC). The #rust channel is also a \#rust channel is also a good resource with generally faster response time but
good resource with generally faster response time but less specific knowledge less specific knowledge about Serde. If IRC is not your thing or you don't get a
about Serde. If IRC is not your thing or you don't get a good response, we are good response, we are happy to respond to [GitHub issues][issues] as well.
happy to respond to [GitHub issues](https://github.com/serde-rs/serde/issues/new)
as well. [irc]: https://wiki.mozilla.org/IRC
[issues]: https://github.com/serde-rs/serde/issues/new/choose
## License ## License

15
third_party/rust/serde_derive/crates-io.md поставляемый
Просмотреть файл

@ -8,7 +8,7 @@ You may be looking for:
- [An overview of Serde](https://serde.rs/) - [An overview of Serde](https://serde.rs/)
- [Data formats supported by Serde](https://serde.rs/#data-formats) - [Data formats supported by Serde](https://serde.rs/#data-formats)
- [Setting up `#[derive(Serialize, Deserialize)]`](https://serde.rs/codegen.html) - [Setting up `#[derive(Serialize, Deserialize)]`](https://serde.rs/derive.html)
- [Examples](https://serde.rs/examples.html) - [Examples](https://serde.rs/examples.html)
- [API documentation](https://docs.serde.rs/serde/) - [API documentation](https://docs.serde.rs/serde/)
- [Release notes](https://github.com/serde-rs/serde/releases) - [Release notes](https://github.com/serde-rs/serde/releases)
@ -47,9 +47,10 @@ fn main() {
## Getting help ## Getting help
Serde developers live in the #serde channel on Serde developers live in the #serde channel on [`irc.mozilla.org`][irc]. The
[`irc.mozilla.org`](https://wiki.mozilla.org/IRC). The #rust channel is also a \#rust channel is also a good resource with generally faster response time but
good resource with generally faster response time but less specific knowledge less specific knowledge about Serde. If IRC is not your thing or you don't get a
about Serde. If IRC is not your thing or you don't get a good response, we are good response, we are happy to respond to [GitHub issues][issues] as well.
happy to respond to [GitHub issues](https://github.com/serde-rs/serde/issues/new)
as well. [irc]: https://wiki.mozilla.org/IRC
[issues]: https://github.com/serde-rs/serde/issues/new/choose

29
third_party/rust/serde_derive/src/bound.rs поставляемый
Просмотреть файл

@ -32,8 +32,7 @@ pub fn without_defaults(generics: &syn::Generics) -> syn::Generics {
..param.clone() ..param.clone()
}), }),
_ => param.clone(), _ => param.clone(),
}) }).collect(),
.collect(),
..generics.clone() ..generics.clone()
} }
} }
@ -91,7 +90,8 @@ pub fn with_where_predicates_from_variants(
// Puts the given bound on any generic type parameters that are used in fields // Puts the given bound on any generic type parameters that are used in fields
// for which filter returns true. // for which filter returns true.
// //
// For example, the following struct needs the bound `A: Serialize, B: Serialize`. // For example, the following struct needs the bound `A: Serialize, B:
// Serialize`.
// //
// struct S<'b, A, B: 'b, C> { // struct S<'b, A, B: 'b, C> {
// a: A, // a: A,
@ -193,14 +193,13 @@ pub fn with_bound(
.map(|id| syn::TypePath { .map(|id| syn::TypePath {
qself: None, qself: None,
path: id.into(), path: id.into(),
}) }).chain(associated_type_usage.into_iter().cloned())
.chain(associated_type_usage.into_iter().cloned())
.map(|bounded_ty| { .map(|bounded_ty| {
syn::WherePredicate::Type(syn::PredicateType { syn::WherePredicate::Type(syn::PredicateType {
lifetimes: None, lifetimes: None,
// the type parameter that is being bounded e.g. T // the type parameter that is being bounded e.g. T
bounded_ty: syn::Type::Path(bounded_ty), bounded_ty: syn::Type::Path(bounded_ty),
colon_token: Default::default(), colon_token: <Token![:]>::default(),
// the bound e.g. Serialize // the bound e.g. Serialize
bounds: vec![syn::TypeParamBound::Trait(syn::TraitBound { bounds: vec![syn::TypeParamBound::Trait(syn::TraitBound {
paren_token: None, paren_token: None,
@ -208,7 +207,7 @@ pub fn with_bound(
lifetimes: None, lifetimes: None,
path: bound.clone(), path: bound.clone(),
})].into_iter() })].into_iter()
.collect(), .collect(),
}) })
}); });
@ -233,7 +232,7 @@ pub fn with_self_bound(
lifetimes: None, lifetimes: None,
// the type that is being bounded e.g. MyStruct<'a, T> // the type that is being bounded e.g. MyStruct<'a, T>
bounded_ty: type_of_item(cont), bounded_ty: type_of_item(cont),
colon_token: Default::default(), colon_token: <Token![:]>::default(),
// the bound e.g. Default // the bound e.g. Default
bounds: vec![syn::TypeParamBound::Trait(syn::TraitBound { bounds: vec![syn::TypeParamBound::Trait(syn::TraitBound {
paren_token: None, paren_token: None,
@ -241,7 +240,7 @@ pub fn with_self_bound(
lifetimes: None, lifetimes: None,
path: bound.clone(), path: bound.clone(),
})].into_iter() })].into_iter()
.collect(), .collect(),
})); }));
generics generics
} }
@ -270,8 +269,7 @@ pub fn with_lifetime_bound(generics: &syn::Generics, lifetime: &str) -> syn::Gen
syn::GenericParam::Const(_) => {} syn::GenericParam::Const(_) => {}
} }
param param
})) })).collect();
.collect();
syn::Generics { syn::Generics {
params: params, params: params,
@ -289,7 +287,7 @@ fn type_of_item(cont: &Container) -> syn::Type {
arguments: syn::PathArguments::AngleBracketed( arguments: syn::PathArguments::AngleBracketed(
syn::AngleBracketedGenericArguments { syn::AngleBracketedGenericArguments {
colon2_token: None, colon2_token: None,
lt_token: Default::default(), lt_token: <Token![<]>::default(),
args: cont args: cont
.generics .generics
.params .params
@ -307,13 +305,12 @@ fn type_of_item(cont: &Container) -> syn::Type {
syn::GenericParam::Const(_) => { syn::GenericParam::Const(_) => {
panic!("Serde does not support const generics yet"); panic!("Serde does not support const generics yet");
} }
}) }).collect(),
.collect(), gt_token: <Token![>]>::default(),
gt_token: Default::default(),
}, },
), ),
}].into_iter() }].into_iter()
.collect(), .collect(),
}, },
}) })
} }

54
third_party/rust/serde_derive/src/de.rs поставляемый
Просмотреть файл

@ -34,8 +34,9 @@ pub fn expand_derive_deserialize(input: &syn::DeriveInput) -> Result<TokenStream
let ident = &cont.ident; let ident = &cont.ident;
let params = Parameters::new(&cont); let params = Parameters::new(&cont);
let (de_impl_generics, _, ty_generics, where_clause) = split_with_de_lifetime(&params); let (de_impl_generics, _, ty_generics, where_clause) = split_with_de_lifetime(&params);
let suffix = ident.to_string().trim_left_matches("r#").to_owned();
let dummy_const = Ident::new( let dummy_const = Ident::new(
&format!("_IMPL_DESERIALIZE_FOR_{}", ident), &format!("_IMPL_DESERIALIZE_FOR_{}", suffix),
Span::call_site(), Span::call_site(),
); );
let body = Stmts(deserialize_body(&cont, &params)); let body = Stmts(deserialize_body(&cont, &params));
@ -77,6 +78,9 @@ pub fn expand_derive_deserialize(input: &syn::DeriveInput) -> Result<TokenStream
let generated = quote! { let generated = quote! {
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications)] #[allow(non_upper_case_globals, unused_attributes, unused_qualifications)]
const #dummy_const: () = { const #dummy_const: () = {
#[allow(unknown_lints)]
#[cfg_attr(feature = "cargo-clippy", allow(useless_attribute))]
#[allow(rust_2018_idioms)]
extern crate serde as _serde; extern crate serde as _serde;
#try_replacement #try_replacement
#impl_block #impl_block
@ -206,7 +210,9 @@ fn build_generics(cont: &Container, borrowed: &BorrowedLifetimes) -> syn::Generi
// All other fields may need a `T: Deserialize` bound where T is the type of the // All other fields may need a `T: Deserialize` bound where T is the type of the
// field. // field.
fn needs_deserialize_bound(field: &attr::Field, variant: Option<&attr::Variant>) -> bool { fn needs_deserialize_bound(field: &attr::Field, variant: Option<&attr::Variant>) -> bool {
!field.skip_deserializing() && field.deserialize_with().is_none() && field.de_bound().is_none() !field.skip_deserializing()
&& field.deserialize_with().is_none()
&& field.de_bound().is_none()
&& variant.map_or(true, |variant| { && variant.map_or(true, |variant| {
!variant.skip_deserializing() !variant.skip_deserializing()
&& variant.deserialize_with().is_none() && variant.deserialize_with().is_none()
@ -856,7 +862,8 @@ fn deserialize_newtype_struct(
#[cfg(feature = "deserialize_in_place")] #[cfg(feature = "deserialize_in_place")]
fn deserialize_newtype_struct_in_place(params: &Parameters, field: &Field) -> TokenStream { fn deserialize_newtype_struct_in_place(params: &Parameters, field: &Field) -> TokenStream {
// We do not generate deserialize_in_place if every field has a deserialize_with. // We do not generate deserialize_in_place if every field has a
// deserialize_with.
assert!(field.attrs.deserialize_with().is_none()); assert!(field.attrs.deserialize_with().is_none());
let delife = params.borrowed.de_lifetime(); let delife = params.borrowed.de_lifetime();
@ -960,8 +967,8 @@ fn deserialize_struct(
quote!(mut __seq) quote!(mut __seq)
}; };
// untagged struct variants do not get a visit_seq method. The same applies to structs that // untagged struct variants do not get a visit_seq method. The same applies to
// only have a map representation. // structs that only have a map representation.
let visit_seq = match *untagged { let visit_seq = match *untagged {
Untagged::No if !cattrs.has_flatten() => Some(quote! { Untagged::No if !cattrs.has_flatten() => Some(quote! {
#[inline] #[inline]
@ -1187,6 +1194,10 @@ fn deserialize_externally_tagged_enum(
.map(|(i, variant)| (variant.attrs.name().deserialize_name(), field_i(i))) .map(|(i, variant)| (variant.attrs.name().deserialize_name(), field_i(i)))
.collect(); .collect();
let other_idx = variants
.iter()
.position(|ref variant| variant.attrs.other());
let variants_stmt = { let variants_stmt = {
let variant_names = variant_names_idents.iter().map(|&(ref name, _)| name); let variant_names = variant_names_idents.iter().map(|&(ref name, _)| name);
quote! { quote! {
@ -1198,6 +1209,7 @@ fn deserialize_externally_tagged_enum(
&variant_names_idents, &variant_names_idents,
cattrs, cattrs,
true, true,
other_idx,
)); ));
// Match arms to extract a variant from a string // Match arms to extract a variant from a string
@ -1318,7 +1330,7 @@ fn deserialize_externally_tagged_enum_in_place(
} }
}; };
let variant_visitor = Stmts(deserialize_generated_identifier(&variant_names_idents, cattrs, true),); let variant_visitor = Stmts(deserialize_generated_identifier(&variant_names_idents, cattrs, true, None),);
let non_unit_field = field_i(non_unit_index); let non_unit_field = field_i(non_unit_index);
let tag_access = match non_unit_variant.style { let tag_access = match non_unit_variant.style {
@ -1532,6 +1544,10 @@ fn deserialize_internally_tagged_enum(
.map(|(i, variant)| (variant.attrs.name().deserialize_name(), field_i(i))) .map(|(i, variant)| (variant.attrs.name().deserialize_name(), field_i(i)))
.collect(); .collect();
let other_idx = variants
.iter()
.position(|ref variant| variant.attrs.other());
let variants_stmt = { let variants_stmt = {
let variant_names = variant_names_idents.iter().map(|&(ref name, _)| name); let variant_names = variant_names_idents.iter().map(|&(ref name, _)| name);
quote! { quote! {
@ -1543,6 +1559,7 @@ fn deserialize_internally_tagged_enum(
&variant_names_idents, &variant_names_idents,
cattrs, cattrs,
true, true,
other_idx,
)); ));
// Match arms to extract a variant from a string // Match arms to extract a variant from a string
@ -1601,6 +1618,10 @@ fn deserialize_adjacently_tagged_enum(
.map(|(i, variant)| (variant.attrs.name().deserialize_name(), field_i(i))) .map(|(i, variant)| (variant.attrs.name().deserialize_name(), field_i(i)))
.collect(); .collect();
let other_idx = variants
.iter()
.position(|ref variant| variant.attrs.other());
let variants_stmt = { let variants_stmt = {
let variant_names = variant_names_idents.iter().map(|&(ref name, _)| name); let variant_names = variant_names_idents.iter().map(|&(ref name, _)| name);
quote! { quote! {
@ -1612,6 +1633,7 @@ fn deserialize_adjacently_tagged_enum(
&variant_names_idents, &variant_names_idents,
cattrs, cattrs,
true, true,
other_idx,
)); ));
let variant_arms: &Vec<_> = &variants let variant_arms: &Vec<_> = &variants
@ -1631,8 +1653,7 @@ fn deserialize_adjacently_tagged_enum(
quote! { quote! {
__Field::#variant_index => #block __Field::#variant_index => #block
} }
}) }).collect();
.collect();
let expecting = format!("adjacently tagged enum {}", params.type_name()); let expecting = format!("adjacently tagged enum {}", params.type_name());
let type_name = cattrs.name().deserialize_name(); let type_name = cattrs.name().deserialize_name();
@ -2181,6 +2202,7 @@ fn deserialize_generated_identifier(
fields: &[(String, Ident)], fields: &[(String, Ident)],
cattrs: &attr::Container, cattrs: &attr::Container,
is_variant: bool, is_variant: bool,
other_idx: Option<usize>,
) -> Fragment { ) -> Fragment {
let this = quote!(__Field); let this = quote!(__Field);
let field_idents: &Vec<_> = &fields.iter().map(|&(_, ref ident)| ident).collect(); let field_idents: &Vec<_> = &fields.iter().map(|&(_, ref ident)| ident).collect();
@ -2189,6 +2211,10 @@ fn deserialize_generated_identifier(
let ignore_variant = quote!(__other(_serde::private::de::Content<'de>),); let ignore_variant = quote!(__other(_serde::private::de::Content<'de>),);
let fallthrough = quote!(_serde::export::Ok(__Field::__other(__value))); let fallthrough = quote!(_serde::export::Ok(__Field::__other(__value)));
(Some(ignore_variant), Some(fallthrough)) (Some(ignore_variant), Some(fallthrough))
} else if let Some(other_idx) = other_idx {
let ignore_variant = fields[other_idx].1.clone();
let fallthrough = quote!(_serde::export::Ok(__Field::#ignore_variant));
(None, Some(fallthrough))
} else if is_variant || cattrs.deny_unknown_fields() { } else if is_variant || cattrs.deny_unknown_fields() {
(None, None) (None, None)
} else { } else {
@ -2281,8 +2307,7 @@ fn deserialize_custom_identifier(
variant.attrs.name().deserialize_name(), variant.attrs.name().deserialize_name(),
variant.ident.clone(), variant.ident.clone(),
) )
}) }).collect();
.collect();
let names = names_idents.iter().map(|&(ref name, _)| name); let names = names_idents.iter().map(|&(ref name, _)| name);
@ -2612,7 +2637,7 @@ fn deserialize_struct_as_struct_visitor(
} }
}; };
let field_visitor = deserialize_generated_identifier(&field_names_idents, cattrs, false); let field_visitor = deserialize_generated_identifier(&field_names_idents, cattrs, false, None);
let visit_map = deserialize_map(struct_path, params, fields, cattrs); let visit_map = deserialize_map(struct_path, params, fields, cattrs);
@ -2632,7 +2657,7 @@ fn deserialize_struct_as_map_visitor(
.map(|(i, field)| (field.attrs.name().deserialize_name(), field_i(i))) .map(|(i, field)| (field.attrs.name().deserialize_name(), field_i(i)))
.collect(); .collect();
let field_visitor = deserialize_generated_identifier(&field_names_idents, cattrs, false); let field_visitor = deserialize_generated_identifier(&field_names_idents, cattrs, false, None);
let visit_map = deserialize_map(struct_path, params, fields, cattrs); let visit_map = deserialize_map(struct_path, params, fields, cattrs);
@ -2867,7 +2892,7 @@ fn deserialize_struct_as_struct_in_place_visitor(
} }
}; };
let field_visitor = deserialize_generated_identifier(&field_names_idents, cattrs, false); let field_visitor = deserialize_generated_identifier(&field_names_idents, cattrs, false, None);
let visit_map = deserialize_map_in_place(params, fields, cattrs); let visit_map = deserialize_map_in_place(params, fields, cattrs);
@ -2889,7 +2914,8 @@ fn deserialize_map_in_place(
.map(|(i, field)| (field, field_i(i))) .map(|(i, field)| (field, field_i(i)))
.collect(); .collect();
// For deserialize_in_place, declare booleans for each field that will be deserialized. // For deserialize_in_place, declare booleans for each field that will be
// deserialized.
let let_flags = fields_names let let_flags = fields_names
.iter() .iter()
.filter(|&&(field, _)| !field.attrs.skip_deserializing()) .filter(|&&(field, _)| !field.attrs.skip_deserializing())

Просмотреть файл

@ -6,24 +6,36 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
//! A Serde ast, parsed from the Syn ast and ready to generate Rust code.
use internals::attr; use internals::attr;
use internals::check; use internals::check;
use internals::{Ctxt, Derive}; use internals::{Ctxt, Derive};
use syn; use syn;
use syn::punctuated::Punctuated; use syn::punctuated::Punctuated;
/// A source data structure annotated with `#[derive(Serialize)]` and/or `#[derive(Deserialize)]`,
/// parsed into an internal representation.
pub struct Container<'a> { pub struct Container<'a> {
/// The struct or enum name (without generics).
pub ident: syn::Ident, pub ident: syn::Ident,
/// Attributes on the structure, parsed for Serde.
pub attrs: attr::Container, pub attrs: attr::Container,
/// The contents of the struct or enum.
pub data: Data<'a>, pub data: Data<'a>,
/// Any generics on the struct or enum.
pub generics: &'a syn::Generics, pub generics: &'a syn::Generics,
} }
/// The fields of a struct or enum.
///
/// Analagous to `syn::Data`.
pub enum Data<'a> { pub enum Data<'a> {
Enum(Repr, Vec<Variant<'a>>), Enum(Repr, Vec<Variant<'a>>),
Struct(Style, Vec<Field<'a>>), Struct(Style, Vec<Field<'a>>),
} }
/// A variant of an enum.
pub struct Variant<'a> { pub struct Variant<'a> {
pub ident: syn::Ident, pub ident: syn::Ident,
pub attrs: attr::Variant, pub attrs: attr::Variant,
@ -31,6 +43,7 @@ pub struct Variant<'a> {
pub fields: Vec<Field<'a>>, pub fields: Vec<Field<'a>>,
} }
/// A field of a struct.
pub struct Field<'a> { pub struct Field<'a> {
pub member: syn::Member, pub member: syn::Member,
pub attrs: attr::Field, pub attrs: attr::Field,
@ -46,13 +59,18 @@ pub struct Repr {
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
pub enum Style { pub enum Style {
/// Named fields.
Struct, Struct,
/// Many unnamed fields.
Tuple, Tuple,
/// One unnamed field.
Newtype, Newtype,
/// No fields.
Unit, Unit,
} }
impl<'a> Container<'a> { impl<'a> Container<'a> {
/// Convert the raw Syn ast into a parsed container object, collecting errors in `cx`.
pub fn from_ast(cx: &Ctxt, item: &'a syn::DeriveInput, derive: Derive) -> Container<'a> { pub fn from_ast(cx: &Ctxt, item: &'a syn::DeriveInput, derive: Derive) -> Container<'a> {
let mut attrs = attr::Container::from_ast(cx, item); let mut attrs = attr::Container::from_ast(cx, item);
@ -244,6 +262,5 @@ fn fields_from_ast<'a>(
attrs: attr::Field::from_ast(cx, i, field, attrs, container_default), attrs: attr::Field::from_ast(cx, i, field, attrs, container_default),
ty: &field.ty, ty: &field.ty,
original: field, original: field,
}) }).collect()
.collect()
} }

Просмотреть файл

@ -11,8 +11,8 @@ use proc_macro2::{Group, Span, TokenStream, TokenTree};
use std::collections::BTreeSet; use std::collections::BTreeSet;
use std::str::FromStr; use std::str::FromStr;
use syn; use syn;
use syn::parse::{self, Parse, ParseStream};
use syn::punctuated::Punctuated; use syn::punctuated::Punctuated;
use syn::synom::{ParseError, Synom};
use syn::Ident; use syn::Ident;
use syn::Meta::{List, NameValue, Word}; use syn::Meta::{List, NameValue, Word};
use syn::NestedMeta::{Literal, Meta}; use syn::NestedMeta::{Literal, Meta};
@ -90,6 +90,10 @@ pub struct Name {
deserialize: String, deserialize: String,
} }
fn unraw(ident: &Ident) -> String {
ident.to_string().trim_left_matches("r#").to_owned()
}
impl Name { impl Name {
/// Return the container name for the container when serializing. /// Return the container name for the container when serializing.
pub fn serialize_name(&self) -> String { pub fn serialize_name(&self) -> String {
@ -102,7 +106,7 @@ impl Name {
} }
} }
/// Represents container (e.g. struct) attribute information /// Represents struct or enum attribute information.
pub struct Container { pub struct Container {
name: Name, name: Name,
transparent: bool, transparent: bool,
@ -272,7 +276,7 @@ impl Container {
} }
} }
// Parse `#[serde(bound = "D: Serialize")]` // Parse `#[serde(bound = "T: SomeBound")]`
Meta(NameValue(ref m)) if m.ident == "bound" => { Meta(NameValue(ref m)) if m.ident == "bound" => {
if let Ok(where_predicates) = if let Ok(where_predicates) =
parse_lit_into_where(cx, &m.ident, &m.ident, &m.lit) parse_lit_into_where(cx, &m.ident, &m.ident, &m.lit)
@ -282,7 +286,7 @@ impl Container {
} }
} }
// Parse `#[serde(bound(serialize = "D: Serialize", deserialize = "D: Deserialize"))]` // Parse `#[serde(bound(serialize = "...", deserialize = "..."))]`
Meta(List(ref m)) if m.ident == "bound" => { Meta(List(ref m)) if m.ident == "bound" => {
if let Ok((ser, de)) = get_where_predicates(cx, &m.nested) { if let Ok((ser, de)) = get_where_predicates(cx, &m.nested) {
ser_bound.set_opt(ser); ser_bound.set_opt(ser);
@ -380,8 +384,8 @@ impl Container {
Container { Container {
name: Name { name: Name {
serialize: ser_name.get().unwrap_or_else(|| item.ident.to_string()), serialize: ser_name.get().unwrap_or_else(|| unraw(&item.ident)),
deserialize: de_name.get().unwrap_or_else(|| item.ident.to_string()), deserialize: de_name.get().unwrap_or_else(|| unraw(&item.ident)),
}, },
transparent: transparent.get(), transparent: transparent.get(),
deny_unknown_fields: deny_unknown_fields.get(), deny_unknown_fields: deny_unknown_fields.get(),
@ -617,7 +621,7 @@ impl Variant {
other.set_true(); other.set_true();
} }
// Parse `#[serde(bound = "D: Serialize")]` // Parse `#[serde(bound = "T: SomeBound")]`
Meta(NameValue(ref m)) if m.ident == "bound" => { Meta(NameValue(ref m)) if m.ident == "bound" => {
if let Ok(where_predicates) = if let Ok(where_predicates) =
parse_lit_into_where(cx, &m.ident, &m.ident, &m.lit) parse_lit_into_where(cx, &m.ident, &m.ident, &m.lit)
@ -627,7 +631,7 @@ impl Variant {
} }
} }
// Parse `#[serde(bound(serialize = "D: Serialize", deserialize = "D: Deserialize"))]` // Parse `#[serde(bound(serialize = "...", deserialize = "..."))]`
Meta(List(ref m)) if m.ident == "bound" => { Meta(List(ref m)) if m.ident == "bound" => {
if let Ok((ser, de)) = get_where_predicates(cx, &m.nested) { if let Ok((ser, de)) = get_where_predicates(cx, &m.nested) {
ser_bound.set_opt(ser); ser_bound.set_opt(ser);
@ -697,8 +701,8 @@ impl Variant {
let de_renamed = de_name.is_some(); let de_renamed = de_name.is_some();
Variant { Variant {
name: Name { name: Name {
serialize: ser_name.unwrap_or_else(|| variant.ident.to_string()), serialize: ser_name.unwrap_or_else(|| unraw(&variant.ident)),
deserialize: de_name.unwrap_or_else(|| variant.ident.to_string()), deserialize: de_name.unwrap_or_else(|| unraw(&variant.ident)),
}, },
ser_renamed: ser_renamed, ser_renamed: ser_renamed,
de_renamed: de_renamed, de_renamed: de_renamed,
@ -822,7 +826,7 @@ impl Field {
let mut flatten = BoolAttr::none(cx, "flatten"); let mut flatten = BoolAttr::none(cx, "flatten");
let ident = match field.ident { let ident = match field.ident {
Some(ref ident) => ident.to_string(), Some(ref ident) => unraw(ident),
None => index.to_string(), None => index.to_string(),
}; };
@ -921,7 +925,7 @@ impl Field {
} }
} }
// Parse `#[serde(bound = "D: Serialize")]` // Parse `#[serde(bound = "T: SomeBound")]`
Meta(NameValue(ref m)) if m.ident == "bound" => { Meta(NameValue(ref m)) if m.ident == "bound" => {
if let Ok(where_predicates) = if let Ok(where_predicates) =
parse_lit_into_where(cx, &m.ident, &m.ident, &m.lit) parse_lit_into_where(cx, &m.ident, &m.ident, &m.lit)
@ -931,7 +935,7 @@ impl Field {
} }
} }
// Parse `#[serde(bound(serialize = "D: Serialize", deserialize = "D: Deserialize"))]` // Parse `#[serde(bound(serialize = "...", deserialize = "..."))]`
Meta(List(ref m)) if m.ident == "bound" => { Meta(List(ref m)) if m.ident == "bound" => {
if let Ok((ser, de)) = get_where_predicates(cx, &m.nested) { if let Ok((ser, de)) = get_where_predicates(cx, &m.nested) {
ser_bound.set_opt(ser); ser_bound.set_opt(ser);
@ -989,9 +993,9 @@ impl Field {
} }
} }
// Is skip_deserializing, initialize the field to Default::default() unless a different // Is skip_deserializing, initialize the field to Default::default() unless a
// default is specified by `#[serde(default = "...")]` on ourselves or our container (e.g. // different default is specified by `#[serde(default = "...")]` on
// the struct we are in). // ourselves or our container (e.g. the struct we are in).
if let Default::None = *container_default { if let Default::None = *container_default {
if skip_deserializing.0.value.is_some() { if skip_deserializing.0.value.is_some() {
default.set_if_none(Default::Default); default.set_if_none(Default::Default);
@ -1296,11 +1300,10 @@ fn parse_lit_into_lifetimes(
struct BorrowedLifetimes(Punctuated<syn::Lifetime, Token![+]>); struct BorrowedLifetimes(Punctuated<syn::Lifetime, Token![+]>);
impl Synom for BorrowedLifetimes { impl Parse for BorrowedLifetimes {
named!(parse -> Self, map!( fn parse(input: ParseStream) -> parse::Result<Self> {
call!(Punctuated::parse_separated_nonempty), Punctuated::parse_separated_nonempty(input).map(BorrowedLifetimes)
BorrowedLifetimes }
));
} }
if let Ok(BorrowedLifetimes(lifetimes)) = parse_lit_str(string) { if let Ok(BorrowedLifetimes(lifetimes)) = parse_lit_str(string) {
@ -1509,7 +1512,8 @@ fn collect_lifetimes(ty: &syn::Type, out: &mut BTreeSet<syn::Lifetime>) {
syn::GenericArgument::Binding(ref binding) => { syn::GenericArgument::Binding(ref binding) => {
collect_lifetimes(&binding.ty, out); collect_lifetimes(&binding.ty, out);
} }
syn::GenericArgument::Const(_) => {} syn::GenericArgument::Constraint(_)
| syn::GenericArgument::Const(_) => {}
} }
} }
} }
@ -1531,15 +1535,15 @@ fn collect_lifetimes(ty: &syn::Type, out: &mut BTreeSet<syn::Lifetime>) {
} }
} }
fn parse_lit_str<T>(s: &syn::LitStr) -> Result<T, ParseError> fn parse_lit_str<T>(s: &syn::LitStr) -> parse::Result<T>
where where
T: Synom, T: Parse,
{ {
let tokens = try!(spanned_tokens(s)); let tokens = try!(spanned_tokens(s));
syn::parse2(tokens) syn::parse2(tokens)
} }
fn spanned_tokens(s: &syn::LitStr) -> Result<TokenStream, ParseError> { fn spanned_tokens(s: &syn::LitStr) -> parse::Result<TokenStream> {
let stream = try!(syn::parse_str(&s.value())); let stream = try!(syn::parse_str(&s.value()));
Ok(respan_token_stream(stream, s.span())) Ok(respan_token_stream(stream, s.span()))
} }

Просмотреть файл

@ -6,6 +6,9 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
//! Code to convert the Rust-styled field/variant (e.g. `my_field`, `MyType`) to the
//! case of the source (e.g. `my-field`, `MY_FIELD`).
// See https://users.rust-lang.org/t/psa-dealing-with-warning-unused-import-std-ascii-asciiext-in-today-s-nightly/13726 // See https://users.rust-lang.org/t/psa-dealing-with-warning-unused-import-std-ascii-asciiext-in-today-s-nightly/13726
#[allow(deprecated, unused_imports)] #[allow(deprecated, unused_imports)]
use std::ascii::AsciiExt; use std::ascii::AsciiExt;
@ -14,6 +17,7 @@ use std::str::FromStr;
use self::RenameRule::*; use self::RenameRule::*;
/// The different possible ways to change case of fields in a struct, or variants in an enum.
#[derive(PartialEq)] #[derive(PartialEq)]
pub enum RenameRule { pub enum RenameRule {
/// Don't apply a default rename rule. /// Don't apply a default rename rule.
@ -22,13 +26,16 @@ pub enum RenameRule {
LowerCase, LowerCase,
/// Rename direct children to "UPPERCASE" style. /// Rename direct children to "UPPERCASE" style.
UPPERCASE, UPPERCASE,
/// Rename direct children to "PascalCase" style, as typically used for enum variants. /// Rename direct children to "PascalCase" style, as typically used for
/// enum variants.
PascalCase, PascalCase,
/// Rename direct children to "camelCase" style. /// Rename direct children to "camelCase" style.
CamelCase, CamelCase,
/// Rename direct children to "snake_case" style, as commonly used for fields. /// Rename direct children to "snake_case" style, as commonly used for
/// fields.
SnakeCase, SnakeCase,
/// Rename direct children to "SCREAMING_SNAKE_CASE" style, as commonly used for constants. /// Rename direct children to "SCREAMING_SNAKE_CASE" style, as commonly
/// used for constants.
ScreamingSnakeCase, ScreamingSnakeCase,
/// Rename direct children to "kebab-case" style. /// Rename direct children to "kebab-case" style.
KebabCase, KebabCase,
@ -37,6 +44,7 @@ pub enum RenameRule {
} }
impl RenameRule { impl RenameRule {
/// Apply a renaming rule to an enum variant, returning the version expected in the source.
pub fn apply_to_variant(&self, variant: &str) -> String { pub fn apply_to_variant(&self, variant: &str) -> String {
match *self { match *self {
None | PascalCase => variant.to_owned(), None | PascalCase => variant.to_owned(),
@ -61,6 +69,7 @@ impl RenameRule {
} }
} }
/// Apply a renaming rule to a struct field, returning the version expected in the source.
pub fn apply_to_field(&self, field: &str) -> String { pub fn apply_to_field(&self, field: &str) -> String {
match *self { match *self {
None | LowerCase | SnakeCase => field.to_owned(), None | LowerCase | SnakeCase => field.to_owned(),

Просмотреть файл

@ -93,7 +93,7 @@ fn check_flatten_field(cx: &Ctxt, style: Style, field: &Field) {
} }
/// The `other` attribute must be used at most once and it must be the last /// The `other` attribute must be used at most once and it must be the last
/// variant of an enum that has the `field_identifier` attribute. /// variant of an enum.
/// ///
/// Inside a `variant_identifier` all variants must be unit variants. Inside a /// Inside a `variant_identifier` all variants must be unit variants. Inside a
/// `field_identifier` all but possibly one variant must be unit variants. The /// `field_identifier` all but possibly one variant must be unit variants. The
@ -111,42 +111,48 @@ fn check_identifier(cx: &Ctxt, cont: &Container) {
variant.style, variant.style,
cont.attrs.identifier(), cont.attrs.identifier(),
variant.attrs.other(), variant.attrs.other(),
cont.attrs.tag(),
) { ) {
// The `other` attribute may only be used in a field_identifier. // The `other` attribute may not be used in a variant_identifier.
(_, Identifier::Variant, true) | (_, Identifier::No, true) => { (_, Identifier::Variant, true, _) => {
cx.error("#[serde(other)] may only be used inside a field_identifier"); cx.error("#[serde(other)] may not be used on a variant_identifier");
}
// Variant with `other` attribute cannot appear in untagged enum
(_, Identifier::No, true, &EnumTag::None) => {
cx.error("#[serde(other)] cannot appear on untagged enum");
} }
// Variant with `other` attribute must be the last one. // Variant with `other` attribute must be the last one.
(Style::Unit, Identifier::Field, true) => { (Style::Unit, Identifier::Field, true, _) | (Style::Unit, Identifier::No, true, _) => {
if i < variants.len() - 1 { if i < variants.len() - 1 {
cx.error("#[serde(other)] must be the last variant"); cx.error("#[serde(other)] must be the last variant");
} }
} }
// Variant with `other` attribute must be a unit variant. // Variant with `other` attribute must be a unit variant.
(_, Identifier::Field, true) => { (_, Identifier::Field, true, _) | (_, Identifier::No, true, _) => {
cx.error("#[serde(other)] must be on a unit variant"); cx.error("#[serde(other)] must be on a unit variant");
} }
// Any sort of variant is allowed if this is not an identifier. // Any sort of variant is allowed if this is not an identifier.
(_, Identifier::No, false) => {} (_, Identifier::No, false, _) => {}
// Unit variant without `other` attribute is always fine. // Unit variant without `other` attribute is always fine.
(Style::Unit, _, false) => {} (Style::Unit, _, false, _) => {}
// The last field is allowed to be a newtype catch-all. // The last field is allowed to be a newtype catch-all.
(Style::Newtype, Identifier::Field, false) => { (Style::Newtype, Identifier::Field, false, _) => {
if i < variants.len() - 1 { if i < variants.len() - 1 {
cx.error(format!("`{}` must be the last variant", variant.ident)); cx.error(format!("`{}` must be the last variant", variant.ident));
} }
} }
(_, Identifier::Field, false) => { (_, Identifier::Field, false, _) => {
cx.error("field_identifier may only contain unit variants"); cx.error("field_identifier may only contain unit variants");
} }
(_, Identifier::Variant, false) => { (_, Identifier::Variant, false, _) => {
cx.error("variant_identifier may only contain unit variants"); cx.error("variant_identifier may only contain unit variants");
} }
} }

Просмотреть файл

@ -10,18 +10,29 @@ use std::cell::RefCell;
use std::fmt::Display; use std::fmt::Display;
use std::thread; use std::thread;
/// A type to collect errors together and format them.
///
/// Dropping this object will cause a panic. It must be consumed using `check`.
///
/// References can be shared since this type uses run-time exclusive mut checking.
#[derive(Default)] #[derive(Default)]
pub struct Ctxt { pub struct Ctxt {
// The contents will be set to `None` during checking. This is so that checking can be
// enforced.
errors: RefCell<Option<Vec<String>>>, errors: RefCell<Option<Vec<String>>>,
} }
impl Ctxt { impl Ctxt {
/// Create a new context object.
///
/// This object contains no errors, but will still trigger a panic if it is not `check`ed.
pub fn new() -> Self { pub fn new() -> Self {
Ctxt { Ctxt {
errors: RefCell::new(Some(Vec::new())), errors: RefCell::new(Some(Vec::new())),
} }
} }
/// Add an error to the context object.
pub fn error<T: Display>(&self, msg: T) { pub fn error<T: Display>(&self, msg: T) {
self.errors self.errors
.borrow_mut() .borrow_mut()
@ -30,6 +41,7 @@ impl Ctxt {
.push(msg.to_string()); .push(msg.to_string());
} }
/// Consume this object, producing a formatted error string if there are errors.
pub fn check(self) -> Result<(), String> { pub fn check(self) -> Result<(), String> {
let mut errors = self.errors.borrow_mut().take().unwrap(); let mut errors = self.errors.borrow_mut().take().unwrap();
match errors.len() { match errors.len() {

29
third_party/rust/serde_derive/src/lib.rs поставляемый
Просмотреть файл

@ -22,22 +22,37 @@
//! //!
//! [https://serde.rs/derive.html]: https://serde.rs/derive.html //! [https://serde.rs/derive.html]: https://serde.rs/derive.html
#![doc(html_root_url = "https://docs.rs/serde_derive/1.0.66")] #![doc(html_root_url = "https://docs.rs/serde_derive/1.0.80")]
#![cfg_attr(feature = "cargo-clippy", allow(renamed_and_removed_lints))]
#![cfg_attr(feature = "cargo-clippy", deny(clippy, clippy_pedantic))] #![cfg_attr(feature = "cargo-clippy", deny(clippy, clippy_pedantic))]
// Whitelisted clippy lints // Whitelisted clippy lints
#![cfg_attr( #![cfg_attr(
feature = "cargo-clippy", feature = "cargo-clippy",
allow( allow(
enum_variant_names, redundant_field_names, too_many_arguments, used_underscore_binding, cyclomatic_complexity,
cyclomatic_complexity, needless_pass_by_value enum_variant_names,
needless_pass_by_value,
redundant_field_names,
too_many_arguments,
used_underscore_binding,
) )
)] )]
// Whitelisted clippy_pedantic lints // Whitelisted clippy_pedantic lints
#![cfg_attr( #![cfg_attr(
feature = "cargo-clippy", feature = "cargo-clippy",
allow( allow(
items_after_statements, doc_markdown, stutter, similar_names, use_self, single_match_else, cast_possible_truncation,
enum_glob_use, match_same_arms, filter_map, cast_possible_truncation doc_markdown,
enum_glob_use,
filter_map,
indexing_slicing,
items_after_statements,
match_same_arms,
similar_names,
single_match_else,
stutter,
unseparated_literal_suffix,
use_self,
) )
)] )]
// The `quote!` macro requires deep recursion. // The `quote!` macro requires deep recursion.
@ -68,7 +83,7 @@ mod try;
#[proc_macro_derive(Serialize, attributes(serde))] #[proc_macro_derive(Serialize, attributes(serde))]
pub fn derive_serialize(input: TokenStream) -> TokenStream { pub fn derive_serialize(input: TokenStream) -> TokenStream {
let input: DeriveInput = syn::parse(input).unwrap(); let input = parse_macro_input!(input as DeriveInput);
ser::expand_derive_serialize(&input) ser::expand_derive_serialize(&input)
.unwrap_or_else(compile_error) .unwrap_or_else(compile_error)
.into() .into()
@ -76,7 +91,7 @@ pub fn derive_serialize(input: TokenStream) -> TokenStream {
#[proc_macro_derive(Deserialize, attributes(serde))] #[proc_macro_derive(Deserialize, attributes(serde))]
pub fn derive_deserialize(input: TokenStream) -> TokenStream { pub fn derive_deserialize(input: TokenStream) -> TokenStream {
let input: DeriveInput = syn::parse(input).unwrap(); let input = parse_macro_input!(input as DeriveInput);
de::expand_derive_deserialize(&input) de::expand_derive_deserialize(&input)
.unwrap_or_else(compile_error) .unwrap_or_else(compile_error)
.into() .into()

Просмотреть файл

@ -62,8 +62,7 @@ fn pretend_fields_used(cont: &Container) -> TokenStream {
Some(quote!(#type_ident::#variant_ident #pat)) Some(quote!(#type_ident::#variant_ident #pat))
} }
_ => None, _ => None,
}) }).collect::<Vec<_>>(),
.collect::<Vec<_>>(),
Data::Struct(Style::Struct, ref fields) => { Data::Struct(Style::Struct, ref fields) => {
let pat = struct_pattern(fields); let pat = struct_pattern(fields);
vec![quote!(#type_ident #pat)] vec![quote!(#type_ident #pat)]

37
third_party/rust/serde_derive/src/ser.rs поставляемый
Просмотреть файл

@ -26,7 +26,11 @@ pub fn expand_derive_serialize(input: &syn::DeriveInput) -> Result<TokenStream,
let ident = &cont.ident; let ident = &cont.ident;
let params = Parameters::new(&cont); let params = Parameters::new(&cont);
let (impl_generics, ty_generics, where_clause) = params.generics.split_for_impl(); let (impl_generics, ty_generics, where_clause) = params.generics.split_for_impl();
let dummy_const = Ident::new(&format!("_IMPL_SERIALIZE_FOR_{}", ident), Span::call_site()); let suffix = ident.to_string().trim_left_matches("r#").to_owned();
let dummy_const = Ident::new(
&format!("_IMPL_SERIALIZE_FOR_{}", suffix),
Span::call_site(),
);
let body = Stmts(serialize_body(&cont, &params)); let body = Stmts(serialize_body(&cont, &params));
let impl_block = if let Some(remote) = cont.attrs.remote() { let impl_block = if let Some(remote) = cont.attrs.remote() {
@ -61,6 +65,9 @@ pub fn expand_derive_serialize(input: &syn::DeriveInput) -> Result<TokenStream,
let generated = quote! { let generated = quote! {
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications)] #[allow(non_upper_case_globals, unused_attributes, unused_qualifications)]
const #dummy_const: () = { const #dummy_const: () = {
#[allow(unknown_lints)]
#[cfg_attr(feature = "cargo-clippy", allow(useless_attribute))]
#[allow(rust_2018_idioms)]
extern crate serde as _serde; extern crate serde as _serde;
#try_replacement #try_replacement
#impl_block #impl_block
@ -157,7 +164,9 @@ fn build_generics(cont: &Container) -> syn::Generics {
// attribute specify their own bound so we do not generate one. All other fields // attribute specify their own bound so we do not generate one. All other fields
// may need a `T: Serialize` bound where T is the type of the field. // may need a `T: Serialize` bound where T is the type of the field.
fn needs_serialize_bound(field: &attr::Field, variant: Option<&attr::Variant>) -> bool { fn needs_serialize_bound(field: &attr::Field, variant: Option<&attr::Variant>) -> bool {
!field.skip_serializing() && field.serialize_with().is_none() && field.ser_bound().is_none() !field.skip_serializing()
&& field.serialize_with().is_none()
&& field.ser_bound().is_none()
&& variant.map_or(true, |variant| { && variant.map_or(true, |variant| {
!variant.skip_serializing() !variant.skip_serializing()
&& variant.serialize_with().is_none() && variant.serialize_with().is_none()
@ -279,8 +288,7 @@ fn serialize_tuple_struct(
let field_expr = get_member(params, field, &Member::Unnamed(index)); let field_expr = get_member(params, field, &Member::Unnamed(index));
quote!(if #path(#field_expr) { 0 } else { 1 }) quote!(if #path(#field_expr) { 0 } else { 1 })
} }
}) }).fold(quote!(0), |sum, expr| quote!(#sum + #expr));
.fold(quote!(0), |sum, expr| quote!(#sum + #expr));
quote_block! { quote_block! {
let #let_mut __serde_state = try!(_serde::Serializer::serialize_tuple_struct(__serializer, #type_name, #len)); let #let_mut __serde_state = try!(_serde::Serializer::serialize_tuple_struct(__serializer, #type_name, #len));
@ -323,8 +331,7 @@ fn serialize_struct_as_struct(
let field_expr = get_member(params, field, &field.member); let field_expr = get_member(params, field, &field.member);
quote!(if #path(#field_expr) { 0 } else { 1 }) quote!(if #path(#field_expr) { 0 } else { 1 })
} }
}) }).fold(quote!(0), |sum, expr| quote!(#sum + #expr));
.fold(quote!(0), |sum, expr| quote!(#sum + #expr));
quote_block! { quote_block! {
let #let_mut __serde_state = try!(_serde::Serializer::serialize_struct(__serializer, #type_name, #len)); let #let_mut __serde_state = try!(_serde::Serializer::serialize_struct(__serializer, #type_name, #len));
@ -358,8 +365,7 @@ fn serialize_struct_as_map(
let field_expr = get_member(params, field, &field.member); let field_expr = get_member(params, field, &field.member);
quote!(if #path(#field_expr) { 0 } else { 1 }) quote!(if #path(#field_expr) { 0 } else { 1 })
} }
}) }).fold(quote!(0), |sum, expr| quote!(#sum + #expr));
.fold(quote!(0), |sum, expr| quote!(#sum + #expr));
quote!(_serde::export::Some(#len)) quote!(_serde::export::Some(#len))
}; };
@ -380,8 +386,7 @@ fn serialize_enum(params: &Parameters, variants: &[Variant], cattrs: &attr::Cont
.enumerate() .enumerate()
.map(|(variant_index, variant)| { .map(|(variant_index, variant)| {
serialize_variant(params, variant, variant_index as u32, cattrs) serialize_variant(params, variant, variant_index as u32, cattrs)
}) }).collect();
.collect();
quote_expr! { quote_expr! {
match *#self_var { match *#self_var {
@ -785,8 +790,7 @@ fn serialize_tuple_variant(
let field_expr = Ident::new(&format!("__field{}", i), Span::call_site()); let field_expr = Ident::new(&format!("__field{}", i), Span::call_site());
quote!(if #path(#field_expr) { 0 } else { 1 }) quote!(if #path(#field_expr) { 0 } else { 1 })
} }
}) }).fold(quote!(0), |sum, expr| quote!(#sum + #expr));
.fold(quote!(0), |sum, expr| quote!(#sum + #expr));
match context { match context {
TupleVariant::ExternallyTagged { TupleVariant::ExternallyTagged {
@ -863,8 +867,7 @@ fn serialize_struct_variant<'a>(
Some(path) => quote!(if #path(#member) { 0 } else { 1 }), Some(path) => quote!(if #path(#member) { 0 } else { 1 }),
None => quote!(1), None => quote!(1),
} }
}) }).fold(quote!(0), |sum, expr| quote!(#sum + #expr));
.fold(quote!(0), |sum, expr| quote!(#sum + #expr));
match context { match context {
StructVariant::ExternallyTagged { StructVariant::ExternallyTagged {
@ -1043,8 +1046,7 @@ fn serialize_tuple_struct_visitor(
None => ser, None => ser,
Some(skip) => quote!(if !#skip { #ser }), Some(skip) => quote!(if !#skip { #ser }),
} }
}) }).collect()
.collect()
} }
fn serialize_struct_visitor( fn serialize_struct_visitor(
@ -1138,8 +1140,7 @@ fn wrap_serialize_variant_with(
} }
}; };
quote!(#id) quote!(#id)
}) }).collect();
.collect();
wrap_serialize_with( wrap_serialize_with(
params, params,
serialize_with, serialize_with,