Files
google-apis-rs/serde_with/macro.with_prefix.html
2024-03-05 21:06:01 +01:00

77 lines
7.8 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Serialize with an added prefix on every field name and deserialize by trimming away the prefix."><title>with_prefix in serde_with - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/FiraSans-Regular-018c141bf0843ffd.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/FiraSans-Medium-8f9a781e4970d388.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/SourceCodePro-Semibold-d899c5a5c4aeb14a.ttf.woff2"><link rel="stylesheet" href="../static.files/normalize-76eba96aa4d2e634.css"><link rel="stylesheet" href="../static.files/rustdoc-ac92e1bbe349e143.css"><meta name="rustdoc-vars" data-root-path="../" data-static-root-path="../static.files/" data-current-crate="serde_with" data-themes="" data-resource-suffix="" data-rustdoc-version="1.76.0 (07dca489a 2024-02-04)" data-channel="1.76.0" data-search-js="search-2b6ce74ff89ae146.js" data-settings-js="settings-4313503d2e1961c2.js" ><script src="../static.files/storage-f2adc0d6ca4d09fb.js"></script><script defer src="sidebar-items.js"></script><script defer src="../static.files/main-305769736d49e732.js"></script><noscript><link rel="stylesheet" href="../static.files/noscript-feafe1bb7466e4bd.css"></noscript><link rel="alternate icon" type="image/png" href="../static.files/favicon-16x16-8b506e7a72182f1c.png"><link rel="alternate icon" type="image/png" href="../static.files/favicon-32x32-422f7d1d52889060.png"><link rel="icon" type="image/svg+xml" href="../static.files/favicon-2c020d218678b618.svg"></head><body class="rustdoc macro"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle">&#9776;</button></nav><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../serde_with/index.html">serde_with</a><span class="version">2.3.3</span></h2></div><div class="sidebar-elems"></div></nav><div class="sidebar-resizer"></div>
<main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../serde_with/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../help.html" title="help">?</a></div><div id="settings-menu" tabindex="-1"><a href="../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../static.files/wheel-7b819b6101059cd0.svg"></a></div></form></nav><section id="main-content" class="content"><div class="main-heading"><h1>Macro <a href="index.html">serde_with</a>::<wbr><a class="macro" href="#">with_prefix</a><button id="copy-path" title="Copy item path to clipboard"><img src="../static.files/clipboard-7571035ce49a181d.svg" width="19" height="18" alt="Copy item path"></button></h1><span class="out-of-band"><a class="src" href="../src/serde_with/with_prefix.rs.html#104-136">source</a> · <button id="toggle-all-docs" title="collapse all docs">[<span>&#x2212;</span>]</button></span></div><pre class="rust item-decl"><span class="macro">macro_rules! </span>with_prefix {
(<span class="macro-nonterminal">$module</span>:ident <span class="macro-nonterminal">$prefix</span>:expr) =&gt; { ... };
(<span class="macro-nonterminal">$vis</span>:vis <span class="macro-nonterminal">$module</span>:ident <span class="macro-nonterminal">$prefix</span>:expr) =&gt; { ... };
}</pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Serialize with an added prefix on every field name and deserialize by
trimming away the prefix.</p>
<p>You can set the visibility of the generated module by prefixing the module name with a module visibility.
<code>with_prefix!(pub(crate) prefix_foo &quot;foo_&quot;);</code> creates a module with <code>pub(crate)</code> visibility.
The visibility is optional and by default <code>pub(self)</code>, i.e., private visibility is assumed.</p>
<p><strong>Note:</strong> Use of this macro is incompatible with applying the <a href="https://serde.rs/container-attrs.html#deny_unknown_fields"><code>deny_unknown_fields</code></a> attribute
on the container.
While deserializing, it will always warn about unknown fields, even though they are processed
by the <code>with_prefix</code> wrapper.
More details can be found in <a href="https://github.com/jonasbb/serde_with/issues/57">this issue</a>.</p>
<h2 id="example"><a href="#example">Example</a></h2>
<p>The <a href="https://api.challonge.com/v1/documents/matches/show">Challonge REST API</a> likes to use prefixes to group related fields. In
simplified form, their JSON may resemble the following:</p>
<div class="example-wrap"><pre class="language-json"><code>{
&quot;player1_name&quot;: &quot;name1&quot;,
&quot;player1_votes&quot;: 1,
&quot;player2_name&quot;: &quot;name2&quot;,
&quot;player2_votes&quot;: 2
}
</code></pre></div>
<p>In Rust, we would ideally like to model this data as a pair of <code>Player</code>
structs, rather than repeating the fields of <code>Player</code> for each prefix.</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">struct </span>Match {
player1: Player,
player2: Player,
}
<span class="kw">struct </span>Player {
name: String,
votes: u64,
}</code></pre></div>
<p>This <code>with_prefix!</code> macro produces an adapter that adds a prefix onto field
names during serialization and trims away the prefix during deserialization.
An implementation of the Challonge API would use <code>with_prefix!</code> like this:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>serde::{Deserialize, Serialize};
<span class="kw">use </span>serde_with::with_prefix;
<span class="attr">#[derive(Serialize, Deserialize)]
</span><span class="kw">struct </span>Match {
<span class="attr">#[serde(flatten, with = <span class="string">"prefix_player1"</span>)]
</span>player1: Player,
<span class="attr">#[serde(flatten, with = <span class="string">"prefix_player2"</span>)]
</span>player2: Player,
}
<span class="attr">#[derive(Serialize, Deserialize)]
</span><span class="kw">struct </span>Player {
name: String,
votes: u64,
}
<span class="macro">with_prefix!</span>(prefix_player1 <span class="string">"player1_"</span>);
<span class="comment">// You can also set the visibility of the generated prefix module, the default is private.
</span><span class="macro">with_prefix!</span>(<span class="kw">pub </span>prefix_player2 <span class="string">"player2_"</span>);
<span class="kw">fn </span>main() {
<span class="kw">let </span>m = Match {
player1: Player {
name: <span class="string">"name1"</span>.to_owned(),
votes: <span class="number">1</span>,
},
player2: Player {
name: <span class="string">"name2"</span>.to_owned(),
votes: <span class="number">2</span>,
},
};
<span class="kw">let </span>j = serde_json::to_string_pretty(<span class="kw-2">&amp;</span>m).unwrap();
<span class="macro">println!</span>(<span class="string">"{}"</span>, j);
}</code></pre></div>
</div></details></section></div></main></body></html>