1
0
mirror of https://github.com/actix/actix-website synced 2025-02-02 20:29:03 +01:00
2018-07-26 10:53:41 -07:00

611 lines
44 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="Source to the Rust file `src/param.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>param.rs.html -- source</title><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../dark.css"><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><script src="../../storage.js"></script></head><body class="rustdoc source"><!--[if lte IE 8]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu">&#9776;</div></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!"><img src="../../brush.svg" width="18" alt="Pick another theme!"></button><div id="theme-choices"></div></div><script src="../../theme.js"></script><nav class="sub"><form class="search-form js-only"><div class="search-container"><input class="search-input" name="search" autocomplete="off" placeholder="Click or press S to search, ? for more options…" type="search"><a id="settings-menu" href="../../settings.html"><img src="../../wheel.svg" width="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><pre class="line-numbers"><span id="1"> 1</span>
<span id="2"> 2</span>
<span id="3"> 3</span>
<span id="4"> 4</span>
<span id="5"> 5</span>
<span id="6"> 6</span>
<span id="7"> 7</span>
<span id="8"> 8</span>
<span id="9"> 9</span>
<span id="10"> 10</span>
<span id="11"> 11</span>
<span id="12"> 12</span>
<span id="13"> 13</span>
<span id="14"> 14</span>
<span id="15"> 15</span>
<span id="16"> 16</span>
<span id="17"> 17</span>
<span id="18"> 18</span>
<span id="19"> 19</span>
<span id="20"> 20</span>
<span id="21"> 21</span>
<span id="22"> 22</span>
<span id="23"> 23</span>
<span id="24"> 24</span>
<span id="25"> 25</span>
<span id="26"> 26</span>
<span id="27"> 27</span>
<span id="28"> 28</span>
<span id="29"> 29</span>
<span id="30"> 30</span>
<span id="31"> 31</span>
<span id="32"> 32</span>
<span id="33"> 33</span>
<span id="34"> 34</span>
<span id="35"> 35</span>
<span id="36"> 36</span>
<span id="37"> 37</span>
<span id="38"> 38</span>
<span id="39"> 39</span>
<span id="40"> 40</span>
<span id="41"> 41</span>
<span id="42"> 42</span>
<span id="43"> 43</span>
<span id="44"> 44</span>
<span id="45"> 45</span>
<span id="46"> 46</span>
<span id="47"> 47</span>
<span id="48"> 48</span>
<span id="49"> 49</span>
<span id="50"> 50</span>
<span id="51"> 51</span>
<span id="52"> 52</span>
<span id="53"> 53</span>
<span id="54"> 54</span>
<span id="55"> 55</span>
<span id="56"> 56</span>
<span id="57"> 57</span>
<span id="58"> 58</span>
<span id="59"> 59</span>
<span id="60"> 60</span>
<span id="61"> 61</span>
<span id="62"> 62</span>
<span id="63"> 63</span>
<span id="64"> 64</span>
<span id="65"> 65</span>
<span id="66"> 66</span>
<span id="67"> 67</span>
<span id="68"> 68</span>
<span id="69"> 69</span>
<span id="70"> 70</span>
<span id="71"> 71</span>
<span id="72"> 72</span>
<span id="73"> 73</span>
<span id="74"> 74</span>
<span id="75"> 75</span>
<span id="76"> 76</span>
<span id="77"> 77</span>
<span id="78"> 78</span>
<span id="79"> 79</span>
<span id="80"> 80</span>
<span id="81"> 81</span>
<span id="82"> 82</span>
<span id="83"> 83</span>
<span id="84"> 84</span>
<span id="85"> 85</span>
<span id="86"> 86</span>
<span id="87"> 87</span>
<span id="88"> 88</span>
<span id="89"> 89</span>
<span id="90"> 90</span>
<span id="91"> 91</span>
<span id="92"> 92</span>
<span id="93"> 93</span>
<span id="94"> 94</span>
<span id="95"> 95</span>
<span id="96"> 96</span>
<span id="97"> 97</span>
<span id="98"> 98</span>
<span id="99"> 99</span>
<span id="100">100</span>
<span id="101">101</span>
<span id="102">102</span>
<span id="103">103</span>
<span id="104">104</span>
<span id="105">105</span>
<span id="106">106</span>
<span id="107">107</span>
<span id="108">108</span>
<span id="109">109</span>
<span id="110">110</span>
<span id="111">111</span>
<span id="112">112</span>
<span id="113">113</span>
<span id="114">114</span>
<span id="115">115</span>
<span id="116">116</span>
<span id="117">117</span>
<span id="118">118</span>
<span id="119">119</span>
<span id="120">120</span>
<span id="121">121</span>
<span id="122">122</span>
<span id="123">123</span>
<span id="124">124</span>
<span id="125">125</span>
<span id="126">126</span>
<span id="127">127</span>
<span id="128">128</span>
<span id="129">129</span>
<span id="130">130</span>
<span id="131">131</span>
<span id="132">132</span>
<span id="133">133</span>
<span id="134">134</span>
<span id="135">135</span>
<span id="136">136</span>
<span id="137">137</span>
<span id="138">138</span>
<span id="139">139</span>
<span id="140">140</span>
<span id="141">141</span>
<span id="142">142</span>
<span id="143">143</span>
<span id="144">144</span>
<span id="145">145</span>
<span id="146">146</span>
<span id="147">147</span>
<span id="148">148</span>
<span id="149">149</span>
<span id="150">150</span>
<span id="151">151</span>
<span id="152">152</span>
<span id="153">153</span>
<span id="154">154</span>
<span id="155">155</span>
<span id="156">156</span>
<span id="157">157</span>
<span id="158">158</span>
<span id="159">159</span>
<span id="160">160</span>
<span id="161">161</span>
<span id="162">162</span>
<span id="163">163</span>
<span id="164">164</span>
<span id="165">165</span>
<span id="166">166</span>
<span id="167">167</span>
<span id="168">168</span>
<span id="169">169</span>
<span id="170">170</span>
<span id="171">171</span>
<span id="172">172</span>
<span id="173">173</span>
<span id="174">174</span>
<span id="175">175</span>
<span id="176">176</span>
<span id="177">177</span>
<span id="178">178</span>
<span id="179">179</span>
<span id="180">180</span>
<span id="181">181</span>
<span id="182">182</span>
<span id="183">183</span>
<span id="184">184</span>
<span id="185">185</span>
<span id="186">186</span>
<span id="187">187</span>
<span id="188">188</span>
<span id="189">189</span>
<span id="190">190</span>
<span id="191">191</span>
<span id="192">192</span>
<span id="193">193</span>
<span id="194">194</span>
<span id="195">195</span>
<span id="196">196</span>
<span id="197">197</span>
<span id="198">198</span>
<span id="199">199</span>
<span id="200">200</span>
<span id="201">201</span>
<span id="202">202</span>
<span id="203">203</span>
<span id="204">204</span>
<span id="205">205</span>
<span id="206">206</span>
<span id="207">207</span>
<span id="208">208</span>
<span id="209">209</span>
<span id="210">210</span>
<span id="211">211</span>
<span id="212">212</span>
<span id="213">213</span>
<span id="214">214</span>
<span id="215">215</span>
<span id="216">216</span>
<span id="217">217</span>
<span id="218">218</span>
<span id="219">219</span>
<span id="220">220</span>
<span id="221">221</span>
<span id="222">222</span>
<span id="223">223</span>
<span id="224">224</span>
<span id="225">225</span>
<span id="226">226</span>
<span id="227">227</span>
<span id="228">228</span>
<span id="229">229</span>
<span id="230">230</span>
<span id="231">231</span>
<span id="232">232</span>
<span id="233">233</span>
<span id="234">234</span>
<span id="235">235</span>
<span id="236">236</span>
<span id="237">237</span>
<span id="238">238</span>
<span id="239">239</span>
<span id="240">240</span>
<span id="241">241</span>
<span id="242">242</span>
<span id="243">243</span>
<span id="244">244</span>
<span id="245">245</span>
<span id="246">246</span>
<span id="247">247</span>
<span id="248">248</span>
<span id="249">249</span>
<span id="250">250</span>
<span id="251">251</span>
<span id="252">252</span>
<span id="253">253</span>
<span id="254">254</span>
<span id="255">255</span>
<span id="256">256</span>
<span id="257">257</span>
<span id="258">258</span>
<span id="259">259</span>
<span id="260">260</span>
<span id="261">261</span>
<span id="262">262</span>
<span id="263">263</span>
<span id="264">264</span>
<span id="265">265</span>
<span id="266">266</span>
<span id="267">267</span>
<span id="268">268</span>
<span id="269">269</span>
<span id="270">270</span>
<span id="271">271</span>
<span id="272">272</span>
<span id="273">273</span>
<span id="274">274</span>
<span id="275">275</span>
<span id="276">276</span>
<span id="277">277</span>
<span id="278">278</span>
<span id="279">279</span>
<span id="280">280</span>
<span id="281">281</span>
<span id="282">282</span>
<span id="283">283</span>
<span id="284">284</span>
<span id="285">285</span>
<span id="286">286</span>
<span id="287">287</span>
<span id="288">288</span>
<span id="289">289</span>
<span id="290">290</span>
<span id="291">291</span>
<span id="292">292</span>
<span id="293">293</span>
<span id="294">294</span>
<span id="295">295</span>
<span id="296">296</span>
<span id="297">297</span>
<span id="298">298</span>
<span id="299">299</span>
<span id="300">300</span>
<span id="301">301</span>
<span id="302">302</span>
<span id="303">303</span>
<span id="304">304</span>
</pre><pre class="rust ">
<span class="kw">use</span> <span class="ident">std</span>;
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">ops</span>::<span class="ident">Index</span>;
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">path</span>::<span class="ident">PathBuf</span>;
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">rc</span>::<span class="ident">Rc</span>;
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">str</span>::<span class="ident">FromStr</span>;
<span class="kw">use</span> <span class="ident">http</span>::<span class="ident">StatusCode</span>;
<span class="kw">use</span> <span class="ident">smallvec</span>::<span class="ident">SmallVec</span>;
<span class="kw">use</span> <span class="ident">error</span>::{<span class="ident">InternalError</span>, <span class="ident">ResponseError</span>, <span class="ident">UriSegmentError</span>};
<span class="kw">use</span> <span class="ident">uri</span>::<span class="ident">Url</span>;
<span class="doccomment">/// A trait to abstract the idea of creating a new instance of a type from a</span>
<span class="doccomment">/// path parameter.</span>
<span class="kw">pub</span> <span class="kw">trait</span> <span class="ident">FromParam</span>: <span class="ident">Sized</span> {
<span class="doccomment">/// The associated error which can be returned from parsing.</span>
<span class="kw">type</span> <span class="prelude-val">Err</span>: <span class="ident">ResponseError</span>;
<span class="doccomment">/// Parses a string `s` to return a value of this type.</span>
<span class="kw">fn</span> <span class="ident">from_param</span>(<span class="ident">s</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>) <span class="op">-&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="self">Self</span>, <span class="self">Self</span>::<span class="prelude-val">Err</span><span class="op">&gt;</span>;
}
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Debug</span>, <span class="ident">Clone</span>)]</span>
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">enum</span> <span class="ident">ParamItem</span> {
<span class="ident">Static</span>(<span class="kw-2">&amp;</span><span class="lifetime">&#39;static</span> <span class="ident">str</span>),
<span class="ident">UrlSegment</span>(<span class="ident">u16</span>, <span class="ident">u16</span>),
}
<span class="doccomment">/// Route match information</span>
<span class="doccomment">///</span>
<span class="doccomment">/// If resource path contains variable patterns, `Params` stores this variables.</span>
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Debug</span>, <span class="ident">Clone</span>)]</span>
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">Params</span> {
<span class="ident">url</span>: <span class="ident">Url</span>,
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="ident">tail</span>: <span class="ident">u16</span>,
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="ident">segments</span>: <span class="ident">SmallVec</span><span class="op">&lt;</span>[(<span class="ident">Rc</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span>, <span class="ident">ParamItem</span>); <span class="number">3</span>]<span class="op">&gt;</span>,
}
<span class="kw">impl</span> <span class="ident">Params</span> {
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">new</span>() <span class="op">-&gt;</span> <span class="ident">Params</span> {
<span class="ident">Params</span> {
<span class="ident">url</span>: <span class="ident">Url</span>::<span class="ident">default</span>(),
<span class="ident">tail</span>: <span class="number">0</span>,
<span class="ident">segments</span>: <span class="ident">SmallVec</span>::<span class="ident">new</span>(),
}
}
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">with_url</span>(<span class="ident">url</span>: <span class="kw-2">&amp;</span><span class="ident">Url</span>) <span class="op">-&gt;</span> <span class="ident">Params</span> {
<span class="ident">Params</span> {
<span class="ident">url</span>: <span class="ident">url</span>.<span class="ident">clone</span>(),
<span class="ident">tail</span>: <span class="number">0</span>,
<span class="ident">segments</span>: <span class="ident">SmallVec</span>::<span class="ident">new</span>(),
}
}
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">clear</span>(<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="self">self</span>) {
<span class="self">self</span>.<span class="ident">segments</span>.<span class="ident">clear</span>();
}
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">set_tail</span>(<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">tail</span>: <span class="ident">u16</span>) {
<span class="self">self</span>.<span class="ident">tail</span> <span class="op">=</span> <span class="ident">tail</span>;
}
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">set_url</span>(<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">url</span>: <span class="ident">Url</span>) {
<span class="self">self</span>.<span class="ident">url</span> <span class="op">=</span> <span class="ident">url</span>;
}
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">add</span>(<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">name</span>: <span class="ident">Rc</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span>, <span class="ident">value</span>: <span class="ident">ParamItem</span>) {
<span class="self">self</span>.<span class="ident">segments</span>.<span class="ident">push</span>((<span class="ident">name</span>, <span class="ident">value</span>));
}
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">add_static</span>(<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">name</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>, <span class="ident">value</span>: <span class="kw-2">&amp;</span><span class="lifetime">&#39;static</span> <span class="ident">str</span>) {
<span class="self">self</span>.<span class="ident">segments</span>
.<span class="ident">push</span>((<span class="ident">Rc</span>::<span class="ident">new</span>(<span class="ident">name</span>.<span class="ident">to_string</span>()), <span class="ident">ParamItem</span>::<span class="ident">Static</span>(<span class="ident">value</span>)));
}
<span class="doccomment">/// Check if there are any matched patterns</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">is_empty</span>(<span class="kw-2">&amp;</span><span class="self">self</span>) <span class="op">-&gt;</span> <span class="ident">bool</span> {
<span class="self">self</span>.<span class="ident">segments</span>.<span class="ident">is_empty</span>()
}
<span class="doccomment">/// Check number of extracted parameters</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">len</span>(<span class="kw-2">&amp;</span><span class="self">self</span>) <span class="op">-&gt;</span> <span class="ident">usize</span> {
<span class="self">self</span>.<span class="ident">segments</span>.<span class="ident">len</span>()
}
<span class="doccomment">/// Get matched parameter by name without type conversion</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">get</span>(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="ident">key</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>) <span class="op">-&gt;</span> <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="kw-2">&amp;</span><span class="ident">str</span><span class="op">&gt;</span> {
<span class="kw">for</span> <span class="ident">item</span> <span class="kw">in</span> <span class="self">self</span>.<span class="ident">segments</span>.<span class="ident">iter</span>() {
<span class="kw">if</span> <span class="ident">key</span> <span class="op">==</span> <span class="ident">item</span>.<span class="number">0</span>.<span class="ident">as_str</span>() {
<span class="kw">return</span> <span class="kw">match</span> <span class="ident">item</span>.<span class="number">1</span> {
<span class="ident">ParamItem</span>::<span class="ident">Static</span>(<span class="kw-2">ref</span> <span class="ident">s</span>) <span class="op">=&gt;</span> <span class="prelude-val">Some</span>(<span class="kw-2">&amp;</span><span class="ident">s</span>),
<span class="ident">ParamItem</span>::<span class="ident">UrlSegment</span>(<span class="ident">s</span>, <span class="ident">e</span>) <span class="op">=&gt;</span> {
<span class="prelude-val">Some</span>(<span class="kw-2">&amp;</span><span class="self">self</span>.<span class="ident">url</span>.<span class="ident">path</span>()[(<span class="ident">s</span> <span class="kw">as</span> <span class="ident">usize</span>)..(<span class="ident">e</span> <span class="kw">as</span> <span class="ident">usize</span>)])
}
};
}
}
<span class="kw">if</span> <span class="ident">key</span> <span class="op">==</span> <span class="string">&quot;tail&quot;</span> {
<span class="prelude-val">Some</span>(<span class="kw-2">&amp;</span><span class="self">self</span>.<span class="ident">url</span>.<span class="ident">path</span>()[(<span class="self">self</span>.<span class="ident">tail</span> <span class="kw">as</span> <span class="ident">usize</span>)..])
} <span class="kw">else</span> {
<span class="prelude-val">None</span>
}
}
<span class="doccomment">/// Get unprocessed part of path</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">unprocessed</span>(<span class="kw-2">&amp;</span><span class="self">self</span>) <span class="op">-&gt;</span> <span class="kw-2">&amp;</span><span class="ident">str</span> {
<span class="kw-2">&amp;</span><span class="self">self</span>.<span class="ident">url</span>.<span class="ident">path</span>()[(<span class="self">self</span>.<span class="ident">tail</span> <span class="kw">as</span> <span class="ident">usize</span>)..]
}
<span class="doccomment">/// Get matched `FromParam` compatible parameter by name.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// If keyed parameter is not available empty string is used as default</span>
<span class="doccomment">/// value.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// ```rust</span>
<span class="doccomment">/// # extern crate actix_web;</span>
<span class="doccomment">/// # use actix_web::*;</span>
<span class="doccomment">/// fn index(req: HttpRequest) -&gt; Result&lt;String&gt; {</span>
<span class="doccomment">/// let ivalue: isize = req.match_info().query(&quot;val&quot;)?;</span>
<span class="doccomment">/// Ok(format!(&quot;isuze value: {:?}&quot;, ivalue))</span>
<span class="doccomment">/// }</span>
<span class="doccomment">/// # fn main() {}</span>
<span class="doccomment">/// ```</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">query</span><span class="op">&lt;</span><span class="ident">T</span>: <span class="ident">FromParam</span><span class="op">&gt;</span>(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="ident">key</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>) <span class="op">-&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">T</span>, <span class="op">&lt;</span><span class="ident">T</span> <span class="kw">as</span> <span class="ident">FromParam</span><span class="op">&gt;</span>::<span class="prelude-val">Err</span><span class="op">&gt;</span> {
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">s</span>) <span class="op">=</span> <span class="self">self</span>.<span class="ident">get</span>(<span class="ident">key</span>) {
<span class="ident">T</span>::<span class="ident">from_param</span>(<span class="ident">s</span>)
} <span class="kw">else</span> {
<span class="ident">T</span>::<span class="ident">from_param</span>(<span class="string">&quot;&quot;</span>)
}
}
<span class="doccomment">/// Return iterator to items in parameter container</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">iter</span>(<span class="kw-2">&amp;</span><span class="self">self</span>) <span class="op">-&gt;</span> <span class="ident">ParamsIter</span> {
<span class="ident">ParamsIter</span> {
<span class="ident">idx</span>: <span class="number">0</span>,
<span class="ident">params</span>: <span class="self">self</span>,
}
}
}
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Debug</span>)]</span>
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">ParamsIter</span><span class="op">&lt;</span><span class="lifetime">&#39;a</span><span class="op">&gt;</span> {
<span class="ident">idx</span>: <span class="ident">usize</span>,
<span class="ident">params</span>: <span class="kw-2">&amp;</span><span class="lifetime">&#39;a</span> <span class="ident">Params</span>,
}
<span class="kw">impl</span><span class="op">&lt;</span><span class="lifetime">&#39;a</span><span class="op">&gt;</span> <span class="ident">Iterator</span> <span class="kw">for</span> <span class="ident">ParamsIter</span><span class="op">&lt;</span><span class="lifetime">&#39;a</span><span class="op">&gt;</span> {
<span class="kw">type</span> <span class="ident">Item</span> <span class="op">=</span> (<span class="kw-2">&amp;</span><span class="lifetime">&#39;a</span> <span class="ident">str</span>, <span class="kw-2">&amp;</span><span class="lifetime">&#39;a</span> <span class="ident">str</span>);
<span class="attribute">#[<span class="ident">inline</span>]</span>
<span class="kw">fn</span> <span class="ident">next</span>(<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="self">self</span>) <span class="op">-&gt;</span> <span class="prelude-ty">Option</span><span class="op">&lt;</span>(<span class="kw-2">&amp;</span><span class="lifetime">&#39;a</span> <span class="ident">str</span>, <span class="kw-2">&amp;</span><span class="lifetime">&#39;a</span> <span class="ident">str</span>)<span class="op">&gt;</span> {
<span class="kw">if</span> <span class="self">self</span>.<span class="ident">idx</span> <span class="op">&lt;</span> <span class="self">self</span>.<span class="ident">params</span>.<span class="ident">len</span>() {
<span class="kw">let</span> <span class="ident">idx</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">idx</span>;
<span class="kw">let</span> <span class="ident">res</span> <span class="op">=</span> <span class="kw">match</span> <span class="self">self</span>.<span class="ident">params</span>.<span class="ident">segments</span>[<span class="ident">idx</span>].<span class="number">1</span> {
<span class="ident">ParamItem</span>::<span class="ident">Static</span>(<span class="kw-2">ref</span> <span class="ident">s</span>) <span class="op">=&gt;</span> <span class="kw-2">&amp;</span><span class="ident">s</span>,
<span class="ident">ParamItem</span>::<span class="ident">UrlSegment</span>(<span class="ident">s</span>, <span class="ident">e</span>) <span class="op">=&gt;</span> {
<span class="kw-2">&amp;</span><span class="self">self</span>.<span class="ident">params</span>.<span class="ident">url</span>.<span class="ident">path</span>()[(<span class="ident">s</span> <span class="kw">as</span> <span class="ident">usize</span>)..(<span class="ident">e</span> <span class="kw">as</span> <span class="ident">usize</span>)]
}
};
<span class="self">self</span>.<span class="ident">idx</span> <span class="op">+=</span> <span class="number">1</span>;
<span class="kw">return</span> <span class="prelude-val">Some</span>((<span class="kw-2">&amp;</span><span class="self">self</span>.<span class="ident">params</span>.<span class="ident">segments</span>[<span class="ident">idx</span>].<span class="number">0</span>, <span class="ident">res</span>));
}
<span class="prelude-val">None</span>
}
}
<span class="kw">impl</span><span class="op">&lt;</span><span class="lifetime">&#39;a</span><span class="op">&gt;</span> <span class="ident">Index</span><span class="op">&lt;</span><span class="kw-2">&amp;</span><span class="lifetime">&#39;a</span> <span class="ident">str</span><span class="op">&gt;</span> <span class="kw">for</span> <span class="ident">Params</span> {
<span class="kw">type</span> <span class="ident">Output</span> <span class="op">=</span> <span class="ident">str</span>;
<span class="kw">fn</span> <span class="ident">index</span>(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="ident">name</span>: <span class="kw-2">&amp;</span><span class="lifetime">&#39;a</span> <span class="ident">str</span>) <span class="op">-&gt;</span> <span class="kw-2">&amp;</span><span class="ident">str</span> {
<span class="self">self</span>.<span class="ident">get</span>(<span class="ident">name</span>)
.<span class="ident">expect</span>(<span class="string">&quot;Value for parameter is not available&quot;</span>)
}
}
<span class="kw">impl</span> <span class="ident">Index</span><span class="op">&lt;</span><span class="ident">usize</span><span class="op">&gt;</span> <span class="kw">for</span> <span class="ident">Params</span> {
<span class="kw">type</span> <span class="ident">Output</span> <span class="op">=</span> <span class="ident">str</span>;
<span class="kw">fn</span> <span class="ident">index</span>(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="ident">idx</span>: <span class="ident">usize</span>) <span class="op">-&gt;</span> <span class="kw-2">&amp;</span><span class="ident">str</span> {
<span class="kw">match</span> <span class="self">self</span>.<span class="ident">segments</span>[<span class="ident">idx</span>].<span class="number">1</span> {
<span class="ident">ParamItem</span>::<span class="ident">Static</span>(<span class="kw-2">ref</span> <span class="ident">s</span>) <span class="op">=&gt;</span> <span class="kw-2">&amp;</span><span class="ident">s</span>,
<span class="ident">ParamItem</span>::<span class="ident">UrlSegment</span>(<span class="ident">s</span>, <span class="ident">e</span>) <span class="op">=&gt;</span> <span class="kw-2">&amp;</span><span class="self">self</span>.<span class="ident">url</span>.<span class="ident">path</span>()[(<span class="ident">s</span> <span class="kw">as</span> <span class="ident">usize</span>)..(<span class="ident">e</span> <span class="kw">as</span> <span class="ident">usize</span>)],
}
}
}
<span class="doccomment">/// Creates a `PathBuf` from a path parameter. The returned `PathBuf` is</span>
<span class="doccomment">/// percent-decoded. If a segment is equal to &quot;..&quot;, the previous segment (if</span>
<span class="doccomment">/// any) is skipped.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// For security purposes, if a segment meets any of the following conditions,</span>
<span class="doccomment">/// an `Err` is returned indicating the condition met:</span>
<span class="doccomment">///</span>
<span class="doccomment">/// * Decoded segment starts with any of: `.` (except `..`), `*`</span>
<span class="doccomment">/// * Decoded segment ends with any of: `:`, `&gt;`, `&lt;`</span>
<span class="doccomment">/// * Decoded segment contains any of: `/`</span>
<span class="doccomment">/// * On Windows, decoded segment contains any of: &#39;\&#39;</span>
<span class="doccomment">/// * Percent-encoding results in invalid UTF8.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// As a result of these conditions, a `PathBuf` parsed from request path</span>
<span class="doccomment">/// parameter is safe to interpolate within, or use as a suffix of, a path</span>
<span class="doccomment">/// without additional checks.</span>
<span class="kw">impl</span> <span class="ident">FromParam</span> <span class="kw">for</span> <span class="ident">PathBuf</span> {
<span class="kw">type</span> <span class="prelude-val">Err</span> <span class="op">=</span> <span class="ident">UriSegmentError</span>;
<span class="kw">fn</span> <span class="ident">from_param</span>(<span class="ident">val</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>) <span class="op">-&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">PathBuf</span>, <span class="ident">UriSegmentError</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">buf</span> <span class="op">=</span> <span class="ident">PathBuf</span>::<span class="ident">new</span>();
<span class="kw">for</span> <span class="ident">segment</span> <span class="kw">in</span> <span class="ident">val</span>.<span class="ident">split</span>(<span class="string">&#39;/&#39;</span>) {
<span class="kw">if</span> <span class="ident">segment</span> <span class="op">==</span> <span class="string">&quot;..&quot;</span> {
<span class="ident">buf</span>.<span class="ident">pop</span>();
} <span class="kw">else</span> <span class="kw">if</span> <span class="ident">segment</span>.<span class="ident">starts_with</span>(<span class="string">&#39;.&#39;</span>) {
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">UriSegmentError</span>::<span class="ident">BadStart</span>(<span class="string">&#39;.&#39;</span>));
} <span class="kw">else</span> <span class="kw">if</span> <span class="ident">segment</span>.<span class="ident">starts_with</span>(<span class="string">&#39;*&#39;</span>) {
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">UriSegmentError</span>::<span class="ident">BadStart</span>(<span class="string">&#39;*&#39;</span>));
} <span class="kw">else</span> <span class="kw">if</span> <span class="ident">segment</span>.<span class="ident">ends_with</span>(<span class="string">&#39;:&#39;</span>) {
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">UriSegmentError</span>::<span class="ident">BadEnd</span>(<span class="string">&#39;:&#39;</span>));
} <span class="kw">else</span> <span class="kw">if</span> <span class="ident">segment</span>.<span class="ident">ends_with</span>(<span class="string">&#39;&gt;&#39;</span>) {
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">UriSegmentError</span>::<span class="ident">BadEnd</span>(<span class="string">&#39;&gt;&#39;</span>));
} <span class="kw">else</span> <span class="kw">if</span> <span class="ident">segment</span>.<span class="ident">ends_with</span>(<span class="string">&#39;&lt;&#39;</span>) {
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">UriSegmentError</span>::<span class="ident">BadEnd</span>(<span class="string">&#39;&lt;&#39;</span>));
} <span class="kw">else</span> <span class="kw">if</span> <span class="ident">segment</span>.<span class="ident">is_empty</span>() {
<span class="kw">continue</span>;
} <span class="kw">else</span> <span class="kw">if</span> <span class="macro">cfg</span><span class="macro">!</span>(<span class="ident">windows</span>) <span class="op">&amp;&amp;</span> <span class="ident">segment</span>.<span class="ident">contains</span>(<span class="string">&#39;\\&#39;</span>) {
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">UriSegmentError</span>::<span class="ident">BadChar</span>(<span class="string">&#39;\\&#39;</span>));
} <span class="kw">else</span> {
<span class="ident">buf</span>.<span class="ident">push</span>(<span class="ident">segment</span>)
}
}
<span class="prelude-val">Ok</span>(<span class="ident">buf</span>)
}
}
<span class="macro">macro_rules</span><span class="macro">!</span> <span class="ident">FROM_STR</span> {
(<span class="macro-nonterminal">$</span><span class="kw">type</span>:<span class="macro-nonterminal">ty</span>) <span class="op">=&gt;</span> {
<span class="kw">impl</span> <span class="ident">FromParam</span> <span class="kw">for</span> <span class="macro-nonterminal">$</span><span class="kw">type</span> {
<span class="kw">type</span> <span class="prelude-val">Err</span> <span class="op">=</span> <span class="macro-nonterminal">InternalError</span><span class="op">&lt;&lt;</span><span class="macro-nonterminal">$</span><span class="kw">type</span> <span class="kw">as</span> <span class="macro-nonterminal">FromStr</span><span class="op">&gt;</span>::<span class="prelude-val">Err</span><span class="op">&gt;</span>;
<span class="kw">fn</span> <span class="ident">from_param</span>(<span class="ident">val</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>) <span class="op">-&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="self">Self</span>, <span class="self">Self</span>::<span class="prelude-val">Err</span><span class="op">&gt;</span> {
<span class="op">&lt;</span><span class="macro-nonterminal">$</span><span class="kw">type</span> <span class="kw">as</span> <span class="macro-nonterminal">FromStr</span><span class="op">&gt;</span>::<span class="ident">from_str</span>(<span class="ident">val</span>)
.<span class="ident">map_err</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> <span class="ident">InternalError</span>::<span class="ident">new</span>(<span class="ident">e</span>, <span class="ident">StatusCode</span>::<span class="ident">BAD_REQUEST</span>))
}
}
};
}
<span class="macro">FROM_STR</span><span class="macro">!</span>(<span class="ident">u8</span>);
<span class="macro">FROM_STR</span><span class="macro">!</span>(<span class="ident">u16</span>);
<span class="macro">FROM_STR</span><span class="macro">!</span>(<span class="ident">u32</span>);
<span class="macro">FROM_STR</span><span class="macro">!</span>(<span class="ident">u64</span>);
<span class="macro">FROM_STR</span><span class="macro">!</span>(<span class="ident">usize</span>);
<span class="macro">FROM_STR</span><span class="macro">!</span>(<span class="ident">i8</span>);
<span class="macro">FROM_STR</span><span class="macro">!</span>(<span class="ident">i16</span>);
<span class="macro">FROM_STR</span><span class="macro">!</span>(<span class="ident">i32</span>);
<span class="macro">FROM_STR</span><span class="macro">!</span>(<span class="ident">i64</span>);
<span class="macro">FROM_STR</span><span class="macro">!</span>(<span class="ident">isize</span>);
<span class="macro">FROM_STR</span><span class="macro">!</span>(<span class="ident">f32</span>);
<span class="macro">FROM_STR</span><span class="macro">!</span>(<span class="ident">f64</span>);
<span class="macro">FROM_STR</span><span class="macro">!</span>(<span class="ident">String</span>);
<span class="macro">FROM_STR</span><span class="macro">!</span>(<span class="ident">std</span>::<span class="ident">net</span>::<span class="ident">IpAddr</span>);
<span class="macro">FROM_STR</span><span class="macro">!</span>(<span class="ident">std</span>::<span class="ident">net</span>::<span class="ident">Ipv4Addr</span>);
<span class="macro">FROM_STR</span><span class="macro">!</span>(<span class="ident">std</span>::<span class="ident">net</span>::<span class="ident">Ipv6Addr</span>);
<span class="macro">FROM_STR</span><span class="macro">!</span>(<span class="ident">std</span>::<span class="ident">net</span>::<span class="ident">SocketAddr</span>);
<span class="macro">FROM_STR</span><span class="macro">!</span>(<span class="ident">std</span>::<span class="ident">net</span>::<span class="ident">SocketAddrV4</span>);
<span class="macro">FROM_STR</span><span class="macro">!</span>(<span class="ident">std</span>::<span class="ident">net</span>::<span class="ident">SocketAddrV6</span>);
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">test</span>)]</span>
<span class="kw">mod</span> <span class="ident">tests</span> {
<span class="kw">use</span> <span class="kw">super</span>::<span class="kw-2">*</span>;
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">iter</span>::<span class="ident">FromIterator</span>;
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_path_buf</span>() {
<span class="macro">assert_eq</span><span class="macro">!</span>(
<span class="ident">PathBuf</span>::<span class="ident">from_param</span>(<span class="string">&quot;/test/.tt&quot;</span>),
<span class="prelude-val">Err</span>(<span class="ident">UriSegmentError</span>::<span class="ident">BadStart</span>(<span class="string">&#39;.&#39;</span>))
);
<span class="macro">assert_eq</span><span class="macro">!</span>(
<span class="ident">PathBuf</span>::<span class="ident">from_param</span>(<span class="string">&quot;/test/*tt&quot;</span>),
<span class="prelude-val">Err</span>(<span class="ident">UriSegmentError</span>::<span class="ident">BadStart</span>(<span class="string">&#39;*&#39;</span>))
);
<span class="macro">assert_eq</span><span class="macro">!</span>(
<span class="ident">PathBuf</span>::<span class="ident">from_param</span>(<span class="string">&quot;/test/tt:&quot;</span>),
<span class="prelude-val">Err</span>(<span class="ident">UriSegmentError</span>::<span class="ident">BadEnd</span>(<span class="string">&#39;:&#39;</span>))
);
<span class="macro">assert_eq</span><span class="macro">!</span>(
<span class="ident">PathBuf</span>::<span class="ident">from_param</span>(<span class="string">&quot;/test/tt&lt;&quot;</span>),
<span class="prelude-val">Err</span>(<span class="ident">UriSegmentError</span>::<span class="ident">BadEnd</span>(<span class="string">&#39;&lt;&#39;</span>))
);
<span class="macro">assert_eq</span><span class="macro">!</span>(
<span class="ident">PathBuf</span>::<span class="ident">from_param</span>(<span class="string">&quot;/test/tt&gt;&quot;</span>),
<span class="prelude-val">Err</span>(<span class="ident">UriSegmentError</span>::<span class="ident">BadEnd</span>(<span class="string">&#39;&gt;&#39;</span>))
);
<span class="macro">assert_eq</span><span class="macro">!</span>(
<span class="ident">PathBuf</span>::<span class="ident">from_param</span>(<span class="string">&quot;/seg1/seg2/&quot;</span>),
<span class="prelude-val">Ok</span>(<span class="ident">PathBuf</span>::<span class="ident">from_iter</span>(<span class="macro">vec</span><span class="macro">!</span>[<span class="string">&quot;seg1&quot;</span>, <span class="string">&quot;seg2&quot;</span>]))
);
<span class="macro">assert_eq</span><span class="macro">!</span>(
<span class="ident">PathBuf</span>::<span class="ident">from_param</span>(<span class="string">&quot;/seg1/../seg2/&quot;</span>),
<span class="prelude-val">Ok</span>(<span class="ident">PathBuf</span>::<span class="ident">from_iter</span>(<span class="macro">vec</span><span class="macro">!</span>[<span class="string">&quot;seg2&quot;</span>]))
);
}
}
</pre>
</section><section id="search" class="content hidden"></section><section class="footer"></section><aside id="help" class="hidden"><div><h1 class="hidden">Help</h1><div class="shortcuts"><h2>Keyboard Shortcuts</h2><dl><dt><kbd>?</kbd></dt><dd>Show this help dialog</dd><dt><kbd>S</kbd></dt><dd>Focus the search field</dd><dt><kbd></kbd></dt><dd>Move up in search results</dd><dt><kbd></kbd></dt><dd>Move down in search results</dd><dt><kbd></kbd></dt><dd>Switch tab</dd><dt><kbd>&#9166;</kbd></dt><dd>Go to active search result</dd><dt><kbd>+</kbd></dt><dd>Expand all sections</dd><dt><kbd>-</kbd></dt><dd>Collapse all sections</dd></dl></div><div class="infos"><h2>Search Tricks</h2><p>Prefix searches with a type followed by a colon (e.g. <code>fn:</code>) to restrict the search to a given type.</p><p>Accepted types are: <code>fn</code>, <code>mod</code>, <code>struct</code>, <code>enum</code>, <code>trait</code>, <code>type</code>, <code>macro</code>, and <code>const</code>.</p><p>Search functions by type signature (e.g. <code>vec -> usize</code> or <code>* -> vec</code>)</p><p>Search multiple things at once by splitting your query with comma (e.g. <code>str,u8</code> or <code>String,struct:Vec,test</code>)</p></div></div></aside><script>window.rootPath = "../../";window.currentCrate = "actix_web";</script><script src="../../aliases.js"></script><script src="../../main.js"></script><script defer src="../../search-index.js"></script></body></html>