deserialize_untagged_variant in that place is called when deserialzie_with attribute is set.
In that case it performs special actions that is better to use explicitly in deserialize_untagged_variant
for readability
Even for a simple data structure that would ordinarily expand to an impl
that only refers to the public Serde traits without serde::__private, we
still disallow a (renamed) serde_core dependency. This leaves the
liberty to new usage of private helpers in such impls over time. For
example, similar to the optimization of the standard library's
derive(Debug) that introduced debug_struct_field1_finish to improve
compile time of derived impls.
In the 2024 edition of Rust, `serde`s macros for `serialize_with` can
lead to a temporary lifetime error such as:
```
error[E0716]: temporary value dropped while borrowed
--> my-binary/src/main.rs:6:10
|
6 | #[derive(MyDerive)]
| ^^^^^^^-
| | |
| | temporary value is freed at the end of this statement
| creates a temporary value which is freed while still in use
| borrow later used by call
| in this derive macro expansion
|
::: /private/tmp/life/my-project/my-macro/src/lib.rs:6:1
|
6 | pub fn my_derive(_input: TokenStream) -> TokenStream {
| ---------------------------------------------------- in this expansion of `#[derive(MyDerive)]`
|
= note: consider using a `let` binding to create a longer lived value
```
This is because the macro code takes a reference to struct inside of a
block, which then goes out of scope when `serde` passes it to a
function.
To resolve this, we move the reference to outside of the block, to
ensure that the lifetime extends into the function call.
Signed-off-by: Andrew V. Teylu <andrew.teylu@vector.com>
warning: lifetime flowing from input to output with different syntax can be confusing
--> serde/src/private/de.rs:266:23
|
266 | fn unexpected(&self) -> Unexpected {
| ^^^^^ ---------- the lifetime gets resolved as `'_`
| |
| this lifetime flows to the output
|
= note: `#[warn(mismatched_lifetime_syntaxes)]` on by default
help: one option is to remove the lifetime for references and use the anonymous lifetime for paths
|
266 | fn unexpected(&self) -> Unexpected<'_> {
| ++++
warning: lifetime flowing from input to output with different syntax can be confusing
--> serde/src/private/mod.rs:27:35
|
27 | pub fn from_utf8_lossy(bytes: &[u8]) -> Cow<str> {
| ^^^^^ -------- the lifetime gets resolved as `'_`
| |
| this lifetime flows to the output
|
help: one option is to remove the lifetime for references and use the anonymous lifetime for paths
|
27 | pub fn from_utf8_lossy(bytes: &[u8]) -> Cow<'_, str> {
| +++
warning: lifetime flowing from input to output with different syntax can be confusing
--> serde_derive/src/internals/attr.rs:612:23
|
612 | pub fn serde_path(&self) -> Cow<syn::Path> {
| ^^^^^ -------------- the lifetime gets resolved as `'_`
| |
| this lifetime flows to the output
|
= note: `#[warn(mismatched_lifetime_syntaxes)]` on by default
help: one option is to remove the lifetime for references and use the anonymous lifetime for paths
|
612 | pub fn serde_path(&self) -> Cow<'_, syn::Path> {
| +++
warning: lifetime flowing from input to output with different syntax can be confusing
--> serde_derive/src/internals/case.rs:45:37
|
45 | pub fn from_str(rename_all_str: &str) -> Result<Self, ParseError> {
| ^^^^ ---------- the lifetime gets resolved as `'_`
| |
| this lifetime flows to the output
|
help: one option is to remove the lifetime for references and use the anonymous lifetime for paths
|
45 | pub fn from_str(rename_all_str: &str) -> Result<Self, ParseError<'_>> {
| ++++
warning: lifetime flowing from input to output with different syntax can be confusing
--> serde_derive/src/de.rs:3228:13
|
3228 | params: &Parameters,
| ^^^^^^^^^^^ this lifetime flows to the output
3229 | ) -> (
3230 | DeImplGenerics,
| -------------- the lifetimes get resolved as `'_`
3231 | DeTypeGenerics,
| -------------- the lifetimes get resolved as `'_`
3232 | syn::TypeGenerics,
| ----------------- the lifetimes get resolved as `'_`
3233 | Option<&syn::WhereClause>,
| ----------------- the lifetimes get resolved as `'_`
|
help: one option is to remove the lifetime for references and use the anonymous lifetime for paths
|
3230 ~ DeImplGenerics<'_>,
3231 ~ DeTypeGenerics<'_>,
3232 ~ syn::TypeGenerics<'_>,
|