Deploy to GitHub pages
This commit is contained in:
commit
3f686f4a85
|
@ -0,0 +1,45 @@
|
||||||
|
These documentation pages include resources by third parties. This copyright
|
||||||
|
file applies only to those resources. The following third party resources are
|
||||||
|
included, and carry their own copyright notices and license terms:
|
||||||
|
|
||||||
|
* Fira Sans (FiraSans-Regular.woff, FiraSans-Medium.woff):
|
||||||
|
|
||||||
|
Copyright (c) 2014, Mozilla Foundation https://mozilla.org/
|
||||||
|
with Reserved Font Name Fira Sans.
|
||||||
|
|
||||||
|
Copyright (c) 2014, Telefonica S.A.
|
||||||
|
|
||||||
|
Licensed under the SIL Open Font License, Version 1.1.
|
||||||
|
See FiraSans-LICENSE.txt.
|
||||||
|
|
||||||
|
* rustdoc.css, main.js, and playpen.js:
|
||||||
|
|
||||||
|
Copyright 2015 The Rust Developers.
|
||||||
|
Licensed under the Apache License, Version 2.0 (see LICENSE-APACHE.txt) or
|
||||||
|
the MIT license (LICENSE-MIT.txt) at your option.
|
||||||
|
|
||||||
|
* normalize.css:
|
||||||
|
|
||||||
|
Copyright (c) Nicolas Gallagher and Jonathan Neal.
|
||||||
|
Licensed under the MIT license (see LICENSE-MIT.txt).
|
||||||
|
|
||||||
|
* Source Code Pro (SourceCodePro-Regular.woff, SourceCodePro-Semibold.woff):
|
||||||
|
|
||||||
|
Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/),
|
||||||
|
with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark
|
||||||
|
of Adobe Systems Incorporated in the United States and/or other countries.
|
||||||
|
|
||||||
|
Licensed under the SIL Open Font License, Version 1.1.
|
||||||
|
See SourceCodePro-LICENSE.txt.
|
||||||
|
|
||||||
|
* Source Serif Pro (SourceSerifPro-Regular.ttf.woff,
|
||||||
|
SourceSerifPro-Bold.ttf.woff, SourceSerifPro-It.ttf.woff):
|
||||||
|
|
||||||
|
Copyright 2014 Adobe Systems Incorporated (http://www.adobe.com/), with
|
||||||
|
Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of
|
||||||
|
Adobe Systems Incorporated in the United States and/or other countries.
|
||||||
|
|
||||||
|
Licensed under the SIL Open Font License, Version 1.1.
|
||||||
|
See SourceSerifPro-LICENSE.txt.
|
||||||
|
|
||||||
|
This copyright file is intended to be distributed with rustdoc output.
|
|
@ -0,0 +1,94 @@
|
||||||
|
Digitized data copyright (c) 2012-2015, The Mozilla Foundation and Telefonica S.A.
|
||||||
|
with Reserved Font Name < Fira >,
|
||||||
|
|
||||||
|
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||||
|
This license is copied below, and is also available with a FAQ at:
|
||||||
|
http://scripts.sil.org/OFL
|
||||||
|
|
||||||
|
|
||||||
|
-----------------------------------------------------------
|
||||||
|
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||||
|
-----------------------------------------------------------
|
||||||
|
|
||||||
|
PREAMBLE
|
||||||
|
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||||
|
development of collaborative font projects, to support the font creation
|
||||||
|
efforts of academic and linguistic communities, and to provide a free and
|
||||||
|
open framework in which fonts may be shared and improved in partnership
|
||||||
|
with others.
|
||||||
|
|
||||||
|
The OFL allows the licensed fonts to be used, studied, modified and
|
||||||
|
redistributed freely as long as they are not sold by themselves. The
|
||||||
|
fonts, including any derivative works, can be bundled, embedded,
|
||||||
|
redistributed and/or sold with any software provided that any reserved
|
||||||
|
names are not used by derivative works. The fonts and derivatives,
|
||||||
|
however, cannot be released under any other type of license. The
|
||||||
|
requirement for fonts to remain under this license does not apply
|
||||||
|
to any document created using the fonts or their derivatives.
|
||||||
|
|
||||||
|
DEFINITIONS
|
||||||
|
"Font Software" refers to the set of files released by the Copyright
|
||||||
|
Holder(s) under this license and clearly marked as such. This may
|
||||||
|
include source files, build scripts and documentation.
|
||||||
|
|
||||||
|
"Reserved Font Name" refers to any names specified as such after the
|
||||||
|
copyright statement(s).
|
||||||
|
|
||||||
|
"Original Version" refers to the collection of Font Software components as
|
||||||
|
distributed by the Copyright Holder(s).
|
||||||
|
|
||||||
|
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||||
|
or substituting -- in part or in whole -- any of the components of the
|
||||||
|
Original Version, by changing formats or by porting the Font Software to a
|
||||||
|
new environment.
|
||||||
|
|
||||||
|
"Author" refers to any designer, engineer, programmer, technical
|
||||||
|
writer or other person who contributed to the Font Software.
|
||||||
|
|
||||||
|
PERMISSION & CONDITIONS
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||||
|
redistribute, and sell modified and unmodified copies of the Font
|
||||||
|
Software, subject to the following conditions:
|
||||||
|
|
||||||
|
1) Neither the Font Software nor any of its individual components,
|
||||||
|
in Original or Modified Versions, may be sold by itself.
|
||||||
|
|
||||||
|
2) Original or Modified Versions of the Font Software may be bundled,
|
||||||
|
redistributed and/or sold with any software, provided that each copy
|
||||||
|
contains the above copyright notice and this license. These can be
|
||||||
|
included either as stand-alone text files, human-readable headers or
|
||||||
|
in the appropriate machine-readable metadata fields within text or
|
||||||
|
binary files as long as those fields can be easily viewed by the user.
|
||||||
|
|
||||||
|
3) No Modified Version of the Font Software may use the Reserved Font
|
||||||
|
Name(s) unless explicit written permission is granted by the corresponding
|
||||||
|
Copyright Holder. This restriction only applies to the primary font name as
|
||||||
|
presented to the users.
|
||||||
|
|
||||||
|
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||||
|
Software shall not be used to promote, endorse or advertise any
|
||||||
|
Modified Version, except to acknowledge the contribution(s) of the
|
||||||
|
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||||
|
permission.
|
||||||
|
|
||||||
|
5) The Font Software, modified or unmodified, in part or in whole,
|
||||||
|
must be distributed entirely under this license, and must not be
|
||||||
|
distributed under any other license. The requirement for fonts to
|
||||||
|
remain under this license does not apply to any document created
|
||||||
|
using the Font Software.
|
||||||
|
|
||||||
|
TERMINATION
|
||||||
|
This license becomes null and void if any of the above conditions are
|
||||||
|
not met.
|
||||||
|
|
||||||
|
DISCLAIMER
|
||||||
|
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||||
|
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||||
|
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||||
|
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||||
|
OTHER DEALINGS IN THE FONT SOFTWARE.
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,201 @@
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
|
@ -0,0 +1,23 @@
|
||||||
|
Permission is hereby granted, free of charge, to any
|
||||||
|
person obtaining a copy of this software and associated
|
||||||
|
documentation files (the "Software"), to deal in the
|
||||||
|
Software without restriction, including without
|
||||||
|
limitation the rights to use, copy, modify, merge,
|
||||||
|
publish, distribute, sublicense, and/or sell copies of
|
||||||
|
the Software, and to permit persons to whom the Software
|
||||||
|
is furnished to do so, subject to the following
|
||||||
|
conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice
|
||||||
|
shall be included in all copies or substantial portions
|
||||||
|
of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
|
||||||
|
ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
||||||
|
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||||
|
SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
|
||||||
|
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
DEALINGS IN THE SOFTWARE.
|
|
@ -0,0 +1,93 @@
|
||||||
|
Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries.
|
||||||
|
|
||||||
|
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||||
|
|
||||||
|
This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
|
||||||
|
|
||||||
|
|
||||||
|
-----------------------------------------------------------
|
||||||
|
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||||
|
-----------------------------------------------------------
|
||||||
|
|
||||||
|
PREAMBLE
|
||||||
|
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||||
|
development of collaborative font projects, to support the font creation
|
||||||
|
efforts of academic and linguistic communities, and to provide a free and
|
||||||
|
open framework in which fonts may be shared and improved in partnership
|
||||||
|
with others.
|
||||||
|
|
||||||
|
The OFL allows the licensed fonts to be used, studied, modified and
|
||||||
|
redistributed freely as long as they are not sold by themselves. The
|
||||||
|
fonts, including any derivative works, can be bundled, embedded,
|
||||||
|
redistributed and/or sold with any software provided that any reserved
|
||||||
|
names are not used by derivative works. The fonts and derivatives,
|
||||||
|
however, cannot be released under any other type of license. The
|
||||||
|
requirement for fonts to remain under this license does not apply
|
||||||
|
to any document created using the fonts or their derivatives.
|
||||||
|
|
||||||
|
DEFINITIONS
|
||||||
|
"Font Software" refers to the set of files released by the Copyright
|
||||||
|
Holder(s) under this license and clearly marked as such. This may
|
||||||
|
include source files, build scripts and documentation.
|
||||||
|
|
||||||
|
"Reserved Font Name" refers to any names specified as such after the
|
||||||
|
copyright statement(s).
|
||||||
|
|
||||||
|
"Original Version" refers to the collection of Font Software components as
|
||||||
|
distributed by the Copyright Holder(s).
|
||||||
|
|
||||||
|
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||||
|
or substituting -- in part or in whole -- any of the components of the
|
||||||
|
Original Version, by changing formats or by porting the Font Software to a
|
||||||
|
new environment.
|
||||||
|
|
||||||
|
"Author" refers to any designer, engineer, programmer, technical
|
||||||
|
writer or other person who contributed to the Font Software.
|
||||||
|
|
||||||
|
PERMISSION & CONDITIONS
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||||
|
redistribute, and sell modified and unmodified copies of the Font
|
||||||
|
Software, subject to the following conditions:
|
||||||
|
|
||||||
|
1) Neither the Font Software nor any of its individual components,
|
||||||
|
in Original or Modified Versions, may be sold by itself.
|
||||||
|
|
||||||
|
2) Original or Modified Versions of the Font Software may be bundled,
|
||||||
|
redistributed and/or sold with any software, provided that each copy
|
||||||
|
contains the above copyright notice and this license. These can be
|
||||||
|
included either as stand-alone text files, human-readable headers or
|
||||||
|
in the appropriate machine-readable metadata fields within text or
|
||||||
|
binary files as long as those fields can be easily viewed by the user.
|
||||||
|
|
||||||
|
3) No Modified Version of the Font Software may use the Reserved Font
|
||||||
|
Name(s) unless explicit written permission is granted by the corresponding
|
||||||
|
Copyright Holder. This restriction only applies to the primary font name as
|
||||||
|
presented to the users.
|
||||||
|
|
||||||
|
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||||
|
Software shall not be used to promote, endorse or advertise any
|
||||||
|
Modified Version, except to acknowledge the contribution(s) of the
|
||||||
|
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||||
|
permission.
|
||||||
|
|
||||||
|
5) The Font Software, modified or unmodified, in part or in whole,
|
||||||
|
must be distributed entirely under this license, and must not be
|
||||||
|
distributed under any other license. The requirement for fonts to
|
||||||
|
remain under this license does not apply to any document created
|
||||||
|
using the Font Software.
|
||||||
|
|
||||||
|
TERMINATION
|
||||||
|
This license becomes null and void if any of the above conditions are
|
||||||
|
not met.
|
||||||
|
|
||||||
|
DISCLAIMER
|
||||||
|
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||||
|
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||||
|
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||||
|
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||||
|
OTHER DEALINGS IN THE FONT SOFTWARE.
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,93 @@
|
||||||
|
Copyright 2014-2018 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries.
|
||||||
|
|
||||||
|
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||||
|
|
||||||
|
This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
|
||||||
|
|
||||||
|
|
||||||
|
-----------------------------------------------------------
|
||||||
|
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||||
|
-----------------------------------------------------------
|
||||||
|
|
||||||
|
PREAMBLE
|
||||||
|
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||||
|
development of collaborative font projects, to support the font creation
|
||||||
|
efforts of academic and linguistic communities, and to provide a free and
|
||||||
|
open framework in which fonts may be shared and improved in partnership
|
||||||
|
with others.
|
||||||
|
|
||||||
|
The OFL allows the licensed fonts to be used, studied, modified and
|
||||||
|
redistributed freely as long as they are not sold by themselves. The
|
||||||
|
fonts, including any derivative works, can be bundled, embedded,
|
||||||
|
redistributed and/or sold with any software provided that any reserved
|
||||||
|
names are not used by derivative works. The fonts and derivatives,
|
||||||
|
however, cannot be released under any other type of license. The
|
||||||
|
requirement for fonts to remain under this license does not apply
|
||||||
|
to any document created using the fonts or their derivatives.
|
||||||
|
|
||||||
|
DEFINITIONS
|
||||||
|
"Font Software" refers to the set of files released by the Copyright
|
||||||
|
Holder(s) under this license and clearly marked as such. This may
|
||||||
|
include source files, build scripts and documentation.
|
||||||
|
|
||||||
|
"Reserved Font Name" refers to any names specified as such after the
|
||||||
|
copyright statement(s).
|
||||||
|
|
||||||
|
"Original Version" refers to the collection of Font Software components as
|
||||||
|
distributed by the Copyright Holder(s).
|
||||||
|
|
||||||
|
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||||
|
or substituting -- in part or in whole -- any of the components of the
|
||||||
|
Original Version, by changing formats or by porting the Font Software to a
|
||||||
|
new environment.
|
||||||
|
|
||||||
|
"Author" refers to any designer, engineer, programmer, technical
|
||||||
|
writer or other person who contributed to the Font Software.
|
||||||
|
|
||||||
|
PERMISSION & CONDITIONS
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||||
|
redistribute, and sell modified and unmodified copies of the Font
|
||||||
|
Software, subject to the following conditions:
|
||||||
|
|
||||||
|
1) Neither the Font Software nor any of its individual components,
|
||||||
|
in Original or Modified Versions, may be sold by itself.
|
||||||
|
|
||||||
|
2) Original or Modified Versions of the Font Software may be bundled,
|
||||||
|
redistributed and/or sold with any software, provided that each copy
|
||||||
|
contains the above copyright notice and this license. These can be
|
||||||
|
included either as stand-alone text files, human-readable headers or
|
||||||
|
in the appropriate machine-readable metadata fields within text or
|
||||||
|
binary files as long as those fields can be easily viewed by the user.
|
||||||
|
|
||||||
|
3) No Modified Version of the Font Software may use the Reserved Font
|
||||||
|
Name(s) unless explicit written permission is granted by the corresponding
|
||||||
|
Copyright Holder. This restriction only applies to the primary font name as
|
||||||
|
presented to the users.
|
||||||
|
|
||||||
|
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||||
|
Software shall not be used to promote, endorse or advertise any
|
||||||
|
Modified Version, except to acknowledge the contribution(s) of the
|
||||||
|
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||||
|
permission.
|
||||||
|
|
||||||
|
5) The Font Software, modified or unmodified, in part or in whole,
|
||||||
|
must be distributed entirely under this license, and must not be
|
||||||
|
distributed under any other license. The requirement for fonts to
|
||||||
|
remain under this license does not apply to any document created
|
||||||
|
using the Font Software.
|
||||||
|
|
||||||
|
TERMINATION
|
||||||
|
This license becomes null and void if any of the above conditions are
|
||||||
|
not met.
|
||||||
|
|
||||||
|
DISCLAIMER
|
||||||
|
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||||
|
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||||
|
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||||
|
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||||
|
OTHER DEALINGS IN THE FONT SOFTWARE.
|
Binary file not shown.
|
@ -0,0 +1,5 @@
|
||||||
|
var ALIASES = {};
|
||||||
|
ALIASES["tower"] = {};
|
||||||
|
ALIASES["tower_layer"] = {};
|
||||||
|
ALIASES["tower_service"] = {};
|
||||||
|
ALIASES["tower_test"] = {};
|
|
@ -0,0 +1 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="1792" height="1792" viewBox="0 0 1792 1792"><path d="M1615 0q70 0 122.5 46.5t52.5 116.5q0 63-45 151-332 629-465 752-97 91-218 91-126 0-216.5-92.5t-90.5-219.5q0-128 92-212l638-579q59-54 130-54zm-909 1034q39 76 106.5 130t150.5 76l1 71q4 213-129.5 347t-348.5 134q-123 0-218-46.5t-152.5-127.5-86.5-183-29-220q7 5 41 30t62 44.5 59 36.5 46 17q41 0 55-37 25-66 57.5-112.5t69.5-76 88-47.5 103-25.5 125-10.5z"/></svg>
|
After Width: | Height: | Size: 455 B |
|
@ -0,0 +1 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Layer_1" width="128" height="128" enable-background="new 0 0 128 128" version="1.1" viewBox="-30 -20 176 176" xml:space="preserve"><g><line x1="111" x2="64" y1="40.5" y2="87.499" fill="none" stroke="#2F3435" stroke-linecap="square" stroke-miterlimit="10" stroke-width="12"/><line x1="64" x2="17" y1="87.499" y2="40.5" fill="none" stroke="#2F3435" stroke-linecap="square" stroke-miterlimit="10" stroke-width="12"/></g></svg>
|
After Width: | Height: | Size: 510 B |
Binary file not shown.
After Width: | Height: | Size: 23 KiB |
|
@ -0,0 +1,5 @@
|
||||||
|
(function() {var implementors = {};
|
||||||
|
implementors["tower"] = [{"text":"impl<L: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html\" title=\"trait core::clone::Clone\">Clone</a>> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html\" title=\"trait core::clone::Clone\">Clone</a> for <a class=\"struct\" href=\"tower/builder/struct.ServiceBuilder.html\" title=\"struct tower::builder::ServiceBuilder\">ServiceBuilder</a><L>","synthetic":false,"types":["tower::builder::ServiceBuilder"]}];
|
||||||
|
implementors["tower_layer"] = [{"text":"impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html\" title=\"trait core::clone::Clone\">Clone</a> for <a class=\"struct\" href=\"tower_layer/struct.Identity.html\" title=\"struct tower_layer::Identity\">Identity</a>","synthetic":false,"types":["tower_layer::identity::Identity"]},{"text":"impl<Inner: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html\" title=\"trait core::clone::Clone\">Clone</a>, Outer: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html\" title=\"trait core::clone::Clone\">Clone</a>> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html\" title=\"trait core::clone::Clone\">Clone</a> for <a class=\"struct\" href=\"tower_layer/struct.Stack.html\" title=\"struct tower_layer::Stack\">Stack</a><Inner, Outer>","synthetic":false,"types":["tower_layer::stack::Stack"]}];
|
||||||
|
implementors["tower_test"] = [{"text":"impl<T: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html\" title=\"trait core::clone::Clone\">Clone</a>> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html\" title=\"trait core::clone::Clone\">Clone</a> for <a class=\"struct\" href=\"tower_test/mock/spawn/struct.Spawn.html\" title=\"struct tower_test::mock::spawn::Spawn\">Spawn</a><T>","synthetic":false,"types":["tower_test::mock::spawn::Spawn"]},{"text":"impl<T, U> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html\" title=\"trait core::clone::Clone\">Clone</a> for <a class=\"struct\" href=\"tower_test/mock/struct.Mock.html\" title=\"struct tower_test::mock::Mock\">Mock</a><T, U>","synthetic":false,"types":["tower_test::mock::Mock"]}];
|
||||||
|
if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
|
|
@ -0,0 +1,3 @@
|
||||||
|
(function() {var implementors = {};
|
||||||
|
implementors["tower_layer"] = [{"text":"impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/default/trait.Default.html\" title=\"trait core::default::Default\">Default</a> for <a class=\"struct\" href=\"tower_layer/struct.Identity.html\" title=\"struct tower_layer::Identity\">Identity</a>","synthetic":false,"types":["tower_layer::identity::Identity"]}];
|
||||||
|
if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
|
|
@ -0,0 +1,5 @@
|
||||||
|
(function() {var implementors = {};
|
||||||
|
implementors["tower"] = [{"text":"impl<L: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a>> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a> for <a class=\"struct\" href=\"tower/builder/struct.ServiceBuilder.html\" title=\"struct tower::builder::ServiceBuilder\">ServiceBuilder</a><L>","synthetic":false,"types":["tower::builder::ServiceBuilder"]}];
|
||||||
|
implementors["tower_layer"] = [{"text":"impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a> for <a class=\"struct\" href=\"tower_layer/struct.Identity.html\" title=\"struct tower_layer::Identity\">Identity</a>","synthetic":false,"types":["tower_layer::identity::Identity"]},{"text":"impl<Inner, Outer> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a> for <a class=\"struct\" href=\"tower_layer/struct.Stack.html\" title=\"struct tower_layer::Stack\">Stack</a><Inner, Outer> <span class=\"where fmt-newline\">where<br> Inner: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a>,<br> Outer: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a>, </span>","synthetic":false,"types":["tower_layer::stack::Stack"]}];
|
||||||
|
implementors["tower_test"] = [{"text":"impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a> for <a class=\"struct\" href=\"tower_test/mock/error/struct.Closed.html\" title=\"struct tower_test::mock::error::Closed\">Closed</a>","synthetic":false,"types":["tower_test::mock::error::Closed"]},{"text":"impl<T: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a>> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a> for <a class=\"struct\" href=\"tower_test/mock/future/struct.ResponseFuture.html\" title=\"struct tower_test::mock::future::ResponseFuture\">ResponseFuture</a><T>","synthetic":false,"types":["tower_test::mock::future::ResponseFuture"]},{"text":"impl<T: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a>> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a> for <a class=\"struct\" href=\"tower_test/mock/spawn/struct.Spawn.html\" title=\"struct tower_test::mock::spawn::Spawn\">Spawn</a><T>","synthetic":false,"types":["tower_test::mock::spawn::Spawn"]},{"text":"impl<T: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a>, U: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a>> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a> for <a class=\"struct\" href=\"tower_test/mock/struct.Mock.html\" title=\"struct tower_test::mock::Mock\">Mock</a><T, U>","synthetic":false,"types":["tower_test::mock::Mock"]},{"text":"impl<T: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a>, U: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a>> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a> for <a class=\"struct\" href=\"tower_test/mock/struct.Handle.html\" title=\"struct tower_test::mock::Handle\">Handle</a><T, U>","synthetic":false,"types":["tower_test::mock::Handle"]},{"text":"impl<T: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a>> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a> for <a class=\"struct\" href=\"tower_test/mock/struct.SendResponse.html\" title=\"struct tower_test::mock::SendResponse\">SendResponse</a><T>","synthetic":false,"types":["tower_test::mock::SendResponse"]}];
|
||||||
|
if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
|
|
@ -0,0 +1,3 @@
|
||||||
|
(function() {var implementors = {};
|
||||||
|
implementors["tower_test"] = [{"text":"impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/fmt/trait.Display.html\" title=\"trait core::fmt::Display\">Display</a> for <a class=\"struct\" href=\"tower_test/mock/error/struct.Closed.html\" title=\"struct tower_test::mock::error::Closed\">Closed</a>","synthetic":false,"types":["tower_test::mock::error::Closed"]}];
|
||||||
|
if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
|
|
@ -0,0 +1,3 @@
|
||||||
|
(function() {var implementors = {};
|
||||||
|
implementors["tower_test"] = [{"text":"impl<T> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/future/future/trait.Future.html\" title=\"trait core::future::future::Future\">Future</a> for <a class=\"struct\" href=\"tower_test/mock/future/struct.ResponseFuture.html\" title=\"struct tower_test::mock::future::ResponseFuture\">ResponseFuture</a><T>","synthetic":false,"types":["tower_test::mock::future::ResponseFuture"]}];
|
||||||
|
if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
|
|
@ -0,0 +1,5 @@
|
||||||
|
(function() {var implementors = {};
|
||||||
|
implementors["tower"] = [{"text":"impl<L> Freeze for <a class=\"struct\" href=\"tower/builder/struct.ServiceBuilder.html\" title=\"struct tower::builder::ServiceBuilder\">ServiceBuilder</a><L> <span class=\"where fmt-newline\">where<br> L: Freeze, </span>","synthetic":true,"types":["tower::builder::ServiceBuilder"]}];
|
||||||
|
implementors["tower_layer"] = [{"text":"impl Freeze for <a class=\"struct\" href=\"tower_layer/struct.Identity.html\" title=\"struct tower_layer::Identity\">Identity</a>","synthetic":true,"types":["tower_layer::identity::Identity"]},{"text":"impl<Inner, Outer> Freeze for <a class=\"struct\" href=\"tower_layer/struct.Stack.html\" title=\"struct tower_layer::Stack\">Stack</a><Inner, Outer> <span class=\"where fmt-newline\">where<br> Inner: Freeze,<br> Outer: Freeze, </span>","synthetic":true,"types":["tower_layer::stack::Stack"]}];
|
||||||
|
implementors["tower_test"] = [{"text":"impl<T, U> !Freeze for <a class=\"struct\" href=\"tower_test/mock/struct.Mock.html\" title=\"struct tower_test::mock::Mock\">Mock</a><T, U>","synthetic":true,"types":["tower_test::mock::Mock"]},{"text":"impl<T, U> Freeze for <a class=\"struct\" href=\"tower_test/mock/struct.Handle.html\" title=\"struct tower_test::mock::Handle\">Handle</a><T, U>","synthetic":true,"types":["tower_test::mock::Handle"]},{"text":"impl<T> Freeze for <a class=\"struct\" href=\"tower_test/mock/struct.SendResponse.html\" title=\"struct tower_test::mock::SendResponse\">SendResponse</a><T>","synthetic":true,"types":["tower_test::mock::SendResponse"]},{"text":"impl Freeze for <a class=\"struct\" href=\"tower_test/mock/error/struct.Closed.html\" title=\"struct tower_test::mock::error::Closed\">Closed</a>","synthetic":true,"types":["tower_test::mock::error::Closed"]},{"text":"impl<T> Freeze for <a class=\"struct\" href=\"tower_test/mock/future/struct.ResponseFuture.html\" title=\"struct tower_test::mock::future::ResponseFuture\">ResponseFuture</a><T>","synthetic":true,"types":["tower_test::mock::future::ResponseFuture"]},{"text":"impl<T> Freeze for <a class=\"struct\" href=\"tower_test/mock/spawn/struct.Spawn.html\" title=\"struct tower_test::mock::spawn::Spawn\">Spawn</a><T> <span class=\"where fmt-newline\">where<br> T: Freeze, </span>","synthetic":true,"types":["tower_test::mock::spawn::Spawn"]}];
|
||||||
|
if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
|
|
@ -0,0 +1,5 @@
|
||||||
|
(function() {var implementors = {};
|
||||||
|
implementors["tower"] = [{"text":"impl<L> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a> for <a class=\"struct\" href=\"tower/builder/struct.ServiceBuilder.html\" title=\"struct tower::builder::ServiceBuilder\">ServiceBuilder</a><L> <span class=\"where fmt-newline\">where<br> L: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a>, </span>","synthetic":true,"types":["tower::builder::ServiceBuilder"]}];
|
||||||
|
implementors["tower_layer"] = [{"text":"impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a> for <a class=\"struct\" href=\"tower_layer/struct.Identity.html\" title=\"struct tower_layer::Identity\">Identity</a>","synthetic":true,"types":["tower_layer::identity::Identity"]},{"text":"impl<Inner, Outer> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a> for <a class=\"struct\" href=\"tower_layer/struct.Stack.html\" title=\"struct tower_layer::Stack\">Stack</a><Inner, Outer> <span class=\"where fmt-newline\">where<br> Inner: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a>,<br> Outer: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a>, </span>","synthetic":true,"types":["tower_layer::stack::Stack"]}];
|
||||||
|
implementors["tower_test"] = [{"text":"impl<T, U> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a> for <a class=\"struct\" href=\"tower_test/mock/struct.Mock.html\" title=\"struct tower_test::mock::Mock\">Mock</a><T, U> <span class=\"where fmt-newline\">where<br> T: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a>,<br> U: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a>, </span>","synthetic":true,"types":["tower_test::mock::Mock"]},{"text":"impl<T, U> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a> for <a class=\"struct\" href=\"tower_test/mock/struct.Handle.html\" title=\"struct tower_test::mock::Handle\">Handle</a><T, U> <span class=\"where fmt-newline\">where<br> T: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a>,<br> U: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a>, </span>","synthetic":true,"types":["tower_test::mock::Handle"]},{"text":"impl<T> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a> for <a class=\"struct\" href=\"tower_test/mock/struct.SendResponse.html\" title=\"struct tower_test::mock::SendResponse\">SendResponse</a><T> <span class=\"where fmt-newline\">where<br> T: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a>, </span>","synthetic":true,"types":["tower_test::mock::SendResponse"]},{"text":"impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a> for <a class=\"struct\" href=\"tower_test/mock/error/struct.Closed.html\" title=\"struct tower_test::mock::error::Closed\">Closed</a>","synthetic":true,"types":["tower_test::mock::error::Closed"]},{"text":"impl<T> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a> for <a class=\"struct\" href=\"tower_test/mock/future/struct.ResponseFuture.html\" title=\"struct tower_test::mock::future::ResponseFuture\">ResponseFuture</a><T> <span class=\"where fmt-newline\">where<br> T: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a>, </span>","synthetic":true,"types":["tower_test::mock::future::ResponseFuture"]},{"text":"impl<T> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a> for <a class=\"struct\" href=\"tower_test/mock/spawn/struct.Spawn.html\" title=\"struct tower_test::mock::spawn::Spawn\">Spawn</a><T> <span class=\"where fmt-newline\">where<br> T: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a>, </span>","synthetic":true,"types":["tower_test::mock::spawn::Spawn"]}];
|
||||||
|
if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
|
|
@ -0,0 +1,5 @@
|
||||||
|
(function() {var implementors = {};
|
||||||
|
implementors["tower"] = [{"text":"impl<L> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html\" title=\"trait core::marker::Sync\">Sync</a> for <a class=\"struct\" href=\"tower/builder/struct.ServiceBuilder.html\" title=\"struct tower::builder::ServiceBuilder\">ServiceBuilder</a><L> <span class=\"where fmt-newline\">where<br> L: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html\" title=\"trait core::marker::Sync\">Sync</a>, </span>","synthetic":true,"types":["tower::builder::ServiceBuilder"]}];
|
||||||
|
implementors["tower_layer"] = [{"text":"impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html\" title=\"trait core::marker::Sync\">Sync</a> for <a class=\"struct\" href=\"tower_layer/struct.Identity.html\" title=\"struct tower_layer::Identity\">Identity</a>","synthetic":true,"types":["tower_layer::identity::Identity"]},{"text":"impl<Inner, Outer> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html\" title=\"trait core::marker::Sync\">Sync</a> for <a class=\"struct\" href=\"tower_layer/struct.Stack.html\" title=\"struct tower_layer::Stack\">Stack</a><Inner, Outer> <span class=\"where fmt-newline\">where<br> Inner: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html\" title=\"trait core::marker::Sync\">Sync</a>,<br> Outer: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html\" title=\"trait core::marker::Sync\">Sync</a>, </span>","synthetic":true,"types":["tower_layer::stack::Stack"]}];
|
||||||
|
implementors["tower_test"] = [{"text":"impl<T, U> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html\" title=\"trait core::marker::Sync\">Sync</a> for <a class=\"struct\" href=\"tower_test/mock/struct.Mock.html\" title=\"struct tower_test::mock::Mock\">Mock</a><T, U> <span class=\"where fmt-newline\">where<br> T: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a>,<br> U: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a>, </span>","synthetic":true,"types":["tower_test::mock::Mock"]},{"text":"impl<T, U> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html\" title=\"trait core::marker::Sync\">Sync</a> for <a class=\"struct\" href=\"tower_test/mock/struct.Handle.html\" title=\"struct tower_test::mock::Handle\">Handle</a><T, U> <span class=\"where fmt-newline\">where<br> T: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a>,<br> U: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a>, </span>","synthetic":true,"types":["tower_test::mock::Handle"]},{"text":"impl<T> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html\" title=\"trait core::marker::Sync\">Sync</a> for <a class=\"struct\" href=\"tower_test/mock/struct.SendResponse.html\" title=\"struct tower_test::mock::SendResponse\">SendResponse</a><T> <span class=\"where fmt-newline\">where<br> T: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a>, </span>","synthetic":true,"types":["tower_test::mock::SendResponse"]},{"text":"impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html\" title=\"trait core::marker::Sync\">Sync</a> for <a class=\"struct\" href=\"tower_test/mock/error/struct.Closed.html\" title=\"struct tower_test::mock::error::Closed\">Closed</a>","synthetic":true,"types":["tower_test::mock::error::Closed"]},{"text":"impl<T> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html\" title=\"trait core::marker::Sync\">Sync</a> for <a class=\"struct\" href=\"tower_test/mock/future/struct.ResponseFuture.html\" title=\"struct tower_test::mock::future::ResponseFuture\">ResponseFuture</a><T> <span class=\"where fmt-newline\">where<br> T: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a>, </span>","synthetic":true,"types":["tower_test::mock::future::ResponseFuture"]},{"text":"impl<T> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html\" title=\"trait core::marker::Sync\">Sync</a> for <a class=\"struct\" href=\"tower_test/mock/spawn/struct.Spawn.html\" title=\"struct tower_test::mock::spawn::Spawn\">Spawn</a><T> <span class=\"where fmt-newline\">where<br> T: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html\" title=\"trait core::marker::Sync\">Sync</a>, </span>","synthetic":true,"types":["tower_test::mock::spawn::Spawn"]}];
|
||||||
|
if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
|
|
@ -0,0 +1,5 @@
|
||||||
|
(function() {var implementors = {};
|
||||||
|
implementors["tower"] = [{"text":"impl<L> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html\" title=\"trait core::marker::Unpin\">Unpin</a> for <a class=\"struct\" href=\"tower/builder/struct.ServiceBuilder.html\" title=\"struct tower::builder::ServiceBuilder\">ServiceBuilder</a><L> <span class=\"where fmt-newline\">where<br> L: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html\" title=\"trait core::marker::Unpin\">Unpin</a>, </span>","synthetic":true,"types":["tower::builder::ServiceBuilder"]}];
|
||||||
|
implementors["tower_layer"] = [{"text":"impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html\" title=\"trait core::marker::Unpin\">Unpin</a> for <a class=\"struct\" href=\"tower_layer/struct.Identity.html\" title=\"struct tower_layer::Identity\">Identity</a>","synthetic":true,"types":["tower_layer::identity::Identity"]},{"text":"impl<Inner, Outer> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html\" title=\"trait core::marker::Unpin\">Unpin</a> for <a class=\"struct\" href=\"tower_layer/struct.Stack.html\" title=\"struct tower_layer::Stack\">Stack</a><Inner, Outer> <span class=\"where fmt-newline\">where<br> Inner: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html\" title=\"trait core::marker::Unpin\">Unpin</a>,<br> Outer: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html\" title=\"trait core::marker::Unpin\">Unpin</a>, </span>","synthetic":true,"types":["tower_layer::stack::Stack"]}];
|
||||||
|
implementors["tower_test"] = [{"text":"impl<T, U> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html\" title=\"trait core::marker::Unpin\">Unpin</a> for <a class=\"struct\" href=\"tower_test/mock/struct.Mock.html\" title=\"struct tower_test::mock::Mock\">Mock</a><T, U>","synthetic":true,"types":["tower_test::mock::Mock"]},{"text":"impl<T, U> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html\" title=\"trait core::marker::Unpin\">Unpin</a> for <a class=\"struct\" href=\"tower_test/mock/struct.Handle.html\" title=\"struct tower_test::mock::Handle\">Handle</a><T, U>","synthetic":true,"types":["tower_test::mock::Handle"]},{"text":"impl<T> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html\" title=\"trait core::marker::Unpin\">Unpin</a> for <a class=\"struct\" href=\"tower_test/mock/struct.SendResponse.html\" title=\"struct tower_test::mock::SendResponse\">SendResponse</a><T>","synthetic":true,"types":["tower_test::mock::SendResponse"]},{"text":"impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html\" title=\"trait core::marker::Unpin\">Unpin</a> for <a class=\"struct\" href=\"tower_test/mock/error/struct.Closed.html\" title=\"struct tower_test::mock::error::Closed\">Closed</a>","synthetic":true,"types":["tower_test::mock::error::Closed"]},{"text":"impl<T> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html\" title=\"trait core::marker::Unpin\">Unpin</a> for <a class=\"struct\" href=\"tower_test/mock/spawn/struct.Spawn.html\" title=\"struct tower_test::mock::spawn::Spawn\">Spawn</a><T> <span class=\"where fmt-newline\">where<br> T: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html\" title=\"trait core::marker::Unpin\">Unpin</a>, </span>","synthetic":true,"types":["tower_test::mock::spawn::Spawn"]},{"text":"impl<'pin, T> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html\" title=\"trait core::marker::Unpin\">Unpin</a> for <a class=\"struct\" href=\"tower_test/mock/future/struct.ResponseFuture.html\" title=\"struct tower_test::mock::future::ResponseFuture\">ResponseFuture</a><T> <span class=\"where fmt-newline\">where<br> __ResponseFuture<'pin, T>: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html\" title=\"trait core::marker::Unpin\">Unpin</a>, </span>","synthetic":false,"types":["tower_test::mock::future::ResponseFuture"]}];
|
||||||
|
if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
|
|
@ -0,0 +1,3 @@
|
||||||
|
(function() {var implementors = {};
|
||||||
|
implementors["tower_test"] = [{"text":"impl<T, U> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/ops/drop/trait.Drop.html\" title=\"trait core::ops::drop::Drop\">Drop</a> for <a class=\"struct\" href=\"tower_test/mock/struct.Mock.html\" title=\"struct tower_test::mock::Mock\">Mock</a><T, U>","synthetic":false,"types":["tower_test::mock::Mock"]},{"text":"impl<T, U> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/ops/drop/trait.Drop.html\" title=\"trait core::ops::drop::Drop\">Drop</a> for <a class=\"struct\" href=\"tower_test/mock/struct.Handle.html\" title=\"struct tower_test::mock::Handle\">Handle</a><T, U>","synthetic":false,"types":["tower_test::mock::Handle"]}];
|
||||||
|
if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
|
|
@ -0,0 +1,3 @@
|
||||||
|
(function() {var implementors = {};
|
||||||
|
implementors["tower_test"] = [{"text":"impl<T> PinnedDrop for <a class=\"struct\" href=\"tower_test/mock/future/struct.ResponseFuture.html\" title=\"struct tower_test::mock::future::ResponseFuture\">ResponseFuture</a><T>","synthetic":false,"types":["tower_test::mock::future::ResponseFuture"]}];
|
||||||
|
if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
|
|
@ -0,0 +1,3 @@
|
||||||
|
(function() {var implementors = {};
|
||||||
|
implementors["tower_test"] = [{"text":"impl<T> <a class=\"trait\" href=\"https://docs.rs/pin-project/0.4.22/pin_project/trait.UnsafeUnpin.html\" title=\"trait pin_project::UnsafeUnpin\">UnsafeUnpin</a> for <a class=\"struct\" href=\"tower_test/mock/future/struct.ResponseFuture.html\" title=\"struct tower_test::mock::future::ResponseFuture\">ResponseFuture</a><T>","synthetic":false,"types":["tower_test::mock::future::ResponseFuture"]}];
|
||||||
|
if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
|
|
@ -0,0 +1,3 @@
|
||||||
|
(function() {var implementors = {};
|
||||||
|
implementors["tower_test"] = [{"text":"impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/std/error/trait.Error.html\" title=\"trait std::error::Error\">Error</a> for <a class=\"struct\" href=\"tower_test/mock/error/struct.Closed.html\" title=\"struct tower_test::mock::error::Closed\">Closed</a>","synthetic":false,"types":["tower_test::mock::error::Closed"]}];
|
||||||
|
if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
|
|
@ -0,0 +1,5 @@
|
||||||
|
(function() {var implementors = {};
|
||||||
|
implementors["tower"] = [{"text":"impl<L> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/std/panic/trait.RefUnwindSafe.html\" title=\"trait std::panic::RefUnwindSafe\">RefUnwindSafe</a> for <a class=\"struct\" href=\"tower/builder/struct.ServiceBuilder.html\" title=\"struct tower::builder::ServiceBuilder\">ServiceBuilder</a><L> <span class=\"where fmt-newline\">where<br> L: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/std/panic/trait.RefUnwindSafe.html\" title=\"trait std::panic::RefUnwindSafe\">RefUnwindSafe</a>, </span>","synthetic":true,"types":["tower::builder::ServiceBuilder"]}];
|
||||||
|
implementors["tower_layer"] = [{"text":"impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/std/panic/trait.RefUnwindSafe.html\" title=\"trait std::panic::RefUnwindSafe\">RefUnwindSafe</a> for <a class=\"struct\" href=\"tower_layer/struct.Identity.html\" title=\"struct tower_layer::Identity\">Identity</a>","synthetic":true,"types":["tower_layer::identity::Identity"]},{"text":"impl<Inner, Outer> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/std/panic/trait.RefUnwindSafe.html\" title=\"trait std::panic::RefUnwindSafe\">RefUnwindSafe</a> for <a class=\"struct\" href=\"tower_layer/struct.Stack.html\" title=\"struct tower_layer::Stack\">Stack</a><Inner, Outer> <span class=\"where fmt-newline\">where<br> Inner: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/std/panic/trait.RefUnwindSafe.html\" title=\"trait std::panic::RefUnwindSafe\">RefUnwindSafe</a>,<br> Outer: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/std/panic/trait.RefUnwindSafe.html\" title=\"trait std::panic::RefUnwindSafe\">RefUnwindSafe</a>, </span>","synthetic":true,"types":["tower_layer::stack::Stack"]}];
|
||||||
|
implementors["tower_test"] = [{"text":"impl<T, U> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/std/panic/trait.RefUnwindSafe.html\" title=\"trait std::panic::RefUnwindSafe\">RefUnwindSafe</a> for <a class=\"struct\" href=\"tower_test/mock/struct.Mock.html\" title=\"struct tower_test::mock::Mock\">Mock</a><T, U>","synthetic":true,"types":["tower_test::mock::Mock"]},{"text":"impl<T, U> !<a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/std/panic/trait.RefUnwindSafe.html\" title=\"trait std::panic::RefUnwindSafe\">RefUnwindSafe</a> for <a class=\"struct\" href=\"tower_test/mock/struct.Handle.html\" title=\"struct tower_test::mock::Handle\">Handle</a><T, U>","synthetic":true,"types":["tower_test::mock::Handle"]},{"text":"impl<T> !<a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/std/panic/trait.RefUnwindSafe.html\" title=\"trait std::panic::RefUnwindSafe\">RefUnwindSafe</a> for <a class=\"struct\" href=\"tower_test/mock/struct.SendResponse.html\" title=\"struct tower_test::mock::SendResponse\">SendResponse</a><T>","synthetic":true,"types":["tower_test::mock::SendResponse"]},{"text":"impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/std/panic/trait.RefUnwindSafe.html\" title=\"trait std::panic::RefUnwindSafe\">RefUnwindSafe</a> for <a class=\"struct\" href=\"tower_test/mock/error/struct.Closed.html\" title=\"struct tower_test::mock::error::Closed\">Closed</a>","synthetic":true,"types":["tower_test::mock::error::Closed"]},{"text":"impl<T> !<a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/std/panic/trait.RefUnwindSafe.html\" title=\"trait std::panic::RefUnwindSafe\">RefUnwindSafe</a> for <a class=\"struct\" href=\"tower_test/mock/future/struct.ResponseFuture.html\" title=\"struct tower_test::mock::future::ResponseFuture\">ResponseFuture</a><T>","synthetic":true,"types":["tower_test::mock::future::ResponseFuture"]},{"text":"impl<T> !<a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/std/panic/trait.RefUnwindSafe.html\" title=\"trait std::panic::RefUnwindSafe\">RefUnwindSafe</a> for <a class=\"struct\" href=\"tower_test/mock/spawn/struct.Spawn.html\" title=\"struct tower_test::mock::spawn::Spawn\">Spawn</a><T>","synthetic":true,"types":["tower_test::mock::spawn::Spawn"]}];
|
||||||
|
if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
|
|
@ -0,0 +1,5 @@
|
||||||
|
(function() {var implementors = {};
|
||||||
|
implementors["tower"] = [{"text":"impl<L> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/std/panic/trait.UnwindSafe.html\" title=\"trait std::panic::UnwindSafe\">UnwindSafe</a> for <a class=\"struct\" href=\"tower/builder/struct.ServiceBuilder.html\" title=\"struct tower::builder::ServiceBuilder\">ServiceBuilder</a><L> <span class=\"where fmt-newline\">where<br> L: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/std/panic/trait.UnwindSafe.html\" title=\"trait std::panic::UnwindSafe\">UnwindSafe</a>, </span>","synthetic":true,"types":["tower::builder::ServiceBuilder"]}];
|
||||||
|
implementors["tower_layer"] = [{"text":"impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/std/panic/trait.UnwindSafe.html\" title=\"trait std::panic::UnwindSafe\">UnwindSafe</a> for <a class=\"struct\" href=\"tower_layer/struct.Identity.html\" title=\"struct tower_layer::Identity\">Identity</a>","synthetic":true,"types":["tower_layer::identity::Identity"]},{"text":"impl<Inner, Outer> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/std/panic/trait.UnwindSafe.html\" title=\"trait std::panic::UnwindSafe\">UnwindSafe</a> for <a class=\"struct\" href=\"tower_layer/struct.Stack.html\" title=\"struct tower_layer::Stack\">Stack</a><Inner, Outer> <span class=\"where fmt-newline\">where<br> Inner: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/std/panic/trait.UnwindSafe.html\" title=\"trait std::panic::UnwindSafe\">UnwindSafe</a>,<br> Outer: <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/std/panic/trait.UnwindSafe.html\" title=\"trait std::panic::UnwindSafe\">UnwindSafe</a>, </span>","synthetic":true,"types":["tower_layer::stack::Stack"]}];
|
||||||
|
implementors["tower_test"] = [{"text":"impl<T, U> <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/std/panic/trait.UnwindSafe.html\" title=\"trait std::panic::UnwindSafe\">UnwindSafe</a> for <a class=\"struct\" href=\"tower_test/mock/struct.Mock.html\" title=\"struct tower_test::mock::Mock\">Mock</a><T, U>","synthetic":true,"types":["tower_test::mock::Mock"]},{"text":"impl<T, U> !<a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/std/panic/trait.UnwindSafe.html\" title=\"trait std::panic::UnwindSafe\">UnwindSafe</a> for <a class=\"struct\" href=\"tower_test/mock/struct.Handle.html\" title=\"struct tower_test::mock::Handle\">Handle</a><T, U>","synthetic":true,"types":["tower_test::mock::Handle"]},{"text":"impl<T> !<a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/std/panic/trait.UnwindSafe.html\" title=\"trait std::panic::UnwindSafe\">UnwindSafe</a> for <a class=\"struct\" href=\"tower_test/mock/struct.SendResponse.html\" title=\"struct tower_test::mock::SendResponse\">SendResponse</a><T>","synthetic":true,"types":["tower_test::mock::SendResponse"]},{"text":"impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/std/panic/trait.UnwindSafe.html\" title=\"trait std::panic::UnwindSafe\">UnwindSafe</a> for <a class=\"struct\" href=\"tower_test/mock/error/struct.Closed.html\" title=\"struct tower_test::mock::error::Closed\">Closed</a>","synthetic":true,"types":["tower_test::mock::error::Closed"]},{"text":"impl<T> !<a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/std/panic/trait.UnwindSafe.html\" title=\"trait std::panic::UnwindSafe\">UnwindSafe</a> for <a class=\"struct\" href=\"tower_test/mock/future/struct.ResponseFuture.html\" title=\"struct tower_test::mock::future::ResponseFuture\">ResponseFuture</a><T>","synthetic":true,"types":["tower_test::mock::future::ResponseFuture"]},{"text":"impl<T> !<a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/std/panic/trait.UnwindSafe.html\" title=\"trait std::panic::UnwindSafe\">UnwindSafe</a> for <a class=\"struct\" href=\"tower_test/mock/spawn/struct.Spawn.html\" title=\"struct tower_test::mock::spawn::Spawn\">Spawn</a><T>","synthetic":true,"types":["tower_test::mock::spawn::Spawn"]}];
|
||||||
|
if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
|
|
@ -0,0 +1,3 @@
|
||||||
|
(function() {var implementors = {};
|
||||||
|
implementors["tower"] = [];
|
||||||
|
if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
|
|
@ -0,0 +1,3 @@
|
||||||
|
(function() {var implementors = {};
|
||||||
|
implementors["tower"] = [];
|
||||||
|
if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
|
|
@ -0,0 +1,3 @@
|
||||||
|
(function() {var implementors = {};
|
||||||
|
implementors["tower_layer"] = [];
|
||||||
|
if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
|
|
@ -0,0 +1,4 @@
|
||||||
|
(function() {var implementors = {};
|
||||||
|
implementors["tower_service"] = [];
|
||||||
|
implementors["tower_test"] = [{"text":"impl<T, U> <a class=\"trait\" href=\"tower_service/trait.Service.html\" title=\"trait tower_service::Service\">Service</a><T> for <a class=\"struct\" href=\"tower_test/mock/struct.Mock.html\" title=\"struct tower_test::mock::Mock\">Mock</a><T, U>","synthetic":false,"types":["tower_test::mock::Mock"]}];
|
||||||
|
if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
|
|
@ -0,0 +1,2 @@
|
||||||
|
/*! normalize.css v3.0.0 | MIT License | git.io/normalize */
|
||||||
|
html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}
|
|
@ -0,0 +1 @@
|
||||||
|
#main>h2+div,#main>h2+h3,#main>h3+div{display:block;}.loading-content{display:none;}#main>h2+div,#main>h3+div{display:block;}#main>h2+h3{display:flex;}
|
Binary file not shown.
After Width: | Height: | Size: 5.6 KiB |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -0,0 +1 @@
|
||||||
|
.setting-line{padding:5px;position:relative;}.setting-line>div{max-width:calc(100% - 74px);display:inline-block;vertical-align:top;font-size:17px;padding-top:2px;}.setting-line>.title{font-size:19px;width:100%;max-width:none;border-bottom:1px solid;}.toggle{position:relative;display:inline-block;width:45px;height:27px;margin-right:20px;}.toggle input{display:none;}.slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;-webkit-transition:.3s;transition:.3s;}.slider:before{position:absolute;content:"";height:19px;width:19px;left:4px;bottom:4px;background-color:white;-webkit-transition:.3s;transition:.3s;}input:checked+.slider{background-color:#2196F3;}input:focus+.slider{box-shadow:0 0 1px #2196F3;}input:checked+.slider:before{-webkit-transform:translateX(19px);-ms-transform:translateX(19px);transform:translateX(19px);}.setting-line>.sub-settings{padding-left:42px;width:100%;display:block;}
|
|
@ -0,0 +1,2 @@
|
||||||
|
<!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="Settings of Rustdoc"><meta name="keywords" content="rust, rustlang, rust-lang"><title>Rustdoc settings</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="./settings.css"><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><noscript><link rel="stylesheet" href="./noscript.css"></noscript><link rel="shortcut icon" href="./favicon.ico"><style type="text/css">#crate-search{background-image:url("./down-arrow.svg");}</style></head><body class="rustdoc mod"><!--[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">☰</div><a href='./tower_test/index.html'><div class='logo-container'><img src='./rust-logo.png' alt='logo'></div></a><p class='location'>Settings</p><div class='sidebar-elems'></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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"><h1 class='fqn'><span class='in-band'>Rustdoc settings</span></h1><div class='settings'><div class='setting-line'><div class='title'>Auto-hide item declarations</div><div class='sub-settings'><div class='setting-line'><label class='toggle'><input type='checkbox' id='auto-hide-struct' checked><span class='slider'></span></label><div>Auto-hide structs declaration</div></div><div class='setting-line'><label class='toggle'><input type='checkbox' id='auto-hide-enum' ><span class='slider'></span></label><div>Auto-hide enums declaration</div></div><div class='setting-line'><label class='toggle'><input type='checkbox' id='auto-hide-union' checked><span class='slider'></span></label><div>Auto-hide unions declaration</div></div><div class='setting-line'><label class='toggle'><input type='checkbox' id='auto-hide-trait' checked><span class='slider'></span></label><div>Auto-hide traits declaration</div></div><div class='setting-line'><label class='toggle'><input type='checkbox' id='auto-hide-macro' ><span class='slider'></span></label><div>Auto-hide macros declaration</div></div></div>
|
||||||
|
</div><div class='setting-line'><label class='toggle'><input type='checkbox' id='auto-hide-attributes' checked><span class='slider'></span></label><div>Auto-hide item attributes.</div></div><div class='setting-line'><label class='toggle'><input type='checkbox' id='auto-hide-method-docs' ><span class='slider'></span></label><div>Auto-hide item methods' documentation</div></div><div class='setting-line'><label class='toggle'><input type='checkbox' id='auto-hide-trait-implementations' checked><span class='slider'></span></label><div>Auto-hide trait implementations documentation</div></div><div class='setting-line'><label class='toggle'><input type='checkbox' id='go-to-only-result' ><span class='slider'></span></label><div>Directly go to item in search if there is only one result</div></div><div class='setting-line'><label class='toggle'><input type='checkbox' id='line-numbers' ><span class='slider'></span></label><div>Show line numbers on code examples</div></div><div class='setting-line'><label class='toggle'><input type='checkbox' id='disable-shortcuts' ><span class='slider'></span></label><div>Disable keyboard shortcuts</div></div></div><script src='./settings.js'></script></section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "./";window.currentCrate = "tower_test";</script><script src="./aliases.js"></script><script src="./main.js"></script><script defer src="./search-index.js"></script></body></html>
|
|
@ -0,0 +1 @@
|
||||||
|
(function(){function changeSetting(settingName,isEnabled){updateLocalStorage('rustdoc-'+settingName,isEnabled)}function getSettingValue(settingName){return getCurrentValue('rustdoc-'+settingName)}function setEvents(){var elems=document.getElementsByClassName("slider");if(!elems||elems.length===0){return}for(var i=0;i<elems.length;++i){var toggle=elems[i].previousElementSibling;var settingId=toggle.id;var settingValue=getSettingValue(settingId);if(settingValue!==null){toggle.checked=settingValue==="true"}toggle.onchange=function(){changeSetting(this.id,this.checked)}}}setEvents()})()
|
|
@ -0,0 +1,6 @@
|
||||||
|
var N = null;var sourcesIndex = {};
|
||||||
|
sourcesIndex["tower"] = {"name":"","dirs":[{"name":"builder","files":["mod.rs"]}],"files":["layer.rs","lib.rs"]};
|
||||||
|
sourcesIndex["tower_layer"] = {"name":"","files":["identity.rs","lib.rs","stack.rs"]};
|
||||||
|
sourcesIndex["tower_service"] = {"name":"","files":["lib.rs"]};
|
||||||
|
sourcesIndex["tower_test"] = {"name":"","dirs":[{"name":"mock","files":["error.rs","future.rs","mod.rs","spawn.rs"]}],"files":["lib.rs","macros.rs"]};
|
||||||
|
createSourceSidebar();
|
|
@ -0,0 +1 @@
|
||||||
|
function getCurrentFilePath(){var parts=window.location.pathname.split("/");var rootPathParts=window.rootPath.split("/");for(var i=0;i<rootPathParts.length;++i){if(rootPathParts[i]===".."){parts.pop()}}var file=window.location.pathname.substring(parts.join("/").length);if(file.startsWith("/")){file=file.substring(1)}return file.substring(0,file.length-5)}function createDirEntry(elem,parent,fullPath,currentFile,hasFoundFile){var name=document.createElement("div");name.className="name";fullPath+=elem["name"]+"/";name.onclick=function(){if(hasClass(this,"expand")){removeClass(this,"expand")}else{addClass(this,"expand")}};name.innerText=elem["name"];var children=document.createElement("div");children.className="children";var folders=document.createElement("div");folders.className="folders";if(elem.dirs){for(var i=0;i<elem.dirs.length;++i){if(createDirEntry(elem.dirs[i],folders,fullPath,currentFile,hasFoundFile)===true){addClass(name,"expand");hasFoundFile=true}}}children.appendChild(folders);var files=document.createElement("div");files.className="files";if(elem.files){for(i=0;i<elem.files.length;++i){var file=document.createElement("a");file.innerText=elem.files[i];file.href=window.rootPath+"src/"+fullPath+elem.files[i]+".html";if(hasFoundFile===false&¤tFile===fullPath+elem.files[i]){file.className="selected";addClass(name,"expand");hasFoundFile=true}files.appendChild(file)}}search.fullPath=fullPath;children.appendChild(files);parent.appendChild(name);parent.appendChild(children);return hasFoundFile===true&¤tFile.startsWith(fullPath)}function toggleSidebar(){var sidebar=document.getElementById("source-sidebar");var child=this.children[0].children[0];if(child.innerText===">"){sidebar.style.left="";this.style.left="";child.innerText="<";updateLocalStorage("rustdoc-source-sidebar-show","true")}else{sidebar.style.left="-300px";this.style.left="0";child.innerText=">";updateLocalStorage("rustdoc-source-sidebar-show","false")}}function createSidebarToggle(){var sidebarToggle=document.createElement("div");sidebarToggle.id="sidebar-toggle";sidebarToggle.onclick=toggleSidebar;var inner1=document.createElement("div");inner1.style.position="relative";var inner2=document.createElement("div");inner2.style.paddingTop="3px";if(getCurrentValue("rustdoc-source-sidebar-show")==="true"){inner2.innerText="<"}else{inner2.innerText=">";sidebarToggle.style.left="0"}inner1.appendChild(inner2);sidebarToggle.appendChild(inner1);return sidebarToggle}function createSourceSidebar(){if(window.rootPath.endsWith("/")===false){window.rootPath+="/"}var main=document.getElementById("main");var sidebarToggle=createSidebarToggle();main.insertBefore(sidebarToggle,main.firstChild);var sidebar=document.createElement("div");sidebar.id="source-sidebar";if(getCurrentValue("rustdoc-source-sidebar-show")!=="true"){sidebar.style.left="-300px"}var currentFile=getCurrentFilePath();var hasFoundFile=false;var title=document.createElement("div");title.className="title";title.innerText="Files";sidebar.appendChild(title);Object.keys(sourcesIndex).forEach(function(key){sourcesIndex[key].name=key;hasFoundFile=createDirEntry(sourcesIndex[key],sidebar,"",currentFile,hasFoundFile)});main.insertBefore(sidebar,main.firstChild)}
|
|
@ -0,0 +1,467 @@
|
||||||
|
<!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 `tower/src/builder/mod.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>mod.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><noscript><link rel="stylesheet" href="../../../noscript.css"></noscript><link rel="shortcut icon" href="../../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../../down-arrow.svg");}</style></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">☰</div><a href='../../../tower/index.html'><div class='logo-container'><img src='../../../rust-logo.png' alt='logo'></div></a></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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>
|
||||||
|
</pre><div class="example-wrap"><pre class="rust ">
|
||||||
|
<span class="doccomment">//! Builder types to compose layers and services</span>
|
||||||
|
|
||||||
|
<span class="kw">use</span> <span class="ident">tower_layer</span>::{<span class="ident">Identity</span>, <span class="ident">Layer</span>, <span class="ident">Stack</span>};
|
||||||
|
|
||||||
|
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">fmt</span>;
|
||||||
|
|
||||||
|
<span class="doccomment">/// Declaratively construct Service values.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// `ServiceBuilder` provides a [builder-like interface][builder] for composing</span>
|
||||||
|
<span class="doccomment">/// layers to be applied to a `Service`.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// # Service</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// A [`Service`](tower_service::Service) is a trait representing an</span>
|
||||||
|
<span class="doccomment">/// asynchronous function of a request to a response. It is similar to `async</span>
|
||||||
|
<span class="doccomment">/// fn(Request) -> Result<Response, Error>`.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// A `Service` is typically bound to a single transport, such as a TCP</span>
|
||||||
|
<span class="doccomment">/// connection. It defines how _all_ inbound or outbound requests are handled</span>
|
||||||
|
<span class="doccomment">/// by that connection.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// [builder]: https://doc.rust-lang.org/1.0.0/style/ownership/builders.html</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// # Order</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// The order in which layers are added impacts how requests are handled. Layers</span>
|
||||||
|
<span class="doccomment">/// that are added first will be called with the request first. The argument to</span>
|
||||||
|
<span class="doccomment">/// `service` will be last to see the request.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// ```</span>
|
||||||
|
<span class="doccomment">/// # // this (and other) doctest is ignored because we don't have a way</span>
|
||||||
|
<span class="doccomment">/// # // to say that it should only be run with cfg(feature = "...")</span>
|
||||||
|
<span class="doccomment">/// # use tower::Service;</span>
|
||||||
|
<span class="doccomment">/// # use tower::builder::ServiceBuilder;</span>
|
||||||
|
<span class="doccomment">/// #[cfg(all(feature = "buffer", feature = "limit"))]</span>
|
||||||
|
<span class="doccomment">/// # async fn wrap<S>(svc: S) where S: Service<(), Error = &'static str> + 'static + Send, S::Future: Send {</span>
|
||||||
|
<span class="doccomment">/// ServiceBuilder::new()</span>
|
||||||
|
<span class="doccomment">/// .buffer(100)</span>
|
||||||
|
<span class="doccomment">/// .concurrency_limit(10)</span>
|
||||||
|
<span class="doccomment">/// .service(svc)</span>
|
||||||
|
<span class="doccomment">/// # ;</span>
|
||||||
|
<span class="doccomment">/// # }</span>
|
||||||
|
<span class="doccomment">/// ```</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// In the above example, the buffer layer receives the request first followed</span>
|
||||||
|
<span class="doccomment">/// by `concurrency_limit`. `buffer` enables up to 100 request to be in-flight</span>
|
||||||
|
<span class="doccomment">/// **on top of** the requests that have already been forwarded to the next</span>
|
||||||
|
<span class="doccomment">/// layer. Combined with `concurrency_limit`, this allows up to 110 requests to be</span>
|
||||||
|
<span class="doccomment">/// in-flight.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// ```</span>
|
||||||
|
<span class="doccomment">/// # use tower::Service;</span>
|
||||||
|
<span class="doccomment">/// # use tower::builder::ServiceBuilder;</span>
|
||||||
|
<span class="doccomment">/// #[cfg(all(feature = "buffer", feature = "limit"))]</span>
|
||||||
|
<span class="doccomment">/// # async fn wrap<S>(svc: S) where S: Service<(), Error = &'static str> + 'static + Send, S::Future: Send {</span>
|
||||||
|
<span class="doccomment">/// ServiceBuilder::new()</span>
|
||||||
|
<span class="doccomment">/// .concurrency_limit(10)</span>
|
||||||
|
<span class="doccomment">/// .buffer(100)</span>
|
||||||
|
<span class="doccomment">/// .service(svc)</span>
|
||||||
|
<span class="doccomment">/// # ;</span>
|
||||||
|
<span class="doccomment">/// # }</span>
|
||||||
|
<span class="doccomment">/// ```</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// The above example is similar, but the order of layers is reversed. Now,</span>
|
||||||
|
<span class="doccomment">/// `concurrency_limit` applies first and only allows 10 requests to be in-flight</span>
|
||||||
|
<span class="doccomment">/// total.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// # Examples</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// A `Service` stack with a single layer:</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// ```</span>
|
||||||
|
<span class="doccomment">/// # use tower::Service;</span>
|
||||||
|
<span class="doccomment">/// # use tower::builder::ServiceBuilder;</span>
|
||||||
|
<span class="doccomment">/// # #[cfg(feature = "limit")]</span>
|
||||||
|
<span class="doccomment">/// # use tower::limit::concurrency::ConcurrencyLimitLayer;</span>
|
||||||
|
<span class="doccomment">/// #[cfg(feature = "limit")]</span>
|
||||||
|
<span class="doccomment">/// # async fn wrap<S>(svc: S) where S: Service<(), Error = &'static str> + 'static + Send, S::Future: Send {</span>
|
||||||
|
<span class="doccomment">/// ServiceBuilder::new()</span>
|
||||||
|
<span class="doccomment">/// .concurrency_limit(5)</span>
|
||||||
|
<span class="doccomment">/// .service(svc);</span>
|
||||||
|
<span class="doccomment">/// # ;</span>
|
||||||
|
<span class="doccomment">/// # }</span>
|
||||||
|
<span class="doccomment">/// ```</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// A `Service` stack with _multiple_ layers that contain rate limiting,</span>
|
||||||
|
<span class="doccomment">/// in-flight request limits, and a channel-backed, clonable `Service`:</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// ```</span>
|
||||||
|
<span class="doccomment">/// # use tower::Service;</span>
|
||||||
|
<span class="doccomment">/// # use tower::builder::ServiceBuilder;</span>
|
||||||
|
<span class="doccomment">/// # use std::time::Duration;</span>
|
||||||
|
<span class="doccomment">/// #[cfg(all(feature = "buffer", feature = "limit"))]</span>
|
||||||
|
<span class="doccomment">/// # async fn wrap<S>(svc: S) where S: Service<(), Error = &'static str> + 'static + Send, S::Future: Send {</span>
|
||||||
|
<span class="doccomment">/// ServiceBuilder::new()</span>
|
||||||
|
<span class="doccomment">/// .buffer(5)</span>
|
||||||
|
<span class="doccomment">/// .concurrency_limit(5)</span>
|
||||||
|
<span class="doccomment">/// .rate_limit(5, Duration::from_secs(1))</span>
|
||||||
|
<span class="doccomment">/// .service(svc);</span>
|
||||||
|
<span class="doccomment">/// # ;</span>
|
||||||
|
<span class="doccomment">/// # }</span>
|
||||||
|
<span class="doccomment">/// ```</span>
|
||||||
|
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Clone</span>)]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">ServiceBuilder</span><span class="op"><</span><span class="ident">L</span><span class="op">></span> {
|
||||||
|
<span class="ident">layer</span>: <span class="ident">L</span>,
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">impl</span> <span class="ident">ServiceBuilder</span><span class="op"><</span><span class="ident">Identity</span><span class="op">></span> {
|
||||||
|
<span class="doccomment">/// Create a new `ServiceBuilder`.</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">new</span>() <span class="op">-</span><span class="op">></span> <span class="self">Self</span> {
|
||||||
|
<span class="ident">ServiceBuilder</span> {
|
||||||
|
<span class="ident">layer</span>: <span class="ident">Identity</span>::<span class="ident">new</span>(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">impl</span><span class="op"><</span><span class="ident">L</span><span class="op">></span> <span class="ident">ServiceBuilder</span><span class="op"><</span><span class="ident">L</span><span class="op">></span> {
|
||||||
|
<span class="doccomment">/// Add a new layer `T` into the `ServiceBuilder`.</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">layer</span><span class="op"><</span><span class="ident">T</span><span class="op">></span>(<span class="self">self</span>, <span class="ident">layer</span>: <span class="ident">T</span>) <span class="op">-</span><span class="op">></span> <span class="ident">ServiceBuilder</span><span class="op"><</span><span class="ident">Stack</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">L</span><span class="op">></span><span class="op">></span> {
|
||||||
|
<span class="ident">ServiceBuilder</span> {
|
||||||
|
<span class="ident">layer</span>: <span class="ident">Stack</span>::<span class="ident">new</span>(<span class="ident">layer</span>, <span class="self">self</span>.<span class="ident">layer</span>),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// Buffer requests when when the next layer is out of capacity.</span>
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"buffer"</span>)]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">buffer</span><span class="op"><</span><span class="ident">Request</span><span class="op">></span>(
|
||||||
|
<span class="self">self</span>,
|
||||||
|
<span class="ident">bound</span>: <span class="ident">usize</span>,
|
||||||
|
) <span class="op">-</span><span class="op">></span> <span class="ident">ServiceBuilder</span><span class="op"><</span><span class="ident">Stack</span><span class="op"><</span><span class="kw">crate</span>::<span class="ident">buffer</span>::<span class="ident">BufferLayer</span><span class="op"><</span><span class="ident">Request</span><span class="op">></span>, <span class="ident">L</span><span class="op">></span><span class="op">></span> {
|
||||||
|
<span class="self">self</span>.<span class="ident">layer</span>(<span class="kw">crate</span>::<span class="ident">buffer</span>::<span class="ident">BufferLayer</span>::<span class="ident">new</span>(<span class="ident">bound</span>))
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// Limit the max number of in-flight requests.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// A request is in-flight from the time the request is received until the</span>
|
||||||
|
<span class="doccomment">/// response future completes. This includes the time spent in the next</span>
|
||||||
|
<span class="doccomment">/// layers.</span>
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"limit"</span>)]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">concurrency_limit</span>(
|
||||||
|
<span class="self">self</span>,
|
||||||
|
<span class="ident">max</span>: <span class="ident">usize</span>,
|
||||||
|
) <span class="op">-</span><span class="op">></span> <span class="ident">ServiceBuilder</span><span class="op"><</span><span class="ident">Stack</span><span class="op"><</span><span class="kw">crate</span>::<span class="ident">limit</span>::<span class="ident">ConcurrencyLimitLayer</span>, <span class="ident">L</span><span class="op">></span><span class="op">></span> {
|
||||||
|
<span class="self">self</span>.<span class="ident">layer</span>(<span class="kw">crate</span>::<span class="ident">limit</span>::<span class="ident">ConcurrencyLimitLayer</span>::<span class="ident">new</span>(<span class="ident">max</span>))
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// Drop requests when the next layer is unable to respond to requests.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// Usually, when a layer or service does not have capacity to process a</span>
|
||||||
|
<span class="doccomment">/// request (i.e., `poll_ready` returns `NotReady`), the caller waits until</span>
|
||||||
|
<span class="doccomment">/// capacity becomes available.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// `load_shed` immediately responds with an error when the next layer is</span>
|
||||||
|
<span class="doccomment">/// out of capacity.</span>
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"load-shed"</span>)]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">load_shed</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="ident">ServiceBuilder</span><span class="op"><</span><span class="ident">Stack</span><span class="op"><</span><span class="kw">crate</span>::<span class="ident">load_shed</span>::<span class="ident">LoadShedLayer</span>, <span class="ident">L</span><span class="op">></span><span class="op">></span> {
|
||||||
|
<span class="self">self</span>.<span class="ident">layer</span>(<span class="kw">crate</span>::<span class="ident">load_shed</span>::<span class="ident">LoadShedLayer</span>::<span class="ident">new</span>())
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// Limit requests to at most `num` per the given duration</span>
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"limit"</span>)]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">rate_limit</span>(
|
||||||
|
<span class="self">self</span>,
|
||||||
|
<span class="ident">num</span>: <span class="ident">u64</span>,
|
||||||
|
<span class="ident">per</span>: <span class="ident">std</span>::<span class="ident">time</span>::<span class="ident">Duration</span>,
|
||||||
|
) <span class="op">-</span><span class="op">></span> <span class="ident">ServiceBuilder</span><span class="op"><</span><span class="ident">Stack</span><span class="op"><</span><span class="kw">crate</span>::<span class="ident">limit</span>::<span class="ident">RateLimitLayer</span>, <span class="ident">L</span><span class="op">></span><span class="op">></span> {
|
||||||
|
<span class="self">self</span>.<span class="ident">layer</span>(<span class="kw">crate</span>::<span class="ident">limit</span>::<span class="ident">RateLimitLayer</span>::<span class="ident">new</span>(<span class="ident">num</span>, <span class="ident">per</span>))
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// Retry failed requests.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// `policy` must implement [`Policy`].</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// [`Policy`]: ../retry/trait.Policy.html</span>
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"retry"</span>)]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">retry</span><span class="op"><</span><span class="ident">P</span><span class="op">></span>(<span class="self">self</span>, <span class="ident">policy</span>: <span class="ident">P</span>) <span class="op">-</span><span class="op">></span> <span class="ident">ServiceBuilder</span><span class="op"><</span><span class="ident">Stack</span><span class="op"><</span><span class="kw">crate</span>::<span class="ident">retry</span>::<span class="ident">RetryLayer</span><span class="op"><</span><span class="ident">P</span><span class="op">></span>, <span class="ident">L</span><span class="op">></span><span class="op">></span> {
|
||||||
|
<span class="self">self</span>.<span class="ident">layer</span>(<span class="kw">crate</span>::<span class="ident">retry</span>::<span class="ident">RetryLayer</span>::<span class="ident">new</span>(<span class="ident">policy</span>))
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// Fail requests that take longer than `timeout`.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// If the next layer takes more than `timeout` to respond to a request,</span>
|
||||||
|
<span class="doccomment">/// processing is terminated and an error is returned.</span>
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"timeout"</span>)]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">timeout</span>(
|
||||||
|
<span class="self">self</span>,
|
||||||
|
<span class="ident">timeout</span>: <span class="ident">std</span>::<span class="ident">time</span>::<span class="ident">Duration</span>,
|
||||||
|
) <span class="op">-</span><span class="op">></span> <span class="ident">ServiceBuilder</span><span class="op"><</span><span class="ident">Stack</span><span class="op"><</span><span class="kw">crate</span>::<span class="ident">timeout</span>::<span class="ident">TimeoutLayer</span>, <span class="ident">L</span><span class="op">></span><span class="op">></span> {
|
||||||
|
<span class="self">self</span>.<span class="ident">layer</span>(<span class="kw">crate</span>::<span class="ident">timeout</span>::<span class="ident">TimeoutLayer</span>::<span class="ident">new</span>(<span class="ident">timeout</span>))
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// Map one request type to another.</span>
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"util"</span>)]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">map_request</span><span class="op"><</span><span class="ident">F</span>, <span class="ident">R1</span>, <span class="ident">R2</span><span class="op">></span>(
|
||||||
|
<span class="self">self</span>,
|
||||||
|
<span class="ident">f</span>: <span class="ident">F</span>,
|
||||||
|
) <span class="op">-</span><span class="op">></span> <span class="ident">ServiceBuilder</span><span class="op"><</span><span class="ident">Stack</span><span class="op"><</span><span class="kw">crate</span>::<span class="ident">util</span>::<span class="ident">MapRequestLayer</span><span class="op"><</span><span class="ident">F</span><span class="op">></span>, <span class="ident">L</span><span class="op">></span><span class="op">></span>
|
||||||
|
<span class="kw">where</span>
|
||||||
|
<span class="ident">F</span>: <span class="ident">Fn</span>(<span class="ident">R1</span>) <span class="op">-</span><span class="op">></span> <span class="ident">R2</span>,
|
||||||
|
{
|
||||||
|
<span class="self">self</span>.<span class="ident">layer</span>(<span class="kw">crate</span>::<span class="ident">util</span>::<span class="ident">MapRequestLayer</span>::<span class="ident">new</span>(<span class="ident">f</span>))
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// Map one response type to another.</span>
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"util"</span>)]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">map_response</span><span class="op"><</span><span class="ident">F</span><span class="op">></span>(
|
||||||
|
<span class="self">self</span>,
|
||||||
|
<span class="ident">f</span>: <span class="ident">F</span>,
|
||||||
|
) <span class="op">-</span><span class="op">></span> <span class="ident">ServiceBuilder</span><span class="op"><</span><span class="ident">Stack</span><span class="op"><</span><span class="kw">crate</span>::<span class="ident">util</span>::<span class="ident">MapResponseLayer</span><span class="op"><</span><span class="ident">F</span><span class="op">></span>, <span class="ident">L</span><span class="op">></span><span class="op">></span> {
|
||||||
|
<span class="self">self</span>.<span class="ident">layer</span>(<span class="kw">crate</span>::<span class="ident">util</span>::<span class="ident">MapResponseLayer</span>::<span class="ident">new</span>(<span class="ident">f</span>))
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// Obtains the underlying `Layer` implementation.</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">into_inner</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="ident">L</span> {
|
||||||
|
<span class="self">self</span>.<span class="ident">layer</span>
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// Wrap the service `S` with the layers.</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">service</span><span class="op"><</span><span class="ident">S</span><span class="op">></span>(<span class="self">self</span>, <span class="ident">service</span>: <span class="ident">S</span>) <span class="op">-</span><span class="op">></span> <span class="ident">L</span>::<span class="ident">Service</span>
|
||||||
|
<span class="kw">where</span>
|
||||||
|
<span class="ident">L</span>: <span class="ident">Layer</span><span class="op"><</span><span class="ident">S</span><span class="op">></span>,
|
||||||
|
{
|
||||||
|
<span class="self">self</span>.<span class="ident">layer</span>.<span class="ident">layer</span>(<span class="ident">service</span>)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">impl</span><span class="op"><</span><span class="ident">L</span>: <span class="ident">fmt</span>::<span class="ident">Debug</span><span class="op">></span> <span class="ident">fmt</span>::<span class="ident">Debug</span> <span class="kw">for</span> <span class="ident">ServiceBuilder</span><span class="op"><</span><span class="ident">L</span><span class="op">></span> {
|
||||||
|
<span class="kw">fn</span> <span class="ident">fmt</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">f</span>: <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">fmt</span>::<span class="ident">Formatter</span><span class="op"><</span><span class="lifetime">'_</span><span class="op">></span>) <span class="op">-</span><span class="op">></span> <span class="ident">fmt</span>::<span class="prelude-ty">Result</span> {
|
||||||
|
<span class="ident">f</span>.<span class="ident">debug_tuple</span>(<span class="string">"ServiceBuilder"</span>).<span class="ident">field</span>(<span class="kw-2">&</span><span class="self">self</span>.<span class="ident">layer</span>).<span class="ident">finish</span>()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</pre></div>
|
||||||
|
</section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../../";window.currentCrate = "tower";</script><script src="../../../aliases.js"></script><script src="../../../main.js"></script><script src="../../../source-script.js"></script><script src="../../../source-files.js"></script><script defer src="../../../search-index.js"></script></body></html>
|
|
@ -0,0 +1,19 @@
|
||||||
|
<!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 `tower/src/layer.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>layer.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><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="shortcut icon" href="../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></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">☰</div><a href='../../tower/index.html'><div class='logo-container'><img src='../../rust-logo.png' alt='logo'></div></a></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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>
|
||||||
|
</pre><div class="example-wrap"><pre class="rust ">
|
||||||
|
<span class="doccomment">//! A collection of `Layer` based tower services</span>
|
||||||
|
|
||||||
|
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">tower_layer</span>::<span class="ident">Layer</span>;
|
||||||
|
|
||||||
|
<span class="doccomment">/// `util` exports an Identity Layer and Chain, a mechanism for chaining them.</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">util</span> {
|
||||||
|
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">tower_layer</span>::{<span class="ident">Identity</span>, <span class="ident">Stack</span>};
|
||||||
|
}
|
||||||
|
</pre></div>
|
||||||
|
</section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../";window.currentCrate = "tower";</script><script src="../../aliases.js"></script><script src="../../main.js"></script><script src="../../source-script.js"></script><script src="../../source-files.js"></script><script defer src="../../search-index.js"></script></body></html>
|
|
@ -0,0 +1,175 @@
|
||||||
|
<!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 `tower/src/lib.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>lib.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><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="shortcut icon" href="../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></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">☰</div><a href='../../tower/index.html'><div class='logo-container'><img src='../../rust-logo.png' alt='logo'></div></a></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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>
|
||||||
|
</pre><div class="example-wrap"><pre class="rust ">
|
||||||
|
<span class="attribute">#![<span class="ident">doc</span>(<span class="ident">html_root_url</span> <span class="op">=</span> <span class="string">"https://docs.rs/tower/0.3.1"</span>)]</span>
|
||||||
|
<span class="attribute">#![<span class="ident">warn</span>(
|
||||||
|
<span class="ident">missing_debug_implementations</span>,
|
||||||
|
<span class="ident">missing_docs</span>,
|
||||||
|
<span class="ident">rust_2018_idioms</span>,
|
||||||
|
<span class="ident">unreachable_pub</span>
|
||||||
|
)]</span>
|
||||||
|
<span class="attribute">#![<span class="ident">allow</span>(<span class="ident">elided_lifetimes_in_paths</span>)]</span>
|
||||||
|
<span class="attribute">#![<span class="ident">cfg_attr</span>(<span class="ident">docsrs</span>, <span class="ident">feature</span>(<span class="ident">doc_cfg</span>))]</span>
|
||||||
|
|
||||||
|
<span class="doccomment">//! `fn(Request) -> Future<Response>`</span>
|
||||||
|
<span class="doccomment">//!</span>
|
||||||
|
<span class="doccomment">//! Tower is a library of modular and reusable components for building</span>
|
||||||
|
<span class="doccomment">//! robust networking clients and servers.</span>
|
||||||
|
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"balance"</span>)]</span>
|
||||||
|
<span class="attribute">#[<span class="ident">cfg_attr</span>(<span class="ident">docsrs</span>, <span class="ident">doc</span>(<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"balance"</span>)))]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">balance</span>;
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"buffer"</span>)]</span>
|
||||||
|
<span class="attribute">#[<span class="ident">cfg_attr</span>(<span class="ident">docsrs</span>, <span class="ident">doc</span>(<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"buffer"</span>)))]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">buffer</span>;
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"discover"</span>)]</span>
|
||||||
|
<span class="attribute">#[<span class="ident">cfg_attr</span>(<span class="ident">docsrs</span>, <span class="ident">doc</span>(<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"discover"</span>)))]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">discover</span>;
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"filter"</span>)]</span>
|
||||||
|
<span class="attribute">#[<span class="ident">cfg_attr</span>(<span class="ident">docsrs</span>, <span class="ident">doc</span>(<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"filter"</span>)))]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">filter</span>;
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"hedge"</span>)]</span>
|
||||||
|
<span class="attribute">#[<span class="ident">cfg_attr</span>(<span class="ident">docsrs</span>, <span class="ident">doc</span>(<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"hedge"</span>)))]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">hedge</span>;
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"limit"</span>)]</span>
|
||||||
|
<span class="attribute">#[<span class="ident">cfg_attr</span>(<span class="ident">docsrs</span>, <span class="ident">doc</span>(<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"limit"</span>)))]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">limit</span>;
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"load"</span>)]</span>
|
||||||
|
<span class="attribute">#[<span class="ident">cfg_attr</span>(<span class="ident">docsrs</span>, <span class="ident">doc</span>(<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"load"</span>)))]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">load</span>;
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"load-shed"</span>)]</span>
|
||||||
|
<span class="attribute">#[<span class="ident">cfg_attr</span>(<span class="ident">docsrs</span>, <span class="ident">doc</span>(<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"load-shed"</span>)))]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">load_shed</span>;
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"make"</span>)]</span>
|
||||||
|
<span class="attribute">#[<span class="ident">cfg_attr</span>(<span class="ident">docsrs</span>, <span class="ident">doc</span>(<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"make"</span>)))]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">make</span>;
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"ready-cache"</span>)]</span>
|
||||||
|
<span class="attribute">#[<span class="ident">cfg_attr</span>(<span class="ident">docsrs</span>, <span class="ident">doc</span>(<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"ready-cache"</span>)))]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">ready_cache</span>;
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"reconnect"</span>)]</span>
|
||||||
|
<span class="attribute">#[<span class="ident">cfg_attr</span>(<span class="ident">docsrs</span>, <span class="ident">doc</span>(<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"reconnect"</span>)))]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">reconnect</span>;
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"retry"</span>)]</span>
|
||||||
|
<span class="attribute">#[<span class="ident">cfg_attr</span>(<span class="ident">docsrs</span>, <span class="ident">doc</span>(<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"retry"</span>)))]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">retry</span>;
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"spawn-ready"</span>)]</span>
|
||||||
|
<span class="attribute">#[<span class="ident">cfg_attr</span>(<span class="ident">docsrs</span>, <span class="ident">doc</span>(<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"spawn-ready"</span>)))]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">spawn_ready</span>;
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"steer"</span>)]</span>
|
||||||
|
<span class="attribute">#[<span class="ident">cfg_attr</span>(<span class="ident">docsrs</span>, <span class="ident">doc</span>(<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"steer"</span>)))]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">steer</span>;
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"timeout"</span>)]</span>
|
||||||
|
<span class="attribute">#[<span class="ident">cfg_attr</span>(<span class="ident">docsrs</span>, <span class="ident">doc</span>(<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"timeout"</span>)))]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">timeout</span>;
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"util"</span>)]</span>
|
||||||
|
<span class="attribute">#[<span class="ident">cfg_attr</span>(<span class="ident">docsrs</span>, <span class="ident">doc</span>(<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"util"</span>)))]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">util</span>;
|
||||||
|
|
||||||
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">builder</span>;
|
||||||
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">layer</span>;
|
||||||
|
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"util"</span>)]</span>
|
||||||
|
<span class="attribute">#[<span class="ident">cfg_attr</span>(<span class="ident">docsrs</span>, <span class="ident">doc</span>(<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"util"</span>)))]</span>
|
||||||
|
<span class="attribute">#[<span class="ident">doc</span>(<span class="ident">inline</span>)]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">use</span> <span class="self">self</span>::<span class="ident">util</span>::{<span class="ident">service_fn</span>, <span class="ident">ServiceExt</span>};
|
||||||
|
|
||||||
|
<span class="attribute">#[<span class="ident">doc</span>(<span class="ident">inline</span>)]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">builder</span>::<span class="ident">ServiceBuilder</span>;
|
||||||
|
<span class="attribute">#[<span class="ident">doc</span>(<span class="ident">inline</span>)]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">tower_layer</span>::<span class="ident">Layer</span>;
|
||||||
|
<span class="attribute">#[<span class="ident">doc</span>(<span class="ident">inline</span>)]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">tower_service</span>::<span class="ident">Service</span>;
|
||||||
|
|
||||||
|
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">unreachable_pub</span>)]</span>
|
||||||
|
<span class="kw">mod</span> <span class="ident">sealed</span> {
|
||||||
|
<span class="kw">pub</span> <span class="kw">trait</span> <span class="ident">Sealed</span><span class="op"><</span><span class="ident">T</span><span class="op">></span> {}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// Alias for a type-erased error type.</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">type</span> <span class="ident">BoxError</span> <span class="op">=</span> <span class="ident">Box</span><span class="op"><</span><span class="kw">dyn</span> <span class="ident">std</span>::<span class="ident">error</span>::<span class="ident">Error</span> <span class="op">+</span> <span class="ident">Send</span> <span class="op">+</span> <span class="ident">Sync</span><span class="op">></span>;
|
||||||
|
</pre></div>
|
||||||
|
</section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../";window.currentCrate = "tower";</script><script src="../../aliases.js"></script><script src="../../main.js"></script><script src="../../source-script.js"></script><script src="../../source-files.js"></script><script defer src="../../search-index.js"></script></body></html>
|
|
@ -0,0 +1,69 @@
|
||||||
|
<!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 `tower-layer/src/identity.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>identity.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><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="shortcut icon" href="../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></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">☰</div><a href='../../tower_layer/index.html'><div class='logo-container'><img src='../../rust-logo.png' alt='logo'></div></a></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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>
|
||||||
|
</pre><div class="example-wrap"><pre class="rust ">
|
||||||
|
<span class="kw">use</span> <span class="kw">super</span>::<span class="ident">Layer</span>;
|
||||||
|
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">fmt</span>;
|
||||||
|
|
||||||
|
<span class="doccomment">/// A no-op middleware.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// When wrapping a `Service`, the `Identity` layer returns the provided</span>
|
||||||
|
<span class="doccomment">/// service without modifying it.</span>
|
||||||
|
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Default</span>, <span class="ident">Clone</span>)]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">Identity</span> {
|
||||||
|
<span class="ident">_p</span>: (),
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">impl</span> <span class="ident">Identity</span> {
|
||||||
|
<span class="doccomment">/// Create a new `Identity` value</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">new</span>() <span class="op">-</span><span class="op">></span> <span class="ident">Identity</span> {
|
||||||
|
<span class="ident">Identity</span> { <span class="ident">_p</span>: () }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// Decorates a `Service`, transforming either the request or the response.</span>
|
||||||
|
<span class="kw">impl</span><span class="op"><</span><span class="ident">S</span><span class="op">></span> <span class="ident">Layer</span><span class="op"><</span><span class="ident">S</span><span class="op">></span> <span class="kw">for</span> <span class="ident">Identity</span> {
|
||||||
|
<span class="kw">type</span> <span class="ident">Service</span> <span class="op">=</span> <span class="ident">S</span>;
|
||||||
|
|
||||||
|
<span class="kw">fn</span> <span class="ident">layer</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">inner</span>: <span class="ident">S</span>) <span class="op">-</span><span class="op">></span> <span class="self">Self</span>::<span class="ident">Service</span> {
|
||||||
|
<span class="ident">inner</span>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">impl</span> <span class="ident">fmt</span>::<span class="ident">Debug</span> <span class="kw">for</span> <span class="ident">Identity</span> {
|
||||||
|
<span class="kw">fn</span> <span class="ident">fmt</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">f</span>: <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">fmt</span>::<span class="ident">Formatter</span><span class="op"><</span><span class="lifetime">'_</span><span class="op">></span>) <span class="op">-</span><span class="op">></span> <span class="ident">fmt</span>::<span class="prelude-ty">Result</span> {
|
||||||
|
<span class="ident">f</span>.<span class="ident">debug_struct</span>(<span class="string">"Identity"</span>).<span class="ident">finish</span>()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</pre></div>
|
||||||
|
</section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../";window.currentCrate = "tower_layer";</script><script src="../../aliases.js"></script><script src="../../main.js"></script><script src="../../source-script.js"></script><script src="../../source-files.js"></script><script defer src="../../search-index.js"></script></body></html>
|
|
@ -0,0 +1,205 @@
|
||||||
|
<!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 `tower-layer/src/lib.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>lib.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><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="shortcut icon" href="../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></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">☰</div><a href='../../tower_layer/index.html'><div class='logo-container'><img src='../../rust-logo.png' alt='logo'></div></a></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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>
|
||||||
|
</pre><div class="example-wrap"><pre class="rust ">
|
||||||
|
<span class="attribute">#![<span class="ident">doc</span>(<span class="ident">html_root_url</span> <span class="op">=</span> <span class="string">"https://docs.rs/tower-layer/0.3.0-alpha.2"</span>)]</span>
|
||||||
|
<span class="attribute">#![<span class="ident">warn</span>(
|
||||||
|
<span class="ident">missing_debug_implementations</span>,
|
||||||
|
<span class="ident">missing_docs</span>,
|
||||||
|
<span class="ident">rust_2018_idioms</span>,
|
||||||
|
<span class="ident">unreachable_pub</span>
|
||||||
|
)]</span>
|
||||||
|
|
||||||
|
<span class="doccomment">//! Layer traits and extensions.</span>
|
||||||
|
<span class="doccomment">//!</span>
|
||||||
|
<span class="doccomment">//! A layer decorates an service and provides additional functionality. It</span>
|
||||||
|
<span class="doccomment">//! allows other services to be composed with the service that implements layer.</span>
|
||||||
|
<span class="doccomment">//!</span>
|
||||||
|
<span class="doccomment">//! A middleware implements the [`Layer`] and [`Service`] trait.</span>
|
||||||
|
|
||||||
|
<span class="kw">mod</span> <span class="ident">identity</span>;
|
||||||
|
<span class="kw">mod</span> <span class="ident">stack</span>;
|
||||||
|
|
||||||
|
<span class="kw">pub</span> <span class="kw">use</span> <span class="self">self</span>::{<span class="ident">identity</span>::<span class="ident">Identity</span>, <span class="ident">stack</span>::<span class="ident">Stack</span>};
|
||||||
|
|
||||||
|
<span class="doccomment">/// Decorates a `Service`, transforming either the request or the response.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// Often, many of the pieces needed for writing network applications can be</span>
|
||||||
|
<span class="doccomment">/// reused across multiple services. The `Layer` trait can be used to write</span>
|
||||||
|
<span class="doccomment">/// reusable components that can be applied to very different kinds of services;</span>
|
||||||
|
<span class="doccomment">/// for example, it can be applied to services operating on different protocols,</span>
|
||||||
|
<span class="doccomment">/// and to both the client and server side of a network transaction.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// # Log</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// Take request logging as an example:</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// ```rust</span>
|
||||||
|
<span class="doccomment">/// # use tower_service::Service;</span>
|
||||||
|
<span class="doccomment">/// # use std::task::{Poll, Context};</span>
|
||||||
|
<span class="doccomment">/// # use tower_layer::Layer;</span>
|
||||||
|
<span class="doccomment">/// # use std::fmt;</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// pub struct LogLayer {</span>
|
||||||
|
<span class="doccomment">/// target: &'static str,</span>
|
||||||
|
<span class="doccomment">/// }</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// impl<S> Layer<S> for LogLayer {</span>
|
||||||
|
<span class="doccomment">/// type Service = LogService<S>;</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// fn layer(&self, service: S) -> Self::Service {</span>
|
||||||
|
<span class="doccomment">/// LogService {</span>
|
||||||
|
<span class="doccomment">/// target: self.target,</span>
|
||||||
|
<span class="doccomment">/// service</span>
|
||||||
|
<span class="doccomment">/// }</span>
|
||||||
|
<span class="doccomment">/// }</span>
|
||||||
|
<span class="doccomment">/// }</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// // This service implements the Log behavior</span>
|
||||||
|
<span class="doccomment">/// pub struct LogService<S> {</span>
|
||||||
|
<span class="doccomment">/// target: &'static str,</span>
|
||||||
|
<span class="doccomment">/// service: S,</span>
|
||||||
|
<span class="doccomment">/// }</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// impl<S, Request> Service<Request> for LogService<S></span>
|
||||||
|
<span class="doccomment">/// where</span>
|
||||||
|
<span class="doccomment">/// S: Service<Request>,</span>
|
||||||
|
<span class="doccomment">/// Request: fmt::Debug,</span>
|
||||||
|
<span class="doccomment">/// {</span>
|
||||||
|
<span class="doccomment">/// type Response = S::Response;</span>
|
||||||
|
<span class="doccomment">/// type Error = S::Error;</span>
|
||||||
|
<span class="doccomment">/// type Future = S::Future;</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {</span>
|
||||||
|
<span class="doccomment">/// self.service.poll_ready(cx)</span>
|
||||||
|
<span class="doccomment">/// }</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// fn call(&mut self, request: Request) -> Self::Future {</span>
|
||||||
|
<span class="doccomment">/// // Insert log statement here or other functionality</span>
|
||||||
|
<span class="doccomment">/// println!("request = {:?}, target = {:?}", request, self.target);</span>
|
||||||
|
<span class="doccomment">/// self.service.call(request)</span>
|
||||||
|
<span class="doccomment">/// }</span>
|
||||||
|
<span class="doccomment">/// }</span>
|
||||||
|
<span class="doccomment">/// ```</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// The above log implementation is decoupled from the underlying protocol and</span>
|
||||||
|
<span class="doccomment">/// is also decoupled from client or server concerns. In other words, the same</span>
|
||||||
|
<span class="doccomment">/// log middleware could be used in either a client or a server.</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">trait</span> <span class="ident">Layer</span><span class="op"><</span><span class="ident">S</span><span class="op">></span> {
|
||||||
|
<span class="doccomment">/// The wrapped service</span>
|
||||||
|
<span class="kw">type</span> <span class="ident">Service</span>;
|
||||||
|
<span class="doccomment">/// Wrap the given service with the middleware, returning a new service</span>
|
||||||
|
<span class="doccomment">/// that has been decorated with the middleware.</span>
|
||||||
|
<span class="kw">fn</span> <span class="ident">layer</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">inner</span>: <span class="ident">S</span>) <span class="op">-</span><span class="op">></span> <span class="self">Self</span>::<span class="ident">Service</span>;
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">impl</span><span class="op"><</span><span class="lifetime">'a</span>, <span class="ident">T</span>, <span class="ident">S</span><span class="op">></span> <span class="ident">Layer</span><span class="op"><</span><span class="ident">S</span><span class="op">></span> <span class="kw">for</span> <span class="kw-2">&</span><span class="lifetime">'a</span> <span class="ident">T</span>
|
||||||
|
<span class="kw">where</span>
|
||||||
|
<span class="ident">T</span>: <span class="question-mark">?</span><span class="ident">Sized</span> <span class="op">+</span> <span class="ident">Layer</span><span class="op"><</span><span class="ident">S</span><span class="op">></span>,
|
||||||
|
{
|
||||||
|
<span class="kw">type</span> <span class="ident">Service</span> <span class="op">=</span> <span class="ident">T</span>::<span class="ident">Service</span>;
|
||||||
|
|
||||||
|
<span class="kw">fn</span> <span class="ident">layer</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">inner</span>: <span class="ident">S</span>) <span class="op">-</span><span class="op">></span> <span class="self">Self</span>::<span class="ident">Service</span> {
|
||||||
|
(<span class="kw-2">*</span><span class="kw-2">*</span><span class="self">self</span>).<span class="ident">layer</span>(<span class="ident">inner</span>)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</pre></div>
|
||||||
|
</section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../";window.currentCrate = "tower_layer";</script><script src="../../aliases.js"></script><script src="../../main.js"></script><script src="../../source-script.js"></script><script src="../../source-files.js"></script><script defer src="../../search-index.js"></script></body></html>
|
|
@ -0,0 +1,127 @@
|
||||||
|
<!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 `tower-layer/src/stack.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>stack.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><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="shortcut icon" href="../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></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">☰</div><a href='../../tower_layer/index.html'><div class='logo-container'><img src='../../rust-logo.png' alt='logo'></div></a></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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>
|
||||||
|
</pre><div class="example-wrap"><pre class="rust ">
|
||||||
|
<span class="kw">use</span> <span class="kw">super</span>::<span class="ident">Layer</span>;
|
||||||
|
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">fmt</span>;
|
||||||
|
|
||||||
|
<span class="doccomment">/// Two middlewares chained together.</span>
|
||||||
|
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Clone</span>)]</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">Stack</span><span class="op"><</span><span class="ident">Inner</span>, <span class="ident">Outer</span><span class="op">></span> {
|
||||||
|
<span class="ident">inner</span>: <span class="ident">Inner</span>,
|
||||||
|
<span class="ident">outer</span>: <span class="ident">Outer</span>,
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">impl</span><span class="op"><</span><span class="ident">Inner</span>, <span class="ident">Outer</span><span class="op">></span> <span class="ident">Stack</span><span class="op"><</span><span class="ident">Inner</span>, <span class="ident">Outer</span><span class="op">></span> {
|
||||||
|
<span class="doccomment">/// Create a new `Stack`.</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">new</span>(<span class="ident">inner</span>: <span class="ident">Inner</span>, <span class="ident">outer</span>: <span class="ident">Outer</span>) <span class="op">-</span><span class="op">></span> <span class="self">Self</span> {
|
||||||
|
<span class="ident">Stack</span> { <span class="ident">inner</span>, <span class="ident">outer</span> }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">impl</span><span class="op"><</span><span class="ident">S</span>, <span class="ident">Inner</span>, <span class="ident">Outer</span><span class="op">></span> <span class="ident">Layer</span><span class="op"><</span><span class="ident">S</span><span class="op">></span> <span class="kw">for</span> <span class="ident">Stack</span><span class="op"><</span><span class="ident">Inner</span>, <span class="ident">Outer</span><span class="op">></span>
|
||||||
|
<span class="kw">where</span>
|
||||||
|
<span class="ident">Inner</span>: <span class="ident">Layer</span><span class="op"><</span><span class="ident">S</span><span class="op">></span>,
|
||||||
|
<span class="ident">Outer</span>: <span class="ident">Layer</span><span class="op"><</span><span class="ident">Inner</span>::<span class="ident">Service</span><span class="op">></span>,
|
||||||
|
{
|
||||||
|
<span class="kw">type</span> <span class="ident">Service</span> <span class="op">=</span> <span class="ident">Outer</span>::<span class="ident">Service</span>;
|
||||||
|
|
||||||
|
<span class="kw">fn</span> <span class="ident">layer</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">service</span>: <span class="ident">S</span>) <span class="op">-</span><span class="op">></span> <span class="self">Self</span>::<span class="ident">Service</span> {
|
||||||
|
<span class="kw">let</span> <span class="ident">inner</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">inner</span>.<span class="ident">layer</span>(<span class="ident">service</span>);
|
||||||
|
|
||||||
|
<span class="self">self</span>.<span class="ident">outer</span>.<span class="ident">layer</span>(<span class="ident">inner</span>)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">impl</span><span class="op"><</span><span class="ident">Inner</span>, <span class="ident">Outer</span><span class="op">></span> <span class="ident">fmt</span>::<span class="ident">Debug</span> <span class="kw">for</span> <span class="ident">Stack</span><span class="op"><</span><span class="ident">Inner</span>, <span class="ident">Outer</span><span class="op">></span>
|
||||||
|
<span class="kw">where</span>
|
||||||
|
<span class="ident">Inner</span>: <span class="ident">fmt</span>::<span class="ident">Debug</span>,
|
||||||
|
<span class="ident">Outer</span>: <span class="ident">fmt</span>::<span class="ident">Debug</span>,
|
||||||
|
{
|
||||||
|
<span class="kw">fn</span> <span class="ident">fmt</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">f</span>: <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">fmt</span>::<span class="ident">Formatter</span><span class="op"><</span><span class="lifetime">'_</span><span class="op">></span>) <span class="op">-</span><span class="op">></span> <span class="ident">fmt</span>::<span class="prelude-ty">Result</span> {
|
||||||
|
<span class="comment">// The generated output of nested `Stack`s is very noisy and makes</span>
|
||||||
|
<span class="comment">// it harder to understand what is in a `ServiceBuilder`.</span>
|
||||||
|
<span class="comment">//</span>
|
||||||
|
<span class="comment">// Instead, this output is designed assuming that a `Stack` is</span>
|
||||||
|
<span class="comment">// usually quite nested, and inside a `ServiceBuilder`. Therefore,</span>
|
||||||
|
<span class="comment">// this skips using `f.debug_struct()`, since each one would force</span>
|
||||||
|
<span class="comment">// a new layer of indentation.</span>
|
||||||
|
<span class="comment">//</span>
|
||||||
|
<span class="comment">// - In compact mode, a nested stack ends up just looking like a flat</span>
|
||||||
|
<span class="comment">// list of layers.</span>
|
||||||
|
<span class="comment">//</span>
|
||||||
|
<span class="comment">// - In pretty mode, while a newline is inserted between each layer,</span>
|
||||||
|
<span class="comment">// the `DebugStruct` used in the `ServiceBuilder` will inject padding</span>
|
||||||
|
<span class="comment">// to that each line is at the same indentation level.</span>
|
||||||
|
<span class="comment">//</span>
|
||||||
|
<span class="comment">// Also, the order of [outer, inner] is important, since it reflects</span>
|
||||||
|
<span class="comment">// the order that the layers were added to the stack.</span>
|
||||||
|
<span class="kw">if</span> <span class="ident">f</span>.<span class="ident">alternate</span>() {
|
||||||
|
<span class="comment">// pretty</span>
|
||||||
|
<span class="macro">write</span><span class="macro">!</span>(<span class="ident">f</span>, <span class="string">"{:#?},\n{:#?}"</span>, <span class="self">self</span>.<span class="ident">outer</span>, <span class="self">self</span>.<span class="ident">inner</span>)
|
||||||
|
} <span class="kw">else</span> {
|
||||||
|
<span class="macro">write</span><span class="macro">!</span>(<span class="ident">f</span>, <span class="string">"{:?}, {:?}"</span>, <span class="self">self</span>.<span class="ident">outer</span>, <span class="self">self</span>.<span class="ident">inner</span>)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</pre></div>
|
||||||
|
</section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../";window.currentCrate = "tower_layer";</script><script src="../../aliases.js"></script><script src="../../main.js"></script><script src="../../source-script.js"></script><script src="../../source-files.js"></script><script defer src="../../search-index.js"></script></body></html>
|
|
@ -0,0 +1,545 @@
|
||||||
|
<!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 `tower-service/src/lib.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>lib.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><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="shortcut icon" href="../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></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">☰</div><a href='../../tower_service/index.html'><div class='logo-container'><img src='../../rust-logo.png' alt='logo'></div></a></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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>
|
||||||
|
</pre><div class="example-wrap"><pre class="rust ">
|
||||||
|
<span class="attribute">#![<span class="ident">doc</span>(<span class="ident">html_root_url</span> <span class="op">=</span> <span class="string">"https://docs.rs/tower-service/0.3.0"</span>)]</span>
|
||||||
|
<span class="attribute">#![<span class="ident">warn</span>(
|
||||||
|
<span class="ident">missing_debug_implementations</span>,
|
||||||
|
<span class="ident">missing_docs</span>,
|
||||||
|
<span class="ident">rust_2018_idioms</span>,
|
||||||
|
<span class="ident">unreachable_pub</span>
|
||||||
|
)]</span>
|
||||||
|
|
||||||
|
<span class="doccomment">//! Definition of the core `Service` trait to Tower</span>
|
||||||
|
<span class="doccomment">//!</span>
|
||||||
|
<span class="doccomment">//! The [`Service`] trait provides the necessary abstractions for defining</span>
|
||||||
|
<span class="doccomment">//! request / response clients and servers. It is simple but powerful and is</span>
|
||||||
|
<span class="doccomment">//! used as the foundation for the rest of Tower.</span>
|
||||||
|
|
||||||
|
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">future</span>::<span class="ident">Future</span>;
|
||||||
|
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">task</span>::{<span class="ident">Context</span>, <span class="ident">Poll</span>};
|
||||||
|
|
||||||
|
<span class="doccomment">/// An asynchronous function from a `Request` to a `Response`.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// The `Service` trait is a simplified interface making it easy to write</span>
|
||||||
|
<span class="doccomment">/// network applications in a modular and reusable way, decoupled from the</span>
|
||||||
|
<span class="doccomment">/// underlying protocol. It is one of Tower's fundamental abstractions.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// # Functional</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// A `Service` is a function of a `Request`. It immediately returns a</span>
|
||||||
|
<span class="doccomment">/// `Future` representing the eventual completion of processing the</span>
|
||||||
|
<span class="doccomment">/// request. The actual request processing may happen at any time in the</span>
|
||||||
|
<span class="doccomment">/// future, on any thread or executor. The processing may depend on calling</span>
|
||||||
|
<span class="doccomment">/// other services. At some point in the future, the processing will complete,</span>
|
||||||
|
<span class="doccomment">/// and the `Future` will resolve to a response or error.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// At a high level, the `Service::call` function represents an RPC request. The</span>
|
||||||
|
<span class="doccomment">/// `Service` value can be a server or a client.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// # Server</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// An RPC server *implements* the `Service` trait. Requests received by the</span>
|
||||||
|
<span class="doccomment">/// server over the network are deserialized and then passed as an argument to the</span>
|
||||||
|
<span class="doccomment">/// server value. The returned response is sent back over the network.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// As an example, here is how an HTTP request is processed by a server:</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// ```rust</span>
|
||||||
|
<span class="doccomment">/// # use std::pin::Pin;</span>
|
||||||
|
<span class="doccomment">/// # use std::task::{Poll, Context};</span>
|
||||||
|
<span class="doccomment">/// # use std::future::Future;</span>
|
||||||
|
<span class="doccomment">/// # use tower_service::Service;</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// use http::{Request, Response, StatusCode};</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// struct HelloWorld;</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// impl Service<Request<Vec<u8>>> for HelloWorld {</span>
|
||||||
|
<span class="doccomment">/// type Response = Response<Vec<u8>>;</span>
|
||||||
|
<span class="doccomment">/// type Error = http::Error;</span>
|
||||||
|
<span class="doccomment">/// type Future = Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>>>>;</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {</span>
|
||||||
|
<span class="doccomment">/// Poll::Ready(Ok(()))</span>
|
||||||
|
<span class="doccomment">/// }</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// fn call(&mut self, req: Request<Vec<u8>>) -> Self::Future {</span>
|
||||||
|
<span class="doccomment">/// // create the body</span>
|
||||||
|
<span class="doccomment">/// let body: Vec<u8> = "hello, world!\n"</span>
|
||||||
|
<span class="doccomment">/// .as_bytes()</span>
|
||||||
|
<span class="doccomment">/// .to_owned();</span>
|
||||||
|
<span class="doccomment">/// // Create the HTTP response</span>
|
||||||
|
<span class="doccomment">/// let resp = Response::builder()</span>
|
||||||
|
<span class="doccomment">/// .status(StatusCode::OK)</span>
|
||||||
|
<span class="doccomment">/// .body(body)</span>
|
||||||
|
<span class="doccomment">/// .expect("Unable to create `http::Response`");</span>
|
||||||
|
<span class="doccomment">/// </span>
|
||||||
|
<span class="doccomment">/// // create a response in a future.</span>
|
||||||
|
<span class="doccomment">/// let fut = async {</span>
|
||||||
|
<span class="doccomment">/// Ok(resp)</span>
|
||||||
|
<span class="doccomment">/// };</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// // Return the response as an immediate future</span>
|
||||||
|
<span class="doccomment">/// Box::pin(fut)</span>
|
||||||
|
<span class="doccomment">/// }</span>
|
||||||
|
<span class="doccomment">/// }</span>
|
||||||
|
<span class="doccomment">/// ```</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// # Client</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// A client consumes a service by using a `Service` value. The client may</span>
|
||||||
|
<span class="doccomment">/// issue requests by invoking `call` and passing the request as an argument.</span>
|
||||||
|
<span class="doccomment">/// It then receives the response by waiting for the returned future.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// As an example, here is how a Redis request would be issued:</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// ```rust,ignore</span>
|
||||||
|
<span class="doccomment">/// let client = redis::Client::new()</span>
|
||||||
|
<span class="doccomment">/// .connect("127.0.0.1:6379".parse().unwrap())</span>
|
||||||
|
<span class="doccomment">/// .unwrap();</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// let resp = client.call(Cmd::set("foo", "this is the value of foo")).await?;</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// // Wait for the future to resolve</span>
|
||||||
|
<span class="doccomment">/// println!("Redis response: {:?}", resp);</span>
|
||||||
|
<span class="doccomment">/// ```</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// # Middleware / Layer</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// More often than not, all the pieces needed for writing robust, scalable</span>
|
||||||
|
<span class="doccomment">/// network applications are the same no matter the underlying protocol. By</span>
|
||||||
|
<span class="doccomment">/// unifying the API for both clients and servers in a protocol agnostic way,</span>
|
||||||
|
<span class="doccomment">/// it is possible to write middleware that provide these pieces in a</span>
|
||||||
|
<span class="doccomment">/// reusable way.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// Take timeouts as an example:</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// ```rust,ignore</span>
|
||||||
|
<span class="doccomment">/// use tower_service::Service;</span>
|
||||||
|
<span class="doccomment">/// use tower_layer::Layer;</span>
|
||||||
|
<span class="doccomment">/// use futures::FutureExt;</span>
|
||||||
|
<span class="doccomment">/// use std::future::Future;</span>
|
||||||
|
<span class="doccomment">/// use std::task::{Context, Poll};</span>
|
||||||
|
<span class="doccomment">/// use std::time::Duration;</span>
|
||||||
|
<span class="doccomment">/// use std::pin::Pin;</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// pub struct Timeout<T> {</span>
|
||||||
|
<span class="doccomment">/// inner: T,</span>
|
||||||
|
<span class="doccomment">/// timeout: Duration,</span>
|
||||||
|
<span class="doccomment">/// }</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// pub struct TimeoutLayer(Duration);</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// pub struct Expired;</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// impl<T> Timeout<T> {</span>
|
||||||
|
<span class="doccomment">/// pub fn new(inner: T, timeout: Duration) -> Timeout<T> {</span>
|
||||||
|
<span class="doccomment">/// Timeout {</span>
|
||||||
|
<span class="doccomment">/// inner,</span>
|
||||||
|
<span class="doccomment">/// timeout</span>
|
||||||
|
<span class="doccomment">/// }</span>
|
||||||
|
<span class="doccomment">/// }</span>
|
||||||
|
<span class="doccomment">/// }</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// impl<T, Request> Service<Request> for Timeout<T></span>
|
||||||
|
<span class="doccomment">/// where</span>
|
||||||
|
<span class="doccomment">/// T: Service<Request>,</span>
|
||||||
|
<span class="doccomment">/// T::Future: 'static,</span>
|
||||||
|
<span class="doccomment">/// T::Error: From<Expired> + 'static,</span>
|
||||||
|
<span class="doccomment">/// T::Response: 'static</span>
|
||||||
|
<span class="doccomment">/// {</span>
|
||||||
|
<span class="doccomment">/// type Response = T::Response;</span>
|
||||||
|
<span class="doccomment">/// type Error = T::Error;</span>
|
||||||
|
<span class="doccomment">/// type Future = Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>>>>;</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {</span>
|
||||||
|
<span class="doccomment">/// self.inner.poll_ready(cx).map_err(Into::into)</span>
|
||||||
|
<span class="doccomment">/// }</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// fn call(&mut self, req: Request) -> Self::Future {</span>
|
||||||
|
<span class="doccomment">/// let timeout = tokio_timer::delay_for(self.timeout)</span>
|
||||||
|
<span class="doccomment">/// .map(|_| Err(Self::Error::from(Expired)));</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// let fut = Box::pin(self.inner.call(req));</span>
|
||||||
|
<span class="doccomment">/// let f = futures::select(fut, timeout)</span>
|
||||||
|
<span class="doccomment">/// .map(|either| either.factor_first().0);</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// Box::pin(f)</span>
|
||||||
|
<span class="doccomment">/// }</span>
|
||||||
|
<span class="doccomment">/// }</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// impl TimeoutLayer {</span>
|
||||||
|
<span class="doccomment">/// pub fn new(delay: Duration) -> Self {</span>
|
||||||
|
<span class="doccomment">/// TimeoutLayer(delay)</span>
|
||||||
|
<span class="doccomment">/// }</span>
|
||||||
|
<span class="doccomment">/// }</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// impl<S> Layer<S> for TimeoutLayer</span>
|
||||||
|
<span class="doccomment">/// {</span>
|
||||||
|
<span class="doccomment">/// type Service = Timeout<S>;</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// fn layer(&self, service: S) -> Timeout<S> {</span>
|
||||||
|
<span class="doccomment">/// Timeout::new(service, self.0)</span>
|
||||||
|
<span class="doccomment">/// }</span>
|
||||||
|
<span class="doccomment">/// }</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// ```</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// The above timeout implementation is decoupled from the underlying protocol</span>
|
||||||
|
<span class="doccomment">/// and is also decoupled from client or server concerns. In other words, the</span>
|
||||||
|
<span class="doccomment">/// same timeout middleware could be used in either a client or a server.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// # Backpressure</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// Calling a `Service` which is at capacity (i.e., it is temporarily unable to process a</span>
|
||||||
|
<span class="doccomment">/// request) should result in an error. The caller is responsible for ensuring</span>
|
||||||
|
<span class="doccomment">/// that the service is ready to receive the request before calling it.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// `Service` provides a mechanism by which the caller is able to coordinate</span>
|
||||||
|
<span class="doccomment">/// readiness. `Service::poll_ready` returns `Ready` if the service expects that</span>
|
||||||
|
<span class="doccomment">/// it is able to process a request.</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">trait</span> <span class="ident">Service</span><span class="op"><</span><span class="ident">Request</span><span class="op">></span> {
|
||||||
|
<span class="doccomment">/// Responses given by the service.</span>
|
||||||
|
<span class="kw">type</span> <span class="ident">Response</span>;
|
||||||
|
|
||||||
|
<span class="doccomment">/// Errors produced by the service.</span>
|
||||||
|
<span class="kw">type</span> <span class="ident">Error</span>;
|
||||||
|
|
||||||
|
<span class="doccomment">/// The future response value.</span>
|
||||||
|
<span class="kw">type</span> <span class="ident">Future</span>: <span class="ident">Future</span><span class="op"><</span><span class="ident">Output</span> <span class="op">=</span> <span class="prelude-ty">Result</span><span class="op"><</span><span class="self">Self</span>::<span class="ident">Response</span>, <span class="self">Self</span>::<span class="ident">Error</span><span class="op">></span><span class="op">></span>;
|
||||||
|
|
||||||
|
<span class="doccomment">/// Returns `Poll::Ready(Ok(()))` when the service is able to process requests.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// If the service is at capacity, then `Poll::Pending` is returned and the task</span>
|
||||||
|
<span class="doccomment">/// is notified when the service becomes ready again. This function is</span>
|
||||||
|
<span class="doccomment">/// expected to be called while on a task. Generally, this can be done with</span>
|
||||||
|
<span class="doccomment">/// a simple `futures::future::poll_fn` call.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// If `Poll::Ready(Err(_))` is returned, the service is no longer able to service requests</span>
|
||||||
|
<span class="doccomment">/// and the caller should discard the service instance.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// Once `poll_ready` returns `Poll::Ready(Ok(()))`, a request may be dispatched to the</span>
|
||||||
|
<span class="doccomment">/// service using `call`. Until a request is dispatched, repeated calls to</span>
|
||||||
|
<span class="doccomment">/// `poll_ready` must return either `Poll::Ready(Ok(()))` or `Poll::Ready(Err(_))`.</span>
|
||||||
|
<span class="kw">fn</span> <span class="ident">poll_ready</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">cx</span>: <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">Context</span><span class="op"><</span><span class="lifetime">'_</span><span class="op">></span>) <span class="op">-</span><span class="op">></span> <span class="ident">Poll</span><span class="op"><</span><span class="prelude-ty">Result</span><span class="op"><</span>(), <span class="self">Self</span>::<span class="ident">Error</span><span class="op">></span><span class="op">></span>;
|
||||||
|
|
||||||
|
<span class="doccomment">/// Process the request and return the response asynchronously.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// This function is expected to be callable off task. As such,</span>
|
||||||
|
<span class="doccomment">/// implementations should take care to not call `poll_ready`.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// Before dispatching a request, `poll_ready` must be called and return</span>
|
||||||
|
<span class="doccomment">/// `Poll::Ready(Ok(()))`.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// # Panics</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// Implementations are permitted to panic if `call` is invoked without</span>
|
||||||
|
<span class="doccomment">/// obtaining `Poll::Ready(Ok(()))` from `poll_ready`.</span>
|
||||||
|
<span class="kw">fn</span> <span class="ident">call</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">req</span>: <span class="ident">Request</span>) <span class="op">-</span><span class="op">></span> <span class="self">Self</span>::<span class="ident">Future</span>;
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">impl</span><span class="op"><</span><span class="lifetime">'a</span>, <span class="ident">S</span>, <span class="ident">Request</span><span class="op">></span> <span class="ident">Service</span><span class="op"><</span><span class="ident">Request</span><span class="op">></span> <span class="kw">for</span> <span class="kw-2">&</span><span class="lifetime">'a</span> <span class="kw-2">mut</span> <span class="ident">S</span>
|
||||||
|
<span class="kw">where</span>
|
||||||
|
<span class="ident">S</span>: <span class="ident">Service</span><span class="op"><</span><span class="ident">Request</span><span class="op">></span> <span class="op">+</span> <span class="lifetime">'a</span>,
|
||||||
|
{
|
||||||
|
<span class="kw">type</span> <span class="ident">Response</span> <span class="op">=</span> <span class="ident">S</span>::<span class="ident">Response</span>;
|
||||||
|
<span class="kw">type</span> <span class="ident">Error</span> <span class="op">=</span> <span class="ident">S</span>::<span class="ident">Error</span>;
|
||||||
|
<span class="kw">type</span> <span class="ident">Future</span> <span class="op">=</span> <span class="ident">S</span>::<span class="ident">Future</span>;
|
||||||
|
|
||||||
|
<span class="kw">fn</span> <span class="ident">poll_ready</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">cx</span>: <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">Context</span><span class="op"><</span><span class="lifetime">'_</span><span class="op">></span>) <span class="op">-</span><span class="op">></span> <span class="ident">Poll</span><span class="op"><</span><span class="prelude-ty">Result</span><span class="op"><</span>(), <span class="ident">S</span>::<span class="ident">Error</span><span class="op">></span><span class="op">></span> {
|
||||||
|
(<span class="kw-2">*</span><span class="kw-2">*</span><span class="self">self</span>).<span class="ident">poll_ready</span>(<span class="ident">cx</span>)
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">fn</span> <span class="ident">call</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">request</span>: <span class="ident">Request</span>) <span class="op">-</span><span class="op">></span> <span class="ident">S</span>::<span class="ident">Future</span> {
|
||||||
|
(<span class="kw-2">*</span><span class="kw-2">*</span><span class="self">self</span>).<span class="ident">call</span>(<span class="ident">request</span>)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">impl</span><span class="op"><</span><span class="ident">S</span>, <span class="ident">Request</span><span class="op">></span> <span class="ident">Service</span><span class="op"><</span><span class="ident">Request</span><span class="op">></span> <span class="kw">for</span> <span class="ident">Box</span><span class="op"><</span><span class="ident">S</span><span class="op">></span>
|
||||||
|
<span class="kw">where</span>
|
||||||
|
<span class="ident">S</span>: <span class="ident">Service</span><span class="op"><</span><span class="ident">Request</span><span class="op">></span> <span class="op">+</span> <span class="question-mark">?</span><span class="ident">Sized</span>,
|
||||||
|
{
|
||||||
|
<span class="kw">type</span> <span class="ident">Response</span> <span class="op">=</span> <span class="ident">S</span>::<span class="ident">Response</span>;
|
||||||
|
<span class="kw">type</span> <span class="ident">Error</span> <span class="op">=</span> <span class="ident">S</span>::<span class="ident">Error</span>;
|
||||||
|
<span class="kw">type</span> <span class="ident">Future</span> <span class="op">=</span> <span class="ident">S</span>::<span class="ident">Future</span>;
|
||||||
|
|
||||||
|
<span class="kw">fn</span> <span class="ident">poll_ready</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">cx</span>: <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">Context</span><span class="op"><</span><span class="lifetime">'_</span><span class="op">></span>) <span class="op">-</span><span class="op">></span> <span class="ident">Poll</span><span class="op"><</span><span class="prelude-ty">Result</span><span class="op"><</span>(), <span class="ident">S</span>::<span class="ident">Error</span><span class="op">></span><span class="op">></span> {
|
||||||
|
(<span class="kw-2">*</span><span class="kw-2">*</span><span class="self">self</span>).<span class="ident">poll_ready</span>(<span class="ident">cx</span>)
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">fn</span> <span class="ident">call</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">request</span>: <span class="ident">Request</span>) <span class="op">-</span><span class="op">></span> <span class="ident">S</span>::<span class="ident">Future</span> {
|
||||||
|
(<span class="kw-2">*</span><span class="kw-2">*</span><span class="self">self</span>).<span class="ident">call</span>(<span class="ident">request</span>)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</pre></div>
|
||||||
|
</section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../";window.currentCrate = "tower_service";</script><script src="../../aliases.js"></script><script src="../../main.js"></script><script src="../../source-script.js"></script><script src="../../source-files.js"></script><script defer src="../../search-index.js"></script></body></html>
|
|
@ -0,0 +1,29 @@
|
||||||
|
<!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 `tower-test/src/lib.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>lib.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><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="shortcut icon" href="../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></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">☰</div><a href='../../tower_test/index.html'><div class='logo-container'><img src='../../rust-logo.png' alt='logo'></div></a></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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>
|
||||||
|
</pre><div class="example-wrap"><pre class="rust ">
|
||||||
|
<span class="attribute">#![<span class="ident">doc</span>(<span class="ident">html_root_url</span> <span class="op">=</span> <span class="string">"https://docs.rs/tower-test/0.3.0"</span>)]</span>
|
||||||
|
<span class="attribute">#![<span class="ident">warn</span>(
|
||||||
|
<span class="ident">missing_debug_implementations</span>,
|
||||||
|
<span class="ident">missing_docs</span>,
|
||||||
|
<span class="ident">rust_2018_idioms</span>,
|
||||||
|
<span class="ident">unreachable_pub</span>
|
||||||
|
)]</span>
|
||||||
|
<span class="attribute">#![<span class="ident">allow</span>(<span class="ident">elided_lifetimes_in_paths</span>)]</span>
|
||||||
|
|
||||||
|
<span class="doccomment">//! Mock `Service` that can be used in tests.</span>
|
||||||
|
|
||||||
|
<span class="kw">mod</span> <span class="ident">macros</span>;
|
||||||
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">mock</span>;
|
||||||
|
</pre></div>
|
||||||
|
</section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../";window.currentCrate = "tower_test";</script><script src="../../aliases.js"></script><script src="../../main.js"></script><script src="../../source-script.js"></script><script src="../../source-files.js"></script><script defer src="../../search-index.js"></script></body></html>
|
|
@ -0,0 +1,83 @@
|
||||||
|
<!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 `tower-test/src/macros.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>macros.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><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="shortcut icon" href="../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></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">☰</div><a href='../../tower_test/index.html'><div class='logo-container'><img src='../../rust-logo.png' alt='logo'></div></a></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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>
|
||||||
|
</pre><div class="example-wrap"><pre class="rust ">
|
||||||
|
<span class="doccomment">/// Asserts that the mock handle receives a new request equal to the given</span>
|
||||||
|
<span class="doccomment">/// value.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// On success, the [`SendResponse`] handle for the matched request is returned,</span>
|
||||||
|
<span class="doccomment">/// allowing the caller to respond to the request. On failure, the macro panics.</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// # Examples</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// ```rust</span>
|
||||||
|
<span class="doccomment">/// use tower_service::Service;</span>
|
||||||
|
<span class="doccomment">/// use tower_test::{mock, assert_request_eq};</span>
|
||||||
|
<span class="doccomment">/// use tokio_test::assert_ready;</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// # async fn test() {</span>
|
||||||
|
<span class="doccomment">/// let (mut service, mut handle) = mock::spawn();</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// assert_ready!(service.poll_ready());</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// let response = service.call("hello");</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// assert_request_eq!(handle, "hello").send_response("world");</span>
|
||||||
|
<span class="doccomment">///</span>
|
||||||
|
<span class="doccomment">/// assert_eq!(response.await.unwrap(), "world");</span>
|
||||||
|
<span class="doccomment">/// # }</span>
|
||||||
|
<span class="doccomment">/// ```</span>
|
||||||
|
<span class="attribute">#[<span class="ident">macro_export</span>]</span>
|
||||||
|
<span class="macro">macro_rules</span><span class="macro">!</span> <span class="ident">assert_request_eq</span> {
|
||||||
|
(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">mock_handle</span>:<span class="ident">expr</span>, <span class="macro-nonterminal">$</span><span class="macro-nonterminal">expect</span>:<span class="ident">expr</span>) <span class="op">=</span><span class="op">></span> {
|
||||||
|
<span class="macro">assert_request_eq</span><span class="macro">!</span>(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">mock_handle</span>, <span class="macro-nonterminal">$</span><span class="macro-nonterminal">expect</span>,)
|
||||||
|
};
|
||||||
|
(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">mock_handle</span>:<span class="ident">expr</span>, <span class="macro-nonterminal">$</span><span class="macro-nonterminal">expect</span>:<span class="ident">expr</span>, $(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">arg</span>:<span class="ident">tt</span>)<span class="kw-2">*</span>) <span class="op">=</span><span class="op">></span> {{
|
||||||
|
<span class="kw">let</span> (<span class="ident">actual</span>, <span class="ident">send_response</span>) <span class="op">=</span> <span class="kw">match</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">mock_handle</span>.<span class="ident">next_request</span>().<span class="kw">await</span> {
|
||||||
|
<span class="prelude-val">Some</span>(<span class="ident">r</span>) <span class="op">=</span><span class="op">></span> <span class="ident">r</span>,
|
||||||
|
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> <span class="macro">panic</span><span class="macro">!</span>(<span class="string">"expected a request but none was received."</span>),
|
||||||
|
};
|
||||||
|
|
||||||
|
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">actual</span>, <span class="macro-nonterminal">$</span><span class="macro-nonterminal">expect</span>, $(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">arg</span>)<span class="kw-2">*</span>);
|
||||||
|
<span class="ident">send_response</span>
|
||||||
|
}};
|
||||||
|
}
|
||||||
|
</pre></div>
|
||||||
|
</section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../";window.currentCrate = "tower_test";</script><script src="../../aliases.js"></script><script src="../../main.js"></script><script src="../../source-script.js"></script><script src="../../source-files.js"></script><script defer src="../../search-index.js"></script></body></html>
|
|
@ -0,0 +1,49 @@
|
||||||
|
<!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 `tower-test/src/mock/error.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>error.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><noscript><link rel="stylesheet" href="../../../noscript.css"></noscript><link rel="shortcut icon" href="../../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../../down-arrow.svg");}</style></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">☰</div><a href='../../../tower_test/index.html'><div class='logo-container'><img src='../../../rust-logo.png' alt='logo'></div></a></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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>
|
||||||
|
</pre><div class="example-wrap"><pre class="rust ">
|
||||||
|
<span class="doccomment">//! Error types</span>
|
||||||
|
|
||||||
|
<span class="kw">use</span> <span class="ident">std</span>::{<span class="ident">error</span>, <span class="ident">fmt</span>};
|
||||||
|
|
||||||
|
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">type</span> <span class="ident">Error</span> <span class="op">=</span> <span class="ident">Box</span><span class="op"><</span><span class="kw">dyn</span> <span class="ident">error</span>::<span class="ident">Error</span> <span class="op">+</span> <span class="ident">Send</span> <span class="op">+</span> <span class="ident">Sync</span><span class="op">></span>;
|
||||||
|
|
||||||
|
<span class="doccomment">/// Error yielded when a mocked service does not yet accept requests.</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">Closed</span>(());
|
||||||
|
|
||||||
|
<span class="kw">impl</span> <span class="ident">Closed</span> {
|
||||||
|
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">new</span>() <span class="op">-</span><span class="op">></span> <span class="ident">Closed</span> {
|
||||||
|
<span class="ident">Closed</span>(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">impl</span> <span class="ident">fmt</span>::<span class="ident">Display</span> <span class="kw">for</span> <span class="ident">Closed</span> {
|
||||||
|
<span class="kw">fn</span> <span class="ident">fmt</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">fmt</span>: <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">fmt</span>::<span class="ident">Formatter</span>) <span class="op">-</span><span class="op">></span> <span class="ident">fmt</span>::<span class="prelude-ty">Result</span> {
|
||||||
|
<span class="macro">write</span><span class="macro">!</span>(<span class="ident">fmt</span>, <span class="string">"service closed"</span>)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">impl</span> <span class="ident">error</span>::<span class="ident">Error</span> <span class="kw">for</span> <span class="ident">Closed</span> {}
|
||||||
|
</pre></div>
|
||||||
|
</section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../../";window.currentCrate = "tower_test";</script><script src="../../../aliases.js"></script><script src="../../../main.js"></script><script src="../../../source-script.js"></script><script src="../../../source-files.js"></script><script defer src="../../../search-index.js"></script></body></html>
|
|
@ -0,0 +1,95 @@
|
||||||
|
<!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 `tower-test/src/mock/future.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>future.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><noscript><link rel="stylesheet" href="../../../noscript.css"></noscript><link rel="shortcut icon" href="../../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../../down-arrow.svg");}</style></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">☰</div><a href='../../../tower_test/index.html'><div class='logo-container'><img src='../../../rust-logo.png' alt='logo'></div></a></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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>
|
||||||
|
</pre><div class="example-wrap"><pre class="rust ">
|
||||||
|
<span class="doccomment">//! Future types</span>
|
||||||
|
|
||||||
|
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">mock</span>::<span class="ident">error</span>::{<span class="self">self</span>, <span class="ident">Error</span>};
|
||||||
|
<span class="kw">use</span> <span class="ident">futures_util</span>::<span class="ident">ready</span>;
|
||||||
|
<span class="kw">use</span> <span class="ident">pin_project</span>::<span class="ident">pin_project</span>;
|
||||||
|
<span class="kw">use</span> <span class="ident">tokio</span>::<span class="ident">sync</span>::<span class="ident">oneshot</span>;
|
||||||
|
|
||||||
|
<span class="kw">use</span> <span class="ident">std</span>::{
|
||||||
|
<span class="ident">future</span>::<span class="ident">Future</span>,
|
||||||
|
<span class="ident">pin</span>::<span class="ident">Pin</span>,
|
||||||
|
<span class="ident">task</span>::{<span class="ident">Context</span>, <span class="ident">Poll</span>},
|
||||||
|
};
|
||||||
|
|
||||||
|
<span class="doccomment">/// Future of the `Mock` response.</span>
|
||||||
|
<span class="attribute">#[<span class="ident">pin_project</span>]</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">ResponseFuture</span><span class="op"><</span><span class="ident">T</span><span class="op">></span> {
|
||||||
|
<span class="attribute">#[<span class="ident">pin</span>]</span>
|
||||||
|
<span class="ident">rx</span>: <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">Rx</span><span class="op"><</span><span class="ident">T</span><span class="op">></span><span class="op">></span>,
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">type</span> <span class="ident">Rx</span><span class="op"><</span><span class="ident">T</span><span class="op">></span> <span class="op">=</span> <span class="ident">oneshot</span>::<span class="ident">Receiver</span><span class="op"><</span><span class="prelude-ty">Result</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">Error</span><span class="op">></span><span class="op">></span>;
|
||||||
|
|
||||||
|
<span class="kw">impl</span><span class="op"><</span><span class="ident">T</span><span class="op">></span> <span class="ident">ResponseFuture</span><span class="op"><</span><span class="ident">T</span><span class="op">></span> {
|
||||||
|
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">new</span>(<span class="ident">rx</span>: <span class="ident">Rx</span><span class="op"><</span><span class="ident">T</span><span class="op">></span>) <span class="op">-</span><span class="op">></span> <span class="ident">ResponseFuture</span><span class="op"><</span><span class="ident">T</span><span class="op">></span> {
|
||||||
|
<span class="ident">ResponseFuture</span> { <span class="ident">rx</span>: <span class="prelude-val">Some</span>(<span class="ident">rx</span>) }
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">closed</span>() <span class="op">-</span><span class="op">></span> <span class="ident">ResponseFuture</span><span class="op"><</span><span class="ident">T</span><span class="op">></span> {
|
||||||
|
<span class="ident">ResponseFuture</span> { <span class="ident">rx</span>: <span class="prelude-val">None</span> }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">impl</span><span class="op"><</span><span class="ident">T</span><span class="op">></span> <span class="ident">Future</span> <span class="kw">for</span> <span class="ident">ResponseFuture</span><span class="op"><</span><span class="ident">T</span><span class="op">></span> {
|
||||||
|
<span class="kw">type</span> <span class="ident">Output</span> <span class="op">=</span> <span class="prelude-ty">Result</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">Error</span><span class="op">></span>;
|
||||||
|
|
||||||
|
<span class="kw">fn</span> <span class="ident">poll</span>(<span class="self">self</span>: <span class="ident">Pin</span><span class="op"><</span><span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">Self</span><span class="op">></span>, <span class="ident">cx</span>: <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">Context</span>) <span class="op">-</span><span class="op">></span> <span class="ident">Poll</span><span class="op"><</span><span class="self">Self</span>::<span class="ident">Output</span><span class="op">></span> {
|
||||||
|
<span class="kw">match</span> <span class="self">self</span>.<span class="ident">project</span>().<span class="ident">rx</span>.<span class="ident">as_pin_mut</span>() {
|
||||||
|
<span class="prelude-val">Some</span>(<span class="ident">rx</span>) <span class="op">=</span><span class="op">></span> <span class="kw">match</span> <span class="macro">ready</span><span class="macro">!</span>(<span class="ident">rx</span>.<span class="ident">poll</span>(<span class="ident">cx</span>)) {
|
||||||
|
<span class="prelude-val">Ok</span>(<span class="ident">r</span>) <span class="op">=</span><span class="op">></span> <span class="ident">Poll</span>::<span class="ident">Ready</span>(<span class="ident">r</span>),
|
||||||
|
<span class="prelude-val">Err</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">></span> <span class="ident">Poll</span>::<span class="ident">Ready</span>(<span class="prelude-val">Err</span>(<span class="ident">error</span>::<span class="ident">Closed</span>::<span class="ident">new</span>().<span class="ident">into</span>())),
|
||||||
|
},
|
||||||
|
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> <span class="ident">Poll</span>::<span class="ident">Ready</span>(<span class="prelude-val">Err</span>(<span class="ident">error</span>::<span class="ident">Closed</span>::<span class="ident">new</span>().<span class="ident">into</span>())),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</pre></div>
|
||||||
|
</section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../../";window.currentCrate = "tower_test";</script><script src="../../../aliases.js"></script><script src="../../../main.js"></script><script src="../../../source-script.js"></script><script src="../../../source-files.js"></script><script defer src="../../../search-index.js"></script></body></html>
|
|
@ -0,0 +1,631 @@
|
||||||
|
<!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 `tower-test/src/mock/mod.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>mod.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><noscript><link rel="stylesheet" href="../../../noscript.css"></noscript><link rel="shortcut icon" href="../../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../../down-arrow.svg");}</style></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">☰</div><a href='../../../tower_test/index.html'><div class='logo-container'><img src='../../../rust-logo.png' alt='logo'></div></a></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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>
|
||||||
|
<span id="305">305</span>
|
||||||
|
<span id="306">306</span>
|
||||||
|
<span id="307">307</span>
|
||||||
|
<span id="308">308</span>
|
||||||
|
<span id="309">309</span>
|
||||||
|
<span id="310">310</span>
|
||||||
|
<span id="311">311</span>
|
||||||
|
<span id="312">312</span>
|
||||||
|
<span id="313">313</span>
|
||||||
|
<span id="314">314</span>
|
||||||
|
</pre><div class="example-wrap"><pre class="rust ">
|
||||||
|
<span class="doccomment">//! Mock `Service` that can be used in tests.</span>
|
||||||
|
|
||||||
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">error</span>;
|
||||||
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">future</span>;
|
||||||
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">spawn</span>;
|
||||||
|
|
||||||
|
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">spawn</span>::<span class="ident">Spawn</span>;
|
||||||
|
|
||||||
|
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">mock</span>::{<span class="ident">error</span>::<span class="ident">Error</span>, <span class="ident">future</span>::<span class="ident">ResponseFuture</span>};
|
||||||
|
<span class="kw">use</span> <span class="ident">core</span>::<span class="ident">task</span>::<span class="ident">Waker</span>;
|
||||||
|
|
||||||
|
<span class="kw">use</span> <span class="ident">tokio</span>::<span class="ident">sync</span>::{<span class="ident">mpsc</span>, <span class="ident">oneshot</span>};
|
||||||
|
<span class="kw">use</span> <span class="ident">tower_layer</span>::<span class="ident">Layer</span>;
|
||||||
|
<span class="kw">use</span> <span class="ident">tower_service</span>::<span class="ident">Service</span>;
|
||||||
|
|
||||||
|
<span class="kw">use</span> <span class="ident">std</span>::{
|
||||||
|
<span class="ident">collections</span>::<span class="ident">HashMap</span>,
|
||||||
|
<span class="ident">future</span>::<span class="ident">Future</span>,
|
||||||
|
<span class="ident">sync</span>::{<span class="ident">Arc</span>, <span class="ident">Mutex</span>},
|
||||||
|
<span class="ident">task</span>::{<span class="ident">Context</span>, <span class="ident">Poll</span>},
|
||||||
|
<span class="ident">u64</span>,
|
||||||
|
};
|
||||||
|
|
||||||
|
<span class="doccomment">/// Spawn a layer onto a mock service.</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">spawn_layer</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span>, <span class="ident">L</span><span class="op">></span>(<span class="ident">layer</span>: <span class="ident">L</span>) <span class="op">-</span><span class="op">></span> (<span class="ident">Spawn</span><span class="op"><</span><span class="ident">L</span>::<span class="ident">Service</span><span class="op">></span>, <span class="ident">Handle</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span>)
|
||||||
|
<span class="kw">where</span>
|
||||||
|
<span class="ident">L</span>: <span class="ident">Layer</span><span class="op"><</span><span class="ident">Mock</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span><span class="op">></span>,
|
||||||
|
{
|
||||||
|
<span class="kw">let</span> (<span class="ident">inner</span>, <span class="ident">handle</span>) <span class="op">=</span> <span class="ident">pair</span>();
|
||||||
|
<span class="kw">let</span> <span class="ident">svc</span> <span class="op">=</span> <span class="ident">layer</span>.<span class="ident">layer</span>(<span class="ident">inner</span>);
|
||||||
|
|
||||||
|
(<span class="ident">Spawn</span>::<span class="ident">new</span>(<span class="ident">svc</span>), <span class="ident">handle</span>)
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// Spawn a Service onto a mock task.</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">spawn</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span>() <span class="op">-</span><span class="op">></span> (<span class="ident">Spawn</span><span class="op"><</span><span class="ident">Mock</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span><span class="op">></span>, <span class="ident">Handle</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span>) {
|
||||||
|
<span class="kw">let</span> (<span class="ident">svc</span>, <span class="ident">handle</span>) <span class="op">=</span> <span class="ident">pair</span>();
|
||||||
|
|
||||||
|
(<span class="ident">Spawn</span>::<span class="ident">new</span>(<span class="ident">svc</span>), <span class="ident">handle</span>)
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// Spawn a Service via the provided wrapper closure.</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">spawn_with</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span>, <span class="ident">F</span>, <span class="ident">S</span><span class="op">></span>(<span class="ident">f</span>: <span class="ident">F</span>) <span class="op">-</span><span class="op">></span> (<span class="ident">Spawn</span><span class="op"><</span><span class="ident">S</span><span class="op">></span>, <span class="ident">Handle</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span>)
|
||||||
|
<span class="kw">where</span>
|
||||||
|
<span class="ident">F</span>: <span class="ident">Fn</span>(<span class="ident">Mock</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span>) <span class="op">-</span><span class="op">></span> <span class="ident">S</span>,
|
||||||
|
{
|
||||||
|
<span class="kw">let</span> (<span class="ident">svc</span>, <span class="ident">handle</span>) <span class="op">=</span> <span class="ident">pair</span>();
|
||||||
|
|
||||||
|
<span class="kw">let</span> <span class="ident">svc</span> <span class="op">=</span> <span class="ident">f</span>(<span class="ident">svc</span>);
|
||||||
|
|
||||||
|
(<span class="ident">Spawn</span>::<span class="ident">new</span>(<span class="ident">svc</span>), <span class="ident">handle</span>)
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// A mock service</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">Mock</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span> {
|
||||||
|
<span class="ident">id</span>: <span class="ident">u64</span>,
|
||||||
|
<span class="ident">tx</span>: <span class="ident">Mutex</span><span class="op"><</span><span class="ident">Tx</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span><span class="op">></span>,
|
||||||
|
<span class="ident">state</span>: <span class="ident">Arc</span><span class="op"><</span><span class="ident">Mutex</span><span class="op"><</span><span class="ident">State</span><span class="op">></span><span class="op">></span>,
|
||||||
|
<span class="ident">can_send</span>: <span class="ident">bool</span>,
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// Handle to the `Mock`.</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">Handle</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span> {
|
||||||
|
<span class="ident">rx</span>: <span class="ident">Rx</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span>,
|
||||||
|
<span class="ident">state</span>: <span class="ident">Arc</span><span class="op"><</span><span class="ident">Mutex</span><span class="op"><</span><span class="ident">State</span><span class="op">></span><span class="op">></span>,
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">type</span> <span class="ident">Request</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span> <span class="op">=</span> (<span class="ident">T</span>, <span class="ident">SendResponse</span><span class="op"><</span><span class="ident">U</span><span class="op">></span>);
|
||||||
|
|
||||||
|
<span class="doccomment">/// Send a response in reply to a received request.</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">SendResponse</span><span class="op"><</span><span class="ident">T</span><span class="op">></span> {
|
||||||
|
<span class="ident">tx</span>: <span class="ident">oneshot</span>::<span class="ident">Sender</span><span class="op"><</span><span class="prelude-ty">Result</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">Error</span><span class="op">></span><span class="op">></span>,
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Debug</span>)]</span>
|
||||||
|
<span class="kw">struct</span> <span class="ident">State</span> {
|
||||||
|
<span class="doccomment">/// Tracks the number of requests that can be sent through</span>
|
||||||
|
<span class="ident">rem</span>: <span class="ident">u64</span>,
|
||||||
|
|
||||||
|
<span class="doccomment">/// Tasks that are blocked</span>
|
||||||
|
<span class="ident">tasks</span>: <span class="ident">HashMap</span><span class="op"><</span><span class="ident">u64</span>, <span class="ident">Waker</span><span class="op">></span>,
|
||||||
|
|
||||||
|
<span class="doccomment">/// Tracks if the `Handle` dropped</span>
|
||||||
|
<span class="ident">is_closed</span>: <span class="ident">bool</span>,
|
||||||
|
|
||||||
|
<span class="doccomment">/// Tracks the ID for the next mock clone</span>
|
||||||
|
<span class="ident">next_clone_id</span>: <span class="ident">u64</span>,
|
||||||
|
|
||||||
|
<span class="doccomment">/// Tracks the next error to yield (if any)</span>
|
||||||
|
<span class="ident">err_with</span>: <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">Error</span><span class="op">></span>,
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">type</span> <span class="ident">Tx</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span> <span class="op">=</span> <span class="ident">mpsc</span>::<span class="ident">UnboundedSender</span><span class="op"><</span><span class="ident">Request</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span><span class="op">></span>;
|
||||||
|
<span class="kw">type</span> <span class="ident">Rx</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span> <span class="op">=</span> <span class="ident">mpsc</span>::<span class="ident">UnboundedReceiver</span><span class="op"><</span><span class="ident">Request</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span><span class="op">></span>;
|
||||||
|
|
||||||
|
<span class="doccomment">/// Create a new `Mock` and `Handle` pair.</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">pair</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span>() <span class="op">-</span><span class="op">></span> (<span class="ident">Mock</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span>, <span class="ident">Handle</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span>) {
|
||||||
|
<span class="kw">let</span> (<span class="ident">tx</span>, <span class="ident">rx</span>) <span class="op">=</span> <span class="ident">mpsc</span>::<span class="ident">unbounded_channel</span>();
|
||||||
|
<span class="kw">let</span> <span class="ident">tx</span> <span class="op">=</span> <span class="ident">Mutex</span>::<span class="ident">new</span>(<span class="ident">tx</span>);
|
||||||
|
|
||||||
|
<span class="kw">let</span> <span class="ident">state</span> <span class="op">=</span> <span class="ident">Arc</span>::<span class="ident">new</span>(<span class="ident">Mutex</span>::<span class="ident">new</span>(<span class="ident">State</span>::<span class="ident">new</span>()));
|
||||||
|
|
||||||
|
<span class="kw">let</span> <span class="ident">mock</span> <span class="op">=</span> <span class="ident">Mock</span> {
|
||||||
|
<span class="ident">id</span>: <span class="number">0</span>,
|
||||||
|
<span class="ident">tx</span>,
|
||||||
|
<span class="ident">state</span>: <span class="ident">state</span>.<span class="ident">clone</span>(),
|
||||||
|
<span class="ident">can_send</span>: <span class="bool-val">false</span>,
|
||||||
|
};
|
||||||
|
|
||||||
|
<span class="kw">let</span> <span class="ident">handle</span> <span class="op">=</span> <span class="ident">Handle</span> { <span class="ident">rx</span>, <span class="ident">state</span> };
|
||||||
|
|
||||||
|
(<span class="ident">mock</span>, <span class="ident">handle</span>)
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">impl</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span> <span class="ident">Service</span><span class="op"><</span><span class="ident">T</span><span class="op">></span> <span class="kw">for</span> <span class="ident">Mock</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span> {
|
||||||
|
<span class="kw">type</span> <span class="ident">Response</span> <span class="op">=</span> <span class="ident">U</span>;
|
||||||
|
<span class="kw">type</span> <span class="ident">Error</span> <span class="op">=</span> <span class="ident">Error</span>;
|
||||||
|
<span class="kw">type</span> <span class="ident">Future</span> <span class="op">=</span> <span class="ident">ResponseFuture</span><span class="op"><</span><span class="ident">U</span><span class="op">></span>;
|
||||||
|
|
||||||
|
<span class="kw">fn</span> <span class="ident">poll_ready</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">cx</span>: <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">Context</span><span class="op"><</span><span class="lifetime">'_</span><span class="op">></span>) <span class="op">-</span><span class="op">></span> <span class="ident">Poll</span><span class="op"><</span><span class="prelude-ty">Result</span><span class="op"><</span>(), <span class="self">Self</span>::<span class="ident">Error</span><span class="op">></span><span class="op">></span> {
|
||||||
|
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">state</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">state</span>.<span class="ident">lock</span>().<span class="ident">unwrap</span>();
|
||||||
|
|
||||||
|
<span class="kw">if</span> <span class="ident">state</span>.<span class="ident">is_closed</span> {
|
||||||
|
<span class="kw">return</span> <span class="ident">Poll</span>::<span class="ident">Ready</span>(<span class="prelude-val">Err</span>(<span class="ident">error</span>::<span class="ident">Closed</span>::<span class="ident">new</span>().<span class="ident">into</span>()));
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">e</span>) <span class="op">=</span> <span class="ident">state</span>.<span class="ident">err_with</span>.<span class="ident">take</span>() {
|
||||||
|
<span class="kw">return</span> <span class="ident">Poll</span>::<span class="ident">Ready</span>(<span class="prelude-val">Err</span>(<span class="ident">e</span>));
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">if</span> <span class="self">self</span>.<span class="ident">can_send</span> {
|
||||||
|
<span class="kw">return</span> <span class="ident">Poll</span>::<span class="ident">Ready</span>(<span class="prelude-val">Ok</span>(()));
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">if</span> <span class="ident">state</span>.<span class="ident">rem</span> <span class="op">></span> <span class="number">0</span> {
|
||||||
|
<span class="macro">assert</span><span class="macro">!</span>(<span class="op">!</span><span class="ident">state</span>.<span class="ident">tasks</span>.<span class="ident">contains_key</span>(<span class="kw-2">&</span><span class="self">self</span>.<span class="ident">id</span>));
|
||||||
|
|
||||||
|
<span class="comment">// Returning `Ready` means the next call to `call` must succeed.</span>
|
||||||
|
<span class="self">self</span>.<span class="ident">can_send</span> <span class="op">=</span> <span class="bool-val">true</span>;
|
||||||
|
|
||||||
|
<span class="ident">Poll</span>::<span class="ident">Ready</span>(<span class="prelude-val">Ok</span>(()))
|
||||||
|
} <span class="kw">else</span> {
|
||||||
|
<span class="comment">// Bit weird... but whatevz</span>
|
||||||
|
<span class="kw-2">*</span><span class="ident">state</span>
|
||||||
|
.<span class="ident">tasks</span>
|
||||||
|
.<span class="ident">entry</span>(<span class="self">self</span>.<span class="ident">id</span>)
|
||||||
|
.<span class="ident">or_insert_with</span>(<span class="op">|</span><span class="op">|</span> <span class="ident">cx</span>.<span class="ident">waker</span>().<span class="ident">clone</span>()) <span class="op">=</span> <span class="ident">cx</span>.<span class="ident">waker</span>().<span class="ident">clone</span>();
|
||||||
|
|
||||||
|
<span class="ident">Poll</span>::<span class="ident">Pending</span>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">fn</span> <span class="ident">call</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">request</span>: <span class="ident">T</span>) <span class="op">-</span><span class="op">></span> <span class="self">Self</span>::<span class="ident">Future</span> {
|
||||||
|
<span class="comment">// Make sure that the service has capacity</span>
|
||||||
|
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">state</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">state</span>.<span class="ident">lock</span>().<span class="ident">unwrap</span>();
|
||||||
|
|
||||||
|
<span class="kw">if</span> <span class="ident">state</span>.<span class="ident">is_closed</span> {
|
||||||
|
<span class="kw">return</span> <span class="ident">ResponseFuture</span>::<span class="ident">closed</span>();
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">if</span> <span class="op">!</span><span class="self">self</span>.<span class="ident">can_send</span> {
|
||||||
|
<span class="macro">panic</span><span class="macro">!</span>(<span class="string">"service not ready; poll_ready must be called first"</span>);
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="self">self</span>.<span class="ident">can_send</span> <span class="op">=</span> <span class="bool-val">false</span>;
|
||||||
|
|
||||||
|
<span class="comment">// Decrement the number of remaining requests that can be sent</span>
|
||||||
|
<span class="kw">if</span> <span class="ident">state</span>.<span class="ident">rem</span> <span class="op">></span> <span class="number">0</span> {
|
||||||
|
<span class="ident">state</span>.<span class="ident">rem</span> <span class="op">-</span><span class="op">=</span> <span class="number">1</span>;
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">let</span> (<span class="ident">tx</span>, <span class="ident">rx</span>) <span class="op">=</span> <span class="ident">oneshot</span>::<span class="ident">channel</span>();
|
||||||
|
<span class="kw">let</span> <span class="ident">send_response</span> <span class="op">=</span> <span class="ident">SendResponse</span> { <span class="ident">tx</span> };
|
||||||
|
|
||||||
|
<span class="kw">match</span> <span class="self">self</span>.<span class="ident">tx</span>.<span class="ident">lock</span>().<span class="ident">unwrap</span>().<span class="ident">send</span>((<span class="ident">request</span>, <span class="ident">send_response</span>)) {
|
||||||
|
<span class="prelude-val">Ok</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">></span> {}
|
||||||
|
<span class="prelude-val">Err</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">></span> {
|
||||||
|
<span class="comment">// TODO: Can this be reached</span>
|
||||||
|
<span class="kw">return</span> <span class="ident">ResponseFuture</span>::<span class="ident">closed</span>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="ident">ResponseFuture</span>::<span class="ident">new</span>(<span class="ident">rx</span>)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">impl</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span> <span class="ident">Clone</span> <span class="kw">for</span> <span class="ident">Mock</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span> {
|
||||||
|
<span class="kw">fn</span> <span class="ident">clone</span>(<span class="kw-2">&</span><span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="self">Self</span> {
|
||||||
|
<span class="kw">let</span> <span class="ident">id</span> <span class="op">=</span> {
|
||||||
|
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">state</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">state</span>.<span class="ident">lock</span>().<span class="ident">unwrap</span>();
|
||||||
|
<span class="kw">let</span> <span class="ident">id</span> <span class="op">=</span> <span class="ident">state</span>.<span class="ident">next_clone_id</span>;
|
||||||
|
|
||||||
|
<span class="ident">state</span>.<span class="ident">next_clone_id</span> <span class="op">+</span><span class="op">=</span> <span class="number">1</span>;
|
||||||
|
|
||||||
|
<span class="ident">id</span>
|
||||||
|
};
|
||||||
|
|
||||||
|
<span class="kw">let</span> <span class="ident">tx</span> <span class="op">=</span> <span class="ident">Mutex</span>::<span class="ident">new</span>(<span class="self">self</span>.<span class="ident">tx</span>.<span class="ident">lock</span>().<span class="ident">unwrap</span>().<span class="ident">clone</span>());
|
||||||
|
|
||||||
|
<span class="ident">Mock</span> {
|
||||||
|
<span class="ident">id</span>,
|
||||||
|
<span class="ident">tx</span>,
|
||||||
|
<span class="ident">state</span>: <span class="self">self</span>.<span class="ident">state</span>.<span class="ident">clone</span>(),
|
||||||
|
<span class="ident">can_send</span>: <span class="bool-val">false</span>,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">impl</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span> <span class="ident">Drop</span> <span class="kw">for</span> <span class="ident">Mock</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span> {
|
||||||
|
<span class="kw">fn</span> <span class="ident">drop</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>) {
|
||||||
|
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">state</span> <span class="op">=</span> <span class="kw">match</span> <span class="self">self</span>.<span class="ident">state</span>.<span class="ident">lock</span>() {
|
||||||
|
<span class="prelude-val">Ok</span>(<span class="ident">v</span>) <span class="op">=</span><span class="op">></span> <span class="ident">v</span>,
|
||||||
|
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">></span> {
|
||||||
|
<span class="kw">if</span> ::<span class="ident">std</span>::<span class="ident">thread</span>::<span class="ident">panicking</span>() {
|
||||||
|
<span class="kw">return</span>;
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="macro">panic</span><span class="macro">!</span>(<span class="string">"{:?}"</span>, <span class="ident">e</span>);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
<span class="ident">state</span>.<span class="ident">tasks</span>.<span class="ident">remove</span>(<span class="kw-2">&</span><span class="self">self</span>.<span class="ident">id</span>);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="comment">// ===== impl Handle =====</span>
|
||||||
|
|
||||||
|
<span class="kw">impl</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span> <span class="ident">Handle</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span> {
|
||||||
|
<span class="doccomment">/// Asynchronously gets the next request</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">poll_request</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="ident">Poll</span><span class="op"><</span><span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">Request</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span><span class="op">></span><span class="op">></span> {
|
||||||
|
<span class="ident">tokio_test</span>::<span class="ident">task</span>::<span class="ident">spawn</span>(()).<span class="ident">enter</span>(<span class="op">|</span><span class="ident">cx</span>, <span class="kw">_</span><span class="op">|</span> <span class="ident">Box</span>::<span class="ident">pin</span>(<span class="self">self</span>.<span class="ident">rx</span>.<span class="ident">recv</span>()).<span class="ident">as_mut</span>().<span class="ident">poll</span>(<span class="ident">cx</span>))
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// Gets the next request.</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">async</span> <span class="kw">fn</span> <span class="ident">next_request</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">Request</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span><span class="op">></span> {
|
||||||
|
<span class="self">self</span>.<span class="ident">rx</span>.<span class="ident">recv</span>().<span class="kw">await</span>
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// Allow a certain number of requests</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">allow</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">num</span>: <span class="ident">u64</span>) {
|
||||||
|
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">state</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">state</span>.<span class="ident">lock</span>().<span class="ident">unwrap</span>();
|
||||||
|
<span class="ident">state</span>.<span class="ident">rem</span> <span class="op">=</span> <span class="ident">num</span>;
|
||||||
|
|
||||||
|
<span class="kw">if</span> <span class="ident">num</span> <span class="op">></span> <span class="number">0</span> {
|
||||||
|
<span class="kw">for</span> (<span class="kw">_</span>, <span class="ident">task</span>) <span class="kw">in</span> <span class="ident">state</span>.<span class="ident">tasks</span>.<span class="ident">drain</span>() {
|
||||||
|
<span class="ident">task</span>.<span class="ident">wake</span>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// Make the next poll_ method error with the given error.</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">send_error</span><span class="op"><</span><span class="ident">E</span>: <span class="ident">Into</span><span class="op"><</span><span class="ident">Error</span><span class="op">></span><span class="op">></span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">e</span>: <span class="ident">E</span>) {
|
||||||
|
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">state</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">state</span>.<span class="ident">lock</span>().<span class="ident">unwrap</span>();
|
||||||
|
<span class="ident">state</span>.<span class="ident">err_with</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">e</span>.<span class="ident">into</span>());
|
||||||
|
|
||||||
|
<span class="kw">for</span> (<span class="kw">_</span>, <span class="ident">task</span>) <span class="kw">in</span> <span class="ident">state</span>.<span class="ident">tasks</span>.<span class="ident">drain</span>() {
|
||||||
|
<span class="ident">task</span>.<span class="ident">wake</span>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">impl</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span> <span class="ident">Drop</span> <span class="kw">for</span> <span class="ident">Handle</span><span class="op"><</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">></span> {
|
||||||
|
<span class="kw">fn</span> <span class="ident">drop</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>) {
|
||||||
|
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">state</span> <span class="op">=</span> <span class="kw">match</span> <span class="self">self</span>.<span class="ident">state</span>.<span class="ident">lock</span>() {
|
||||||
|
<span class="prelude-val">Ok</span>(<span class="ident">v</span>) <span class="op">=</span><span class="op">></span> <span class="ident">v</span>,
|
||||||
|
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">></span> {
|
||||||
|
<span class="kw">if</span> ::<span class="ident">std</span>::<span class="ident">thread</span>::<span class="ident">panicking</span>() {
|
||||||
|
<span class="kw">return</span>;
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="macro">panic</span><span class="macro">!</span>(<span class="string">"{:?}"</span>, <span class="ident">e</span>);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
<span class="ident">state</span>.<span class="ident">is_closed</span> <span class="op">=</span> <span class="bool-val">true</span>;
|
||||||
|
|
||||||
|
<span class="kw">for</span> (<span class="kw">_</span>, <span class="ident">task</span>) <span class="kw">in</span> <span class="ident">state</span>.<span class="ident">tasks</span>.<span class="ident">drain</span>() {
|
||||||
|
<span class="ident">task</span>.<span class="ident">wake</span>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="comment">// ===== impl SendResponse =====</span>
|
||||||
|
|
||||||
|
<span class="kw">impl</span><span class="op"><</span><span class="ident">T</span><span class="op">></span> <span class="ident">SendResponse</span><span class="op"><</span><span class="ident">T</span><span class="op">></span> {
|
||||||
|
<span class="doccomment">/// Resolve the pending request future for the linked request with the given response.</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">send_response</span>(<span class="self">self</span>, <span class="ident">response</span>: <span class="ident">T</span>) {
|
||||||
|
<span class="comment">// TODO: Should the result be dropped?</span>
|
||||||
|
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">tx</span>.<span class="ident">send</span>(<span class="prelude-val">Ok</span>(<span class="ident">response</span>));
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// Resolve the pending request future for the linked request with the given error.</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">send_error</span><span class="op"><</span><span class="ident">E</span>: <span class="ident">Into</span><span class="op"><</span><span class="ident">Error</span><span class="op">></span><span class="op">></span>(<span class="self">self</span>, <span class="ident">err</span>: <span class="ident">E</span>) {
|
||||||
|
<span class="comment">// TODO: Should the result be dropped?</span>
|
||||||
|
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">tx</span>.<span class="ident">send</span>(<span class="prelude-val">Err</span>(<span class="ident">err</span>.<span class="ident">into</span>()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="comment">// ===== impl State =====</span>
|
||||||
|
|
||||||
|
<span class="kw">impl</span> <span class="ident">State</span> {
|
||||||
|
<span class="kw">fn</span> <span class="ident">new</span>() <span class="op">-</span><span class="op">></span> <span class="ident">State</span> {
|
||||||
|
<span class="ident">State</span> {
|
||||||
|
<span class="ident">rem</span>: <span class="ident">u64</span>::<span class="ident">MAX</span>,
|
||||||
|
<span class="ident">tasks</span>: <span class="ident">HashMap</span>::<span class="ident">new</span>(),
|
||||||
|
<span class="ident">is_closed</span>: <span class="bool-val">false</span>,
|
||||||
|
<span class="ident">next_clone_id</span>: <span class="number">1</span>,
|
||||||
|
<span class="ident">err_with</span>: <span class="prelude-val">None</span>,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</pre></div>
|
||||||
|
</section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../../";window.currentCrate = "tower_test";</script><script src="../../../aliases.js"></script><script src="../../../main.js"></script><script src="../../../source-script.js"></script><script src="../../../source-files.js"></script><script defer src="../../../search-index.js"></script></body></html>
|
|
@ -0,0 +1,147 @@
|
||||||
|
<!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 `tower-test/src/mock/spawn.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>spawn.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><noscript><link rel="stylesheet" href="../../../noscript.css"></noscript><link rel="shortcut icon" href="../../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../../down-arrow.svg");}</style></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">☰</div><a href='../../../tower_test/index.html'><div class='logo-container'><img src='../../../rust-logo.png' alt='logo'></div></a></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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>
|
||||||
|
</pre><div class="example-wrap"><pre class="rust ">
|
||||||
|
<span class="doccomment">//! Spawn mock services onto a mock task.</span>
|
||||||
|
|
||||||
|
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">task</span>::<span class="ident">Poll</span>;
|
||||||
|
<span class="kw">use</span> <span class="ident">tokio_test</span>::<span class="ident">task</span>;
|
||||||
|
<span class="kw">use</span> <span class="ident">tower_service</span>::<span class="ident">Service</span>;
|
||||||
|
|
||||||
|
<span class="doccomment">/// Service spawned on a mock task</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">Spawn</span><span class="op"><</span><span class="ident">T</span><span class="op">></span> {
|
||||||
|
<span class="ident">inner</span>: <span class="ident">T</span>,
|
||||||
|
<span class="ident">task</span>: <span class="ident">task</span>::<span class="ident">Spawn</span><span class="op"><</span>()<span class="op">></span>,
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">impl</span><span class="op"><</span><span class="ident">T</span><span class="op">></span> <span class="ident">Spawn</span><span class="op"><</span><span class="ident">T</span><span class="op">></span> {
|
||||||
|
<span class="doccomment">/// Create a new spawn.</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">new</span>(<span class="ident">inner</span>: <span class="ident">T</span>) <span class="op">-</span><span class="op">></span> <span class="self">Self</span> {
|
||||||
|
<span class="self">Self</span> {
|
||||||
|
<span class="ident">inner</span>,
|
||||||
|
<span class="ident">task</span>: <span class="ident">task</span>::<span class="ident">spawn</span>(()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// Check if this service has been woken up.</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">is_woken</span>(<span class="kw-2">&</span><span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="ident">bool</span> {
|
||||||
|
<span class="self">self</span>.<span class="ident">task</span>.<span class="ident">is_woken</span>()
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// Get how many futurs are holding onto the waker.</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">waker_ref_count</span>(<span class="kw-2">&</span><span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="ident">usize</span> {
|
||||||
|
<span class="self">self</span>.<span class="ident">task</span>.<span class="ident">waker_ref_count</span>()
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// Poll this service ready.</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">poll_ready</span><span class="op"><</span><span class="ident">Request</span><span class="op">></span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="ident">Poll</span><span class="op"><</span><span class="prelude-ty">Result</span><span class="op"><</span>(), <span class="ident">T</span>::<span class="ident">Error</span><span class="op">></span><span class="op">></span>
|
||||||
|
<span class="kw">where</span>
|
||||||
|
<span class="ident">T</span>: <span class="ident">Service</span><span class="op"><</span><span class="ident">Request</span><span class="op">></span>,
|
||||||
|
{
|
||||||
|
<span class="kw">let</span> <span class="ident">task</span> <span class="op">=</span> <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>.<span class="ident">task</span>;
|
||||||
|
<span class="kw">let</span> <span class="ident">inner</span> <span class="op">=</span> <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>.<span class="ident">inner</span>;
|
||||||
|
|
||||||
|
<span class="ident">task</span>.<span class="ident">enter</span>(<span class="op">|</span><span class="ident">cx</span>, <span class="kw">_</span><span class="op">|</span> <span class="ident">inner</span>.<span class="ident">poll_ready</span>(<span class="ident">cx</span>))
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// Call the inner Service.</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">call</span><span class="op"><</span><span class="ident">Request</span><span class="op">></span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">req</span>: <span class="ident">Request</span>) <span class="op">-</span><span class="op">></span> <span class="ident">T</span>::<span class="ident">Future</span>
|
||||||
|
<span class="kw">where</span>
|
||||||
|
<span class="ident">T</span>: <span class="ident">Service</span><span class="op"><</span><span class="ident">Request</span><span class="op">></span>,
|
||||||
|
{
|
||||||
|
<span class="self">self</span>.<span class="ident">inner</span>.<span class="ident">call</span>(<span class="ident">req</span>)
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// Get the inner service.</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">into_inner</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="ident">T</span> {
|
||||||
|
<span class="self">self</span>.<span class="ident">inner</span>
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// Get a reference to the inner service.</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">get_ref</span>(<span class="kw-2">&</span><span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="kw-2">&</span><span class="ident">T</span> {
|
||||||
|
<span class="kw-2">&</span><span class="self">self</span>.<span class="ident">inner</span>
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="doccomment">/// Get a mutable reference to the inner service.</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">get_mut</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">T</span> {
|
||||||
|
<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>.<span class="ident">inner</span>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">impl</span><span class="op"><</span><span class="ident">T</span>: <span class="ident">Clone</span><span class="op">></span> <span class="ident">Clone</span> <span class="kw">for</span> <span class="ident">Spawn</span><span class="op"><</span><span class="ident">T</span><span class="op">></span> {
|
||||||
|
<span class="kw">fn</span> <span class="ident">clone</span>(<span class="kw-2">&</span><span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="self">Self</span> {
|
||||||
|
<span class="ident">Spawn</span>::<span class="ident">new</span>(<span class="self">self</span>.<span class="ident">inner</span>.<span class="ident">clone</span>())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</pre></div>
|
||||||
|
</section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../../";window.currentCrate = "tower_test";</script><script src="../../../aliases.js"></script><script src="../../../main.js"></script><script src="../../../source-script.js"></script><script src="../../../source-files.js"></script><script defer src="../../../search-index.js"></script></body></html>
|
|
@ -0,0 +1 @@
|
||||||
|
var resourcesSuffix="";var currentTheme=document.getElementById("themeStyle");var mainTheme=document.getElementById("mainThemeStyle");var savedHref=[];function hasClass(elem,className){return elem&&elem.classList&&elem.classList.contains(className)}function addClass(elem,className){if(!elem||!elem.classList){return}elem.classList.add(className)}function removeClass(elem,className){if(!elem||!elem.classList){return}elem.classList.remove(className)}function onEach(arr,func,reversed){if(arr&&arr.length>0&&func){var length=arr.length;if(reversed!==true){for(var i=0;i<length;++i){if(func(arr[i])===true){return true}}}else{for(var i=length-1;i>=0;--i){if(func(arr[i])===true){return true}}}}return false}function onEachLazy(lazyArray,func,reversed){return onEach(Array.prototype.slice.call(lazyArray),func,reversed)}function usableLocalStorage(){if(typeof Storage==="undefined"){return false}try{return window.localStorage!==null&&window.localStorage!==undefined}catch(err){return false}}function updateLocalStorage(name,value){if(usableLocalStorage()){localStorage[name]=value}else{}}function getCurrentValue(name){if(usableLocalStorage()&&localStorage[name]!==undefined){return localStorage[name]}return null}function switchTheme(styleElem,mainStyleElem,newTheme,saveTheme){var fullBasicCss="rustdoc"+resourcesSuffix+".css";var fullNewTheme=newTheme+resourcesSuffix+".css";var newHref=mainStyleElem.href.replace(fullBasicCss,fullNewTheme);if(styleElem.href===newHref){return}var found=false;if(savedHref.length===0){onEachLazy(document.getElementsByTagName("link"),function(el){savedHref.push(el.href)})}onEach(savedHref,function(el){if(el===newHref){found=true;return true}});if(found===true){styleElem.href=newHref;if(saveTheme===true){updateLocalStorage("rustdoc-theme",newTheme)}}}function getSystemValue(){var property=getComputedStyle(document.documentElement).getPropertyValue('content');return property.replace(/[\"\']/g,"")}switchTheme(currentTheme,mainTheme,getCurrentValue("rustdoc-theme")||getSystemValue()||"light",false)
|
|
@ -0,0 +1 @@
|
||||||
|
var themes=document.getElementById("theme-choices");var themePicker=document.getElementById("theme-picker");function showThemeButtonState(){themes.style.display="block";themePicker.style.borderBottomRightRadius="0";themePicker.style.borderBottomLeftRadius="0"}function hideThemeButtonState(){themes.style.display="none";themePicker.style.borderBottomRightRadius="3px";themePicker.style.borderBottomLeftRadius="3px"}function switchThemeButtonState(){if(themes.style.display==="block"){hideThemeButtonState()}else{showThemeButtonState()}};function handleThemeButtonsBlur(e){var active=document.activeElement;var related=e.relatedTarget;if(active.id!=="themePicker"&&(!active.parentNode||active.parentNode.id!=="theme-choices")&&(!related||(related.id!=="themePicker"&&(!related.parentNode||related.parentNode.id!=="theme-choices")))){hideThemeButtonState()}}themePicker.onclick=switchThemeButtonState;themePicker.onblur=handleThemeButtonsBlur;["dark","light"].forEach(function(item){var but=document.createElement('button');but.textContent=item;but.onclick=function(el){switchTheme(currentTheme,mainTheme,item,true)};but.onblur=handleThemeButtonsBlur;themes.appendChild(but)})
|
|
@ -0,0 +1,3 @@
|
||||||
|
<!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="List of all items in this crate"><meta name="keywords" content="rust, rustlang, rust-lang"><title>List of all items in this crate</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><noscript><link rel="stylesheet" href="../noscript.css"></noscript><link rel="shortcut icon" href="../favicon.ico"><style type="text/css">#crate-search{background-image:url("../down-arrow.svg");}</style></head><body class="rustdoc mod"><!--[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">☰</div><a href='../tower/index.html'><div class='logo-container'><img src='../rust-logo.png' alt='logo'></div></a></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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"><h1 class='fqn'><span class='out-of-band'><span id='render-detail'><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class='inner'>−</span>]</a></span>
|
||||||
|
</span>
|
||||||
|
<span class='in-band'>List of all items</span></h1><h3 id='Structs'>Structs</h3><ul class='structs docblock'><li><a href='struct.ServiceBuilder.html'>ServiceBuilder</a></li><li><a href='builder/struct.ServiceBuilder.html'>builder::ServiceBuilder</a></li><li><a href='layer/util/struct.Identity.html'>layer::util::Identity</a></li><li><a href='layer/util/struct.Stack.html'>layer::util::Stack</a></li></ul><h3 id='Traits'>Traits</h3><ul class='traits docblock'><li><a href='trait.Layer.html'>Layer</a></li><li><a href='trait.Service.html'>Service</a></li><li><a href='layer/trait.Layer.html'>layer::Layer</a></li></ul><h3 id='Typedefs'>Typedefs</h3><ul class='typedefs docblock'><li><a href='type.BoxError.html'>BoxError</a></li></ul></section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../";window.currentCrate = "tower";</script><script src="../aliases.js"></script><script src="../main.js"></script><script defer src="../search-index.js"></script></body></html>
|
|
@ -0,0 +1,4 @@
|
||||||
|
<!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="API documentation for the Rust `builder` mod in crate `tower`."><meta name="keywords" content="rust, rustlang, rust-lang, builder"><title>tower::builder - Rust</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><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="shortcut icon" href="../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc mod"><!--[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">☰</div><a href='../../tower/index.html'><div class='logo-container'><img src='../../rust-logo.png' alt='logo'></div></a><p class='location'>Module builder</p><div class="sidebar-elems"><div class="block items"><ul><li><a href="#structs">Structs</a></li></ul></div><p class='location'><a href='../index.html'>tower</a></p><script>window.sidebarCurrent = {name: 'builder', ty: 'mod', relpath: '../'};</script><script defer src="../sidebar-items.js"></script></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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"><h1 class='fqn'><span class='out-of-band'><span id='render-detail'><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class='inner'>−</span>]</a></span><a class='srclink' href='../../src/tower/builder/mod.rs.html#1-232' title='goto source code'>[src]</a></span><span class='in-band'>Module <a href='../index.html'>tower</a>::<wbr><a class="mod" href=''>builder</a></span></h1><div class='docblock'><p>Builder types to compose layers and services</p>
|
||||||
|
</div><h2 id='structs' class='section-header'><a href="#structs">Structs</a></h2>
|
||||||
|
<table><tr class='module-item'><td><a class="struct" href="struct.ServiceBuilder.html" title='tower::builder::ServiceBuilder struct'>ServiceBuilder</a></td><td class='docblock-short'><p>Declaratively construct Service values.</p>
|
||||||
|
</td></tr></table></section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../";window.currentCrate = "tower";</script><script src="../../aliases.js"></script><script src="../../main.js"></script><script defer src="../../search-index.js"></script></body></html>
|
|
@ -0,0 +1 @@
|
||||||
|
initSidebarItems({"struct":[["ServiceBuilder","Declaratively construct Service values."]]});
|
|
@ -0,0 +1,74 @@
|
||||||
|
<!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="API documentation for the Rust `ServiceBuilder` struct in crate `tower`."><meta name="keywords" content="rust, rustlang, rust-lang, ServiceBuilder"><title>tower::builder::ServiceBuilder - Rust</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><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="shortcut icon" href="../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc struct"><!--[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">☰</div><a href='../../tower/index.html'><div class='logo-container'><img src='../../rust-logo.png' alt='logo'></div></a><p class='location'>Struct ServiceBuilder</p><div class="sidebar-elems"><div class="block items"><a class="sidebar-title" href="#methods">Methods</a><div class="sidebar-links"><a href="#method.into_inner">into_inner</a><a href="#method.layer">layer</a><a href="#method.new">new</a><a href="#method.service">service</a></div><a class="sidebar-title" href="#implementations">Trait Implementations</a><div class="sidebar-links"><a href="#impl-Clone">Clone</a><a href="#impl-Debug">Debug</a></div><a class="sidebar-title" href="#synthetic-implementations">Auto Trait Implementations</a><div class="sidebar-links"><a href="#impl-RefUnwindSafe">RefUnwindSafe</a><a href="#impl-Send">Send</a><a href="#impl-Sync">Sync</a><a href="#impl-Unpin">Unpin</a><a href="#impl-UnwindSafe">UnwindSafe</a></div><a class="sidebar-title" href="#blanket-implementations">Blanket Implementations</a><div class="sidebar-links"><a href="#impl-Any">Any</a><a href="#impl-Borrow%3CT%3E">Borrow<T></a><a href="#impl-BorrowMut%3CT%3E">BorrowMut<T></a><a href="#impl-From%3CT%3E">From<T></a><a href="#impl-Into%3CU%3E">Into<U></a><a href="#impl-ToOwned">ToOwned</a><a href="#impl-TryFrom%3CU%3E">TryFrom<U></a><a href="#impl-TryInto%3CU%3E">TryInto<U></a></div></div><p class='location'><a href='../index.html'>tower</a>::<wbr><a href='index.html'>builder</a></p><script>window.sidebarCurrent = {name: 'ServiceBuilder', ty: 'struct', relpath: ''};</script><script defer src="sidebar-items.js"></script></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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"><h1 class='fqn'><span class='out-of-band'><span id='render-detail'><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class='inner'>−</span>]</a></span><a class='srclink' href='../../src/tower/builder/mod.rs.html#105-107' title='goto source code'>[src]</a></span><span class='in-band'>Struct <a href='../index.html'>tower</a>::<wbr><a href='index.html'>builder</a>::<wbr><a class="struct" href=''>ServiceBuilder</a></span></h1><div class="docblock type-decl hidden-by-usual-hider"><pre class='rust struct'>pub struct ServiceBuilder<L> { /* fields omitted */ }</pre></div><div class='docblock'><p>Declaratively construct Service values.</p>
|
||||||
|
<p><code>ServiceBuilder</code> provides a <a href="https://doc.rust-lang.org/1.0.0/style/ownership/builders.html">builder-like interface</a> for composing
|
||||||
|
layers to be applied to a <code>Service</code>.</p>
|
||||||
|
<h1 id="service" class="section-header"><a href="#service">Service</a></h1>
|
||||||
|
<p>A <a href="tower_service::Service"><code>Service</code></a> is a trait representing an
|
||||||
|
asynchronous function of a request to a response. It is similar to <code>async fn(Request) -> Result<Response, Error></code>.</p>
|
||||||
|
<p>A <code>Service</code> is typically bound to a single transport, such as a TCP
|
||||||
|
connection. It defines how <em>all</em> inbound or outbound requests are handled
|
||||||
|
by that connection.</p>
|
||||||
|
<h1 id="order" class="section-header"><a href="#order">Order</a></h1>
|
||||||
|
<p>The order in which layers are added impacts how requests are handled. Layers
|
||||||
|
that are added first will be called with the request first. The argument to
|
||||||
|
<code>service</code> will be last to see the request.</p>
|
||||||
|
|
||||||
|
<div class="example-wrap"><pre class="rust rust-example-rendered">
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">all</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"buffer"</span>, <span class="ident">feature</span> <span class="op">=</span> <span class="string">"limit"</span>))]</span>
|
||||||
|
<span class="ident">ServiceBuilder</span>::<span class="ident">new</span>()
|
||||||
|
.<span class="ident">buffer</span>(<span class="number">100</span>)
|
||||||
|
.<span class="ident">concurrency_limit</span>(<span class="number">10</span>)
|
||||||
|
.<span class="ident">service</span>(<span class="ident">svc</span>)</pre></div>
|
||||||
|
<p>In the above example, the buffer layer receives the request first followed
|
||||||
|
by <code>concurrency_limit</code>. <code>buffer</code> enables up to 100 request to be in-flight
|
||||||
|
<strong>on top of</strong> the requests that have already been forwarded to the next
|
||||||
|
layer. Combined with <code>concurrency_limit</code>, this allows up to 110 requests to be
|
||||||
|
in-flight.</p>
|
||||||
|
|
||||||
|
<div class="example-wrap"><pre class="rust rust-example-rendered">
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">all</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"buffer"</span>, <span class="ident">feature</span> <span class="op">=</span> <span class="string">"limit"</span>))]</span>
|
||||||
|
<span class="ident">ServiceBuilder</span>::<span class="ident">new</span>()
|
||||||
|
.<span class="ident">concurrency_limit</span>(<span class="number">10</span>)
|
||||||
|
.<span class="ident">buffer</span>(<span class="number">100</span>)
|
||||||
|
.<span class="ident">service</span>(<span class="ident">svc</span>)</pre></div>
|
||||||
|
<p>The above example is similar, but the order of layers is reversed. Now,
|
||||||
|
<code>concurrency_limit</code> applies first and only allows 10 requests to be in-flight
|
||||||
|
total.</p>
|
||||||
|
<h1 id="examples" class="section-header"><a href="#examples">Examples</a></h1>
|
||||||
|
<p>A <code>Service</code> stack with a single layer:</p>
|
||||||
|
|
||||||
|
<div class="example-wrap"><pre class="rust rust-example-rendered">
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"limit"</span>)]</span>
|
||||||
|
<span class="ident">ServiceBuilder</span>::<span class="ident">new</span>()
|
||||||
|
.<span class="ident">concurrency_limit</span>(<span class="number">5</span>)
|
||||||
|
.<span class="ident">service</span>(<span class="ident">svc</span>);</pre></div>
|
||||||
|
<p>A <code>Service</code> stack with <em>multiple</em> layers that contain rate limiting,
|
||||||
|
in-flight request limits, and a channel-backed, clonable <code>Service</code>:</p>
|
||||||
|
|
||||||
|
<div class="example-wrap"><pre class="rust rust-example-rendered">
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">all</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"buffer"</span>, <span class="ident">feature</span> <span class="op">=</span> <span class="string">"limit"</span>))]</span>
|
||||||
|
<span class="ident">ServiceBuilder</span>::<span class="ident">new</span>()
|
||||||
|
.<span class="ident">buffer</span>(<span class="number">5</span>)
|
||||||
|
.<span class="ident">concurrency_limit</span>(<span class="number">5</span>)
|
||||||
|
.<span class="ident">rate_limit</span>(<span class="number">5</span>, <span class="ident">Duration</span>::<span class="ident">from_secs</span>(<span class="number">1</span>))
|
||||||
|
.<span class="ident">service</span>(<span class="ident">svc</span>);</pre></div>
|
||||||
|
</div><h2 id='methods' class='small-section-header'>Methods<a href='#methods' class='anchor'></a></h2><h3 id='impl' class='impl'><code class='in-band'>impl <a class="struct" href="../../tower/builder/struct.ServiceBuilder.html" title="struct tower::builder::ServiceBuilder">ServiceBuilder</a><<a class="struct" href="../../tower/layer/util/struct.Identity.html" title="struct tower::layer::util::Identity">Identity</a>></code><a href='#impl' class='anchor'></a><a class='srclink' href='../../src/tower/builder/mod.rs.html#109-116' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.new' class="method"><code id='new.v'>pub fn <a href='#method.new' class='fnname'>new</a>() -> Self</code><a class='srclink' href='../../src/tower/builder/mod.rs.html#111-115' title='goto source code'>[src]</a></h4><div class='docblock'><p>Create a new <code>ServiceBuilder</code>.</p>
|
||||||
|
</div></div><h3 id='impl-1' class='impl'><code class='in-band'>impl<L> <a class="struct" href="../../tower/builder/struct.ServiceBuilder.html" title="struct tower::builder::ServiceBuilder">ServiceBuilder</a><L></code><a href='#impl-1' class='anchor'></a><a class='srclink' href='../../src/tower/builder/mod.rs.html#118-226' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.layer' class="method"><code id='layer.v'>pub fn <a href='#method.layer' class='fnname'>layer</a><T>(self, layer: T) -> <a class="struct" href="../../tower/builder/struct.ServiceBuilder.html" title="struct tower::builder::ServiceBuilder">ServiceBuilder</a><<a class="struct" href="../../tower/layer/util/struct.Stack.html" title="struct tower::layer::util::Stack">Stack</a><T, L>></code><a class='srclink' href='../../src/tower/builder/mod.rs.html#120-124' title='goto source code'>[src]</a></h4><div class='docblock'><p>Add a new layer <code>T</code> into the <code>ServiceBuilder</code>.</p>
|
||||||
|
</div><h4 id='method.into_inner' class="method"><code id='into_inner.v'>pub fn <a href='#method.into_inner' class='fnname'>into_inner</a>(self) -> L</code><a class='srclink' href='../../src/tower/builder/mod.rs.html#215-217' title='goto source code'>[src]</a></h4><div class='docblock'><p>Obtains the underlying <code>Layer</code> implementation.</p>
|
||||||
|
</div><h4 id='method.service' class="method"><code id='service.v'>pub fn <a href='#method.service' class='fnname'>service</a><S>(self, service: S) -> L::<a class="type" href="../../tower/layer/trait.Layer.html#associatedtype.Service" title="type tower::layer::Layer::Service">Service</a> <span class="where fmt-newline">where<br> L: <a class="trait" href="../../tower/layer/trait.Layer.html" title="trait tower::layer::Layer">Layer</a><S>, </span></code><a class='srclink' href='../../src/tower/builder/mod.rs.html#220-225' title='goto source code'>[src]</a></h4><div class='docblock'><p>Wrap the service <code>S</code> with the layers.</p>
|
||||||
|
</div></div><h2 id='implementations' class='small-section-header'>Trait Implementations<a href='#implementations' class='anchor'></a></h2><div id='implementations-list'><h3 id='impl-Clone' class='impl'><code class='in-band'>impl<L: <a class="trait" href="https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>> <a class="trait" href="https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a> for <a class="struct" href="../../tower/builder/struct.ServiceBuilder.html" title="struct tower::builder::ServiceBuilder">ServiceBuilder</a><L></code><a href='#impl-Clone' class='anchor'></a><a class='srclink' href='../../src/tower/builder/mod.rs.html#104' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.clone' class="method hidden"><code id='clone.v'>fn <a href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#tymethod.clone' class='fnname'>clone</a>(&self) -> <a class="struct" href="../../tower/builder/struct.ServiceBuilder.html" title="struct tower::builder::ServiceBuilder">ServiceBuilder</a><L></code><a class='srclink' href='../../src/tower/builder/mod.rs.html#104' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Returns a copy of the value. <a href="https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#tymethod.clone">Read more</a></p>
|
||||||
|
</div><h4 id='method.clone_from' class="method hidden"><code id='clone_from.v'>fn <a href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#method.clone_from' class='fnname'>clone_from</a>(&mut self, source: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&</a>Self)</code><span class='since' title='Stable since Rust version 1.0.0'>1.0.0</span><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/clone.rs.html#131-133' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Performs copy-assignment from <code>source</code>. <a href="https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#method.clone_from">Read more</a></p>
|
||||||
|
</div></div><h3 id='impl-Debug' class='impl'><code class='in-band'>impl<L: <a class="trait" href="https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html" title="trait core::fmt::Debug">Debug</a>> <a class="trait" href="https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html" title="trait core::fmt::Debug">Debug</a> for <a class="struct" href="../../tower/builder/struct.ServiceBuilder.html" title="struct tower::builder::ServiceBuilder">ServiceBuilder</a><L></code><a href='#impl-Debug' class='anchor'></a><a class='srclink' href='../../src/tower/builder/mod.rs.html#228-232' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.fmt' class="method hidden"><code id='fmt.v'>fn <a href='https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html#tymethod.fmt' class='fnname'>fmt</a>(&self, f: &mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html" title="struct core::fmt::Formatter">Formatter</a>) -> <a class="type" href="https://doc.rust-lang.org/nightly/core/fmt/type.Result.html" title="type core::fmt::Result">Result</a></code><a class='srclink' href='../../src/tower/builder/mod.rs.html#229-231' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Formats the value using the given formatter. <a href="https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html#tymethod.fmt">Read more</a></p>
|
||||||
|
</div></div></div><h2 id='synthetic-implementations' class='small-section-header'>Auto Trait Implementations<a href='#synthetic-implementations' class='anchor'></a></h2><div id='synthetic-implementations-list'><h3 id='impl-RefUnwindSafe' class='impl'><code class='in-band'>impl<L> <a class="trait" href="https://doc.rust-lang.org/nightly/std/panic/trait.RefUnwindSafe.html" title="trait std::panic::RefUnwindSafe">RefUnwindSafe</a> for <a class="struct" href="../../tower/builder/struct.ServiceBuilder.html" title="struct tower::builder::ServiceBuilder">ServiceBuilder</a><L> <span class="where fmt-newline">where<br> L: <a class="trait" href="https://doc.rust-lang.org/nightly/std/panic/trait.RefUnwindSafe.html" title="trait std::panic::RefUnwindSafe">RefUnwindSafe</a>, </span></code><a href='#impl-RefUnwindSafe' class='anchor'></a></h3><div class='impl-items'></div><h3 id='impl-Send' class='impl'><code class='in-band'>impl<L> <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> for <a class="struct" href="../../tower/builder/struct.ServiceBuilder.html" title="struct tower::builder::ServiceBuilder">ServiceBuilder</a><L> <span class="where fmt-newline">where<br> L: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>, </span></code><a href='#impl-Send' class='anchor'></a></h3><div class='impl-items'></div><h3 id='impl-Sync' class='impl'><code class='in-band'>impl<L> <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="struct" href="../../tower/builder/struct.ServiceBuilder.html" title="struct tower::builder::ServiceBuilder">ServiceBuilder</a><L> <span class="where fmt-newline">where<br> L: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>, </span></code><a href='#impl-Sync' class='anchor'></a></h3><div class='impl-items'></div><h3 id='impl-Unpin' class='impl'><code class='in-band'>impl<L> <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class="struct" href="../../tower/builder/struct.ServiceBuilder.html" title="struct tower::builder::ServiceBuilder">ServiceBuilder</a><L> <span class="where fmt-newline">where<br> L: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>, </span></code><a href='#impl-Unpin' class='anchor'></a></h3><div class='impl-items'></div><h3 id='impl-UnwindSafe' class='impl'><code class='in-band'>impl<L> <a class="trait" href="https://doc.rust-lang.org/nightly/std/panic/trait.UnwindSafe.html" title="trait std::panic::UnwindSafe">UnwindSafe</a> for <a class="struct" href="../../tower/builder/struct.ServiceBuilder.html" title="struct tower::builder::ServiceBuilder">ServiceBuilder</a><L> <span class="where fmt-newline">where<br> L: <a class="trait" href="https://doc.rust-lang.org/nightly/std/panic/trait.UnwindSafe.html" title="trait std::panic::UnwindSafe">UnwindSafe</a>, </span></code><a href='#impl-UnwindSafe' class='anchor'></a></h3><div class='impl-items'></div></div><h2 id='blanket-implementations' class='small-section-header'>Blanket Implementations<a href='#blanket-implementations' class='anchor'></a></h2><div id='blanket-implementations-list'><h3 id='impl-Any' class='impl'><code class='in-band'>impl<T> <a class="trait" href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html" title="trait core::any::Any">Any</a> for T <span class="where fmt-newline">where<br> T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>, </span></code><a href='#impl-Any' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/any.rs.html#108-112' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.type_id' class="method hidden"><code id='type_id.v'>fn <a href='https://doc.rust-lang.org/nightly/core/any/trait.Any.html#tymethod.type_id' class='fnname'>type_id</a>(&self) -> <a class="struct" href="https://doc.rust-lang.org/nightly/core/any/struct.TypeId.html" title="struct core::any::TypeId">TypeId</a></code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/any.rs.html#109-111' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Gets the <code>TypeId</code> of <code>self</code>. <a href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html#tymethod.type_id">Read more</a></p>
|
||||||
|
</div></div><h3 id='impl-Borrow%3CT%3E' class='impl'><code class='in-band'>impl<T> <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html" title="trait core::borrow::Borrow">Borrow</a><T> for T <span class="where fmt-newline">where<br> T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>, </span></code><a href='#impl-Borrow%3CT%3E' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#213-217' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.borrow' class="method hidden"><code id='borrow.v'>fn <a href='https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html#tymethod.borrow' class='fnname'>borrow</a>(&self) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&</a>T</code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#214-216' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Immutably borrows from an owned value. <a href="https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html#tymethod.borrow">Read more</a></p>
|
||||||
|
</div></div><h3 id='impl-BorrowMut%3CT%3E' class='impl'><code class='in-band'>impl<T> <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html" title="trait core::borrow::BorrowMut">BorrowMut</a><T> for T <span class="where fmt-newline">where<br> T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>, </span></code><a href='#impl-BorrowMut%3CT%3E' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#220-224' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.borrow_mut' class="method hidden"><code id='borrow_mut.v'>fn <a href='https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut' class='fnname'>borrow_mut</a>(&mut self) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&mut </a>T</code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#221-223' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Mutably borrows from an owned value. <a href="https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut">Read more</a></p>
|
||||||
|
</div></div><h3 id='impl-From%3CT%3E' class='impl'><code class='in-band'>impl<T> <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.From.html" title="trait core::convert::From">From</a><T> for T</code><a href='#impl-From%3CT%3E' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#564-568' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.from' class="method hidden"><code id='from.v'>fn <a href='https://doc.rust-lang.org/nightly/core/convert/trait.From.html#tymethod.from' class='fnname'>from</a>(t: T) -> T</code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#565-567' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Performs the conversion.</p>
|
||||||
|
</div></div><h3 id='impl-Into%3CU%3E' class='impl'><code class='in-band'>impl<T, U> <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><U> for T <span class="where fmt-newline">where<br> U: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.From.html" title="trait core::convert::From">From</a><T>, </span></code><a href='#impl-Into%3CU%3E' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#553-560' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.into' class="method hidden"><code id='into.v'>fn <a href='https://doc.rust-lang.org/nightly/core/convert/trait.Into.html#tymethod.into' class='fnname'>into</a>(self) -> U</code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#557-559' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Performs the conversion.</p>
|
||||||
|
</div></div><h3 id='impl-ToOwned' class='impl'><code class='in-band'>impl<T> <a class="trait" href="https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html" title="trait alloc::borrow::ToOwned">ToOwned</a> for T <span class="where fmt-newline">where<br> T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>, </span></code><a href='#impl-ToOwned' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#80-92' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='associatedtype.Owned' class="type"><code id='Owned.t'>type <a href='https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#associatedtype.Owned' class="type">Owned</a> = T</code></h4><div class='docblock'><p>The resulting type after obtaining ownership.</p>
|
||||||
|
</div><h4 id='method.to_owned' class="method hidden"><code id='to_owned.v'>fn <a href='https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#tymethod.to_owned' class='fnname'>to_owned</a>(&self) -> T</code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#85-87' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Creates owned data from borrowed data, usually by cloning. <a href="https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#tymethod.to_owned">Read more</a></p>
|
||||||
|
</div><h4 id='method.clone_into' class="method hidden"><code id='clone_into.v'>fn <a href='https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#method.clone_into' class='fnname'>clone_into</a>(&self, target: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&mut </a>T)</code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#89-91' title='goto source code'>[src]</a></h4><div class='stability hidden'><div class='stab unstable'><details><summary><span class='emoji'>🔬</span> This is a nightly-only experimental API. (<code>toowned_clone_into</code>)</summary><p>recently added</p>
|
||||||
|
</details></div></div><div class='docblock hidden'><p>Uses borrowed data to replace owned data, usually by cloning. <a href="https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#method.clone_into">Read more</a></p>
|
||||||
|
</div></div><h3 id='impl-TryFrom%3CU%3E' class='impl'><code class='in-band'>impl<T, U> <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a><U> for T <span class="where fmt-newline">where<br> U: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><T>, </span></code><a href='#impl-TryFrom%3CU%3E' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#601-610' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='associatedtype.Error' class="type"><code id='Error.t'>type <a href='https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error' class="type">Error</a> = <a class="enum" href="https://doc.rust-lang.org/nightly/core/convert/enum.Infallible.html" title="enum core::convert::Infallible">Infallible</a></code></h4><div class='docblock'><p>The type returned in the event of a conversion error.</p>
|
||||||
|
</div><h4 id='method.try_from' class="method hidden"><code id='try_from.v'>fn <a href='https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#tymethod.try_from' class='fnname'>try_from</a>(value: U) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a><T, <T as <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a><U>>::<a class="type" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a>></code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#607-609' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Performs the conversion.</p>
|
||||||
|
</div></div><h3 id='impl-TryInto%3CU%3E' class='impl'><code class='in-band'>impl<T, U> <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html" title="trait core::convert::TryInto">TryInto</a><U> for T <span class="where fmt-newline">where<br> U: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a><T>, </span></code><a href='#impl-TryInto%3CU%3E' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#587-596' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='associatedtype.Error-1' class="type"><code id='Error.t-1'>type <a href='https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html#associatedtype.Error' class="type">Error</a> = <U as <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a><T>>::<a class="type" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a></code></h4><div class='docblock'><p>The type returned in the event of a conversion error.</p>
|
||||||
|
</div><h4 id='method.try_into' class="method hidden"><code id='try_into.v'>fn <a href='https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html#tymethod.try_into' class='fnname'>try_into</a>(self) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a><U, <U as <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a><T>>::<a class="type" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a>></code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#593-595' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Performs the conversion.</p>
|
||||||
|
</div></div></div></section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../";window.currentCrate = "tower";</script><script src="../../aliases.js"></script><script src="../../main.js"></script><script defer src="../../search-index.js"></script></body></html>
|
|
@ -0,0 +1,14 @@
|
||||||
|
<!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="API documentation for the Rust `tower` crate."><meta name="keywords" content="rust, rustlang, rust-lang, tower"><title>tower - Rust</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><noscript><link rel="stylesheet" href="../noscript.css"></noscript><link rel="shortcut icon" href="../favicon.ico"><style type="text/css">#crate-search{background-image:url("../down-arrow.svg");}</style></head><body class="rustdoc mod"><!--[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">☰</div><a href='../tower/index.html'><div class='logo-container'><img src='../rust-logo.png' alt='logo'></div></a><p class='location'>Crate tower</p><div class="sidebar-elems"><a id='all-types' href='all.html'><p>See all tower's items</p></a><div class="block items"><ul><li><a href="#modules">Modules</a></li><li><a href="#structs">Structs</a></li><li><a href="#traits">Traits</a></li><li><a href="#types">Type Definitions</a></li></ul></div><p class='location'></p><script>window.sidebarCurrent = {name: 'tower', ty: 'mod', relpath: '../'};</script></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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"><h1 class='fqn'><span class='out-of-band'><span id='render-detail'><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class='inner'>−</span>]</a></span><a class='srclink' href='../src/tower/lib.rs.html#1-86' title='goto source code'>[src]</a></span><span class='in-band'>Crate <a class="mod" href=''>tower</a></span></h1><div class='docblock'><p><code>fn(Request) -> Future<Response></code></p>
|
||||||
|
<p>Tower is a library of modular and reusable components for building
|
||||||
|
robust networking clients and servers.</p>
|
||||||
|
</div><h2 id='modules' class='section-header'><a href="#modules">Modules</a></h2>
|
||||||
|
<table><tr class='module-item'><td><a class="mod" href="builder/index.html" title='tower::builder mod'>builder</a></td><td class='docblock-short'><p>Builder types to compose layers and services</p>
|
||||||
|
</td></tr><tr class='module-item'><td><a class="mod" href="layer/index.html" title='tower::layer mod'>layer</a></td><td class='docblock-short'><p>A collection of <code>Layer</code> based tower services</p>
|
||||||
|
</td></tr></table><h2 id='structs' class='section-header'><a href="#structs">Structs</a></h2>
|
||||||
|
<table><tr class='module-item'><td><a class="struct" href="struct.ServiceBuilder.html" title='tower::ServiceBuilder struct'>ServiceBuilder</a></td><td class='docblock-short'><p>Declaratively construct Service values.</p>
|
||||||
|
</td></tr></table><h2 id='traits' class='section-header'><a href="#traits">Traits</a></h2>
|
||||||
|
<table><tr class='module-item'><td><a class="trait" href="trait.Layer.html" title='tower::Layer trait'>Layer</a></td><td class='docblock-short'><p>Decorates a <code>Service</code>, transforming either the request or the response.</p>
|
||||||
|
</td></tr><tr class='module-item'><td><a class="trait" href="trait.Service.html" title='tower::Service trait'>Service</a></td><td class='docblock-short'><p>An asynchronous function from a <code>Request</code> to a <code>Response</code>.</p>
|
||||||
|
</td></tr></table><h2 id='types' class='section-header'><a href="#types">Type Definitions</a></h2>
|
||||||
|
<table><tr class='module-item'><td><a class="type" href="type.BoxError.html" title='tower::BoxError type'>BoxError</a></td><td class='docblock-short'><p>Alias for a type-erased error type.</p>
|
||||||
|
</td></tr></table></section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../";window.currentCrate = "tower";</script><script src="../aliases.js"></script><script src="../main.js"></script><script defer src="../search-index.js"></script></body></html>
|
|
@ -0,0 +1,6 @@
|
||||||
|
<!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="API documentation for the Rust `layer` mod in crate `tower`."><meta name="keywords" content="rust, rustlang, rust-lang, layer"><title>tower::layer - Rust</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><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="shortcut icon" href="../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc mod"><!--[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">☰</div><a href='../../tower/index.html'><div class='logo-container'><img src='../../rust-logo.png' alt='logo'></div></a><p class='location'>Module layer</p><div class="sidebar-elems"><div class="block items"><ul><li><a href="#modules">Modules</a></li><li><a href="#traits">Traits</a></li></ul></div><p class='location'><a href='../index.html'>tower</a></p><script>window.sidebarCurrent = {name: 'layer', ty: 'mod', relpath: '../'};</script><script defer src="../sidebar-items.js"></script></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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"><h1 class='fqn'><span class='out-of-band'><span id='render-detail'><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class='inner'>−</span>]</a></span><a class='srclink' href='../../src/tower/layer.rs.html#1-8' title='goto source code'>[src]</a></span><span class='in-band'>Module <a href='../index.html'>tower</a>::<wbr><a class="mod" href=''>layer</a></span></h1><div class='docblock'><p>A collection of <code>Layer</code> based tower services</p>
|
||||||
|
</div><h2 id='modules' class='section-header'><a href="#modules">Modules</a></h2>
|
||||||
|
<table><tr class='module-item'><td><a class="mod" href="util/index.html" title='tower::layer::util mod'>util</a></td><td class='docblock-short'><p><code>util</code> exports an Identity Layer and Chain, a mechanism for chaining them.</p>
|
||||||
|
</td></tr></table><h2 id='traits' class='section-header'><a href="#traits">Traits</a></h2>
|
||||||
|
<table><tr class='module-item'><td><a class="trait" href="trait.Layer.html" title='tower::layer::Layer trait'>Layer</a></td><td class='docblock-short'><p>Decorates a <code>Service</code>, transforming either the request or the response.</p>
|
||||||
|
</td></tr></table></section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../";window.currentCrate = "tower";</script><script src="../../aliases.js"></script><script src="../../main.js"></script><script defer src="../../search-index.js"></script></body></html>
|
|
@ -0,0 +1 @@
|
||||||
|
initSidebarItems({"mod":[["util","`util` exports an Identity Layer and Chain, a mechanism for chaining them."]],"trait":[["Layer","Decorates a `Service`, transforming either the request or the response."]]});
|
|
@ -0,0 +1,66 @@
|
||||||
|
<!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="API documentation for the Rust `Layer` trait in crate `tower`."><meta name="keywords" content="rust, rustlang, rust-lang, Layer"><title>tower::layer::Layer - Rust</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><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="shortcut icon" href="../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc trait"><!--[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">☰</div><a href='../../tower/index.html'><div class='logo-container'><img src='../../rust-logo.png' alt='logo'></div></a><p class='location'>Trait Layer</p><div class="sidebar-elems"><div class="block items"><a class="sidebar-title" href="#associated-types">Associated Types</a><div class="sidebar-links"><a href="#associatedtype.Service">Service</a></div><a class="sidebar-title" href="#required-methods">Required Methods</a><div class="sidebar-links"><a href="#tymethod.layer">layer</a></div><a class="sidebar-title" href="#foreign-impls">Implementations on Foreign Types</a><div class="sidebar-links"><a href="#impl-Layer%3CS%3E-for-%26%27a%20T">&'a T</a></div><a class="sidebar-title" href="#implementors">Implementors</a></div><p class='location'><a href='../index.html'>tower</a>::<wbr><a href='index.html'>layer</a></p><script>window.sidebarCurrent = {name: 'Layer', ty: 'trait', relpath: ''};</script><script defer src="sidebar-items.js"></script></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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"><h1 class='fqn'><span class='out-of-band'><span id='render-detail'><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class='inner'>−</span>]</a></span><a class='srclink' href='../../src/tower_layer/lib.rs.html#84-90' title='goto source code'>[src]</a></span><span class='in-band'>Trait <a href='../index.html'>tower</a>::<wbr><a href='index.html'>layer</a>::<wbr><a class="trait" href=''>Layer</a></span></h1><div class="docblock type-decl hidden-by-usual-hider"><pre class='rust trait'>pub trait Layer<S> {
|
||||||
|
type <a href='#associatedtype.Service' class="type">Service</a>;
|
||||||
|
fn <a href='#tymethod.layer' class='fnname'>layer</a>(&self, inner: S) -> Self::<a class="type" href="../../tower/layer/trait.Layer.html#associatedtype.Service" title="type tower::layer::Layer::Service">Service</a>;
|
||||||
|
}</pre></div><div class='docblock'><p>Decorates a <code>Service</code>, transforming either the request or the response.</p>
|
||||||
|
<p>Often, many of the pieces needed for writing network applications can be
|
||||||
|
reused across multiple services. The <code>Layer</code> trait can be used to write
|
||||||
|
reusable components that can be applied to very different kinds of services;
|
||||||
|
for example, it can be applied to services operating on different protocols,
|
||||||
|
and to both the client and server side of a network transaction.</p>
|
||||||
|
<h1 id="log" class="section-header"><a href="#log">Log</a></h1>
|
||||||
|
<p>Take request logging as an example:</p>
|
||||||
|
|
||||||
|
<div class="example-wrap"><pre class="rust rust-example-rendered">
|
||||||
|
|
||||||
|
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">LogLayer</span> {
|
||||||
|
<span class="ident">target</span>: <span class="kw-2">&</span><span class="lifetime">'static</span> <span class="ident">str</span>,
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">impl</span><span class="op"><</span><span class="ident">S</span><span class="op">></span> <span class="ident">Layer</span><span class="op"><</span><span class="ident">S</span><span class="op">></span> <span class="kw">for</span> <span class="ident">LogLayer</span> {
|
||||||
|
<span class="kw">type</span> <span class="ident">Service</span> <span class="op">=</span> <span class="ident">LogService</span><span class="op"><</span><span class="ident">S</span><span class="op">></span>;
|
||||||
|
|
||||||
|
<span class="kw">fn</span> <span class="ident">layer</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">service</span>: <span class="ident">S</span>) <span class="op">-</span><span class="op">></span> <span class="self">Self</span>::<span class="ident">Service</span> {
|
||||||
|
<span class="ident">LogService</span> {
|
||||||
|
<span class="ident">target</span>: <span class="self">self</span>.<span class="ident">target</span>,
|
||||||
|
<span class="ident">service</span>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="comment">// This service implements the Log behavior</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">LogService</span><span class="op"><</span><span class="ident">S</span><span class="op">></span> {
|
||||||
|
<span class="ident">target</span>: <span class="kw-2">&</span><span class="lifetime">'static</span> <span class="ident">str</span>,
|
||||||
|
<span class="ident">service</span>: <span class="ident">S</span>,
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">impl</span><span class="op"><</span><span class="ident">S</span>, <span class="ident">Request</span><span class="op">></span> <span class="ident">Service</span><span class="op"><</span><span class="ident">Request</span><span class="op">></span> <span class="kw">for</span> <span class="ident">LogService</span><span class="op"><</span><span class="ident">S</span><span class="op">></span>
|
||||||
|
<span class="kw">where</span>
|
||||||
|
<span class="ident">S</span>: <span class="ident">Service</span><span class="op"><</span><span class="ident">Request</span><span class="op">></span>,
|
||||||
|
<span class="ident">Request</span>: <span class="ident">fmt</span>::<span class="ident">Debug</span>,
|
||||||
|
{
|
||||||
|
<span class="kw">type</span> <span class="ident">Response</span> <span class="op">=</span> <span class="ident">S</span>::<span class="ident">Response</span>;
|
||||||
|
<span class="kw">type</span> <span class="ident">Error</span> <span class="op">=</span> <span class="ident">S</span>::<span class="ident">Error</span>;
|
||||||
|
<span class="kw">type</span> <span class="ident">Future</span> <span class="op">=</span> <span class="ident">S</span>::<span class="ident">Future</span>;
|
||||||
|
|
||||||
|
<span class="kw">fn</span> <span class="ident">poll_ready</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">cx</span>: <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">Context</span><span class="op"><</span><span class="lifetime">'_</span><span class="op">></span>) <span class="op">-</span><span class="op">></span> <span class="ident">Poll</span><span class="op"><</span><span class="prelude-ty">Result</span><span class="op"><</span>(), <span class="self">Self</span>::<span class="ident">Error</span><span class="op">></span><span class="op">></span> {
|
||||||
|
<span class="self">self</span>.<span class="ident">service</span>.<span class="ident">poll_ready</span>(<span class="ident">cx</span>)
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">fn</span> <span class="ident">call</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">request</span>: <span class="ident">Request</span>) <span class="op">-</span><span class="op">></span> <span class="self">Self</span>::<span class="ident">Future</span> {
|
||||||
|
<span class="comment">// Insert log statement here or other functionality</span>
|
||||||
|
<span class="macro">println</span><span class="macro">!</span>(<span class="string">"request = {:?}, target = {:?}"</span>, <span class="ident">request</span>, <span class="self">self</span>.<span class="ident">target</span>);
|
||||||
|
<span class="self">self</span>.<span class="ident">service</span>.<span class="ident">call</span>(<span class="ident">request</span>)
|
||||||
|
}
|
||||||
|
}</pre></div>
|
||||||
|
<p>The above log implementation is decoupled from the underlying protocol and
|
||||||
|
is also decoupled from client or server concerns. In other words, the same
|
||||||
|
log middleware could be used in either a client or a server.</p>
|
||||||
|
</div>
|
||||||
|
<h2 id='associated-types' class='small-section-header'>Associated Types<a href='#associated-types' class='anchor'></a></h2><div class='methods'><h3 id='associatedtype.Service' class='method'><code id='Service.t'>type <a href='#associatedtype.Service' class="type">Service</a></code></h3><div class='docblock'><p>The wrapped service</p>
|
||||||
|
</div></div><span class='loading-content'>Loading content...</span>
|
||||||
|
<h2 id='required-methods' class='small-section-header'>Required methods<a href='#required-methods' class='anchor'></a></h2><div class='methods'><h3 id='tymethod.layer' class='method'><code id='layer.v'>fn <a href='#tymethod.layer' class='fnname'>layer</a>(&self, inner: S) -> Self::<a class="type" href="../../tower/layer/trait.Layer.html#associatedtype.Service" title="type tower::layer::Layer::Service">Service</a></code></h3><div class='docblock'><p>Wrap the given service with the middleware, returning a new service
|
||||||
|
that has been decorated with the middleware.</p>
|
||||||
|
</div></div><span class='loading-content'>Loading content...</span>
|
||||||
|
<h2 id='foreign-impls' class='small-section-header'>Implementations on Foreign Types<a href='#foreign-impls' class='anchor'></a></h2><h3 id='impl-Layer%3CS%3E-for-%26%27a%20T' class='impl'><code class='in-band'>impl<'a, T, S> <a class="trait" href="../../tower/layer/trait.Layer.html" title="trait tower::layer::Layer">Layer</a><S> for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&'a </a>T <span class="where fmt-newline">where<br> T: <a class="trait" href="../../tower/layer/trait.Layer.html" title="trait tower::layer::Layer">Layer</a><S> + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>, </span></code><a href='#impl-Layer%3CS%3E-for-%26%27a%20T' class='anchor'></a><a class='srclink' href='../../src/tower_layer/lib.rs.html#92-101' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='associatedtype.Service-1' class="type"><code id='Service.t-1'>type <a href='#associatedtype.Service' class="type">Service</a> = <T as <a class="trait" href="../../tower/layer/trait.Layer.html" title="trait tower::layer::Layer">Layer</a><S>>::<a class="type" href="../../tower/layer/trait.Layer.html#associatedtype.Service" title="type tower::layer::Layer::Service">Service</a></code></h4><h4 id='method.layer' class="method hidden"><code id='layer.v-1'>fn <a href='#method.layer' class='fnname'>layer</a>(&self, inner: S) -> <<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&'a </a>T as <a class="trait" href="../../tower/layer/trait.Layer.html" title="trait tower::layer::Layer">Layer</a><S>>::<a class="type" href="../../tower/layer/trait.Layer.html#associatedtype.Service" title="type tower::layer::Layer::Service">Service</a></code><a class='srclink' href='../../src/tower_layer/lib.rs.html#98-100' title='goto source code'>[src]</a></h4></div><span class='loading-content'>Loading content...</span>
|
||||||
|
<h2 id='implementors' class='small-section-header'>Implementors<a href='#implementors' class='anchor'></a></h2><div class='item-list' id='implementors-list'><h3 id='impl-Layer%3CS%3E' class='impl'><code class='in-band'>impl<S> Layer<S> for <a class="struct" href="../../tower/layer/util/struct.Identity.html" title="struct tower::layer::util::Identity">Identity</a></code><a href='#impl-Layer%3CS%3E' class='anchor'></a><a class='srclink' href='../../src/tower_layer/identity.rs.html#21-27' title='goto source code'>[src]</a></h3><div class='docblock'><p>Decorates a <code>Service</code>, transforming either the request or the response.</p>
|
||||||
|
</div><div class='impl-items'><h4 id='associatedtype.Service-2' class="type"><code id='Service.t-2'>type <a href='#associatedtype.Service-2' class="type">Service</a> = S</code></h4><h4 id='method.layer-1' class="method hidden"><code id='layer.v-2'>fn <a href='#method.layer-1' class='fnname'>layer</a>(&self, inner: S) -> <<a class="struct" href="../../tower/layer/util/struct.Identity.html" title="struct tower::layer::util::Identity">Identity</a> as <a class="trait" href="../../tower/layer/trait.Layer.html" title="trait tower::layer::Layer">Layer</a><S>>::<a class="type" href="../../tower/layer/trait.Layer.html#associatedtype.Service" title="type tower::layer::Layer::Service">Service</a></code><a class='srclink' href='../../src/tower_layer/identity.rs.html#24-26' title='goto source code'>[src]</a></h4></div><h3 id='impl-Layer%3CS%3E-1' class='impl'><code class='in-band'>impl<S, Inner, Outer> Layer<S> for <a class="struct" href="../../tower/layer/util/struct.Stack.html" title="struct tower::layer::util::Stack">Stack</a><Inner, Outer> <span class="where fmt-newline">where<br> Inner: <a class="trait" href="../../tower/layer/trait.Layer.html" title="trait tower::layer::Layer">Layer</a><S>,<br> Outer: <a class="trait" href="../../tower/layer/trait.Layer.html" title="trait tower::layer::Layer">Layer</a><<Inner as <a class="trait" href="../../tower/layer/trait.Layer.html" title="trait tower::layer::Layer">Layer</a><S>>::<a class="type" href="../../tower/layer/trait.Layer.html#associatedtype.Service" title="type tower::layer::Layer::Service">Service</a>>, </span></code><a href='#impl-Layer%3CS%3E-1' class='anchor'></a><a class='srclink' href='../../src/tower_layer/stack.rs.html#18-30' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='associatedtype.Service-3' class="type"><code id='Service.t-3'>type <a href='#associatedtype.Service-3' class="type">Service</a> = <Outer as <a class="trait" href="../../tower/layer/trait.Layer.html" title="trait tower::layer::Layer">Layer</a><<Inner as <a class="trait" href="../../tower/layer/trait.Layer.html" title="trait tower::layer::Layer">Layer</a><S>>::<a class="type" href="../../tower/layer/trait.Layer.html#associatedtype.Service" title="type tower::layer::Layer::Service">Service</a>>>::<a class="type" href="../../tower/layer/trait.Layer.html#associatedtype.Service" title="type tower::layer::Layer::Service">Service</a></code></h4><h4 id='method.layer-2' class="method hidden"><code id='layer.v-3'>fn <a href='#method.layer-2' class='fnname'>layer</a>(&self, service: S) -> <<a class="struct" href="../../tower/layer/util/struct.Stack.html" title="struct tower::layer::util::Stack">Stack</a><Inner, Outer> as <a class="trait" href="../../tower/layer/trait.Layer.html" title="trait tower::layer::Layer">Layer</a><S>>::<a class="type" href="../../tower/layer/trait.Layer.html#associatedtype.Service" title="type tower::layer::Layer::Service">Service</a></code><a class='srclink' href='../../src/tower_layer/stack.rs.html#25-29' title='goto source code'>[src]</a></h4></div></div><span class='loading-content'>Loading content...</span><script type="text/javascript" src="../../implementors/tower_layer/trait.Layer.js" async></script></section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../";window.currentCrate = "tower";</script><script src="../../aliases.js"></script><script src="../../main.js"></script><script defer src="../../search-index.js"></script></body></html>
|
|
@ -0,0 +1,5 @@
|
||||||
|
<!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="API documentation for the Rust `util` mod in crate `tower`."><meta name="keywords" content="rust, rustlang, rust-lang, util"><title>tower::layer::util - Rust</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><noscript><link rel="stylesheet" href="../../../noscript.css"></noscript><link rel="shortcut icon" href="../../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../../down-arrow.svg");}</style></head><body class="rustdoc mod"><!--[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">☰</div><a href='../../../tower/index.html'><div class='logo-container'><img src='../../../rust-logo.png' alt='logo'></div></a><p class='location'>Module util</p><div class="sidebar-elems"><div class="block items"><ul><li><a href="#structs">Structs</a></li></ul></div><p class='location'><a href='../../index.html'>tower</a>::<wbr><a href='../index.html'>layer</a></p><script>window.sidebarCurrent = {name: 'util', ty: 'mod', relpath: '../'};</script><script defer src="../sidebar-items.js"></script></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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"><h1 class='fqn'><span class='out-of-band'><span id='render-detail'><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class='inner'>−</span>]</a></span><a class='srclink' href='../../../src/tower/layer.rs.html#6-8' title='goto source code'>[src]</a></span><span class='in-band'>Module <a href='../../index.html'>tower</a>::<wbr><a href='../index.html'>layer</a>::<wbr><a class="mod" href=''>util</a></span></h1><div class='docblock'><p><code>util</code> exports an Identity Layer and Chain, a mechanism for chaining them.</p>
|
||||||
|
</div><h2 id='structs' class='section-header'><a href="#structs">Structs</a></h2>
|
||||||
|
<table><tr class='module-item'><td><a class="struct" href="struct.Identity.html" title='tower::layer::util::Identity struct'>Identity</a></td><td class='docblock-short'><p>A no-op middleware.</p>
|
||||||
|
</td></tr><tr class='module-item'><td><a class="struct" href="struct.Stack.html" title='tower::layer::util::Stack struct'>Stack</a></td><td class='docblock-short'><p>Two middlewares chained together.</p>
|
||||||
|
</td></tr></table></section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../../";window.currentCrate = "tower";</script><script src="../../../aliases.js"></script><script src="../../../main.js"></script><script defer src="../../../search-index.js"></script></body></html>
|
|
@ -0,0 +1 @@
|
||||||
|
initSidebarItems({"struct":[["Identity","A no-op middleware."],["Stack","Two middlewares chained together."]]});
|
|
@ -0,0 +1,25 @@
|
||||||
|
<!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="API documentation for the Rust `Identity` struct in crate `tower`."><meta name="keywords" content="rust, rustlang, rust-lang, Identity"><title>tower::layer::util::Identity - Rust</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><noscript><link rel="stylesheet" href="../../../noscript.css"></noscript><link rel="shortcut icon" href="../../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../../down-arrow.svg");}</style></head><body class="rustdoc struct"><!--[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">☰</div><a href='../../../tower/index.html'><div class='logo-container'><img src='../../../rust-logo.png' alt='logo'></div></a><p class='location'>Struct Identity</p><div class="sidebar-elems"><div class="block items"><a class="sidebar-title" href="#methods">Methods</a><div class="sidebar-links"><a href="#method.new">new</a></div><a class="sidebar-title" href="#implementations">Trait Implementations</a><div class="sidebar-links"><a href="#impl-Clone">Clone</a><a href="#impl-Debug">Debug</a><a href="#impl-Default">Default</a><a href="#impl-Layer%3CS%3E">Layer<S></a></div><a class="sidebar-title" href="#synthetic-implementations">Auto Trait Implementations</a><div class="sidebar-links"><a href="#impl-RefUnwindSafe">RefUnwindSafe</a><a href="#impl-Send">Send</a><a href="#impl-Sync">Sync</a><a href="#impl-Unpin">Unpin</a><a href="#impl-UnwindSafe">UnwindSafe</a></div><a class="sidebar-title" href="#blanket-implementations">Blanket Implementations</a><div class="sidebar-links"><a href="#impl-Any">Any</a><a href="#impl-Borrow%3CT%3E">Borrow<T></a><a href="#impl-BorrowMut%3CT%3E">BorrowMut<T></a><a href="#impl-From%3CT%3E">From<T></a><a href="#impl-Into%3CU%3E">Into<U></a><a href="#impl-ToOwned">ToOwned</a><a href="#impl-TryFrom%3CU%3E">TryFrom<U></a><a href="#impl-TryInto%3CU%3E">TryInto<U></a></div></div><p class='location'><a href='../../index.html'>tower</a>::<wbr><a href='../index.html'>layer</a>::<wbr><a href='index.html'>util</a></p><script>window.sidebarCurrent = {name: 'Identity', ty: 'struct', relpath: ''};</script><script defer src="sidebar-items.js"></script></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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"><h1 class='fqn'><span class='out-of-band'><span id='render-detail'><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class='inner'>−</span>]</a></span><a class='srclink' href='../../../src/tower_layer/identity.rs.html#9-11' title='goto source code'>[src]</a></span><span class='in-band'>Struct <a href='../../index.html'>tower</a>::<wbr><a href='../index.html'>layer</a>::<wbr><a href='index.html'>util</a>::<wbr><a class="struct" href=''>Identity</a></span></h1><div class="docblock type-decl hidden-by-usual-hider"><pre class='rust struct'>pub struct Identity { /* fields omitted */ }</pre></div><div class='docblock'><p>A no-op middleware.</p>
|
||||||
|
<p>When wrapping a <code>Service</code>, the <code>Identity</code> layer returns the provided
|
||||||
|
service without modifying it.</p>
|
||||||
|
</div><h2 id='methods' class='small-section-header'>Methods<a href='#methods' class='anchor'></a></h2><h3 id='impl' class='impl'><code class='in-band'>impl <a class="struct" href="../../../tower/layer/util/struct.Identity.html" title="struct tower::layer::util::Identity">Identity</a></code><a href='#impl' class='anchor'></a><a class='srclink' href='../../../src/tower_layer/identity.rs.html#13-18' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.new' class="method"><code id='new.v'>pub fn <a href='#method.new' class='fnname'>new</a>() -> <a class="struct" href="../../../tower/layer/util/struct.Identity.html" title="struct tower::layer::util::Identity">Identity</a></code><a class='srclink' href='../../../src/tower_layer/identity.rs.html#15-17' title='goto source code'>[src]</a></h4><div class='docblock'><p>Create a new <code>Identity</code> value</p>
|
||||||
|
</div></div><h2 id='implementations' class='small-section-header'>Trait Implementations<a href='#implementations' class='anchor'></a></h2><div id='implementations-list'><h3 id='impl-Clone' class='impl'><code class='in-band'>impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a> for <a class="struct" href="../../../tower/layer/util/struct.Identity.html" title="struct tower::layer::util::Identity">Identity</a></code><a href='#impl-Clone' class='anchor'></a><a class='srclink' href='../../../src/tower_layer/identity.rs.html#8' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.clone' class="method hidden"><code id='clone.v'>fn <a href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#tymethod.clone' class='fnname'>clone</a>(&self) -> <a class="struct" href="../../../tower/layer/util/struct.Identity.html" title="struct tower::layer::util::Identity">Identity</a></code><a class='srclink' href='../../../src/tower_layer/identity.rs.html#8' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Returns a copy of the value. <a href="https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#tymethod.clone">Read more</a></p>
|
||||||
|
</div><h4 id='method.clone_from' class="method hidden"><code id='clone_from.v'>fn <a href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#method.clone_from' class='fnname'>clone_from</a>(&mut self, source: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&</a>Self)</code><span class='since' title='Stable since Rust version 1.0.0'>1.0.0</span><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/clone.rs.html#131-133' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Performs copy-assignment from <code>source</code>. <a href="https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#method.clone_from">Read more</a></p>
|
||||||
|
</div></div><h3 id='impl-Debug' class='impl'><code class='in-band'>impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html" title="trait core::fmt::Debug">Debug</a> for <a class="struct" href="../../../tower/layer/util/struct.Identity.html" title="struct tower::layer::util::Identity">Identity</a></code><a href='#impl-Debug' class='anchor'></a><a class='srclink' href='../../../src/tower_layer/identity.rs.html#29-33' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.fmt' class="method hidden"><code id='fmt.v'>fn <a href='https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html#tymethod.fmt' class='fnname'>fmt</a>(&self, f: &mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html" title="struct core::fmt::Formatter">Formatter</a>) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.unit.html">()</a>, <a class="struct" href="https://doc.rust-lang.org/nightly/core/fmt/struct.Error.html" title="struct core::fmt::Error">Error</a>></code><a class='srclink' href='../../../src/tower_layer/identity.rs.html#30-32' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Formats the value using the given formatter. <a href="https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html#tymethod.fmt">Read more</a></p>
|
||||||
|
</div></div><h3 id='impl-Default' class='impl'><code class='in-band'>impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/default/trait.Default.html" title="trait core::default::Default">Default</a> for <a class="struct" href="../../../tower/layer/util/struct.Identity.html" title="struct tower::layer::util::Identity">Identity</a></code><a href='#impl-Default' class='anchor'></a><a class='srclink' href='../../../src/tower_layer/identity.rs.html#8' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.default' class="method hidden"><code id='default.v'>fn <a href='https://doc.rust-lang.org/nightly/core/default/trait.Default.html#tymethod.default' class='fnname'>default</a>() -> <a class="struct" href="../../../tower/layer/util/struct.Identity.html" title="struct tower::layer::util::Identity">Identity</a></code><a class='srclink' href='../../../src/tower_layer/identity.rs.html#8' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Returns the "default value" for a type. <a href="https://doc.rust-lang.org/nightly/core/default/trait.Default.html#tymethod.default">Read more</a></p>
|
||||||
|
</div></div><h3 id='impl-Layer%3CS%3E' class='impl'><code class='in-band'>impl<S> <a class="trait" href="../../../tower/layer/trait.Layer.html" title="trait tower::layer::Layer">Layer</a><S> for <a class="struct" href="../../../tower/layer/util/struct.Identity.html" title="struct tower::layer::util::Identity">Identity</a></code><a href='#impl-Layer%3CS%3E' class='anchor'></a><a class='srclink' href='../../../src/tower_layer/identity.rs.html#21-27' title='goto source code'>[src]</a></h3><div class='docblock'><p>Decorates a <code>Service</code>, transforming either the request or the response.</p>
|
||||||
|
</div><div class='impl-items'><h4 id='associatedtype.Service' class="type"><code id='Service.t'>type <a href='../../../tower/layer/trait.Layer.html#associatedtype.Service' class="type">Service</a> = S</code></h4><div class='docblock'><p>The wrapped service</p>
|
||||||
|
</div><h4 id='method.layer' class="method hidden"><code id='layer.v'>fn <a href='../../../tower/layer/trait.Layer.html#tymethod.layer' class='fnname'>layer</a>(&self, inner: S) -> <<a class="struct" href="../../../tower/layer/util/struct.Identity.html" title="struct tower::layer::util::Identity">Identity</a> as <a class="trait" href="../../../tower/layer/trait.Layer.html" title="trait tower::layer::Layer">Layer</a><S>>::<a class="type" href="../../../tower/layer/trait.Layer.html#associatedtype.Service" title="type tower::layer::Layer::Service">Service</a></code><a class='srclink' href='../../../src/tower_layer/identity.rs.html#24-26' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Wrap the given service with the middleware, returning a new service that has been decorated with the middleware. <a href="../../../tower/layer/trait.Layer.html#tymethod.layer">Read more</a></p>
|
||||||
|
</div></div></div><h2 id='synthetic-implementations' class='small-section-header'>Auto Trait Implementations<a href='#synthetic-implementations' class='anchor'></a></h2><div id='synthetic-implementations-list'><h3 id='impl-RefUnwindSafe' class='impl'><code class='in-band'>impl <a class="trait" href="https://doc.rust-lang.org/nightly/std/panic/trait.RefUnwindSafe.html" title="trait std::panic::RefUnwindSafe">RefUnwindSafe</a> for <a class="struct" href="../../../tower/layer/util/struct.Identity.html" title="struct tower::layer::util::Identity">Identity</a></code><a href='#impl-RefUnwindSafe' class='anchor'></a></h3><div class='impl-items'></div><h3 id='impl-Send' class='impl'><code class='in-band'>impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> for <a class="struct" href="../../../tower/layer/util/struct.Identity.html" title="struct tower::layer::util::Identity">Identity</a></code><a href='#impl-Send' class='anchor'></a></h3><div class='impl-items'></div><h3 id='impl-Sync' class='impl'><code class='in-band'>impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="struct" href="../../../tower/layer/util/struct.Identity.html" title="struct tower::layer::util::Identity">Identity</a></code><a href='#impl-Sync' class='anchor'></a></h3><div class='impl-items'></div><h3 id='impl-Unpin' class='impl'><code class='in-band'>impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class="struct" href="../../../tower/layer/util/struct.Identity.html" title="struct tower::layer::util::Identity">Identity</a></code><a href='#impl-Unpin' class='anchor'></a></h3><div class='impl-items'></div><h3 id='impl-UnwindSafe' class='impl'><code class='in-band'>impl <a class="trait" href="https://doc.rust-lang.org/nightly/std/panic/trait.UnwindSafe.html" title="trait std::panic::UnwindSafe">UnwindSafe</a> for <a class="struct" href="../../../tower/layer/util/struct.Identity.html" title="struct tower::layer::util::Identity">Identity</a></code><a href='#impl-UnwindSafe' class='anchor'></a></h3><div class='impl-items'></div></div><h2 id='blanket-implementations' class='small-section-header'>Blanket Implementations<a href='#blanket-implementations' class='anchor'></a></h2><div id='blanket-implementations-list'><h3 id='impl-Any' class='impl'><code class='in-band'>impl<T> <a class="trait" href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html" title="trait core::any::Any">Any</a> for T <span class="where fmt-newline">where<br> T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>, </span></code><a href='#impl-Any' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/any.rs.html#108-112' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.type_id' class="method hidden"><code id='type_id.v'>fn <a href='https://doc.rust-lang.org/nightly/core/any/trait.Any.html#tymethod.type_id' class='fnname'>type_id</a>(&self) -> <a class="struct" href="https://doc.rust-lang.org/nightly/core/any/struct.TypeId.html" title="struct core::any::TypeId">TypeId</a></code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/any.rs.html#109-111' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Gets the <code>TypeId</code> of <code>self</code>. <a href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html#tymethod.type_id">Read more</a></p>
|
||||||
|
</div></div><h3 id='impl-Borrow%3CT%3E' class='impl'><code class='in-band'>impl<T> <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html" title="trait core::borrow::Borrow">Borrow</a><T> for T <span class="where fmt-newline">where<br> T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>, </span></code><a href='#impl-Borrow%3CT%3E' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#213-217' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.borrow' class="method hidden"><code id='borrow.v'>fn <a href='https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html#tymethod.borrow' class='fnname'>borrow</a>(&self) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&</a>T</code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#214-216' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Immutably borrows from an owned value. <a href="https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html#tymethod.borrow">Read more</a></p>
|
||||||
|
</div></div><h3 id='impl-BorrowMut%3CT%3E' class='impl'><code class='in-band'>impl<T> <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html" title="trait core::borrow::BorrowMut">BorrowMut</a><T> for T <span class="where fmt-newline">where<br> T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>, </span></code><a href='#impl-BorrowMut%3CT%3E' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#220-224' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.borrow_mut' class="method hidden"><code id='borrow_mut.v'>fn <a href='https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut' class='fnname'>borrow_mut</a>(&mut self) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&mut </a>T</code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#221-223' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Mutably borrows from an owned value. <a href="https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut">Read more</a></p>
|
||||||
|
</div></div><h3 id='impl-From%3CT%3E' class='impl'><code class='in-band'>impl<T> <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.From.html" title="trait core::convert::From">From</a><T> for T</code><a href='#impl-From%3CT%3E' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#564-568' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.from' class="method hidden"><code id='from.v'>fn <a href='https://doc.rust-lang.org/nightly/core/convert/trait.From.html#tymethod.from' class='fnname'>from</a>(t: T) -> T</code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#565-567' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Performs the conversion.</p>
|
||||||
|
</div></div><h3 id='impl-Into%3CU%3E' class='impl'><code class='in-band'>impl<T, U> <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><U> for T <span class="where fmt-newline">where<br> U: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.From.html" title="trait core::convert::From">From</a><T>, </span></code><a href='#impl-Into%3CU%3E' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#553-560' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.into' class="method hidden"><code id='into.v'>fn <a href='https://doc.rust-lang.org/nightly/core/convert/trait.Into.html#tymethod.into' class='fnname'>into</a>(self) -> U</code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#557-559' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Performs the conversion.</p>
|
||||||
|
</div></div><h3 id='impl-ToOwned' class='impl'><code class='in-band'>impl<T> <a class="trait" href="https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html" title="trait alloc::borrow::ToOwned">ToOwned</a> for T <span class="where fmt-newline">where<br> T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>, </span></code><a href='#impl-ToOwned' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#80-92' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='associatedtype.Owned' class="type"><code id='Owned.t'>type <a href='https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#associatedtype.Owned' class="type">Owned</a> = T</code></h4><div class='docblock'><p>The resulting type after obtaining ownership.</p>
|
||||||
|
</div><h4 id='method.to_owned' class="method hidden"><code id='to_owned.v'>fn <a href='https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#tymethod.to_owned' class='fnname'>to_owned</a>(&self) -> T</code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#85-87' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Creates owned data from borrowed data, usually by cloning. <a href="https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#tymethod.to_owned">Read more</a></p>
|
||||||
|
</div><h4 id='method.clone_into' class="method hidden"><code id='clone_into.v'>fn <a href='https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#method.clone_into' class='fnname'>clone_into</a>(&self, target: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&mut </a>T)</code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#89-91' title='goto source code'>[src]</a></h4><div class='stability hidden'><div class='stab unstable'><details><summary><span class='emoji'>🔬</span> This is a nightly-only experimental API. (<code>toowned_clone_into</code>)</summary><p>recently added</p>
|
||||||
|
</details></div></div><div class='docblock hidden'><p>Uses borrowed data to replace owned data, usually by cloning. <a href="https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#method.clone_into">Read more</a></p>
|
||||||
|
</div></div><h3 id='impl-TryFrom%3CU%3E' class='impl'><code class='in-band'>impl<T, U> <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a><U> for T <span class="where fmt-newline">where<br> U: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><T>, </span></code><a href='#impl-TryFrom%3CU%3E' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#601-610' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='associatedtype.Error' class="type"><code id='Error.t'>type <a href='https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error' class="type">Error</a> = <a class="enum" href="https://doc.rust-lang.org/nightly/core/convert/enum.Infallible.html" title="enum core::convert::Infallible">Infallible</a></code></h4><div class='docblock'><p>The type returned in the event of a conversion error.</p>
|
||||||
|
</div><h4 id='method.try_from' class="method hidden"><code id='try_from.v'>fn <a href='https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#tymethod.try_from' class='fnname'>try_from</a>(value: U) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a><T, <T as <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a><U>>::<a class="type" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a>></code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#607-609' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Performs the conversion.</p>
|
||||||
|
</div></div><h3 id='impl-TryInto%3CU%3E' class='impl'><code class='in-band'>impl<T, U> <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html" title="trait core::convert::TryInto">TryInto</a><U> for T <span class="where fmt-newline">where<br> U: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a><T>, </span></code><a href='#impl-TryInto%3CU%3E' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#587-596' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='associatedtype.Error-1' class="type"><code id='Error.t-1'>type <a href='https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html#associatedtype.Error' class="type">Error</a> = <U as <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a><T>>::<a class="type" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a></code></h4><div class='docblock'><p>The type returned in the event of a conversion error.</p>
|
||||||
|
</div><h4 id='method.try_into' class="method hidden"><code id='try_into.v'>fn <a href='https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html#tymethod.try_into' class='fnname'>try_into</a>(self) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a><U, <U as <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a><T>>::<a class="type" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a>></code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#593-595' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Performs the conversion.</p>
|
||||||
|
</div></div></div></section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../../";window.currentCrate = "tower";</script><script src="../../../aliases.js"></script><script src="../../../main.js"></script><script defer src="../../../search-index.js"></script></body></html>
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1 @@
|
||||||
|
initSidebarItems({"mod":[["builder","Builder types to compose layers and services"],["layer","A collection of `Layer` based tower services"]],"struct":[["ServiceBuilder","Declaratively construct Service values."]],"trait":[["Layer","Decorates a `Service`, transforming either the request or the response."],["Service","An asynchronous function from a `Request` to a `Response`."]],"type":[["BoxError","Alias for a type-erased error type."]]});
|
|
@ -0,0 +1,74 @@
|
||||||
|
<!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="API documentation for the Rust `ServiceBuilder` struct in crate `tower`."><meta name="keywords" content="rust, rustlang, rust-lang, ServiceBuilder"><title>tower::ServiceBuilder - Rust</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><noscript><link rel="stylesheet" href="../noscript.css"></noscript><link rel="shortcut icon" href="../favicon.ico"><style type="text/css">#crate-search{background-image:url("../down-arrow.svg");}</style></head><body class="rustdoc struct"><!--[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">☰</div><a href='../tower/index.html'><div class='logo-container'><img src='../rust-logo.png' alt='logo'></div></a><p class='location'>Struct ServiceBuilder</p><div class="sidebar-elems"><div class="block items"><a class="sidebar-title" href="#methods">Methods</a><div class="sidebar-links"><a href="#method.into_inner">into_inner</a><a href="#method.layer">layer</a><a href="#method.new">new</a><a href="#method.service">service</a></div><a class="sidebar-title" href="#implementations">Trait Implementations</a><div class="sidebar-links"><a href="#impl-Clone">Clone</a><a href="#impl-Debug">Debug</a></div><a class="sidebar-title" href="#synthetic-implementations">Auto Trait Implementations</a><div class="sidebar-links"><a href="#impl-RefUnwindSafe">RefUnwindSafe</a><a href="#impl-Send">Send</a><a href="#impl-Sync">Sync</a><a href="#impl-Unpin">Unpin</a><a href="#impl-UnwindSafe">UnwindSafe</a></div><a class="sidebar-title" href="#blanket-implementations">Blanket Implementations</a><div class="sidebar-links"><a href="#impl-Any">Any</a><a href="#impl-Borrow%3CT%3E">Borrow<T></a><a href="#impl-BorrowMut%3CT%3E">BorrowMut<T></a><a href="#impl-From%3CT%3E">From<T></a><a href="#impl-Into%3CU%3E">Into<U></a><a href="#impl-ToOwned">ToOwned</a><a href="#impl-TryFrom%3CU%3E">TryFrom<U></a><a href="#impl-TryInto%3CU%3E">TryInto<U></a></div></div><p class='location'><a href='index.html'>tower</a></p><script>window.sidebarCurrent = {name: 'ServiceBuilder', ty: 'struct', relpath: ''};</script><script defer src="sidebar-items.js"></script></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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"><h1 class='fqn'><span class='out-of-band'><span id='render-detail'><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class='inner'>−</span>]</a></span><a class='srclink' href='../src/tower/builder/mod.rs.html#105-107' title='goto source code'>[src]</a></span><span class='in-band'>Struct <a href='index.html'>tower</a>::<wbr><a class="struct" href=''>ServiceBuilder</a></span></h1><div class="docblock type-decl hidden-by-usual-hider"><pre class='rust struct'>pub struct ServiceBuilder<L> { /* fields omitted */ }</pre></div><div class='docblock'><p>Declaratively construct Service values.</p>
|
||||||
|
<p><code>ServiceBuilder</code> provides a <a href="https://doc.rust-lang.org/1.0.0/style/ownership/builders.html">builder-like interface</a> for composing
|
||||||
|
layers to be applied to a <code>Service</code>.</p>
|
||||||
|
<h1 id="service" class="section-header"><a href="#service">Service</a></h1>
|
||||||
|
<p>A <a href="tower_service::Service"><code>Service</code></a> is a trait representing an
|
||||||
|
asynchronous function of a request to a response. It is similar to <code>async fn(Request) -> Result<Response, Error></code>.</p>
|
||||||
|
<p>A <code>Service</code> is typically bound to a single transport, such as a TCP
|
||||||
|
connection. It defines how <em>all</em> inbound or outbound requests are handled
|
||||||
|
by that connection.</p>
|
||||||
|
<h1 id="order" class="section-header"><a href="#order">Order</a></h1>
|
||||||
|
<p>The order in which layers are added impacts how requests are handled. Layers
|
||||||
|
that are added first will be called with the request first. The argument to
|
||||||
|
<code>service</code> will be last to see the request.</p>
|
||||||
|
|
||||||
|
<div class="example-wrap"><pre class="rust rust-example-rendered">
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">all</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"buffer"</span>, <span class="ident">feature</span> <span class="op">=</span> <span class="string">"limit"</span>))]</span>
|
||||||
|
<span class="ident">ServiceBuilder</span>::<span class="ident">new</span>()
|
||||||
|
.<span class="ident">buffer</span>(<span class="number">100</span>)
|
||||||
|
.<span class="ident">concurrency_limit</span>(<span class="number">10</span>)
|
||||||
|
.<span class="ident">service</span>(<span class="ident">svc</span>)</pre></div>
|
||||||
|
<p>In the above example, the buffer layer receives the request first followed
|
||||||
|
by <code>concurrency_limit</code>. <code>buffer</code> enables up to 100 request to be in-flight
|
||||||
|
<strong>on top of</strong> the requests that have already been forwarded to the next
|
||||||
|
layer. Combined with <code>concurrency_limit</code>, this allows up to 110 requests to be
|
||||||
|
in-flight.</p>
|
||||||
|
|
||||||
|
<div class="example-wrap"><pre class="rust rust-example-rendered">
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">all</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"buffer"</span>, <span class="ident">feature</span> <span class="op">=</span> <span class="string">"limit"</span>))]</span>
|
||||||
|
<span class="ident">ServiceBuilder</span>::<span class="ident">new</span>()
|
||||||
|
.<span class="ident">concurrency_limit</span>(<span class="number">10</span>)
|
||||||
|
.<span class="ident">buffer</span>(<span class="number">100</span>)
|
||||||
|
.<span class="ident">service</span>(<span class="ident">svc</span>)</pre></div>
|
||||||
|
<p>The above example is similar, but the order of layers is reversed. Now,
|
||||||
|
<code>concurrency_limit</code> applies first and only allows 10 requests to be in-flight
|
||||||
|
total.</p>
|
||||||
|
<h1 id="examples" class="section-header"><a href="#examples">Examples</a></h1>
|
||||||
|
<p>A <code>Service</code> stack with a single layer:</p>
|
||||||
|
|
||||||
|
<div class="example-wrap"><pre class="rust rust-example-rendered">
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"limit"</span>)]</span>
|
||||||
|
<span class="ident">ServiceBuilder</span>::<span class="ident">new</span>()
|
||||||
|
.<span class="ident">concurrency_limit</span>(<span class="number">5</span>)
|
||||||
|
.<span class="ident">service</span>(<span class="ident">svc</span>);</pre></div>
|
||||||
|
<p>A <code>Service</code> stack with <em>multiple</em> layers that contain rate limiting,
|
||||||
|
in-flight request limits, and a channel-backed, clonable <code>Service</code>:</p>
|
||||||
|
|
||||||
|
<div class="example-wrap"><pre class="rust rust-example-rendered">
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">all</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"buffer"</span>, <span class="ident">feature</span> <span class="op">=</span> <span class="string">"limit"</span>))]</span>
|
||||||
|
<span class="ident">ServiceBuilder</span>::<span class="ident">new</span>()
|
||||||
|
.<span class="ident">buffer</span>(<span class="number">5</span>)
|
||||||
|
.<span class="ident">concurrency_limit</span>(<span class="number">5</span>)
|
||||||
|
.<span class="ident">rate_limit</span>(<span class="number">5</span>, <span class="ident">Duration</span>::<span class="ident">from_secs</span>(<span class="number">1</span>))
|
||||||
|
.<span class="ident">service</span>(<span class="ident">svc</span>);</pre></div>
|
||||||
|
</div><h2 id='methods' class='small-section-header'>Methods<a href='#methods' class='anchor'></a></h2><h3 id='impl' class='impl'><code class='in-band'>impl <a class="struct" href="../tower/builder/struct.ServiceBuilder.html" title="struct tower::builder::ServiceBuilder">ServiceBuilder</a><<a class="struct" href="../tower/layer/util/struct.Identity.html" title="struct tower::layer::util::Identity">Identity</a>></code><a href='#impl' class='anchor'></a><a class='srclink' href='../src/tower/builder/mod.rs.html#109-116' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.new' class="method"><code id='new.v'>pub fn <a href='#method.new' class='fnname'>new</a>() -> Self</code><a class='srclink' href='../src/tower/builder/mod.rs.html#111-115' title='goto source code'>[src]</a></h4><div class='docblock'><p>Create a new <code>ServiceBuilder</code>.</p>
|
||||||
|
</div></div><h3 id='impl-1' class='impl'><code class='in-band'>impl<L> <a class="struct" href="../tower/builder/struct.ServiceBuilder.html" title="struct tower::builder::ServiceBuilder">ServiceBuilder</a><L></code><a href='#impl-1' class='anchor'></a><a class='srclink' href='../src/tower/builder/mod.rs.html#118-226' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.layer' class="method"><code id='layer.v'>pub fn <a href='#method.layer' class='fnname'>layer</a><T>(self, layer: T) -> <a class="struct" href="../tower/builder/struct.ServiceBuilder.html" title="struct tower::builder::ServiceBuilder">ServiceBuilder</a><<a class="struct" href="../tower/layer/util/struct.Stack.html" title="struct tower::layer::util::Stack">Stack</a><T, L>></code><a class='srclink' href='../src/tower/builder/mod.rs.html#120-124' title='goto source code'>[src]</a></h4><div class='docblock'><p>Add a new layer <code>T</code> into the <code>ServiceBuilder</code>.</p>
|
||||||
|
</div><h4 id='method.into_inner' class="method"><code id='into_inner.v'>pub fn <a href='#method.into_inner' class='fnname'>into_inner</a>(self) -> L</code><a class='srclink' href='../src/tower/builder/mod.rs.html#215-217' title='goto source code'>[src]</a></h4><div class='docblock'><p>Obtains the underlying <code>Layer</code> implementation.</p>
|
||||||
|
</div><h4 id='method.service' class="method"><code id='service.v'>pub fn <a href='#method.service' class='fnname'>service</a><S>(self, service: S) -> L::<a class="type" href="../tower/layer/trait.Layer.html#associatedtype.Service" title="type tower::layer::Layer::Service">Service</a> <span class="where fmt-newline">where<br> L: <a class="trait" href="../tower/layer/trait.Layer.html" title="trait tower::layer::Layer">Layer</a><S>, </span></code><a class='srclink' href='../src/tower/builder/mod.rs.html#220-225' title='goto source code'>[src]</a></h4><div class='docblock'><p>Wrap the service <code>S</code> with the layers.</p>
|
||||||
|
</div></div><h2 id='implementations' class='small-section-header'>Trait Implementations<a href='#implementations' class='anchor'></a></h2><div id='implementations-list'><h3 id='impl-Clone' class='impl'><code class='in-band'>impl<L: <a class="trait" href="https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>> <a class="trait" href="https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a> for <a class="struct" href="../tower/builder/struct.ServiceBuilder.html" title="struct tower::builder::ServiceBuilder">ServiceBuilder</a><L></code><a href='#impl-Clone' class='anchor'></a><a class='srclink' href='../src/tower/builder/mod.rs.html#104' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.clone' class="method hidden"><code id='clone.v'>fn <a href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#tymethod.clone' class='fnname'>clone</a>(&self) -> <a class="struct" href="../tower/builder/struct.ServiceBuilder.html" title="struct tower::builder::ServiceBuilder">ServiceBuilder</a><L></code><a class='srclink' href='../src/tower/builder/mod.rs.html#104' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Returns a copy of the value. <a href="https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#tymethod.clone">Read more</a></p>
|
||||||
|
</div><h4 id='method.clone_from' class="method hidden"><code id='clone_from.v'>fn <a href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#method.clone_from' class='fnname'>clone_from</a>(&mut self, source: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&</a>Self)</code><span class='since' title='Stable since Rust version 1.0.0'>1.0.0</span><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/clone.rs.html#131-133' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Performs copy-assignment from <code>source</code>. <a href="https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#method.clone_from">Read more</a></p>
|
||||||
|
</div></div><h3 id='impl-Debug' class='impl'><code class='in-band'>impl<L: <a class="trait" href="https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html" title="trait core::fmt::Debug">Debug</a>> <a class="trait" href="https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html" title="trait core::fmt::Debug">Debug</a> for <a class="struct" href="../tower/builder/struct.ServiceBuilder.html" title="struct tower::builder::ServiceBuilder">ServiceBuilder</a><L></code><a href='#impl-Debug' class='anchor'></a><a class='srclink' href='../src/tower/builder/mod.rs.html#228-232' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.fmt' class="method hidden"><code id='fmt.v'>fn <a href='https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html#tymethod.fmt' class='fnname'>fmt</a>(&self, f: &mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html" title="struct core::fmt::Formatter">Formatter</a>) -> <a class="type" href="https://doc.rust-lang.org/nightly/core/fmt/type.Result.html" title="type core::fmt::Result">Result</a></code><a class='srclink' href='../src/tower/builder/mod.rs.html#229-231' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Formats the value using the given formatter. <a href="https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html#tymethod.fmt">Read more</a></p>
|
||||||
|
</div></div></div><h2 id='synthetic-implementations' class='small-section-header'>Auto Trait Implementations<a href='#synthetic-implementations' class='anchor'></a></h2><div id='synthetic-implementations-list'><h3 id='impl-RefUnwindSafe' class='impl'><code class='in-band'>impl<L> <a class="trait" href="https://doc.rust-lang.org/nightly/std/panic/trait.RefUnwindSafe.html" title="trait std::panic::RefUnwindSafe">RefUnwindSafe</a> for <a class="struct" href="../tower/builder/struct.ServiceBuilder.html" title="struct tower::builder::ServiceBuilder">ServiceBuilder</a><L> <span class="where fmt-newline">where<br> L: <a class="trait" href="https://doc.rust-lang.org/nightly/std/panic/trait.RefUnwindSafe.html" title="trait std::panic::RefUnwindSafe">RefUnwindSafe</a>, </span></code><a href='#impl-RefUnwindSafe' class='anchor'></a></h3><div class='impl-items'></div><h3 id='impl-Send' class='impl'><code class='in-band'>impl<L> <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> for <a class="struct" href="../tower/builder/struct.ServiceBuilder.html" title="struct tower::builder::ServiceBuilder">ServiceBuilder</a><L> <span class="where fmt-newline">where<br> L: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>, </span></code><a href='#impl-Send' class='anchor'></a></h3><div class='impl-items'></div><h3 id='impl-Sync' class='impl'><code class='in-band'>impl<L> <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="struct" href="../tower/builder/struct.ServiceBuilder.html" title="struct tower::builder::ServiceBuilder">ServiceBuilder</a><L> <span class="where fmt-newline">where<br> L: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>, </span></code><a href='#impl-Sync' class='anchor'></a></h3><div class='impl-items'></div><h3 id='impl-Unpin' class='impl'><code class='in-band'>impl<L> <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class="struct" href="../tower/builder/struct.ServiceBuilder.html" title="struct tower::builder::ServiceBuilder">ServiceBuilder</a><L> <span class="where fmt-newline">where<br> L: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>, </span></code><a href='#impl-Unpin' class='anchor'></a></h3><div class='impl-items'></div><h3 id='impl-UnwindSafe' class='impl'><code class='in-band'>impl<L> <a class="trait" href="https://doc.rust-lang.org/nightly/std/panic/trait.UnwindSafe.html" title="trait std::panic::UnwindSafe">UnwindSafe</a> for <a class="struct" href="../tower/builder/struct.ServiceBuilder.html" title="struct tower::builder::ServiceBuilder">ServiceBuilder</a><L> <span class="where fmt-newline">where<br> L: <a class="trait" href="https://doc.rust-lang.org/nightly/std/panic/trait.UnwindSafe.html" title="trait std::panic::UnwindSafe">UnwindSafe</a>, </span></code><a href='#impl-UnwindSafe' class='anchor'></a></h3><div class='impl-items'></div></div><h2 id='blanket-implementations' class='small-section-header'>Blanket Implementations<a href='#blanket-implementations' class='anchor'></a></h2><div id='blanket-implementations-list'><h3 id='impl-Any' class='impl'><code class='in-band'>impl<T> <a class="trait" href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html" title="trait core::any::Any">Any</a> for T <span class="where fmt-newline">where<br> T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>, </span></code><a href='#impl-Any' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/any.rs.html#108-112' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.type_id' class="method hidden"><code id='type_id.v'>fn <a href='https://doc.rust-lang.org/nightly/core/any/trait.Any.html#tymethod.type_id' class='fnname'>type_id</a>(&self) -> <a class="struct" href="https://doc.rust-lang.org/nightly/core/any/struct.TypeId.html" title="struct core::any::TypeId">TypeId</a></code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/any.rs.html#109-111' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Gets the <code>TypeId</code> of <code>self</code>. <a href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html#tymethod.type_id">Read more</a></p>
|
||||||
|
</div></div><h3 id='impl-Borrow%3CT%3E' class='impl'><code class='in-band'>impl<T> <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html" title="trait core::borrow::Borrow">Borrow</a><T> for T <span class="where fmt-newline">where<br> T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>, </span></code><a href='#impl-Borrow%3CT%3E' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#213-217' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.borrow' class="method hidden"><code id='borrow.v'>fn <a href='https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html#tymethod.borrow' class='fnname'>borrow</a>(&self) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&</a>T</code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#214-216' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Immutably borrows from an owned value. <a href="https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html#tymethod.borrow">Read more</a></p>
|
||||||
|
</div></div><h3 id='impl-BorrowMut%3CT%3E' class='impl'><code class='in-band'>impl<T> <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html" title="trait core::borrow::BorrowMut">BorrowMut</a><T> for T <span class="where fmt-newline">where<br> T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>, </span></code><a href='#impl-BorrowMut%3CT%3E' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#220-224' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.borrow_mut' class="method hidden"><code id='borrow_mut.v'>fn <a href='https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut' class='fnname'>borrow_mut</a>(&mut self) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&mut </a>T</code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#221-223' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Mutably borrows from an owned value. <a href="https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut">Read more</a></p>
|
||||||
|
</div></div><h3 id='impl-From%3CT%3E' class='impl'><code class='in-band'>impl<T> <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.From.html" title="trait core::convert::From">From</a><T> for T</code><a href='#impl-From%3CT%3E' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#564-568' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.from' class="method hidden"><code id='from.v'>fn <a href='https://doc.rust-lang.org/nightly/core/convert/trait.From.html#tymethod.from' class='fnname'>from</a>(t: T) -> T</code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#565-567' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Performs the conversion.</p>
|
||||||
|
</div></div><h3 id='impl-Into%3CU%3E' class='impl'><code class='in-band'>impl<T, U> <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><U> for T <span class="where fmt-newline">where<br> U: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.From.html" title="trait core::convert::From">From</a><T>, </span></code><a href='#impl-Into%3CU%3E' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#553-560' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.into' class="method hidden"><code id='into.v'>fn <a href='https://doc.rust-lang.org/nightly/core/convert/trait.Into.html#tymethod.into' class='fnname'>into</a>(self) -> U</code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#557-559' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Performs the conversion.</p>
|
||||||
|
</div></div><h3 id='impl-ToOwned' class='impl'><code class='in-band'>impl<T> <a class="trait" href="https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html" title="trait alloc::borrow::ToOwned">ToOwned</a> for T <span class="where fmt-newline">where<br> T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>, </span></code><a href='#impl-ToOwned' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#80-92' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='associatedtype.Owned' class="type"><code id='Owned.t'>type <a href='https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#associatedtype.Owned' class="type">Owned</a> = T</code></h4><div class='docblock'><p>The resulting type after obtaining ownership.</p>
|
||||||
|
</div><h4 id='method.to_owned' class="method hidden"><code id='to_owned.v'>fn <a href='https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#tymethod.to_owned' class='fnname'>to_owned</a>(&self) -> T</code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#85-87' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Creates owned data from borrowed data, usually by cloning. <a href="https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#tymethod.to_owned">Read more</a></p>
|
||||||
|
</div><h4 id='method.clone_into' class="method hidden"><code id='clone_into.v'>fn <a href='https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#method.clone_into' class='fnname'>clone_into</a>(&self, target: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&mut </a>T)</code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#89-91' title='goto source code'>[src]</a></h4><div class='stability hidden'><div class='stab unstable'><details><summary><span class='emoji'>🔬</span> This is a nightly-only experimental API. (<code>toowned_clone_into</code>)</summary><p>recently added</p>
|
||||||
|
</details></div></div><div class='docblock hidden'><p>Uses borrowed data to replace owned data, usually by cloning. <a href="https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#method.clone_into">Read more</a></p>
|
||||||
|
</div></div><h3 id='impl-TryFrom%3CU%3E' class='impl'><code class='in-band'>impl<T, U> <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a><U> for T <span class="where fmt-newline">where<br> U: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><T>, </span></code><a href='#impl-TryFrom%3CU%3E' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#601-610' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='associatedtype.Error' class="type"><code id='Error.t'>type <a href='https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error' class="type">Error</a> = <a class="enum" href="https://doc.rust-lang.org/nightly/core/convert/enum.Infallible.html" title="enum core::convert::Infallible">Infallible</a></code></h4><div class='docblock'><p>The type returned in the event of a conversion error.</p>
|
||||||
|
</div><h4 id='method.try_from' class="method hidden"><code id='try_from.v'>fn <a href='https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#tymethod.try_from' class='fnname'>try_from</a>(value: U) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a><T, <T as <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a><U>>::<a class="type" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a>></code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#607-609' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Performs the conversion.</p>
|
||||||
|
</div></div><h3 id='impl-TryInto%3CU%3E' class='impl'><code class='in-band'>impl<T, U> <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html" title="trait core::convert::TryInto">TryInto</a><U> for T <span class="where fmt-newline">where<br> U: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a><T>, </span></code><a href='#impl-TryInto%3CU%3E' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#587-596' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='associatedtype.Error-1' class="type"><code id='Error.t-1'>type <a href='https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html#associatedtype.Error' class="type">Error</a> = <U as <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a><T>>::<a class="type" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a></code></h4><div class='docblock'><p>The type returned in the event of a conversion error.</p>
|
||||||
|
</div><h4 id='method.try_into' class="method hidden"><code id='try_into.v'>fn <a href='https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html#tymethod.try_into' class='fnname'>try_into</a>(self) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a><U, <U as <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a><T>>::<a class="type" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a>></code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#593-595' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Performs the conversion.</p>
|
||||||
|
</div></div></div></section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../";window.currentCrate = "tower";</script><script src="../aliases.js"></script><script src="../main.js"></script><script defer src="../search-index.js"></script></body></html>
|
|
@ -0,0 +1,66 @@
|
||||||
|
<!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="API documentation for the Rust `Layer` trait in crate `tower`."><meta name="keywords" content="rust, rustlang, rust-lang, Layer"><title>tower::Layer - Rust</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><noscript><link rel="stylesheet" href="../noscript.css"></noscript><link rel="shortcut icon" href="../favicon.ico"><style type="text/css">#crate-search{background-image:url("../down-arrow.svg");}</style></head><body class="rustdoc trait"><!--[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">☰</div><a href='../tower/index.html'><div class='logo-container'><img src='../rust-logo.png' alt='logo'></div></a><p class='location'>Trait Layer</p><div class="sidebar-elems"><div class="block items"><a class="sidebar-title" href="#associated-types">Associated Types</a><div class="sidebar-links"><a href="#associatedtype.Service">Service</a></div><a class="sidebar-title" href="#required-methods">Required Methods</a><div class="sidebar-links"><a href="#tymethod.layer">layer</a></div><a class="sidebar-title" href="#foreign-impls">Implementations on Foreign Types</a><div class="sidebar-links"><a href="#impl-Layer%3CS%3E-for-%26%27a%20T">&'a T</a></div><a class="sidebar-title" href="#implementors">Implementors</a></div><p class='location'><a href='index.html'>tower</a></p><script>window.sidebarCurrent = {name: 'Layer', ty: 'trait', relpath: ''};</script><script defer src="sidebar-items.js"></script></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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"><h1 class='fqn'><span class='out-of-band'><span id='render-detail'><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class='inner'>−</span>]</a></span><a class='srclink' href='../src/tower_layer/lib.rs.html#84-90' title='goto source code'>[src]</a></span><span class='in-band'>Trait <a href='index.html'>tower</a>::<wbr><a class="trait" href=''>Layer</a></span></h1><div class="docblock type-decl hidden-by-usual-hider"><pre class='rust trait'>pub trait Layer<S> {
|
||||||
|
type <a href='#associatedtype.Service' class="type">Service</a>;
|
||||||
|
fn <a href='#tymethod.layer' class='fnname'>layer</a>(&self, inner: S) -> Self::<a class="type" href="../tower/layer/trait.Layer.html#associatedtype.Service" title="type tower::layer::Layer::Service">Service</a>;
|
||||||
|
}</pre></div><div class='docblock'><p>Decorates a <code>Service</code>, transforming either the request or the response.</p>
|
||||||
|
<p>Often, many of the pieces needed for writing network applications can be
|
||||||
|
reused across multiple services. The <code>Layer</code> trait can be used to write
|
||||||
|
reusable components that can be applied to very different kinds of services;
|
||||||
|
for example, it can be applied to services operating on different protocols,
|
||||||
|
and to both the client and server side of a network transaction.</p>
|
||||||
|
<h1 id="log" class="section-header"><a href="#log">Log</a></h1>
|
||||||
|
<p>Take request logging as an example:</p>
|
||||||
|
|
||||||
|
<div class="example-wrap"><pre class="rust rust-example-rendered">
|
||||||
|
|
||||||
|
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">LogLayer</span> {
|
||||||
|
<span class="ident">target</span>: <span class="kw-2">&</span><span class="lifetime">'static</span> <span class="ident">str</span>,
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">impl</span><span class="op"><</span><span class="ident">S</span><span class="op">></span> <span class="ident">Layer</span><span class="op"><</span><span class="ident">S</span><span class="op">></span> <span class="kw">for</span> <span class="ident">LogLayer</span> {
|
||||||
|
<span class="kw">type</span> <span class="ident">Service</span> <span class="op">=</span> <span class="ident">LogService</span><span class="op"><</span><span class="ident">S</span><span class="op">></span>;
|
||||||
|
|
||||||
|
<span class="kw">fn</span> <span class="ident">layer</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">service</span>: <span class="ident">S</span>) <span class="op">-</span><span class="op">></span> <span class="self">Self</span>::<span class="ident">Service</span> {
|
||||||
|
<span class="ident">LogService</span> {
|
||||||
|
<span class="ident">target</span>: <span class="self">self</span>.<span class="ident">target</span>,
|
||||||
|
<span class="ident">service</span>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="comment">// This service implements the Log behavior</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">LogService</span><span class="op"><</span><span class="ident">S</span><span class="op">></span> {
|
||||||
|
<span class="ident">target</span>: <span class="kw-2">&</span><span class="lifetime">'static</span> <span class="ident">str</span>,
|
||||||
|
<span class="ident">service</span>: <span class="ident">S</span>,
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">impl</span><span class="op"><</span><span class="ident">S</span>, <span class="ident">Request</span><span class="op">></span> <span class="ident">Service</span><span class="op"><</span><span class="ident">Request</span><span class="op">></span> <span class="kw">for</span> <span class="ident">LogService</span><span class="op"><</span><span class="ident">S</span><span class="op">></span>
|
||||||
|
<span class="kw">where</span>
|
||||||
|
<span class="ident">S</span>: <span class="ident">Service</span><span class="op"><</span><span class="ident">Request</span><span class="op">></span>,
|
||||||
|
<span class="ident">Request</span>: <span class="ident">fmt</span>::<span class="ident">Debug</span>,
|
||||||
|
{
|
||||||
|
<span class="kw">type</span> <span class="ident">Response</span> <span class="op">=</span> <span class="ident">S</span>::<span class="ident">Response</span>;
|
||||||
|
<span class="kw">type</span> <span class="ident">Error</span> <span class="op">=</span> <span class="ident">S</span>::<span class="ident">Error</span>;
|
||||||
|
<span class="kw">type</span> <span class="ident">Future</span> <span class="op">=</span> <span class="ident">S</span>::<span class="ident">Future</span>;
|
||||||
|
|
||||||
|
<span class="kw">fn</span> <span class="ident">poll_ready</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">cx</span>: <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">Context</span><span class="op"><</span><span class="lifetime">'_</span><span class="op">></span>) <span class="op">-</span><span class="op">></span> <span class="ident">Poll</span><span class="op"><</span><span class="prelude-ty">Result</span><span class="op"><</span>(), <span class="self">Self</span>::<span class="ident">Error</span><span class="op">></span><span class="op">></span> {
|
||||||
|
<span class="self">self</span>.<span class="ident">service</span>.<span class="ident">poll_ready</span>(<span class="ident">cx</span>)
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">fn</span> <span class="ident">call</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">request</span>: <span class="ident">Request</span>) <span class="op">-</span><span class="op">></span> <span class="self">Self</span>::<span class="ident">Future</span> {
|
||||||
|
<span class="comment">// Insert log statement here or other functionality</span>
|
||||||
|
<span class="macro">println</span><span class="macro">!</span>(<span class="string">"request = {:?}, target = {:?}"</span>, <span class="ident">request</span>, <span class="self">self</span>.<span class="ident">target</span>);
|
||||||
|
<span class="self">self</span>.<span class="ident">service</span>.<span class="ident">call</span>(<span class="ident">request</span>)
|
||||||
|
}
|
||||||
|
}</pre></div>
|
||||||
|
<p>The above log implementation is decoupled from the underlying protocol and
|
||||||
|
is also decoupled from client or server concerns. In other words, the same
|
||||||
|
log middleware could be used in either a client or a server.</p>
|
||||||
|
</div>
|
||||||
|
<h2 id='associated-types' class='small-section-header'>Associated Types<a href='#associated-types' class='anchor'></a></h2><div class='methods'><h3 id='associatedtype.Service' class='method'><code id='Service.t'>type <a href='#associatedtype.Service' class="type">Service</a></code></h3><div class='docblock'><p>The wrapped service</p>
|
||||||
|
</div></div><span class='loading-content'>Loading content...</span>
|
||||||
|
<h2 id='required-methods' class='small-section-header'>Required methods<a href='#required-methods' class='anchor'></a></h2><div class='methods'><h3 id='tymethod.layer' class='method'><code id='layer.v'>fn <a href='#tymethod.layer' class='fnname'>layer</a>(&self, inner: S) -> Self::<a class="type" href="../tower/layer/trait.Layer.html#associatedtype.Service" title="type tower::layer::Layer::Service">Service</a></code></h3><div class='docblock'><p>Wrap the given service with the middleware, returning a new service
|
||||||
|
that has been decorated with the middleware.</p>
|
||||||
|
</div></div><span class='loading-content'>Loading content...</span>
|
||||||
|
<h2 id='foreign-impls' class='small-section-header'>Implementations on Foreign Types<a href='#foreign-impls' class='anchor'></a></h2><h3 id='impl-Layer%3CS%3E-for-%26%27a%20T' class='impl'><code class='in-band'>impl<'a, T, S> <a class="trait" href="../tower/layer/trait.Layer.html" title="trait tower::layer::Layer">Layer</a><S> for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&'a </a>T <span class="where fmt-newline">where<br> T: <a class="trait" href="../tower/layer/trait.Layer.html" title="trait tower::layer::Layer">Layer</a><S> + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>, </span></code><a href='#impl-Layer%3CS%3E-for-%26%27a%20T' class='anchor'></a><a class='srclink' href='../src/tower_layer/lib.rs.html#92-101' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='associatedtype.Service-1' class="type"><code id='Service.t-1'>type <a href='#associatedtype.Service' class="type">Service</a> = <T as <a class="trait" href="../tower/layer/trait.Layer.html" title="trait tower::layer::Layer">Layer</a><S>>::<a class="type" href="../tower/layer/trait.Layer.html#associatedtype.Service" title="type tower::layer::Layer::Service">Service</a></code></h4><h4 id='method.layer' class="method hidden"><code id='layer.v-1'>fn <a href='#method.layer' class='fnname'>layer</a>(&self, inner: S) -> <<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&'a </a>T as <a class="trait" href="../tower/layer/trait.Layer.html" title="trait tower::layer::Layer">Layer</a><S>>::<a class="type" href="../tower/layer/trait.Layer.html#associatedtype.Service" title="type tower::layer::Layer::Service">Service</a></code><a class='srclink' href='../src/tower_layer/lib.rs.html#98-100' title='goto source code'>[src]</a></h4></div><span class='loading-content'>Loading content...</span>
|
||||||
|
<h2 id='implementors' class='small-section-header'>Implementors<a href='#implementors' class='anchor'></a></h2><div class='item-list' id='implementors-list'><h3 id='impl-Layer%3CS%3E' class='impl'><code class='in-band'>impl<S> Layer<S> for <a class="struct" href="../tower/layer/util/struct.Identity.html" title="struct tower::layer::util::Identity">Identity</a></code><a href='#impl-Layer%3CS%3E' class='anchor'></a><a class='srclink' href='../src/tower_layer/identity.rs.html#21-27' title='goto source code'>[src]</a></h3><div class='docblock'><p>Decorates a <code>Service</code>, transforming either the request or the response.</p>
|
||||||
|
</div><div class='impl-items'><h4 id='associatedtype.Service-2' class="type"><code id='Service.t-2'>type <a href='#associatedtype.Service-2' class="type">Service</a> = S</code></h4><h4 id='method.layer-1' class="method hidden"><code id='layer.v-2'>fn <a href='#method.layer-1' class='fnname'>layer</a>(&self, inner: S) -> <<a class="struct" href="../tower/layer/util/struct.Identity.html" title="struct tower::layer::util::Identity">Identity</a> as <a class="trait" href="../tower/layer/trait.Layer.html" title="trait tower::layer::Layer">Layer</a><S>>::<a class="type" href="../tower/layer/trait.Layer.html#associatedtype.Service" title="type tower::layer::Layer::Service">Service</a></code><a class='srclink' href='../src/tower_layer/identity.rs.html#24-26' title='goto source code'>[src]</a></h4></div><h3 id='impl-Layer%3CS%3E-1' class='impl'><code class='in-band'>impl<S, Inner, Outer> Layer<S> for <a class="struct" href="../tower/layer/util/struct.Stack.html" title="struct tower::layer::util::Stack">Stack</a><Inner, Outer> <span class="where fmt-newline">where<br> Inner: <a class="trait" href="../tower/layer/trait.Layer.html" title="trait tower::layer::Layer">Layer</a><S>,<br> Outer: <a class="trait" href="../tower/layer/trait.Layer.html" title="trait tower::layer::Layer">Layer</a><<Inner as <a class="trait" href="../tower/layer/trait.Layer.html" title="trait tower::layer::Layer">Layer</a><S>>::<a class="type" href="../tower/layer/trait.Layer.html#associatedtype.Service" title="type tower::layer::Layer::Service">Service</a>>, </span></code><a href='#impl-Layer%3CS%3E-1' class='anchor'></a><a class='srclink' href='../src/tower_layer/stack.rs.html#18-30' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='associatedtype.Service-3' class="type"><code id='Service.t-3'>type <a href='#associatedtype.Service-3' class="type">Service</a> = <Outer as <a class="trait" href="../tower/layer/trait.Layer.html" title="trait tower::layer::Layer">Layer</a><<Inner as <a class="trait" href="../tower/layer/trait.Layer.html" title="trait tower::layer::Layer">Layer</a><S>>::<a class="type" href="../tower/layer/trait.Layer.html#associatedtype.Service" title="type tower::layer::Layer::Service">Service</a>>>::<a class="type" href="../tower/layer/trait.Layer.html#associatedtype.Service" title="type tower::layer::Layer::Service">Service</a></code></h4><h4 id='method.layer-2' class="method hidden"><code id='layer.v-3'>fn <a href='#method.layer-2' class='fnname'>layer</a>(&self, service: S) -> <<a class="struct" href="../tower/layer/util/struct.Stack.html" title="struct tower::layer::util::Stack">Stack</a><Inner, Outer> as <a class="trait" href="../tower/layer/trait.Layer.html" title="trait tower::layer::Layer">Layer</a><S>>::<a class="type" href="../tower/layer/trait.Layer.html#associatedtype.Service" title="type tower::layer::Layer::Service">Service</a></code><a class='srclink' href='../src/tower_layer/stack.rs.html#25-29' title='goto source code'>[src]</a></h4></div></div><span class='loading-content'>Loading content...</span><script type="text/javascript" src="../implementors/tower_layer/trait.Layer.js" async></script></section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../";window.currentCrate = "tower";</script><script src="../aliases.js"></script><script src="../main.js"></script><script defer src="../search-index.js"></script></body></html>
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,2 @@
|
||||||
|
<!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="API documentation for the Rust `BoxError` type in crate `tower`."><meta name="keywords" content="rust, rustlang, rust-lang, BoxError"><title>tower::BoxError - Rust</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><noscript><link rel="stylesheet" href="../noscript.css"></noscript><link rel="shortcut icon" href="../favicon.ico"><style type="text/css">#crate-search{background-image:url("../down-arrow.svg");}</style></head><body class="rustdoc type"><!--[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">☰</div><a href='../tower/index.html'><div class='logo-container'><img src='../rust-logo.png' alt='logo'></div></a><p class='location'>Type Definition BoxError</p><div class="sidebar-elems"><p class='location'><a href='index.html'>tower</a></p><script>window.sidebarCurrent = {name: 'BoxError', ty: 'type', relpath: ''};</script><script defer src="sidebar-items.js"></script></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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"><h1 class='fqn'><span class='out-of-band'><span id='render-detail'><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class='inner'>−</span>]</a></span><a class='srclink' href='../src/tower/lib.rs.html#86' title='goto source code'>[src]</a></span><span class='in-band'>Type Definition <a href='index.html'>tower</a>::<wbr><a class="type" href=''>BoxError</a></span></h1><pre class='rust typedef'>type BoxError = <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a><dyn <a class="trait" href="https://doc.rust-lang.org/nightly/std/error/trait.Error.html" title="trait std::error::Error">Error</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>>;</pre><div class='docblock'><p>Alias for a type-erased error type.</p>
|
||||||
|
</div></section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../";window.currentCrate = "tower";</script><script src="../aliases.js"></script><script src="../main.js"></script><script defer src="../search-index.js"></script></body></html>
|
|
@ -0,0 +1,3 @@
|
||||||
|
<!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="List of all items in this crate"><meta name="keywords" content="rust, rustlang, rust-lang"><title>List of all items in this crate</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><noscript><link rel="stylesheet" href="../noscript.css"></noscript><link rel="shortcut icon" href="../favicon.ico"><style type="text/css">#crate-search{background-image:url("../down-arrow.svg");}</style></head><body class="rustdoc mod"><!--[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">☰</div><a href='../tower_layer/index.html'><div class='logo-container'><img src='../rust-logo.png' alt='logo'></div></a></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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"><h1 class='fqn'><span class='out-of-band'><span id='render-detail'><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class='inner'>−</span>]</a></span>
|
||||||
|
</span>
|
||||||
|
<span class='in-band'>List of all items</span></h1><h3 id='Structs'>Structs</h3><ul class='structs docblock'><li><a href='struct.Identity.html'>Identity</a></li><li><a href='struct.Stack.html'>Stack</a></li></ul><h3 id='Traits'>Traits</h3><ul class='traits docblock'><li><a href='trait.Layer.html'>Layer</a></li></ul></section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../";window.currentCrate = "tower_layer";</script><script src="../aliases.js"></script><script src="../main.js"></script><script defer src="../search-index.js"></script></body></html>
|
|
@ -0,0 +1,10 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="refresh" content="0;URL=../../tower_layer/struct.Identity.html">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<p>Redirecting to <a href="../../tower_layer/struct.Identity.html">../../tower_layer/struct.Identity.html</a>...</p>
|
||||||
|
<script>location.replace("../../tower_layer/struct.Identity.html" + location.search + location.hash);</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,10 @@
|
||||||
|
<!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="API documentation for the Rust `tower_layer` crate."><meta name="keywords" content="rust, rustlang, rust-lang, tower_layer"><title>tower_layer - Rust</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><noscript><link rel="stylesheet" href="../noscript.css"></noscript><link rel="shortcut icon" href="../favicon.ico"><style type="text/css">#crate-search{background-image:url("../down-arrow.svg");}</style></head><body class="rustdoc mod"><!--[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">☰</div><a href='../tower_layer/index.html'><div class='logo-container'><img src='../rust-logo.png' alt='logo'></div></a><p class='location'>Crate tower_layer</p><div class="sidebar-elems"><a id='all-types' href='all.html'><p>See all tower_layer's items</p></a><div class="block items"><ul><li><a href="#structs">Structs</a></li><li><a href="#traits">Traits</a></li></ul></div><p class='location'></p><script>window.sidebarCurrent = {name: 'tower_layer', ty: 'mod', relpath: '../'};</script></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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"><h1 class='fqn'><span class='out-of-band'><span id='render-detail'><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class='inner'>−</span>]</a></span><a class='srclink' href='../src/tower_layer/lib.rs.html#1-101' title='goto source code'>[src]</a></span><span class='in-band'>Crate <a class="mod" href=''>tower_layer</a></span></h1><div class='docblock'><p>Layer traits and extensions.</p>
|
||||||
|
<p>A layer decorates an service and provides additional functionality. It
|
||||||
|
allows other services to be composed with the service that implements layer.</p>
|
||||||
|
<p>A middleware implements the [<code>Layer</code>] and [<code>Service</code>] trait.</p>
|
||||||
|
</div><h2 id='structs' class='section-header'><a href="#structs">Structs</a></h2>
|
||||||
|
<table><tr class='module-item'><td><a class="struct" href="struct.Identity.html" title='tower_layer::Identity struct'>Identity</a></td><td class='docblock-short'><p>A no-op middleware.</p>
|
||||||
|
</td></tr><tr class='module-item'><td><a class="struct" href="struct.Stack.html" title='tower_layer::Stack struct'>Stack</a></td><td class='docblock-short'><p>Two middlewares chained together.</p>
|
||||||
|
</td></tr></table><h2 id='traits' class='section-header'><a href="#traits">Traits</a></h2>
|
||||||
|
<table><tr class='module-item'><td><a class="trait" href="trait.Layer.html" title='tower_layer::Layer trait'>Layer</a></td><td class='docblock-short'><p>Decorates a <code>Service</code>, transforming either the request or the response.</p>
|
||||||
|
</td></tr></table></section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../";window.currentCrate = "tower_layer";</script><script src="../aliases.js"></script><script src="../main.js"></script><script defer src="../search-index.js"></script></body></html>
|
|
@ -0,0 +1 @@
|
||||||
|
initSidebarItems({"struct":[["Identity","A no-op middleware."],["Stack","Two middlewares chained together."]],"trait":[["Layer","Decorates a `Service`, transforming either the request or the response."]]});
|
|
@ -0,0 +1,10 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="refresh" content="0;URL=../../tower_layer/struct.Stack.html">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<p>Redirecting to <a href="../../tower_layer/struct.Stack.html">../../tower_layer/struct.Stack.html</a>...</p>
|
||||||
|
<script>location.replace("../../tower_layer/struct.Stack.html" + location.search + location.hash);</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,25 @@
|
||||||
|
<!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="API documentation for the Rust `Identity` struct in crate `tower_layer`."><meta name="keywords" content="rust, rustlang, rust-lang, Identity"><title>tower_layer::Identity - Rust</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><noscript><link rel="stylesheet" href="../noscript.css"></noscript><link rel="shortcut icon" href="../favicon.ico"><style type="text/css">#crate-search{background-image:url("../down-arrow.svg");}</style></head><body class="rustdoc struct"><!--[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">☰</div><a href='../tower_layer/index.html'><div class='logo-container'><img src='../rust-logo.png' alt='logo'></div></a><p class='location'>Struct Identity</p><div class="sidebar-elems"><div class="block items"><a class="sidebar-title" href="#methods">Methods</a><div class="sidebar-links"><a href="#method.new">new</a></div><a class="sidebar-title" href="#implementations">Trait Implementations</a><div class="sidebar-links"><a href="#impl-Clone">Clone</a><a href="#impl-Debug">Debug</a><a href="#impl-Default">Default</a><a href="#impl-Layer%3CS%3E">Layer<S></a></div><a class="sidebar-title" href="#synthetic-implementations">Auto Trait Implementations</a><div class="sidebar-links"><a href="#impl-RefUnwindSafe">RefUnwindSafe</a><a href="#impl-Send">Send</a><a href="#impl-Sync">Sync</a><a href="#impl-Unpin">Unpin</a><a href="#impl-UnwindSafe">UnwindSafe</a></div><a class="sidebar-title" href="#blanket-implementations">Blanket Implementations</a><div class="sidebar-links"><a href="#impl-Any">Any</a><a href="#impl-Borrow%3CT%3E">Borrow<T></a><a href="#impl-BorrowMut%3CT%3E">BorrowMut<T></a><a href="#impl-From%3CT%3E">From<T></a><a href="#impl-Into%3CU%3E">Into<U></a><a href="#impl-ToOwned">ToOwned</a><a href="#impl-TryFrom%3CU%3E">TryFrom<U></a><a href="#impl-TryInto%3CU%3E">TryInto<U></a></div></div><p class='location'><a href='index.html'>tower_layer</a></p><script>window.sidebarCurrent = {name: 'Identity', ty: 'struct', relpath: ''};</script><script defer src="sidebar-items.js"></script></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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"><h1 class='fqn'><span class='out-of-band'><span id='render-detail'><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class='inner'>−</span>]</a></span><a class='srclink' href='../src/tower_layer/identity.rs.html#9-11' title='goto source code'>[src]</a></span><span class='in-band'>Struct <a href='index.html'>tower_layer</a>::<wbr><a class="struct" href=''>Identity</a></span></h1><div class="docblock type-decl hidden-by-usual-hider"><pre class='rust struct'>pub struct Identity { /* fields omitted */ }</pre></div><div class='docblock'><p>A no-op middleware.</p>
|
||||||
|
<p>When wrapping a <code>Service</code>, the <code>Identity</code> layer returns the provided
|
||||||
|
service without modifying it.</p>
|
||||||
|
</div><h2 id='methods' class='small-section-header'>Methods<a href='#methods' class='anchor'></a></h2><h3 id='impl' class='impl'><code class='in-band'>impl <a class="struct" href="../tower_layer/struct.Identity.html" title="struct tower_layer::Identity">Identity</a></code><a href='#impl' class='anchor'></a><a class='srclink' href='../src/tower_layer/identity.rs.html#13-18' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.new' class="method"><code id='new.v'>pub fn <a href='#method.new' class='fnname'>new</a>() -> <a class="struct" href="../tower_layer/struct.Identity.html" title="struct tower_layer::Identity">Identity</a></code><a class='srclink' href='../src/tower_layer/identity.rs.html#15-17' title='goto source code'>[src]</a></h4><div class='docblock'><p>Create a new <code>Identity</code> value</p>
|
||||||
|
</div></div><h2 id='implementations' class='small-section-header'>Trait Implementations<a href='#implementations' class='anchor'></a></h2><div id='implementations-list'><h3 id='impl-Clone' class='impl'><code class='in-band'>impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a> for <a class="struct" href="../tower_layer/struct.Identity.html" title="struct tower_layer::Identity">Identity</a></code><a href='#impl-Clone' class='anchor'></a><a class='srclink' href='../src/tower_layer/identity.rs.html#8' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.clone' class="method hidden"><code id='clone.v'>fn <a href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#tymethod.clone' class='fnname'>clone</a>(&self) -> <a class="struct" href="../tower_layer/struct.Identity.html" title="struct tower_layer::Identity">Identity</a></code><a class='srclink' href='../src/tower_layer/identity.rs.html#8' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Returns a copy of the value. <a href="https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#tymethod.clone">Read more</a></p>
|
||||||
|
</div><h4 id='method.clone_from' class="method hidden"><code id='clone_from.v'>fn <a href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#method.clone_from' class='fnname'>clone_from</a>(&mut self, source: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&</a>Self)</code><span class='since' title='Stable since Rust version 1.0.0'>1.0.0</span><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/clone.rs.html#131-133' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Performs copy-assignment from <code>source</code>. <a href="https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#method.clone_from">Read more</a></p>
|
||||||
|
</div></div><h3 id='impl-Debug' class='impl'><code class='in-band'>impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html" title="trait core::fmt::Debug">Debug</a> for <a class="struct" href="../tower_layer/struct.Identity.html" title="struct tower_layer::Identity">Identity</a></code><a href='#impl-Debug' class='anchor'></a><a class='srclink' href='../src/tower_layer/identity.rs.html#29-33' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.fmt' class="method hidden"><code id='fmt.v'>fn <a href='https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html#tymethod.fmt' class='fnname'>fmt</a>(&self, f: &mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html" title="struct core::fmt::Formatter">Formatter</a>) -> <a class="type" href="https://doc.rust-lang.org/nightly/core/fmt/type.Result.html" title="type core::fmt::Result">Result</a></code><a class='srclink' href='../src/tower_layer/identity.rs.html#30-32' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Formats the value using the given formatter. <a href="https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html#tymethod.fmt">Read more</a></p>
|
||||||
|
</div></div><h3 id='impl-Default' class='impl'><code class='in-band'>impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/default/trait.Default.html" title="trait core::default::Default">Default</a> for <a class="struct" href="../tower_layer/struct.Identity.html" title="struct tower_layer::Identity">Identity</a></code><a href='#impl-Default' class='anchor'></a><a class='srclink' href='../src/tower_layer/identity.rs.html#8' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.default' class="method hidden"><code id='default.v'>fn <a href='https://doc.rust-lang.org/nightly/core/default/trait.Default.html#tymethod.default' class='fnname'>default</a>() -> <a class="struct" href="../tower_layer/struct.Identity.html" title="struct tower_layer::Identity">Identity</a></code><a class='srclink' href='../src/tower_layer/identity.rs.html#8' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Returns the "default value" for a type. <a href="https://doc.rust-lang.org/nightly/core/default/trait.Default.html#tymethod.default">Read more</a></p>
|
||||||
|
</div></div><h3 id='impl-Layer%3CS%3E' class='impl'><code class='in-band'>impl<S> <a class="trait" href="../tower_layer/trait.Layer.html" title="trait tower_layer::Layer">Layer</a><S> for <a class="struct" href="../tower_layer/struct.Identity.html" title="struct tower_layer::Identity">Identity</a></code><a href='#impl-Layer%3CS%3E' class='anchor'></a><a class='srclink' href='../src/tower_layer/identity.rs.html#21-27' title='goto source code'>[src]</a></h3><div class='docblock'><p>Decorates a <code>Service</code>, transforming either the request or the response.</p>
|
||||||
|
</div><div class='impl-items'><h4 id='associatedtype.Service' class="type"><code id='Service.t'>type <a href='../tower_layer/trait.Layer.html#associatedtype.Service' class="type">Service</a> = S</code></h4><div class='docblock'><p>The wrapped service</p>
|
||||||
|
</div><h4 id='method.layer' class="method hidden"><code id='layer.v'>fn <a href='../tower_layer/trait.Layer.html#tymethod.layer' class='fnname'>layer</a>(&self, inner: S) -> Self::<a class="type" href="../tower_layer/trait.Layer.html#associatedtype.Service" title="type tower_layer::Layer::Service">Service</a></code><a class='srclink' href='../src/tower_layer/identity.rs.html#24-26' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Wrap the given service with the middleware, returning a new service that has been decorated with the middleware. <a href="../tower_layer/trait.Layer.html#tymethod.layer">Read more</a></p>
|
||||||
|
</div></div></div><h2 id='synthetic-implementations' class='small-section-header'>Auto Trait Implementations<a href='#synthetic-implementations' class='anchor'></a></h2><div id='synthetic-implementations-list'><h3 id='impl-RefUnwindSafe' class='impl'><code class='in-band'>impl <a class="trait" href="https://doc.rust-lang.org/nightly/std/panic/trait.RefUnwindSafe.html" title="trait std::panic::RefUnwindSafe">RefUnwindSafe</a> for <a class="struct" href="../tower_layer/struct.Identity.html" title="struct tower_layer::Identity">Identity</a></code><a href='#impl-RefUnwindSafe' class='anchor'></a></h3><div class='impl-items'></div><h3 id='impl-Send' class='impl'><code class='in-band'>impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> for <a class="struct" href="../tower_layer/struct.Identity.html" title="struct tower_layer::Identity">Identity</a></code><a href='#impl-Send' class='anchor'></a></h3><div class='impl-items'></div><h3 id='impl-Sync' class='impl'><code class='in-band'>impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="struct" href="../tower_layer/struct.Identity.html" title="struct tower_layer::Identity">Identity</a></code><a href='#impl-Sync' class='anchor'></a></h3><div class='impl-items'></div><h3 id='impl-Unpin' class='impl'><code class='in-band'>impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class="struct" href="../tower_layer/struct.Identity.html" title="struct tower_layer::Identity">Identity</a></code><a href='#impl-Unpin' class='anchor'></a></h3><div class='impl-items'></div><h3 id='impl-UnwindSafe' class='impl'><code class='in-band'>impl <a class="trait" href="https://doc.rust-lang.org/nightly/std/panic/trait.UnwindSafe.html" title="trait std::panic::UnwindSafe">UnwindSafe</a> for <a class="struct" href="../tower_layer/struct.Identity.html" title="struct tower_layer::Identity">Identity</a></code><a href='#impl-UnwindSafe' class='anchor'></a></h3><div class='impl-items'></div></div><h2 id='blanket-implementations' class='small-section-header'>Blanket Implementations<a href='#blanket-implementations' class='anchor'></a></h2><div id='blanket-implementations-list'><h3 id='impl-Any' class='impl'><code class='in-band'>impl<T> <a class="trait" href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html" title="trait core::any::Any">Any</a> for T <span class="where fmt-newline">where<br> T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>, </span></code><a href='#impl-Any' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/any.rs.html#108-112' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.type_id' class="method hidden"><code id='type_id.v'>fn <a href='https://doc.rust-lang.org/nightly/core/any/trait.Any.html#tymethod.type_id' class='fnname'>type_id</a>(&self) -> <a class="struct" href="https://doc.rust-lang.org/nightly/core/any/struct.TypeId.html" title="struct core::any::TypeId">TypeId</a></code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/any.rs.html#109-111' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Gets the <code>TypeId</code> of <code>self</code>. <a href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html#tymethod.type_id">Read more</a></p>
|
||||||
|
</div></div><h3 id='impl-Borrow%3CT%3E' class='impl'><code class='in-band'>impl<T> <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html" title="trait core::borrow::Borrow">Borrow</a><T> for T <span class="where fmt-newline">where<br> T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>, </span></code><a href='#impl-Borrow%3CT%3E' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#213-217' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.borrow' class="method hidden"><code id='borrow.v'>fn <a href='https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html#tymethod.borrow' class='fnname'>borrow</a>(&self) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&</a>T</code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#214-216' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Immutably borrows from an owned value. <a href="https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html#tymethod.borrow">Read more</a></p>
|
||||||
|
</div></div><h3 id='impl-BorrowMut%3CT%3E' class='impl'><code class='in-band'>impl<T> <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html" title="trait core::borrow::BorrowMut">BorrowMut</a><T> for T <span class="where fmt-newline">where<br> T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>, </span></code><a href='#impl-BorrowMut%3CT%3E' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#220-224' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.borrow_mut' class="method hidden"><code id='borrow_mut.v'>fn <a href='https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut' class='fnname'>borrow_mut</a>(&mut self) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&mut </a>T</code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#221-223' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Mutably borrows from an owned value. <a href="https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut">Read more</a></p>
|
||||||
|
</div></div><h3 id='impl-From%3CT%3E' class='impl'><code class='in-band'>impl<T> <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.From.html" title="trait core::convert::From">From</a><T> for T</code><a href='#impl-From%3CT%3E' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#564-568' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.from' class="method hidden"><code id='from.v'>fn <a href='https://doc.rust-lang.org/nightly/core/convert/trait.From.html#tymethod.from' class='fnname'>from</a>(t: T) -> T</code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#565-567' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Performs the conversion.</p>
|
||||||
|
</div></div><h3 id='impl-Into%3CU%3E' class='impl'><code class='in-band'>impl<T, U> <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><U> for T <span class="where fmt-newline">where<br> U: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.From.html" title="trait core::convert::From">From</a><T>, </span></code><a href='#impl-Into%3CU%3E' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#553-560' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='method.into' class="method hidden"><code id='into.v'>fn <a href='https://doc.rust-lang.org/nightly/core/convert/trait.Into.html#tymethod.into' class='fnname'>into</a>(self) -> U</code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#557-559' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Performs the conversion.</p>
|
||||||
|
</div></div><h3 id='impl-ToOwned' class='impl'><code class='in-band'>impl<T> <a class="trait" href="https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html" title="trait alloc::borrow::ToOwned">ToOwned</a> for T <span class="where fmt-newline">where<br> T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>, </span></code><a href='#impl-ToOwned' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#80-92' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='associatedtype.Owned' class="type"><code id='Owned.t'>type <a href='https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#associatedtype.Owned' class="type">Owned</a> = T</code></h4><div class='docblock'><p>The resulting type after obtaining ownership.</p>
|
||||||
|
</div><h4 id='method.to_owned' class="method hidden"><code id='to_owned.v'>fn <a href='https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#tymethod.to_owned' class='fnname'>to_owned</a>(&self) -> T</code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#85-87' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Creates owned data from borrowed data, usually by cloning. <a href="https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#tymethod.to_owned">Read more</a></p>
|
||||||
|
</div><h4 id='method.clone_into' class="method hidden"><code id='clone_into.v'>fn <a href='https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#method.clone_into' class='fnname'>clone_into</a>(&self, target: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&mut </a>T)</code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#89-91' title='goto source code'>[src]</a></h4><div class='stability hidden'><div class='stab unstable'><details><summary><span class='emoji'>🔬</span> This is a nightly-only experimental API. (<code>toowned_clone_into</code>)</summary><p>recently added</p>
|
||||||
|
</details></div></div><div class='docblock hidden'><p>Uses borrowed data to replace owned data, usually by cloning. <a href="https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#method.clone_into">Read more</a></p>
|
||||||
|
</div></div><h3 id='impl-TryFrom%3CU%3E' class='impl'><code class='in-band'>impl<T, U> <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a><U> for T <span class="where fmt-newline">where<br> U: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><T>, </span></code><a href='#impl-TryFrom%3CU%3E' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#601-610' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='associatedtype.Error' class="type"><code id='Error.t'>type <a href='https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error' class="type">Error</a> = <a class="enum" href="https://doc.rust-lang.org/nightly/core/convert/enum.Infallible.html" title="enum core::convert::Infallible">Infallible</a></code></h4><div class='docblock'><p>The type returned in the event of a conversion error.</p>
|
||||||
|
</div><h4 id='method.try_from' class="method hidden"><code id='try_from.v'>fn <a href='https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#tymethod.try_from' class='fnname'>try_from</a>(value: U) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a><T, <T as <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a><U>>::<a class="type" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a>></code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#607-609' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Performs the conversion.</p>
|
||||||
|
</div></div><h3 id='impl-TryInto%3CU%3E' class='impl'><code class='in-band'>impl<T, U> <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html" title="trait core::convert::TryInto">TryInto</a><U> for T <span class="where fmt-newline">where<br> U: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a><T>, </span></code><a href='#impl-TryInto%3CU%3E' class='anchor'></a><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#587-596' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='associatedtype.Error-1' class="type"><code id='Error.t-1'>type <a href='https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html#associatedtype.Error' class="type">Error</a> = <U as <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a><T>>::<a class="type" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a></code></h4><div class='docblock'><p>The type returned in the event of a conversion error.</p>
|
||||||
|
</div><h4 id='method.try_into' class="method hidden"><code id='try_into.v'>fn <a href='https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html#tymethod.try_into' class='fnname'>try_into</a>(self) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a><U, <U as <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a><T>>::<a class="type" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a>></code><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#593-595' title='goto source code'>[src]</a></h4><div class='docblock hidden'><p>Performs the conversion.</p>
|
||||||
|
</div></div></div></section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../";window.currentCrate = "tower_layer";</script><script src="../aliases.js"></script><script src="../main.js"></script><script defer src="../search-index.js"></script></body></html>
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,66 @@
|
||||||
|
<!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="API documentation for the Rust `Layer` trait in crate `tower_layer`."><meta name="keywords" content="rust, rustlang, rust-lang, Layer"><title>tower_layer::Layer - Rust</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><noscript><link rel="stylesheet" href="../noscript.css"></noscript><link rel="shortcut icon" href="../favicon.ico"><style type="text/css">#crate-search{background-image:url("../down-arrow.svg");}</style></head><body class="rustdoc trait"><!--[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">☰</div><a href='../tower_layer/index.html'><div class='logo-container'><img src='../rust-logo.png' alt='logo'></div></a><p class='location'>Trait Layer</p><div class="sidebar-elems"><div class="block items"><a class="sidebar-title" href="#associated-types">Associated Types</a><div class="sidebar-links"><a href="#associatedtype.Service">Service</a></div><a class="sidebar-title" href="#required-methods">Required Methods</a><div class="sidebar-links"><a href="#tymethod.layer">layer</a></div><a class="sidebar-title" href="#foreign-impls">Implementations on Foreign Types</a><div class="sidebar-links"><a href="#impl-Layer%3CS%3E-for-%26%27a%20T">&'a T</a></div><a class="sidebar-title" href="#implementors">Implementors</a></div><p class='location'><a href='index.html'>tower_layer</a></p><script>window.sidebarCurrent = {name: 'Layer', ty: 'trait', relpath: ''};</script><script defer src="sidebar-items.js"></script></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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"><h1 class='fqn'><span class='out-of-band'><span id='render-detail'><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class='inner'>−</span>]</a></span><a class='srclink' href='../src/tower_layer/lib.rs.html#84-90' title='goto source code'>[src]</a></span><span class='in-band'>Trait <a href='index.html'>tower_layer</a>::<wbr><a class="trait" href=''>Layer</a></span></h1><div class="docblock type-decl hidden-by-usual-hider"><pre class='rust trait'>pub trait Layer<S> {
|
||||||
|
type <a href='#associatedtype.Service' class="type">Service</a>;
|
||||||
|
fn <a href='#tymethod.layer' class='fnname'>layer</a>(&self, inner: S) -> Self::<a class="type" href="../tower_layer/trait.Layer.html#associatedtype.Service" title="type tower_layer::Layer::Service">Service</a>;
|
||||||
|
}</pre></div><div class='docblock'><p>Decorates a <code>Service</code>, transforming either the request or the response.</p>
|
||||||
|
<p>Often, many of the pieces needed for writing network applications can be
|
||||||
|
reused across multiple services. The <code>Layer</code> trait can be used to write
|
||||||
|
reusable components that can be applied to very different kinds of services;
|
||||||
|
for example, it can be applied to services operating on different protocols,
|
||||||
|
and to both the client and server side of a network transaction.</p>
|
||||||
|
<h1 id="log" class="section-header"><a href="#log">Log</a></h1>
|
||||||
|
<p>Take request logging as an example:</p>
|
||||||
|
|
||||||
|
<div class="example-wrap"><pre class="rust rust-example-rendered">
|
||||||
|
|
||||||
|
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">LogLayer</span> {
|
||||||
|
<span class="ident">target</span>: <span class="kw-2">&</span><span class="lifetime">'static</span> <span class="ident">str</span>,
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">impl</span><span class="op"><</span><span class="ident">S</span><span class="op">></span> <span class="ident">Layer</span><span class="op"><</span><span class="ident">S</span><span class="op">></span> <span class="kw">for</span> <span class="ident">LogLayer</span> {
|
||||||
|
<span class="kw">type</span> <span class="ident">Service</span> <span class="op">=</span> <span class="ident">LogService</span><span class="op"><</span><span class="ident">S</span><span class="op">></span>;
|
||||||
|
|
||||||
|
<span class="kw">fn</span> <span class="ident">layer</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">service</span>: <span class="ident">S</span>) <span class="op">-</span><span class="op">></span> <span class="self">Self</span>::<span class="ident">Service</span> {
|
||||||
|
<span class="ident">LogService</span> {
|
||||||
|
<span class="ident">target</span>: <span class="self">self</span>.<span class="ident">target</span>,
|
||||||
|
<span class="ident">service</span>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="comment">// This service implements the Log behavior</span>
|
||||||
|
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">LogService</span><span class="op"><</span><span class="ident">S</span><span class="op">></span> {
|
||||||
|
<span class="ident">target</span>: <span class="kw-2">&</span><span class="lifetime">'static</span> <span class="ident">str</span>,
|
||||||
|
<span class="ident">service</span>: <span class="ident">S</span>,
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">impl</span><span class="op"><</span><span class="ident">S</span>, <span class="ident">Request</span><span class="op">></span> <span class="ident">Service</span><span class="op"><</span><span class="ident">Request</span><span class="op">></span> <span class="kw">for</span> <span class="ident">LogService</span><span class="op"><</span><span class="ident">S</span><span class="op">></span>
|
||||||
|
<span class="kw">where</span>
|
||||||
|
<span class="ident">S</span>: <span class="ident">Service</span><span class="op"><</span><span class="ident">Request</span><span class="op">></span>,
|
||||||
|
<span class="ident">Request</span>: <span class="ident">fmt</span>::<span class="ident">Debug</span>,
|
||||||
|
{
|
||||||
|
<span class="kw">type</span> <span class="ident">Response</span> <span class="op">=</span> <span class="ident">S</span>::<span class="ident">Response</span>;
|
||||||
|
<span class="kw">type</span> <span class="ident">Error</span> <span class="op">=</span> <span class="ident">S</span>::<span class="ident">Error</span>;
|
||||||
|
<span class="kw">type</span> <span class="ident">Future</span> <span class="op">=</span> <span class="ident">S</span>::<span class="ident">Future</span>;
|
||||||
|
|
||||||
|
<span class="kw">fn</span> <span class="ident">poll_ready</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">cx</span>: <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">Context</span><span class="op"><</span><span class="lifetime">'_</span><span class="op">></span>) <span class="op">-</span><span class="op">></span> <span class="ident">Poll</span><span class="op"><</span><span class="prelude-ty">Result</span><span class="op"><</span>(), <span class="self">Self</span>::<span class="ident">Error</span><span class="op">></span><span class="op">></span> {
|
||||||
|
<span class="self">self</span>.<span class="ident">service</span>.<span class="ident">poll_ready</span>(<span class="ident">cx</span>)
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">fn</span> <span class="ident">call</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">request</span>: <span class="ident">Request</span>) <span class="op">-</span><span class="op">></span> <span class="self">Self</span>::<span class="ident">Future</span> {
|
||||||
|
<span class="comment">// Insert log statement here or other functionality</span>
|
||||||
|
<span class="macro">println</span><span class="macro">!</span>(<span class="string">"request = {:?}, target = {:?}"</span>, <span class="ident">request</span>, <span class="self">self</span>.<span class="ident">target</span>);
|
||||||
|
<span class="self">self</span>.<span class="ident">service</span>.<span class="ident">call</span>(<span class="ident">request</span>)
|
||||||
|
}
|
||||||
|
}</pre></div>
|
||||||
|
<p>The above log implementation is decoupled from the underlying protocol and
|
||||||
|
is also decoupled from client or server concerns. In other words, the same
|
||||||
|
log middleware could be used in either a client or a server.</p>
|
||||||
|
</div>
|
||||||
|
<h2 id='associated-types' class='small-section-header'>Associated Types<a href='#associated-types' class='anchor'></a></h2><div class='methods'><h3 id='associatedtype.Service' class='method'><code id='Service.t'>type <a href='#associatedtype.Service' class="type">Service</a></code></h3><div class='docblock'><p>The wrapped service</p>
|
||||||
|
</div></div><span class='loading-content'>Loading content...</span>
|
||||||
|
<h2 id='required-methods' class='small-section-header'>Required methods<a href='#required-methods' class='anchor'></a></h2><div class='methods'><h3 id='tymethod.layer' class='method'><code id='layer.v'>fn <a href='#tymethod.layer' class='fnname'>layer</a>(&self, inner: S) -> Self::<a class="type" href="../tower_layer/trait.Layer.html#associatedtype.Service" title="type tower_layer::Layer::Service">Service</a></code></h3><div class='docblock'><p>Wrap the given service with the middleware, returning a new service
|
||||||
|
that has been decorated with the middleware.</p>
|
||||||
|
</div></div><span class='loading-content'>Loading content...</span>
|
||||||
|
<h2 id='foreign-impls' class='small-section-header'>Implementations on Foreign Types<a href='#foreign-impls' class='anchor'></a></h2><h3 id='impl-Layer%3CS%3E-for-%26%27a%20T' class='impl'><code class='in-band'>impl<'a, T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>, S> <a class="trait" href="../tower_layer/trait.Layer.html" title="trait tower_layer::Layer">Layer</a><S> for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&'a </a>T <span class="where fmt-newline">where<br> T: <a class="trait" href="../tower_layer/trait.Layer.html" title="trait tower_layer::Layer">Layer</a><S>, </span></code><a href='#impl-Layer%3CS%3E-for-%26%27a%20T' class='anchor'></a><a class='srclink' href='../src/tower_layer/lib.rs.html#92-101' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='associatedtype.Service-1' class="type"><code id='Service.t-1'>type <a href='#associatedtype.Service' class="type">Service</a> = T::<a class="type" href="../tower_layer/trait.Layer.html#associatedtype.Service" title="type tower_layer::Layer::Service">Service</a></code></h4><h4 id='method.layer' class="method hidden"><code id='layer.v-1'>fn <a href='#method.layer' class='fnname'>layer</a>(&self, inner: S) -> Self::<a class="type" href="../tower_layer/trait.Layer.html#associatedtype.Service" title="type tower_layer::Layer::Service">Service</a></code><a class='srclink' href='../src/tower_layer/lib.rs.html#98-100' title='goto source code'>[src]</a></h4></div><span class='loading-content'>Loading content...</span>
|
||||||
|
<h2 id='implementors' class='small-section-header'>Implementors<a href='#implementors' class='anchor'></a></h2><div class='item-list' id='implementors-list'><h3 id='impl-Layer%3CS%3E' class='impl'><code class='in-band'>impl<S> Layer<S> for <a class="struct" href="../tower_layer/struct.Identity.html" title="struct tower_layer::Identity">Identity</a></code><a href='#impl-Layer%3CS%3E' class='anchor'></a><a class='srclink' href='../src/tower_layer/identity.rs.html#21-27' title='goto source code'>[src]</a></h3><div class='docblock'><p>Decorates a <code>Service</code>, transforming either the request or the response.</p>
|
||||||
|
</div><div class='impl-items'><h4 id='associatedtype.Service-2' class="type"><code id='Service.t-2'>type <a href='#associatedtype.Service-2' class="type">Service</a> = S</code></h4><h4 id='method.layer-1' class="method hidden"><code id='layer.v-2'>fn <a href='#method.layer-1' class='fnname'>layer</a>(&self, inner: S) -> Self::<a class="type" href="../tower_layer/trait.Layer.html#associatedtype.Service" title="type tower_layer::Layer::Service">Service</a></code><a class='srclink' href='../src/tower_layer/identity.rs.html#24-26' title='goto source code'>[src]</a></h4></div><h3 id='impl-Layer%3CS%3E-1' class='impl'><code class='in-band'>impl<S, Inner, Outer> Layer<S> for <a class="struct" href="../tower_layer/struct.Stack.html" title="struct tower_layer::Stack">Stack</a><Inner, Outer> <span class="where fmt-newline">where<br> Inner: <a class="trait" href="../tower_layer/trait.Layer.html" title="trait tower_layer::Layer">Layer</a><S>,<br> Outer: <a class="trait" href="../tower_layer/trait.Layer.html" title="trait tower_layer::Layer">Layer</a><Inner::<a class="type" href="../tower_layer/trait.Layer.html#associatedtype.Service" title="type tower_layer::Layer::Service">Service</a>>, </span></code><a href='#impl-Layer%3CS%3E-1' class='anchor'></a><a class='srclink' href='../src/tower_layer/stack.rs.html#18-30' title='goto source code'>[src]</a></h3><div class='impl-items'><h4 id='associatedtype.Service-3' class="type"><code id='Service.t-3'>type <a href='#associatedtype.Service-3' class="type">Service</a> = Outer::<a class="type" href="../tower_layer/trait.Layer.html#associatedtype.Service" title="type tower_layer::Layer::Service">Service</a></code></h4><h4 id='method.layer-2' class="method hidden"><code id='layer.v-3'>fn <a href='#method.layer-2' class='fnname'>layer</a>(&self, service: S) -> Self::<a class="type" href="../tower_layer/trait.Layer.html#associatedtype.Service" title="type tower_layer::Layer::Service">Service</a></code><a class='srclink' href='../src/tower_layer/stack.rs.html#25-29' title='goto source code'>[src]</a></h4></div></div><span class='loading-content'>Loading content...</span><script type="text/javascript" src="../implementors/tower_layer/trait.Layer.js" async></script></section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../";window.currentCrate = "tower_layer";</script><script src="../aliases.js"></script><script src="../main.js"></script><script defer src="../search-index.js"></script></body></html>
|
|
@ -0,0 +1,3 @@
|
||||||
|
<!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="List of all items in this crate"><meta name="keywords" content="rust, rustlang, rust-lang"><title>List of all items in this crate</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><noscript><link rel="stylesheet" href="../noscript.css"></noscript><link rel="shortcut icon" href="../favicon.ico"><style type="text/css">#crate-search{background-image:url("../down-arrow.svg");}</style></head><body class="rustdoc mod"><!--[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">☰</div><a href='../tower_service/index.html'><div class='logo-container'><img src='../rust-logo.png' alt='logo'></div></a></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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"><h1 class='fqn'><span class='out-of-band'><span id='render-detail'><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class='inner'>−</span>]</a></span>
|
||||||
|
</span>
|
||||||
|
<span class='in-band'>List of all items</span></h1><h3 id='Traits'>Traits</h3><ul class='traits docblock'><li><a href='trait.Service.html'>Service</a></li></ul></section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../";window.currentCrate = "tower_service";</script><script src="../aliases.js"></script><script src="../main.js"></script><script defer src="../search-index.js"></script></body></html>
|
|
@ -0,0 +1,7 @@
|
||||||
|
<!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="API documentation for the Rust `tower_service` crate."><meta name="keywords" content="rust, rustlang, rust-lang, tower_service"><title>tower_service - Rust</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><noscript><link rel="stylesheet" href="../noscript.css"></noscript><link rel="shortcut icon" href="../favicon.ico"><style type="text/css">#crate-search{background-image:url("../down-arrow.svg");}</style></head><body class="rustdoc mod"><!--[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">☰</div><a href='../tower_service/index.html'><div class='logo-container'><img src='../rust-logo.png' alt='logo'></div></a><p class='location'>Crate tower_service</p><div class="sidebar-elems"><a id='all-types' href='all.html'><p>See all tower_service's items</p></a><div class="block items"><ul><li><a href="#traits">Traits</a></li></ul></div><p class='location'></p><script>window.sidebarCurrent = {name: 'tower_service', ty: 'mod', relpath: '../'};</script></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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"><h1 class='fqn'><span class='out-of-band'><span id='render-detail'><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class='inner'>−</span>]</a></span><a class='srclink' href='../src/tower_service/lib.rs.html#1-271' title='goto source code'>[src]</a></span><span class='in-band'>Crate <a class="mod" href=''>tower_service</a></span></h1><div class='docblock'><p>Definition of the core <code>Service</code> trait to Tower</p>
|
||||||
|
<p>The [<code>Service</code>] trait provides the necessary abstractions for defining
|
||||||
|
request / response clients and servers. It is simple but powerful and is
|
||||||
|
used as the foundation for the rest of Tower.</p>
|
||||||
|
</div><h2 id='traits' class='section-header'><a href="#traits">Traits</a></h2>
|
||||||
|
<table><tr class='module-item'><td><a class="trait" href="trait.Service.html" title='tower_service::Service trait'>Service</a></td><td class='docblock-short'><p>An asynchronous function from a <code>Request</code> to a <code>Response</code>.</p>
|
||||||
|
</td></tr></table></section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../";window.currentCrate = "tower_service";</script><script src="../aliases.js"></script><script src="../main.js"></script><script defer src="../search-index.js"></script></body></html>
|
|
@ -0,0 +1 @@
|
||||||
|
initSidebarItems({"trait":[["Service","An asynchronous function from a `Request` to a `Response`."]]});
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,3 @@
|
||||||
|
<!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="List of all items in this crate"><meta name="keywords" content="rust, rustlang, rust-lang"><title>List of all items in this crate</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><noscript><link rel="stylesheet" href="../noscript.css"></noscript><link rel="shortcut icon" href="../favicon.ico"><style type="text/css">#crate-search{background-image:url("../down-arrow.svg");}</style></head><body class="rustdoc mod"><!--[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">☰</div><a href='../tower_test/index.html'><div class='logo-container'><img src='../rust-logo.png' alt='logo'></div></a></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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"><h1 class='fqn'><span class='out-of-band'><span id='render-detail'><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class='inner'>−</span>]</a></span>
|
||||||
|
</span>
|
||||||
|
<span class='in-band'>List of all items</span></h1><h3 id='Structs'>Structs</h3><ul class='structs docblock'><li><a href='mock/struct.Handle.html'>mock::Handle</a></li><li><a href='mock/struct.Mock.html'>mock::Mock</a></li><li><a href='mock/struct.SendResponse.html'>mock::SendResponse</a></li><li><a href='mock/error/struct.Closed.html'>mock::error::Closed</a></li><li><a href='mock/future/struct.ResponseFuture.html'>mock::future::ResponseFuture</a></li><li><a href='mock/spawn/struct.Spawn.html'>mock::spawn::Spawn</a></li></ul><h3 id='Macros'>Macros</h3><ul class='macros docblock'><li><a href='macro.assert_request_eq.html'>assert_request_eq</a></li></ul><h3 id='Functions'>Functions</h3><ul class='functions docblock'><li><a href='mock/fn.pair.html'>mock::pair</a></li><li><a href='mock/fn.spawn.html'>mock::spawn</a></li><li><a href='mock/fn.spawn_layer.html'>mock::spawn_layer</a></li><li><a href='mock/fn.spawn_with.html'>mock::spawn_with</a></li></ul></section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../";window.currentCrate = "tower_test";</script><script src="../aliases.js"></script><script src="../main.js"></script><script defer src="../search-index.js"></script></body></html>
|
|
@ -0,0 +1,7 @@
|
||||||
|
<!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="API documentation for the Rust `tower_test` crate."><meta name="keywords" content="rust, rustlang, rust-lang, tower_test"><title>tower_test - Rust</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><noscript><link rel="stylesheet" href="../noscript.css"></noscript><link rel="shortcut icon" href="../favicon.ico"><style type="text/css">#crate-search{background-image:url("../down-arrow.svg");}</style></head><body class="rustdoc mod"><!--[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">☰</div><a href='../tower_test/index.html'><div class='logo-container'><img src='../rust-logo.png' alt='logo'></div></a><p class='location'>Crate tower_test</p><div class="sidebar-elems"><a id='all-types' href='all.html'><p>See all tower_test's items</p></a><div class="block items"><ul><li><a href="#modules">Modules</a></li><li><a href="#macros">Macros</a></li></ul></div><p class='location'></p><script>window.sidebarCurrent = {name: 'tower_test', ty: 'mod', relpath: '../'};</script></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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"><h1 class='fqn'><span class='out-of-band'><span id='render-detail'><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class='inner'>−</span>]</a></span><a class='srclink' href='../src/tower_test/lib.rs.html#1-13' title='goto source code'>[src]</a></span><span class='in-band'>Crate <a class="mod" href=''>tower_test</a></span></h1><div class='docblock'><p>Mock <code>Service</code> that can be used in tests.</p>
|
||||||
|
</div><h2 id='modules' class='section-header'><a href="#modules">Modules</a></h2>
|
||||||
|
<table><tr class='module-item'><td><a class="mod" href="mock/index.html" title='tower_test::mock mod'>mock</a></td><td class='docblock-short'><p>Mock <code>Service</code> that can be used in tests.</p>
|
||||||
|
</td></tr></table><h2 id='macros' class='section-header'><a href="#macros">Macros</a></h2>
|
||||||
|
<table><tr class='module-item'><td><a class="macro" href="macro.assert_request_eq.html" title='tower_test::assert_request_eq macro'>assert_request_eq</a></td><td class='docblock-short'><p>Asserts that the mock handle receives a new request equal to the given
|
||||||
|
value.</p>
|
||||||
|
</td></tr></table></section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../";window.currentCrate = "tower_test";</script><script src="../aliases.js"></script><script src="../main.js"></script><script defer src="../search-index.js"></script></body></html>
|
|
@ -0,0 +1,10 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="refresh" content="0;URL=macro.assert_request_eq.html">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<p>Redirecting to <a href="macro.assert_request_eq.html">macro.assert_request_eq.html</a>...</p>
|
||||||
|
<script>location.replace("macro.assert_request_eq.html" + location.search + location.hash);</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,25 @@
|
||||||
|
<!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="API documentation for the Rust `assert_request_eq` macro in crate `tower_test`."><meta name="keywords" content="rust, rustlang, rust-lang, assert_request_eq"><title>tower_test::assert_request_eq - Rust</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><noscript><link rel="stylesheet" href="../noscript.css"></noscript><link rel="shortcut icon" href="../favicon.ico"><style type="text/css">#crate-search{background-image:url("../down-arrow.svg");}</style></head><body class="rustdoc macro"><!--[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">☰</div><a href='../tower_test/index.html'><div class='logo-container'><img src='../rust-logo.png' alt='logo'></div></a><div class="sidebar-elems"><p class='location'><a href='index.html'>tower_test</a></p><script>window.sidebarCurrent = {name: 'assert_request_eq', ty: 'macro', relpath: ''};</script><script defer src="sidebar-items.js"></script></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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"><h1 class='fqn'><span class='out-of-band'><span id='render-detail'><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class='inner'>−</span>]</a></span><a class='srclink' href='../src/tower_test/macros.rs.html#27-40' title='goto source code'>[src]</a></span><span class='in-band'>Macro <a href='index.html'>tower_test</a>::<wbr><a class="macro" href=''>assert_request_eq</a></span></h1><div class="docblock type-decl hidden-by-usual-hider"><div class="example-wrap"><pre class="rust macro">
|
||||||
|
<span class="macro">macro_rules</span><span class="macro">!</span> <span class="ident">assert_request_eq</span> {
|
||||||
|
(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">mock_handle</span>:<span class="ident">expr</span>, <span class="macro-nonterminal">$</span><span class="macro-nonterminal">expect</span>:<span class="ident">expr</span>) <span class="op">=</span><span class="op">></span> { ... };
|
||||||
|
(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">mock_handle</span>:<span class="ident">expr</span>, <span class="macro-nonterminal">$</span><span class="macro-nonterminal">expect</span>:<span class="ident">expr</span>, $(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">arg</span>:<span class="ident">tt</span>)<span class="kw-2">*</span>) <span class="op">=</span><span class="op">></span> { ... };
|
||||||
|
}</pre></div>
|
||||||
|
</div><div class='docblock'><p>Asserts that the mock handle receives a new request equal to the given
|
||||||
|
value.</p>
|
||||||
|
<p>On success, the [<code>SendResponse</code>] handle for the matched request is returned,
|
||||||
|
allowing the caller to respond to the request. On failure, the macro panics.</p>
|
||||||
|
<h1 id="examples" class="section-header"><a href="#examples">Examples</a></h1>
|
||||||
|
<div class="example-wrap"><pre class="rust rust-example-rendered">
|
||||||
|
<span class="kw">use</span> <span class="ident">tower_service</span>::<span class="ident">Service</span>;
|
||||||
|
<span class="kw">use</span> <span class="ident">tower_test</span>::{<span class="ident">mock</span>, <span class="ident">assert_request_eq</span>};
|
||||||
|
<span class="kw">use</span> <span class="ident">tokio_test</span>::<span class="ident">assert_ready</span>;
|
||||||
|
|
||||||
|
<span class="kw">let</span> (<span class="kw-2">mut</span> <span class="ident">service</span>, <span class="kw-2">mut</span> <span class="ident">handle</span>) <span class="op">=</span> <span class="ident">mock</span>::<span class="ident">spawn</span>();
|
||||||
|
|
||||||
|
<span class="macro">assert_ready</span><span class="macro">!</span>(<span class="ident">service</span>.<span class="ident">poll_ready</span>());
|
||||||
|
|
||||||
|
<span class="kw">let</span> <span class="ident">response</span> <span class="op">=</span> <span class="ident">service</span>.<span class="ident">call</span>(<span class="string">"hello"</span>);
|
||||||
|
|
||||||
|
<span class="macro">assert_request_eq</span><span class="macro">!</span>(<span class="ident">handle</span>, <span class="string">"hello"</span>).<span class="ident">send_response</span>(<span class="string">"world"</span>);
|
||||||
|
|
||||||
|
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">response</span>.<span class="kw">await</span>.<span class="ident">unwrap</span>(), <span class="string">"world"</span>);</pre></div>
|
||||||
|
</div></section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../";window.currentCrate = "tower_test";</script><script src="../aliases.js"></script><script src="../main.js"></script><script defer src="../search-index.js"></script></body></html>
|
|
@ -0,0 +1,4 @@
|
||||||
|
<!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="API documentation for the Rust `error` mod in crate `tower_test`."><meta name="keywords" content="rust, rustlang, rust-lang, error"><title>tower_test::mock::error - Rust</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><noscript><link rel="stylesheet" href="../../../noscript.css"></noscript><link rel="shortcut icon" href="../../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../../down-arrow.svg");}</style></head><body class="rustdoc mod"><!--[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">☰</div><a href='../../../tower_test/index.html'><div class='logo-container'><img src='../../../rust-logo.png' alt='logo'></div></a><p class='location'>Module error</p><div class="sidebar-elems"><div class="block items"><ul><li><a href="#structs">Structs</a></li></ul></div><p class='location'><a href='../../index.html'>tower_test</a>::<wbr><a href='../index.html'>mock</a></p><script>window.sidebarCurrent = {name: 'error', ty: 'mod', relpath: '../'};</script><script defer src="../sidebar-items.js"></script></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"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><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"><h1 class='fqn'><span class='out-of-band'><span id='render-detail'><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class='inner'>−</span>]</a></span><a class='srclink' href='../../../src/tower_test/mock/error.rs.html#1-23' title='goto source code'>[src]</a></span><span class='in-band'>Module <a href='../../index.html'>tower_test</a>::<wbr><a href='../index.html'>mock</a>::<wbr><a class="mod" href=''>error</a></span></h1><div class='docblock'><p>Error types</p>
|
||||||
|
</div><h2 id='structs' class='section-header'><a href="#structs">Structs</a></h2>
|
||||||
|
<table><tr class='module-item'><td><a class="struct" href="struct.Closed.html" title='tower_test::mock::error::Closed struct'>Closed</a></td><td class='docblock-short'><p>Error yielded when a mocked service does not yet accept requests.</p>
|
||||||
|
</td></tr></table></section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../../";window.currentCrate = "tower_test";</script><script src="../../../aliases.js"></script><script src="../../../main.js"></script><script defer src="../../../search-index.js"></script></body></html>
|
|
@ -0,0 +1 @@
|
||||||
|
initSidebarItems({"struct":[["Closed","Error yielded when a mocked service does not yet accept requests."]]});
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue