Files
GopherGate/target/doc/darling_core/usage/index.html
2026-02-26 12:00:21 -05:00

81 lines
11 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="Traits and types used for tracking the usage of generic parameters through a proc-macro input."><title>darling_core::usage - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="darling_core" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../static.files/storage-e2aeef58.js"></script><script defer src="../sidebar-items.js"></script><script defer src="../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../static.files/favicon-044be391.svg"></head><body class="rustdoc mod"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">Module usage</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../../darling_core/index.html">darling_<wbr>core</a><span class="version">0.20.11</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Module usage</a></h2><h3><a href="#">Sections</a></h3><ul class="block top-toc"><li><a href="#usage" title="Usage">Usage</a><ul><li><a href="#example-1-filtering" title="Example 1: Filtering">Example 1: Filtering</a></li><li><a href="#example-2-integrating-with-fromderiveinput" title="Example 2: Integrating with `FromDeriveInput`">Example 2: Integrating with <code>FromDeriveInput</code></a></li></ul></li></ul><h3><a href="#structs">Module Items</a></h3><ul class="block"><li><a href="#structs" title="Structs">Structs</a></li><li><a href="#enums" title="Enums">Enums</a></li><li><a href="#traits" title="Traits">Traits</a></li><li><a href="#types" title="Type Aliases">Type Aliases</a></li></ul></section><div id="rustdoc-modnav"><h2 class="in-crate"><a href="../index.html">In crate darling_<wbr>core</a></h2></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="../index.html">darling_core</a></div><h1>Module <span>usage</span>&nbsp;<button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../../src/darling_core/usage/mod.rs.html#1-111">Source</a> </span></div><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Traits and types used for tracking the usage of generic parameters through a proc-macro input.</p>
<p>When generating trait impls, libraries often want to automatically figure out which type parameters
are used in which fields, and then emit bounds that will produce the most permissive compilable
code.</p>
<h2 id="usage"><a class="doc-anchor" href="#usage">§</a>Usage</h2><h3 id="example-1-filtering"><a class="doc-anchor" href="#example-1-filtering">§</a>Example 1: Filtering</h3>
<p>This example accepts a proc-macro input, then finds all lifetimes and type parameters used
by private fields.</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">fn </span>process(input: <span class="kw-2">&amp;</span>DeriveInput) -&gt; Generics {
<span class="kw">let </span>type_params = input.generics.declared_type_params();
<span class="kw">let </span>lifetimes = input.generics.declared_lifetimes();
<span class="kw">let </span><span class="kw-2">mut </span>ret_generics = input.generics.clone();
<span class="kw">if let </span>Data::Struct(<span class="kw-2">ref </span>body) = input.data {
<span class="kw">let </span>internal_fields = body
.fields
.iter()
.filter(|field| field.vis == Visibility::Inherited)
.collect::&lt;Vec&lt;<span class="kw">_</span>&gt;&gt;();
<span class="kw">let </span>int_type_params = internal_fields
.collect_type_params(<span class="kw-2">&amp;</span>Purpose::BoundImpl.into(), <span class="kw-2">&amp;</span>type_params);
<span class="comment">// We could reuse the vec from above, but here we'll instead
// directly consume the chained iterator.
</span><span class="kw">let </span>int_lifetimes = body
.fields
.iter()
.filter(|field| field.vis == Visibility::Inherited)
.collect_lifetimes(<span class="kw-2">&amp;</span>Purpose::BoundImpl.into(), <span class="kw-2">&amp;</span>lifetimes);
ret_generics.params = ret_generics
.params
.into_iter()
.filter(|gp| {
<span class="kw">match </span><span class="kw-2">*</span>gp {
GenericParam::Type(<span class="kw-2">ref </span>ty) =&gt; int_type_params.contains(<span class="kw-2">&amp;</span>ty.ident),
GenericParam::Lifetime(<span class="kw-2">ref </span>lt) =&gt; int_lifetimes.contains(<span class="kw-2">&amp;</span>lt.lifetime),
<span class="kw">_ </span>=&gt; <span class="bool-val">true</span>,
}
})
.collect();
}
ret_generics
}
</code></pre></div><h3 id="example-2-integrating-with-fromderiveinput"><a class="doc-anchor" href="#example-2-integrating-with-fromderiveinput">§</a>Example 2: Integrating with <code>FromDeriveInput</code></h3>
<p>It is possible to use <code>darling</code>s magic fields feature in tandem with the <code>usage</code> feature set.
While there is no custom derive for <code>UsesTypeParams</code> or <code>UsesLifetimes</code>, there are macros to
generate impls.</p>
<div class="example-wrap ignore"><a href="#" class="tooltip" title="This example is not tested"></a><pre class="rust rust-example-rendered"><code><span class="attr">#![allow(dead_code)]
#[derive(FromField)]
#[darling(attributes(speak))]
</span><span class="kw">struct </span>SpeakerField {
ident: <span class="prelude-ty">Option</span>&lt;syn::Ident&gt;,
ty: syn::Type,
<span class="attr">#[darling(default)]
</span>volume: <span class="prelude-ty">Option</span>&lt;u32&gt;,
}
<span class="macro">uses_type_params!</span>(SpeakerField, ty);
<span class="macro">uses_lifetimes!</span>(SpeakerField, ty);
<span class="attr">#[derive(FromDeriveInput)]
</span><span class="kw">struct </span>SpeakerOptions {
generics: syn::Generics,
data: darling::ast::Data&lt;darling::util::Ignored, SpeakerField&gt;,
}</code></pre></div>
<p>At this point, you are able to call <code>uses_type_params</code> on <code>SpeakerOptions.data</code>, or any filtered
view of it. <code>darling</code> internally uses this in conjunction with the <code>skip</code> meta-item to determine
which type parameters dont require the <code>FromMeta</code> bound in generated impls.</p>
<p><strong>Note:</strong> If you are performing operations referencing generic params in meta-items parsed by <code>darling</code>,
you should determine if those impact the emitted code and wire up <code>UsesTypeParams</code> accordingly for
your field/variant.</p>
</div></details><h2 id="structs" class="section-header">Structs<a href="#structs" class="anchor">§</a></h2><dl class="item-table"><dt><a class="struct" href="struct.Options.html" title="struct darling_core::usage::Options">Options</a></dt><dd>Control struct for searching type parameters.</dd></dl><h2 id="enums" class="section-header">Enums<a href="#enums" class="anchor">§</a></h2><dl class="item-table"><dt><a class="enum" href="enum.Purpose.html" title="enum darling_core::usage::Purpose">Purpose</a></dt><dd>The goal of tracing generic parameter usage.</dd></dl><h2 id="traits" class="section-header">Traits<a href="#traits" class="anchor">§</a></h2><dl class="item-table"><dt><a class="trait" href="trait.CollectLifetimes.html" title="trait darling_core::usage::CollectLifetimes">Collect<wbr>Lifetimes</a></dt><dd>Searcher for finding lifetimes in an iterator.</dd><dt><a class="trait" href="trait.CollectTypeParams.html" title="trait darling_core::usage::CollectTypeParams">Collect<wbr>Type<wbr>Params</a></dt><dd>Searcher for finding type params in an iterator.</dd><dt><a class="trait" href="trait.GenericsExt.html" title="trait darling_core::usage::GenericsExt">Generics<wbr>Ext</a></dt><dd>Extension trait for pulling specific generics data from a generics AST representation.</dd><dt><a class="trait" href="trait.UsesLifetimes.html" title="trait darling_core::usage::UsesLifetimes">Uses<wbr>Lifetimes</a></dt><dd>Searcher for finding lifetimes in a syntax tree.
This can be used to determine which lifetimes must be emitted in generated code.</dd><dt><a class="trait" href="trait.UsesTypeParams.html" title="trait darling_core::usage::UsesTypeParams">Uses<wbr>Type<wbr>Params</a></dt><dd>Searcher for finding type params in a syntax tree.
This can be used to determine if a given type parameter needs to be bounded in a generated impl.</dd></dl><h2 id="types" class="section-header">Type Aliases<a href="#types" class="anchor">§</a></h2><dl class="item-table"><dt><a class="type" href="type.IdentRefSet.html" title="type darling_core::usage::IdentRefSet">Ident<wbr>RefSet</a></dt><dd>A set of references to idents.</dd><dt><a class="type" href="type.IdentSet.html" title="type darling_core::usage::IdentSet">Ident<wbr>Set</a></dt><dd>A set of idents.</dd><dt><a class="type" href="type.LifetimeRefSet.html" title="type darling_core::usage::LifetimeRefSet">Lifetime<wbr>RefSet</a></dt><dd>A set of references to lifetimes.</dd><dt><a class="type" href="type.LifetimeSet.html" title="type darling_core::usage::LifetimeSet">Lifetime<wbr>Set</a></dt><dd>A set of lifetimes.</dd></dl></section></div></main></body></html>