Files
boc/aamos-ledger-rust/target/debug/deps/libtower-2e574c74f7ada815.rmeta
T

1873 lines
642 KiB
Plaintext
Raw Normal View History

rust
œ
#rustc 1.96.0 (ac68faa20 2026-05-25)ÁÀ뉊]!ÜÛê(¹Þ—šên-5be7b69c3ff7b5b8ÁíàÄTËŸ ÜJîÄ)'ß\¥!-3d1337db07d0b3aeÁ¤²XctÔ'ÐÓ©z¨ɽÓ-a4945860e1c53b00Á¤°ð ¾ä-±($²ï=©Ã-7e98a21bfd32b0edÁòÖÀH•‘PIÓHã#£-055f30b747f859b6Árustc_std_workspace_coreÁ­Cçß^ò½èÝ$­Çÿ+Cé-c4878ee60b2242c9ÁŸÃï+Ñ]ŠqB<ÏïW#-8dd1dd90e70d0b6aÁ miniz_oxideÁ€š»J(P>àö÷g\K-1eb618da2918ab7fÁadler2ÁÆ;+Þ®5¥Ìýݰ¦ÛLˆ-f7919172d268e069Á hashbrownÁPäV9ÒÆèÜ"ÊÖVŽ\-0fc2184a5da6723aÁrustc_std_workspace_allocÁs&ØòØy¯s•bæ!‰ýŠ-97e4bf30be240674Á
std_detectÁhŠBîÙºÌI®ËÅš-9dbbf8346ba7ac8bÁrustc_demangleÁûë9´Ç×@Œ’ùXFº-f33013f239bf9f14Ácfg_ifÁÜLhž§Œaã¯>­-0a71c8f33a838301Á addr2lineÁ׎Þ!]8V$É@@-e618e6be60e87ba2ÁgimliÁ¸
°µ~Î1‹Ñt ðÁ€w-1f7768a68858f670ÁobjectÁ
áPÃ?­À¶¼QHJ¥-914cd6a4dbe590d1ÁmemchrÁ›º«8Ór­2Ù $¨ûib-cf21ca6f2bb15dcdÁë
‹ás«LÖ€îâƒ×ɯŒ-ee6f3747e38367f0ÁtokioÁJ;Ì3<þÝñŠ7_ú-081d57d1ceb823d6Ápin_project_liteÁ·x¼+Ä`·á¨›t—¸Íœ-2dc344ecc91b59efÁ parking_lotÁâ°r4¨6ª(ü²Hd©n¼-21962aa896c8619bÁlock_apiÁEcÓŽ/ÅS}sw‡A$P-0e8055cd433fa267Á
scopeguardÁ’‰‘p ÒÞa¢ßöéqÓB-29f0bdb2ea82739eÁparking_lot_coreÁ’Ý%Ž=Eq^U4FOV)àŸ-e1ee0517e8b9a4bfÁsmallvecÁ[“S‰«2ûÓàÁ3™ËºS-fa382cf08413422fÁserdeÁFVæ¸Û•IÄÀzÍ-9c8ce3cf08540cc3Á serde_deriveÁ,w|êñ]ù¿¥­C£ð-975c43f96d83014eÁ
serde_coreÁ²€Ãb˜cÐòžÇÇ
-7a42419d8e43b208Á®f©¾/ô)c§{õa“â‘-a3906971a93fd1b8Áæ\‹±ÔcdùÀTƒ-f86f80b348d33b13ÁmioÁGùj0ðÔ·â"FÆ#0Q-3545320490828222ÁbytesÁ`²['3_²µÆ=üå¥-d4f44708ed5da7b6Á tokio_macrosÁóÁm¹^E¼>ŽCê
z3-074a4ab5bbda1a72Ásocket2ÁsT›¸n>~RÊ1G/R-c161f09f0083d1e0Ásignal_hook_registryÁœ¥¿’g›´·DV<{Y<<-b3ea108dcb9d0adeÁerrnoÁÍ\Ý|#{°zŽ¡p&a”-464950f23d45b34dÁ
tower_serviceÁ:`¡{¶aÛ¬í"aô-3b2010b03e380b78Á futures_coreÁÆöc$޳–º¾v¸dK-ac1e9cdb826f83c0Á futures_utilÁ`Á–ëCÕ'÷…~[o*Þ-1e298781d8e8046eÁ futures_taskÁÀð‘ôRî-Ø¡±ê¹-b68ad6d97da04350Á futures_sinkÁ‰ð{Þý’ç KÛÉÔrë-be912d576bc746f9ÁslabÁIø–4àzYMW•˜†‚Ä-35aba13cdef5badeÁ
futures_ioÁTo«Š§ J­íZu\Ȩ-94612345b0215f77Áì­†°<šÒ"®9eæ·3š¶Ø-809318e8f6183885Á tower_layerÁX*ø6êWHNᕈf§-ee72e88a461fccddÁ sync_wrapperÁ&ømDM¹hcÆÎÁ”¹-8a5df64260522eddÁbalanceÁ<»9»¼œ9bufferÁ4ç9»Ù”Ê9discoverÁD”:»õ¤õ9filterÁ4Á:»”¤:hedgeÁ,ë:»¯ŒÏ:limitÁ,”;»ÊŒø:¬$¼;»¬„¡; load_shedÁLè;» load-shedÁ¬È;+testsÁ,û ready_cacheÁ\Ã<» ready-cacheÁ¼¡< reconnectÁLö<»ç¬Ö<retryÁ,£=»Œ‡= spawn_readyÁ\Ò=» spawn-readyÁ¼°=steerÁ,>»ÍŒå=timeoutÁ<¬>»èœŽ>£,‡,$ü+¸
sample_floyd2Álß»¼œ»¸£ÀmacrosÁ
opaque_futureÁmakeÁmake_connectionÁMakeConnectionÁå
ConnectionÁErrorÁFutureÁ
poll_readyÁ¤ååãô make_serviceÁ"""""""""sharedÁ++++++1¤1æ +4¤4¥4ResponseÁ4ô444Ñ" MakeServiceÁ<å<RequestÁ<ä<ô<ServiceÁ< MakeErrorÁ<<<ì< into_serviceÁ<
as_serviceÁ"HžH¤HåH¨"MžM¤MåM¨MäMôMÄMÒMMMì" IntoServiceÁYžY¨YY_markerÁ"^ž^¨^ƒ"bžb¨b×"fžf¤fåf¨fäfôfffÑ" AsServiceÁp'aÁpžp¨pp³"vžv¨v×"zžz¤zåz¨zäzôzzzÑfutureÁŠutilÁŒ 
 š¤šš×žF1ÁžF2ÁžŸžæ £ã£í£Ÿ£×¨ã¨í¨Ÿ¨°¨Š ®¤®®æ ®layerÁ³¤³³¨³FutÁ³ä³ô³³³Ñ½½æ À¤ÀÀÄÀö ŒboxedÁÅö ÆÆÆÆÆÆÆÆÆBoxLayerÁÏInÁϥϦÏÏ"ÆÕÚ"Õ¥Õ¦ÕÕæ ÚÚ ÆÝÚ"ݥݦÝÝÄÝö ÆäÚ"ä¥ä¦ääƒÆêÚ"ê¥ê¦êê×Å layer_cloneÁðððððððððBoxCloneServiceLayerÁùÚ"ù¥ù¦ùù"ðÿÚ"ÿ¥ÿ¦ÿÿæ  ðÚ"¥¦Äö ðŽÚ"Ž¥Ž¦ŽŽƒðÚ"¥¦×Ålayer_clone_syncÁšššššššššBoxCloneSyncServiceLayerÁ£Ú"£¥£¦££"š©Ú"©¥©¦©©æ ®® š±Ú"±¥±¦±±Ä±ö š¸Ú"¸¥¸¦¸¸ƒš¾Ú"¾¥¾¦¾¾×ÅçÄÄÄÄÄÄÄÄÄÄ Ä
Ä Ä Ä
BoxServiceÁÒ¥Ò¦ÒÒinnerÁÄ BoxFutureÁ×¥×ÄÚ¥Ú¦ÚÚæ Þ¤Þ Úö á¤Äã¥ã¦ããäãôãããÑÄì¥ì¦ìì×ÅunsyncÁññññññññññ ñ
ñUnsyncBoxServiceÁý¥ý¦ýýÙ*ñUnsyncBoxFutureÁ¥ñ¥¦æ ¤ö ¤ñ¥¦äôÑñ¥¦×ñ¤¨äôÑÅÅÅÅÅÅŒ boxed_cloneÁ©©©©©©©©©© ©
©BoxCloneServiceÁµ
µ¥µ¦µµˆ©»¥»¦»»æ ¿¤¿ »ö ¤©Ä¥Ä¦ÄÄäÄôÄÄÄѩͥͦÍ̓© CloneServiceÁÒ£Ò clone_boxÁ©Õ£Õ¥Õ§2©Ù¥Ù¦ÙÙ׌boxed_clone_syncÁÞÞÞÞÞÞÞÞÞÞ Þ
ÞBoxCloneSyncServiceÁê
ê¥ê¦êêˆÞð¥ð¦ððæ ô¤ô ðö ÷¤Þù¥ù¦ùùäùôùùùÑÞ¥¦ƒÞ‹2£§2ÞŠ£Š¥Š§2ÞŽ¥Ž¦ŽŽ×Œcall_allÁž 
 SvcÁ ¤ ¢ ×DriveÁ¥¥is_emptyÁ¥pushÁ¥Š ªã6ª¤ª¢ªæ ª
into_innerÁª take_serviceÁª unorderedÁ²ã6²¤²¢²² poll_nextÁorderedÁ¸¸¸¸¸¸¸¸¸¸ ¸
¸Äã6ĤĿ Ää7Äö7ÄŠ8¸Ëã6ˤËËÀ8¸ÐЛ7Ы7Њ Š8ÕÕÕÕÕÕÕÕÕÕ Õ
Õáã6á¤áæ áä7áö7Õçã6ç¤ççÀ8Õìì›7ì«7ìŠ ŒeitherÁôôôôôôôôôôþþþ¨þäþôþþþÑô°Š ôŒ¤ŒŒŒÄŒö Œfuture_serviceÁ­=¤£  ¤ æ ¤¤¤¤×¨¨¤¨×¬¬¤¬£¬¬ä¬ô¬¬¬ÑŒÙÀ¤ÀÀ×ĤÄÄæ Äö ɤÉɨÉôÉäÉôÉÉÉÑÓÓæ Ö¤ÖÖÄÖö Œ map_requestÁÛÛÛÛÛÛÛâ¤ââ×Ûæ¤æææ æö Ûë¤ëëR1ÁëR2ÁëäëôëëëÑÛõõæ Ûø¤øøÄøö Œ map_responseÁýýýýýýýýýý¤×ý¤æ ö ý¤¨ääôÑýššæ ý¤Äö Œ
map_resultÁ¢¢¢¢¢¢¢¢¢¢¬¤¬¬×¢°¤°°æ °ö ¢µ¤µµ¨µäµôµäµôµµµÑ¢ÀÀæ ¢Ã¤ÃÃÄÃö Œ
map_futureÁÈÈÈÈÈÈÈÈÈѤÑÑæ Ñö Ñget_refÁÑget_mutÁÑä7È٣٤ÙÙ¥ÙÙ !ÙäÙôÙÙÙÑÈå¤åå×Èééæ Èì¤ììÄìö Èññ׌oneshotÁôôôôôôôôôô ôÿ¤ÿReqÁÿ not_readyÁÿcalledÁô¤éJ×ôˆ¤ˆéJˆæ ôŒ¤ŒéJŒ°ŒŠ ŒoptionalÁerrorÁæ ˜×ߤ¥¤æ §§¥§§°§Š ²¥²æ ´¨¥¨äôѽ ŒreadyÁ¿¿¿¿¿¿¿¿¿¿ ¿
¿ ReadyOneshotÁ˥˨ËÙ*Ë_pÁ¿Ð¥Ð¨¿Ó¥Ó¨Óæ ¿×¥×¨×°×Š ¿Ü¥Ü¨Ü׿Èà
àÆà¥à¨àˆ¿æ¥æ¨¿éÆé¥é¨éæ ¿îÆî¥î¨î°îŠ ¿ô¥ô¨ô׌
service_fnÁøøøøøøøÆQÿ¥ø¥×ø¥¨£äôÑŒthenÁ 
¤×Ÿ¤ŸŸæ Ÿö ¤¤¤¤¨¤ä¤ô¤ !¤ä¤ô¤¤¤Ñ°°æ ³¤³³Ä³ö ŒrngÁ¸¸¸¸¸¸¸RngÁ¿next_u64Á¿next_f64Á¿
next_rangeÁ¸Ã£ÃÀU¸Ææ ¸È>¸ÊÊ with_hasherÁ¸ÍÍÀUŒŒŒŒŒŒŒŒŒŒ Œ
Œ Œ Œ
ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ Œ!Œ"Œ#Œ$Œ%Œ&Œ'Œ(Œ)Œ*Œ+Œ,Œ-Œ.Œ‚LÿŒß       Œ
ServiceExt笤N
ready_oneshotÁJ6Ž ¤ ³CäÙô½E˜ ˜ ä˜ ôµAœ œ 
NewRequestÁðRŸ Ÿ äŸ ôŸ  !ÍG¤ ¤  !¤ ä¤ ô"Ù/Œ« ¥« ¨Œ option_layerÁ® builderÁ° ° ° ° ° ° ° · >° ¹ æ ° » » ö ½ ¥» ¾[¿ ¥» layer_fnÁÁ » µAà à ½Bà ÇB» ³CÇ » ÙÉ » ÍGË » ðRÍ » Ï » ½EÑ » ä7» serviceÁÔ ¤» ÆQÖ »  check_cloneÁ» check_service_cloneÁÙ ¤» 
check_serviceÁÛ ¤Û ¥Û ¦Û » "à ¤à £» Ù/㠤㠣» ú2æ ¤æ £° é é ×° ì ¤ì ì Äì ö ö ñ ñ ñ ñ ñ ñö ö ö sealedÁ
SealedÁ
¥BoxErrorÁ+SharedÁ
¤
ì]+ˆ
¤ˆ
×+
¤
ƒ+Ž
¤+
¤
æ +
¤
×+
¤
°
Š + SharedFutureÁš
¤š
Ù*+
ž
¤
__assert_not_repr_packedÁ 
¤

ProjectionÁ¢
'__pinÁ¢
¤¢
Ù*

ProjectionRefÁ¦
…c¦
¤¦
Ù*ž
projectÁª
…cž
 project_refÁ¬
…c
__OriginÁ®
…c®
¤®
__dummy_lifetimeÁ®
Ù*
³
…c³
¤
MustNotImplDropÁ
·
¥
¹
¤AndThenÁ»
¤»
»
Ù*»
±À
¤À
À
ƒ
AndThenFutureÁÄ
ãÄ
íÄ
ŸÄ
Ù*É
Ê
ãÊ
íÊ
ŸÉ
ËbÎ
ãÎ
íÎ
ŸÉ
óbÒ
…cÒ
ãÒ
íÒ
ŸÒ
Ù*É
£cØ
…cØ
ãØ
íØ
ŸØ
Ù*Ê
ÐcÞ
…cÊ
çcà
…cÉ
dâ
…câ
ãâ
íâ
Ÿâ
¢dâ
Ù*É
é
…cé
ãé
íé
ŸÉ
×dÉ
ï
¥É
ñ
ãñ
íñ
Ÿ AndThenLayerÁõ
õ
± ø
ø
ƒ
û
û
×ñ UnsyncBoxedÁþ
¤þ
Ù*ñ ¤ ×CallAllÁ ã6 ¤ ¢ ì] streamÁ queueÁ eofÁ curr_reqÁ Ž ã6Ž ¤Ž ¢ Ëb ã6 ¤ ¢ ób …c ã6 ¤ ¢ ì] ‘j Ÿj ¬j ·j £c  …c  ã6  ¤  ¢  ì]  ‘j  Ÿj  ¬j  ·jŽ Ðcª …cŽ çc¬ …c ‚d® …c® ã6® ¤® ¢® ¢d® ì]® ‘j® Ÿj® ¬j® ·j ¹ …c¹ ã6¹ ¤¹ ¢ ×d ¿ ¥ Á ã6Á ¤Á ¢¸âiÅ ã6Å ¤Å Ù*¸É ã6É ¤É ×¸Í Î ã6Î ¤Í ËbÑ ã6Ñ ¤Í óbÔ …cÔ ã6Ô ¤Ô Ù*Í £cÙ …cÙ ã6Ù ¤Ù Ù*Î ÐcÞ …cÎ çcà …cÍ ‚dâ …câ ã6⠤⠢dâ Ù*Í è …cè ã6è ¤Í ×dÍ í ¥Í ï ã6ï ¤ÕCallAllUnorderedÁò ã6ò ¤ò Ù*Õö ã6ö ¤ö ×Õú û ã6û ¤ú Ëbþ ã6þ ¤ú ób …c ã6 ¤ Ù*ú £c …c ã6 ¤ Ù*û Ðc …cû çc …cú ‚d …c ã6 ¤ ¢d Ù*ú  …c ã6 ¤ú ×dú š ¥ú œ ã6œ ¤ôEitherÁŸ Ÿ Ÿ LeftÁ¢
¢ ˆŸ RightÁ¥
¥ ˆô¨ ¨ ¨ ƒô¬ ¬ ô¯ ¯ ¯ ×ôEitherResponseFutureÁ³ ³ ³ ô· ¸ ¸ · Ëb» » · ób¾ …c¾ ¾ ¾ · £cà …cà à à ¸ ÐcÈ …c¸ çcÊ …c· ‚dÌ …cÌ Ì Ì ¢dÌ · Ò …cÒ Ò · ×d· × ¥· Ù Ù ôKindÁÜ Ü Ü Øsß Ù*Ü ñsá Ù*ôKindProjÁã …cã ã ã Øsç Ù*ã ñsé Ù*ôë ì ì ì Ðcï …cë ‚dñ …cñ ñ ñ ¢dñ Øsñ ñsë ø …cø ø ë ×dë ý ¥ë ÿ ÿ 
FutureServiceÁ

¤
º

¤
ƒStateÁŠ
Š
¤Š


ˆŠ
Ä

ˆ

¤
ƒMapErrÁ
¤

Ù*
±œ
¤œ
œ
ƒ MapErrLayerÁ 
 
±£
£
ƒ¦
¦
ש
©
Ÿ©
æ  ­
­
Ÿ­
×
±
±
ٱ
°±
Š  MapErrFutureÁ

Ÿ
Ù*º
»
»
ټ
Ëb¾
¾
ټ
óbÁ
…cÁ
Á
ŸÁ
Ù*º
£cÆ
…cÆ
Æ
ŸÆ
Ù*»
ÐcË
…c»
çcÍ
…cº
dÏ
…cÏ
Ï
ŸÏ
¢dÏ
Ù*º
Õ
…cÕ
Õ
ټ
×dº
Ú
¥º
Ü
Ü
ŸÛ
MapRequestÁß
¤ß
ß
Ù*ß
±Ûä
¤ä
ä
ƒÛMapRequestLayerÁè
è
±Ûë
ë
ƒÛî
î
×ý MapResponseÁñ
¤ñ
ñ
Ù*ñ
±ýö
¤ö
ö
ƒýMapResponseLayerÁú
ú
±ýý
ý
×ýƒýƒƒŸƒæ ý Ÿ×ý
Ÿ°Š ýMapResponseFutureÁŸÙ*ýŸËb˜˜Ÿób…cŸÙ*£c …c  Ÿ Ù*Ðc¥…cçc§…c‚d©…c©©Ÿ©¢d©Ù*¯…c¯¯Ÿ×d´¥Ÿ¢ MapResultÁ¹¤¹¹Ù*¹±¢¾¤¾¾ƒ¢MapResultLayerÁ±¢ÅÅ×¢Èȃ¢ËËŸËæ ¢ ÏÏŸÏ×¢
ÓÓŸÓ°ÓŠ ¢MapResultFutureÁØØŸØÙ*¢ÜÝÝŸÜËbààŸÜóbã…cããŸãÙ*Ü£cè…cèèŸèÙ*ÝÐcí…cÝçcï…cÜ‚dñ…cññŸñ¢dñÙ*Ü÷…c÷÷ŸÜ×dÜü¥ÜþþŸÈ MapFutureÁ¤Ù*±È¤ƒÈMapFutureLayerÁŠŠ±ÈƒôOneshotÁ¤éJºô¤éJ×ô˜¤éJ˜Ëbœ¤œéJ˜óbŸ…cŸ¤ŸéJŸº˜£c¤…c¤¤¤éJ¤ºÐc©…cçc«…c˜‚d­…c­¤­éJ­¢d­º˜³…c³¤³éJ˜×d˜¸¥˜º¤ºéJô¢z½¤½éJ½NotReadyÁÀsvcÁÀreqÁ½CalledÁÃfutÁ½DoneÁÅ
ô StateProjÁÇ…cǤÇéJÇøËˆŽË“ŽÇžŽÎ¬ŽÇ·ŽÐ
ôÒÓ¤ÓéJÓÐcÖ…cÒ‚dØ…cؤØéJØ¢dØøØžŽØ·ŽÒà…cà¤àéJÒ×dÒå¥Òç¤çéJ©ê
êˆí×ResponseFutureÁï¥ïÙ*ò¥ò×õö¥õËbø¥õóbú…cú¥úÙ*õ£cþ…cþ¥þÙ*öÐc…cöçc…cõ‚d…c¥¢dÙ*õ…c¥õ×dõ¥õ¥OptionalÁ¥Ù*¥×ø ServiceFnÁ¥±øœ¥øž¥žƒThenÁ¡¤¡¡Ù*¡±¦¤¦¦ƒ ThenLayerÁªª±­­×°°ƒ³ã³í³Ÿ³æ  ¸ã¸í¸Ÿ¸×
½ã½í½Ÿ½°½Š 
ThenFutureÁÃãÃíßÃÙ*ÈÉãÉíÉŸÈËbÍãÍíÍŸÈóbÑ…cÑãÑíÑŸÑÙ*È£c×…c×ã×íן×Ù*ÉÐcÝ…cÉçcß…cÈ‚dá…cáãáíáŸá¢dáÙ*Èè…cèãèíèŸÈ×dÈî¥Èðãðí🸠HasherRngÁôôhasherÁôcounterÁ¸øøƒ¸ûû×° ServiceBuilderÁþþö ° ƒ






!
:
:
:
;
D
D
D
E
G
W
W
W
X
a
e
e
e
n
n
n
o
v
y
y
y
z



ƒ



§
§
§
­
­
­
»
»
»
¼
Ä
ã
é
ï
ï
ï





·
½
Ã
Ã
Ã
ê
ê
ê
ë
ð
ð
ð




š
š
š
¡
¡
¡
¢
Ë
Ë
Ë
Ì
Ñ
Ô
Ø
Ý
Ý
Ý










¤
¤
¤
§
¨
©
©
©
°
·
·
·
É
Ï
Ï
Ï
Ò
Ó
Ô
Ô
Ô
æ
ë
ë
ë
î
ï
ð
ð
ð








§
§
§
«
«
«
´
´
´
µ
Ã
Ã
Ã
Ñ
Ñ
Ñ
Ò
Ú
å
å
å
ó
ó
ó
ô
ü
Š
Š
Š
˜
˜
˜

¡
¯
¯
¯
¾
¾
¾
¿
Ç
Ö
×
ã
ã
ã
ä
è
è
è
ð
ó
ó
ó









¬
¬
¬
¼
¼
¼
½
Û
Û
Û
ß
ß
ß
æ
ó
ó
ó
ô
÷
÷
÷
ƒ
ƒ
ƒ



Ž
ž
ž
ž
®
®
®
¯
·
À
Á
Â
Å
Ï

Ô
ë
ë
ë
ð
Š
Š
Š







 
Ã
Î
ú
ý
ý
ý
ƒ
ƒ
ƒ

Ì
Ì
Ì
Ñ
ù
ù
ù
þ
«
²
²
²
»


Ÿ
¥
¨
¨
¨
°
°
°
µ
µ
µ
¾
ç
í
ð
ð
ð
ù
ÿ
ÿ
ÿ

Š
Š
Š



˜
Á
Ç
Ç
Ç
Ê
Ò
Ò
Ò
×
×
×
à





œ
î
î
î
ô
ô
ô
ø
˜
˜
˜
 
©
¯
¯
¯
²
¼
¼
¼
Â
Â
Â
Í
ú
ý
ý
ý
ƒ

Ò¾ ¥ì Ö ü Ù
³û·äŽí¿
¤åö©¿c

ÿ`
ì]+>9¯@e?$Ïî©Ø“ªŠ “ª&“ª¥“íš
š
”bœ
Ù*+a¨Ö•'í¤
¥
š
š
”bœ
Ù*+a¨Ö•'íî©¿c¹«‚ع«
žå¨<ˆ¬¬•¬ØYYŒ\"]³"=—ܱÄ2Mˆ¬¨¿c´¬&YYŒ\"]³"=—ܱÄ2Mˆ¬•¬¬¿cppt"u³"}$˜w\8*8ž¨&ppt"u³"}$˜w\8*8ƒ®¨åØ»
»
ˆe¾
Ù*¿
±ë=i›ß”Ó—î©¿c宓íÄ
Ä
ÔeÈ
Ù*_+/ŒÄ€ûãíŸî
¬«î
Ä
Ä
ÔeÈ
Ù*_+/ŒÄ€ûã퟿cް‚ØްØõ
õ
Üh÷
±Wqn¢Þ­,P¿cì°&安®õ
õ
Üh÷
±Wqn¢Þ­,P£¯î©ÏÏÊ"Ô"ÆGø<p²©b`Ú"䪦«²Øý±¿cý±ùùˆ%þ"ðÿ8
ˆ=Ìe«²äªµ²»²«²Øâ²¿câ²££Õ'¨"šµ¦Y£yÈÔ«²äªµ²»²«²ØÁ³¿cÁ³&ÒÒ¯*ÖÙ*Ä?K®,… É¬«¦¬«¿cŸ´¿cþ
þ
ªi Ù*ñCvœ>Á©šî©&ýýø,Ù*ñ"Ý›Ž«¬«Ñ´×´¬«¿c«µ&ó´ì¬&µµ£0ºˆ© «¢OôV¬«Ñ´×´¬«Øˆ¶Ò䪣¿cˆ¶&êêëÉ3ïˆÞ æR‚ºµ­‹¬«Ñ´×´¬«Ø÷¶äªà¶¿c÷¶“í  âiˆ ì] ‘jŠ Ÿj ¬jŒ ·j;™g­ž•­ã6¤¢¾ ¬«¾   âiˆ ì] ‘jŠ Ÿj ¬jŒ ·j;™g­ž•­ã6Ÿ«¢¿cè¸'E踿cÅ Å âiÈ Ù*¸JzÁ„æƹŸ«“íÅ Å âiÈ Ù*¸JzÁ„æĸʸì ¬«ì ò¹'Eò¹¥FuturesOrderedÁin_progress_queueÁ(¿ queued_outputsÁ(¿ next_incoming_indexÁ(¿ next_outgoing_indexÁ(¿ 
~YÝJš±š±¿cò ò Òpõ Ù*ÕÃí9LxÙÞƹŸ«“íò ò Òpõ Ù*ÕÃí9LxÙÞĸʸ ¬« Á¼'EÁ¼¥(é"(é"FuturesUnorderedÁ(ë"ready_to_run_queueÁ(Ž!(ì"head_allÁ(Ž!(í"
is_terminatedÁ(Ž!E~â ˆš±š±ØŸ ¢ £ Øs¤ ˆ¥ ¦ ñs§ ˆenêÊ`
Š è¾¿cè¾&辉®“í³ ³ Út ô6ÇmV2EÖ ¬«Ö ³ ³ Út ô6ÇmV2E°¿¶¿“íÜ ß Øsà Ù*ôá ñsâ Ù*ôÍïhõ”ïM–ÀœÀü ¬«ü Ü ß Øsà Ù*ôá ñsâ Ù*ôÍïhõ”ïM°¿¶¿‚Ø´ÀŸ ¢ £ Øs¤ ˆ¥ ¦ ñs§ ˆenêÊ`
–ÀœÀî©Ø

Øy
º÷}4Z?^É=š±Ÿ«¿cŽÃØŠ

Ž

ˆ

Ä
ˆ!ÙK}š±Ÿ«¿cÖÃ&ŽÃ£Ø

†{š
Ù*
±%òB:î©£¯¿cÎÄØ 
 
Ñ{¢
±cøÊP‡µ*𚱿c¢Å“í

ý|¹
Ù*–P £¯ȰÙ
¬«Ù


ý|¹
Ù*–P š±Ÿ¿c¯Æ‚دÆ&Îĉ® 
 
Ñ{¢
±cøÊP‡µ*ð£¯î©Øß
ß
Äâ
Ù*Ûã
±Û3#Jp¹^'´î©£¯¿cÐÇ&ÐǽBØè
è
“€ê
±ÛºšÃMú!ÿ¤š±¿c´Èè
è
“€ê
±ÛºšÃMú!ÿ¤£¯î©Øñ
ñ
ä€ô
Ù*ýõ
±ýü®qcjÓ î©£¯¿c·É¿cú
ú
´ü
±ý,Qlág|Òš±ØŒÊ“íå‚Ù*ýÒʼn(UKöŒ£¯Ȱ³¬«³å‚Ù*ýÒʼn(UKöŒš±áÆ¿c›Ë‚Ø›Ë&·É‰®ú
ú
´ü
±ý,Qlág|Ò£¯î©Ø¹¹±…¼Ù*¢½±¢ãöÞ9ô5Áî©£¯¿c¼Ì¿cÂÂÿ…ı¢¦D‘6r(òš±Ø‘Í“íØØ®‡ÛÙ*¢
,WS°£¯Ȱû¬«ûØØ®‡ÛÙ*¢
,WS°š±áÆ¿c Î‚Ø Î&¼Ì‰®ÂÂÿ…ı¢¦D‘6r(ò£¯î©Øø‰Ù*ȱÈ2ÔÚ0®áî©£¯&ø‰Ù*ȱÈ2ÔÚ0®áŸ«à¶¿cÁÏØŠŠÆŠŒ±Èös›@t$YVš±ŠŠÆŠŒ±Èös›@t$YV£¯î©¿cåпcºô˜M£Ÿ1^î©éJ“íºô˜M£Ÿ1^Ÿ«éJ·¬«·èÑ“í½ÀøÁˆŽô“ŽôގĬŽôÅÆ·Žj‡ÃÜ|䟫ÜÒ䬫ä½ÀøÁˆŽô“ŽôގĬŽôÅÆ·Žj‡ÃÜ|äî©›Ò¿c‚Ô‚ØèÑ¿cêêë©ìˆ º ÅVQÄcÕ¾Õ¿cïï„‘ñÙ*/ÄÏâdtªM¬«“íïï„‘ñÙ*/ÄÏâdtªM䪎¬«ŽßÕ‚Øïï„‘ñÙ*/ÄÏâdtªMš±¿c¢“Ù*V‰F¼:„ø¬«&¥×쬓íËËëNÎÙ*¿Ï—O¿åØ9³yȦ¬«ì¬‚Øî׿cîדíààáÈ刿 G‚‘C+{Õ8䪉®‚ØààáÈ刿 G‚‘C+{ÕÆäª‰®¿cÏØŠ ד±øêdU¬«ØèÙ¿cèÙ&èÙ‰®Ø¡¡š”¤Ù*¥±óòæ;µµßíî©£¯¿cÆÚ¿cªªã”¬±aÎcMóà¡Çš±Ø›Û“íÃÃ¥–ÇÙ*­úCkÇ"ñ®ê¯ð¯ö¯í¬«
ÑÆi”³þþŠšö ° ÁjÊ
ÑÆi”IdentityÁ—O.ÅÝüdõ«Ò¿cÇàþþŠšö ° ÁjÊ
ÑÆi”î©Hˆ

š
bYv»
£Ä
û
õ
êÏù¾£ìÒ þ
ýÙµŽê  É Å ö ò ¯ Ÿ ¤
¨Š
À
¦
 
­

âß
î
è
ñ
ý
ú
¬¹ÅÂÏØåñнíêòïÜËôà¡­ª¸Ãûôé þ

^
»
ø
õ
äÏŽù¸£Íµê¨ Ÿ

Š
œ

£
 
ä
ß
ë
è
ö
ñ
ú
¾¹ÈŠž¦¡°ªøôþŽ

¬ Ÿ œ4
fYz»
ãÒýþ
ĵùêþŸ ¬
É
ëß
ñ
µ¹Ù¤¡³
š
é
Ä
¹  è Å ò Ò ³ ø Ü Õ

¯÷سà½ïÐËæàè÷
¹
š
š
¨Ä
³ ±

ÓØŒ§ï×Ëîà½ÃMï
ñ
Ä
Àõ
ÝÏù±£ŒŸ Ö 
øè
ú
ÃÂ슳ªì þÕŠ¿ Á  ² ËÅ çò í ï Å Ð(å ì(é"š œ ò × Ù ³ ý ÿ Ü Ú
Ü

´üþظºå罘êšêïîðÃÃÍôÈô· þ«
 ¿c/ØÅŠ »&“í
p‚Ø
<Mî

ÒT¾ 'E
ì ¥
Ö 
ü 
Ù

³
û
·
ä
Äc
¾Ží
¿
³„® 
î© ½Ä3üÿE“ªî©<î©jì]7 ©¤Ÿ »
î©£¯ ²¹±üìMå®$î©£¯ £¯î©Ù*&±)V ´”¥ õ
š± ½¿üüAì°$–š± š±j±7 Û¼ƹ ƒ
4


 Û¼Ÿ«'FüØ ’  ƹŸ«й
 é
ð
®üýó 踔» ƹ<• Ÿ«йÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙƹhƹiŸ«>й4Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙäñoì]בjÚŸjݬ¥ Š
š±Ÿ« ¹ü‹: 
š±Ÿ« ÄË£üÝnŽÃš±ÖÜš±œß? ¼,¿œ³ 
î©£¯ ÅÌÇü€LÎÄî©,‘£¯ £¯î©Ù*&±)V Œ„  
š± ÕüÛ@¢Åš± ìš±j±7 ó¼ß ß
î©£¯ õüéü¬PÐÇî©£¯ Çî©£¯Ù*&±)V ެü
 è
š± ÷üÓ
D´È
š± ä
š±j±7 ,‡ Äö ñ
î©£¯ ŽüÃQ·Éî©£¯ Þ£¯î©Ù*&±)V ´ï ú
š± œüÆEŒÊš± ך±j±7 á  ´Õ ¹î©£¯ ê ñ ³ü¢O ¼Ì î© £¯ ½ £¯î©Ù*&±)V œ ¤‹ š± ž ¥ ÂüâC ‘Í š± ó š±j±7
 Ê
Œ¼
î©£¯ Ì
Ó
Ôü‰J
ÁÏ$­
î©
£¯ ¤
î©£¯ŠÙ*&±)V Ž
T‡
Šš± 

ëüÞ9
åÐ
š± ï
š±k±7î ó ÜÝ ½î©›Ò ÷ þ üž` ‚Ô î©± Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ›Ò¹ î©ÚʅψŽl“Ž+Å ¤¶ ½î©›Ò É Ð ƒü„L ‚Ô î©›Ò&  ¶‡y¬ŽB üœ ­  ·  Û¼›Ò º X
_„œ 
î©›Òtf » üÿ
H î©›Ò Æ Í üÊ
ƒ èÑ
î©Û
›Òã
‚Ô î© Ê…›ÒˆŽ;“Ž?{ ”¡ ¬« ² ¹ ´üˆ± ¥× Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ¬« ¯‹°Ù*}
l
<—
 Û¼¬« ž

 ì¬üøO
ˬ«ì¬ Æ
Í
ÖüÉ
î×
¬«
¯‹Æ¬«Æ PhantomDataÁFu\»ŸõŒËì]Uy ,Œ† ¡î©£¯ ¢üÓJÆÚî©£¯ î©Ù*&±)V î ªš± ð÷²ü¹>›Ûš± Êš±j±7

.&üÇ> þ²á º ü¢iƒá²áx ü‹
# µ¬«Ñ´×´%2ˆ¶>žáÜ¡ˆˆ¢ˆl }.xÏÒ¬«& ¬«„¾„¾PinÁ†¾ ˜X$]È=„kt•žáÜ¡ˆˆ¢ˆl }.xς؃ØÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Ñ´×´Ìì˜Þ&
¬«×´& ¬«Ñ´Ìì˜Þ¡©ü“' ꬫѴ״%ë2÷¶>žáÜ¡ˆˆ¢ˆl }.xϬ«& ¬«Í“&
¬«×´& ¬«Ñ´ Ìì˜ÞÅÌ Ÿ °¿¶¿ £ -è¾9°¿AH,“ Ÿ °¿¶¿ ¦ -è¾9¶¿AH4…! Š
š±Ÿ« Ž
-ÖÃ9š±AH<”! Š
š±Ÿ« 
-ÖÃ9Ÿ«AH| êë%Õ18?üá
à䪉®#á0ààáÈ刿 G‚‘C+{Õ䪉®tËËëNÎÙ*¿Ï—O¿åØ9³yȦ 䪉®½ÄŒ° ñ
ÀÆQTë? ÿû õøXT÷?ü Ššt¬@þý \ªA<þ LayerÁ,ÜAÿ Ä<ŠB&
ü‡DüÌ2/ `async fn(Request) -> Result<Response, Error>`Áÿú # OverviewÁúü–FC Tower is a library of modular and reusable components for buildingÁüÝ*' robust networking clients and servers.ÁˆúüŒJG Tower provides a simple core abstraction, the [`Service`] trait, whichÁü×OL represents an asynchronous function taking a request and returning either aÁü§PM response or an error. This abstraction can be used to model both clients andÁ servers.Áúü‰PM Generic components, like [`timeout`], [rate limiting], and [load balancing],ÁüÚIF can be modeled as [`Service`]s that wrap some inner service and applyÁü¤PM additional behavior before or after the inner service is called. This allowsÁüõTQ implementing these components in a protocol-agnostic, composable way. Typically,ÁüÊ2/ such services are referred to as _middleware_.Áýúü FC An additional abstraction, the [`Layer`] trait, is used to composeÁüÈ JG middleware with [`Service`]s. If a [`Service`] can be thought of as anÁü“
PM asynchronous function from a request type to a response type, a [`Layer`] isÁüä
PM a function taking a [`Service`] of one type and returning a [`Service`] of aÁüµ NK different type. The [`ServiceBuilder`] type is used to add middleware to aÁü„ 52 service by composing it with multiple [`Layer`]s.Áº úÔ¾  ## The Tower EcosystemÁÙ úüÝ -* Tower is made up of the following crates:Á
úä
 * [`tower`] (this crate)Á¼¬
 * [`tower-service`]Á¬Ä
 * [`tower-layer`]Á¤Ú
 * [`tower-test`]Áï
úüó
OL Since the [`Service`] and [`Layer`] traits are important integration pointsÁüÃKH for all libraries using Tower, they are kept as stable as possible, andÁüMJ breaking changes are made rarely. Therefore, they are defined in separateÁüÝFC crates, [`tower-service`] and [`tower-layer`]. This crate containsÁü¤EB re-exports of those core traits, implementations of commonly-usedÁüêMJ middleware, and [utilities] for working with [`Service`]s and [`Layer`]s.Áü¸OL Finally, the [`tower-test`] crate provides tools for testing programs usingÁTˆ Tower.Áú\— # UsageÁ£úü§OL Tower provides an abstraction layer, and generic implementations of variousÁü÷OL middleware. This means that the `tower` crate on its own does *not* provideÁüÇLI a working implementation of a network client or server. Instead, Tower'sÁü”FC [`Service` trait][`Service`] provides an integration point betweenÁüÛIF application code, libraries providing middleware implementations, andÁü¥GD libraries that implement servers and/or clients for various networkÁ protocols.Áüúü€OL Depending on your particular use case, you might use Tower in several ways:ÁÐúüÔKH * **Implementing application logic** for a networked program. You mightÁü MJ use the [`Service`] trait to model your application's behavior, and useÁüîNK the middleware [provided by this crate](#modules) and by other librariesÁü½IF to add functionality to clients and servers provided by one or moreÁü‡ protocol implementations.Áü§OL * **Implementing middleware** to add custom behavior to network clients andÁü÷LI servers in a reusable manner. This might be general-purpose middlewareÁüÄOL (and if it is, please consider releasing your middleware as a library forÁü”KH other Tower users!) or application-specific behavior that needs to beÁüà1. shared between multiple clients or servers.Áü’KH * **Implementing a network protocol**. Libraries that implement networkÁüÞGD protocols (such as HTTP) can depend on `tower-service` to use theÁü¦MJ [`Service`] trait as an integration point between the protocol and userÁüôPM code. For example, a client for some protocol might implement [`Service`],ÁüÅHE allowing users to add arbitrary Tower middleware to those clients.ÁüŽLI Similarly, a server might be created from a user-provided [`Service`].ÁÛúüßJG Additionally, when a network protocol requires functionality alreadyÁüª PM provided by existing Tower middleware, a protocol implementation might useÁüû FC Tower middleware internally, as well as as an integration point.ÁÂ!ú´Æ! ## Library SupportÁÝ!úüá!NK A number of third-party libraries support Tower and the [`Service`] trait.Áü°":7 The following is an incomplete list of such libraries:Áë"úüï"B? * [`hyper`]: A fast and correct low-level HTTP implementation.Áü²#JG * [`tonic`]: A [gRPC-over-HTTP/2][grpc] implementation built on top ofÁüý#PM [`hyper`]. See [here][tonic-examples] for examples of using [`tonic`] withÁdÎ$ Tower.ÁüÛ$<9 * [`warp`]: A lightweight, composable web framework. SeeÁü˜%DA [here][warp-service] for details on using [`warp`] with Tower.ÁüÝ%52 * [`tower-lsp`]: implementations of the [LanguageÁü“&+( Serv
Àº ÆQ» ÿû õøXº ü Šš¹ þý ¸ <þ ªœ³ ÿ IJ &
6!9!<!¬€949Ôo»ñ»¸¼%»”B»„Zü cünl| Š
  Õ,   +   œ, 8¸ & 8û$˜
ž8 8!, ©8Ð & ®8¼ ´, µ  Ã, ·8paramÁ,¸& ½8¼$ Ä Å Æ È, Ê8actualÁ& Ñ8´Ò% Ô*× Ú ÿ K8ò„ä'ô8 pin_projectÁ  ƒ ,   ˜+   , 8¸ 
8§8, ²8Ð  ·, ¸ ¹ À, º8Ÿà$ Á Â Ã Å + × Ø Ü8ÿ
Ù8Ù*& ó, õ8äà8 ¢, £ ¤ «, ¥8Ÿà$ ¬ ­ ®, °8Ð  µ,  · ¾, ¸8Ÿà$ ¿ À Á Ã Ö8Ñ Ô Ú88 Ü8æ ß â ñ8Ù*& è, ê8äà(ó8 û Ì8$  ¾8Ù*8 å, æ ç î, è8Ÿà$ ï ð ñ8Àó'ö8×ø'û8p8
ƒ, 8Ð  Œ,  Ž , 8Ÿà,$   ˜ š Ù
8 ¨8׫ ® Õ ¯8$ ´8± & · ¹8º8À¾'Á8×Ã'Æ8ˆ Ñ:8Ò Ô(×8ÀÚ'Ý8×ß'â8Í ë Ï
8± ý þ8 debug_tupleÁ\ÿ Š œ8ÔL‹   , 8Ð $— 8 £ ¸ ¤8ë ° ± ·7...Á ¹8finishÁ À Á8 è, é ê ñ, ë8Ÿà$ ò ó ô8Àö'ù8ß'88
Š, Ž8Ð $ ,   œ, 8Ÿà,—$  ž Ÿ8$, »8äà& Â8ÀÄ'Ç8ß'Ï8$ × á ù !8!8° û ý, þ8äà4ÿ88À'Œ8ß'84 œ'8°% ¥+ ³ ´ »8Ý8 É8Š  Ð 8& Õ8À×'Ú8ÿ
Ü'ß8Ù’á ä å8æ8 î$ ï8cxÁñ& ó õ8ö8Àú'ý8taskÁ$ÿ'ƒ 8k<…  Œ :8  ( 8À'˜ 8—ñ'ž 8·$   ¤ 8'© 8° ±  ³  ï  8 É 8Ðc Ñ  Ò  Ó 8Ù* Ù 8Š  Þ  á 8àðß d<üHE Trait aliases for Services that produce specific types of Responses.Á»„ú;Äô;$•<Çtÿ`4Å
pŒYˆ\<œJ|NÛ`4
4,‚Øk<DÌ
·$MœØ AsyncReadÁLd
AsyncWriteÁToÃÄ<&¬“œ†L8y{jlLXUW=?´€3ü½3ü™>; The [`MakeConnection`] trait is used to create transports.ÁØúüÜHE The goal of this service is to allow composable methods for creatingÁü¥GD `AsyncRead + AsyncWrite` transports. This could mean creating a TLSÁüíOL based connection or using some other method to authenticate the connection.ÁåÎìü½ú
³úô©ŒßÍìö©«ú>¿ú.«úJ¿ú:Íì³úö©ü¦(žûÞû–û)²ûÂûÍì³úö©\†åûÍì³úö©üÑD‚ØüüÞ6üƒØÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
žûíûüå.‡ü£üvµüWZü¦'ü÷*' The transport provided by this serviceÁT«T†üÔ-* Errors produced by the connecting serviceÁ,üÑCü—52 The future that eventually produces the transportÁ4ÖüëPü›KH Returns `Poll::Ready(Ok(()))` when it is able to make more connections.ÁTî ³ú ÌÌkÎwakerÁ¸Ï local_wakerÁ¸ÐextÁ¸Ñ³¸Ò_marker2Á¸f'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
íû ù
³úö©àðü÷>üÁ1. Connect and return a transport asynchronouslyÁ|ú ³úö©ü Š
³úö©$ê4•ü¹@¤åÍìî© ¾Óú&î©ö©î©#%(*üþsåÍ삪 ƒ Óú4† &‚ªö©‚ªö©& Ã’†‚ª !! lnqs’†T›
, 
‚ªö©&

‚ªö©& üÔ
OT×
ˆŠ ˆ‚ª ÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åŠœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
‚ªö© â

‚ªö©
àðí
ü× =  ‚ªö©‚ªö© ê 
!‚ªö© ê „_dc+<YpÛ`4k
"#×|¤,"$4‚Ø"%ƒ"&ƒ "&k<ÈÌ"(·œØ")Ä&"*¬\™DwŒœ…€ÄžqL¼QSAC´Ü5¬õ4„
š
InfallibleÁTˆê+,k<.Ì+.·$7œØ+/Ä<Q&+IL"<>-/´B!Œ·¤22ì„ ¼“ª3
 üÿ$üÏ+( Create a new [`Shared`] from a service.ÁŒî©“ª11
3î©ì]öPüÈ7¤5¥656ì„ ÍÍìäª ÐØî©“ª789:;& &
& & &
:;HJDFl†D44î©T44ˆê)?ÈXM´­4¿44¹«üÞPŒŽ Œ“ª ÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åŽœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
“ªäª&
4 ì4
:î©äª_cxÁ÷üØ. “ªäª“ªäª& 4 à4
;î©äª_targetÁ<ëüÛAü# Creates new [`Service`] values.Á±úüµMJ Acts as a service factory. This is useful for cases where new [`Service`]ÁüƒLI values must be produced. One case is a TCP server listener. The listenerÁüÐFC accepts new TCP streams, obtains a new [`Service`] value using theÁü—QN [`MakeService`] trait, and uses that new [`Service`] value to process inboundÁüé$! requests on that new TCP stream.ÁŽúü’HE This is essentially a trait alias for a [`Service`] of [`Service`]s.Á<å=¨>=><«úüÛÓ
³úö©‰®̃ÓúÍ쉮<«úKšš6«úWššB?@ABCDEFG?@ABCDEFGÍì³úö©‰®?†›Íì³úö©‰®@\…¬›Íì³úö©‰®AüÌO&Ú›‰®üÚ@Ú›‰®& Ž›ÌëÚ›‰®&
´›œ†Ò›Iò›;†œ*œœÍì³úö©‰®BËœÍì³úö©‰®Cü˜ E‚Øùœü¥ 7ùœƒØÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Ú›Óœü¬ /ñœv£DFGEöùô÷ü£" Responses given by the serviceÁDÏ<<T…üÞ" Errors produced by the serviceÁ,Š<<üÌNü–1. The [`Service`] value created by this factoryÁ<Ñ<<ü¡-* Errors produced while building a service.ÁLØ<<ü˜ Düè+( The future of the [`Service`] instance.Á4 <<üú Tüã MJ Returns [`Poll::Ready`] when the factory is able to create more services.Áµ
úü½
RO If the service is at capacity, then [`Poll::Pending`] is returned and the taskÁü” FC is notified when the service becomes ready again. This function isÁüß *' expected to be called while on a task.ÁŽ úü– +( [`Poll::Ready`]: std::task::Poll::ReadyÁüÆ /, [`Poll::Pending`]: std::task::Poll::PendingÁTý  ³ú ÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Óœ< ˆ
<
D³úö©‰®$
àð
ü’;üÔ
96 Create and return a new service value asynchronously.Ád• ³úö©ùœ< ¢<
E³úö©‰®êü¯RüÓC@ Consume this [`MakeService`] and convert it into a [`Service`].Áú
# ExampleÁÊÑüÁ! use std::convert::Infallible;Á¼ç use tower::Service;Áüƒ! use tower::make::MakeService;ÁÔ© use tower::service_fn;ÁÈúŒÐ # fn main() {Á
# async {Á´ø // A `MakeService`Áü“85 let make_service = service_fn(|make_req: ()| async {ÁüÐ<9 Ok::<_, Infallible>(service_fn(|req: String| async {Áü‘$! Ok::<_, Infallible>(req)Á }))Á });ÁÖúüÞ1. // Convert the `MakeService` into a `Service`Áü”.+ let mut svc = make_service.into_service();ÁÇúÌÏ // Make a new serviceÁüí2/ let mut new_svc = svc.call(()).await.unwrap();Á¤ú¼¬ // Call the serviceÁüÈ=: let res = new_svc.call("foo".to_string()).await.unwrap();Á # };Á<— # }ÁÊѳúYYŒ\"]³"=—ܱÄ2M³ú‰®<<Íì³ú
F³úö©‰®$¿üñWüíc` Convert this [`MakeService`] into a [`Service`] without consuming the original [`MakeService`].ÁÕú‘©ÊÑüû!µ©¼¡ß©ü½!€ªÔ㪪úŒŠÙªóª´²‰«üÍ<9 let mut make_service = service_fn(|make_req: ()| async {ÁüŽ<ë«üÏ$±¬Þ¬ò¬úüœ1­üÒ,) let mut svc = make_service.as_service();ÁƒúÌ‹®ü©2°®àú¼è÷®ü„=˜¯ÆúüÎ52 // The original `MakeService` is still accessibleÁüˆ?< let new_svc = make_service.make_service(()).await.unwrap();ÁÞ¯ï¯ÊÑ ³úppt"u³"}$˜w\8*³ú‰®< ÿ<í±
G³úö©‰®$„ü° €žI¤JåK¨LKIJLˆ¬¬& Ÿ«d‰!Í쟫 ¸ Íì¬Í앬&ˆ¬¬ìù Í숬 µ &Ÿ«•¬„Ÿ!ˆ¬npjlfhü¶!ƒžN¤OåP¨QQOPNÔ¹d"ê¹ ¾!û¹4Á!Œº<É!ºì‚"°º »!Áº„¨"ˆ¬RSTUVWX?@ABCDEXW9;fhkmprlÀ"DÅ"MMŸ«•¬& Tá",æ"MMŸ«•¬&
dü"<#MMŸ«t#L—#MMˆ¬¬&
\±#4¶#MMˆ¬¬& üÏ#STÒ# ˆ¬ ÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ˆ¬¬•¬BM Ý#M
Wˆ¬Ÿ«¬•¬$â#àðè#üÖ$:dÙ$˜ ˜ˆ¬¬ˆ¬¬•¬CM æ$M
Xˆ¬Ÿ«¬•¬$ë$ê4ñ$üì&"üÀ%<9 Service returned by [`MakeService::into_service`][into].Áý%úü&@= See the documentation on [`into_service`][into] for details.ÁÂ&úüÆ&%" [into]: MakeService::into_serviceÁ\÷&žZ¨[[Z°º ƒ'Íìì¬<†'´¬=—ܱÄ2M\]/1+-<•'$•'"YYˆ¬ì¢'<¢'"YYƒFu\»Ÿì¬üÄ'Fž_¨``_°º É'³Ä<Ì'؈¬,„(´¬aÙa)+.0¼‘(,”( ´¬´¬^ š(^
aˆ¬ì¬$›(ü”)Pžc¨ddc°º ™)³Ä<œ)¿cˆ¬TÙ)´¬eÀce)+.0üë)8î)šœ š´¬  c cˆ¢cµ
 `£cbufÁ `àB¤GS
œÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ŸÈŸÈ Èô éBLb ò)b
eˆ¬ì¬$ó)± ù)ü’+Œžg¤håi¨jgijhÔ¹d÷+ê¹ š+û¹4+Œº<¥+ºìç+°º —+Áº,ƒ­klmno& &
& & &
no/1\^acfhl¥,Dª,ffˆ¬¬& TÆ,,Ë,ffÙ½\á,4æ,ffû½ü-OT-žŸ ƒ­ žÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åŸœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ƒ­¬&
f -f
nˆ¬Ÿ«¬•¬$ -àð¦-ü™.2$œ.   ƒ­¬ƒ­¬& f ¡.f
oˆ¬Ÿ«¬•¬$¦.ê4¬.üž0$üþ.85 Service returned by [`MakeService::as_service`][as].Á·/úü»/<9 See the documentation on [`as_service`][as] for details.Áø/úüü/! [as]: MakeService::as_serviceÁL©0Æqžr¨ssqrÍ샮 ·0»š<º0ƒ®Æ|É0ppt"u³"}$˜w\8*ƃ®‰®}$˜w\8*tu³0y{~|$É0"pp ƃ®ìÞ0<Þ0"ppƒFu\»Ÿ‰®ü€1R8¡žw¨xx¡wþÒ …1»š<ˆ1¿cƒ®TÇ1Ê­yÀcy)+.0üÙ18Ü1¢£¤ ¢Ê­ £ c cˆ¢cµ
 `£cðÇ `àB¤GS
¤—Év à1v
y8ƒ®‰®$á1± ç1üþ2Ž8¥ž{¤|å}¨~¥{}|~ƒ®Ø®& ʸdå3Íìʸ †3ÍìØ®4‰3ÍìÒ®<3&ƒ®Ø®ìÕ3þÒ ƒ3&ʸÒ®„û3•®ƒ& &
& & &
ƒ@BŠŒˆl“4D˜4zzƒ®Ø®& T´4,¹4zzƒ®Ø®&
\Ï44Ô4zzƒ®Ø®& üû4OTþ4¦§¨ ¦•® §ÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾å¨œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
•®Ø®&
z ‰5z
8ƒ®ʸخҮ$Ž5àð”5ü‡62$Š6© ©•®Ø®•®Ø®& z 6z
ƒ8ƒ®ʸخҮ$”6ê4š6üz%Ñ4ü©"È4”Õ½4À4²4µ4§4ª4t‘„¦
Future typesÁ4™”bdáš
üÄ)dÎ>üKH Various utility types and functions that are generally used with Tower.Á»ñ„»>ĵ>$Ö>Å©ÞôÛý¢Èô¿ø¸ÿ ‰ ® ˆe<û»
ÒÜhd„õ
Óˆ%¤¨ùÕ¥Õ'ľ£Ö¦Ê"DØÏפ¯*TâÒØ§ø,„îýÙ¨£0|˜µÚÉ3œ¿êÛºs4àŸ Ü­=tý ÞØyl
߆{4«
áÑ{\³ 
âø‰äÆŠŠåÄT€ß
ç“€è
èä€ñ
ê´„¾ú
ë±…¹íÿ…Âî<‹ï¢“ðÈàòëNd¿ËóÆQTß ÿõדöš”$‚¡øã”ªùâi<±Å ûòÒp„ºò üó‚ØŒý¼àDÿŒþø dMDQŒ»
õ
Ä
É
TryFutureÁL'!Žß40( TryFutureExtÁd8×P¤,4f‚ØÙ’|„¾k<‘Ì·œØªœ˜Ä&¼Úd!Ìα³DK¤œY•lr„L…vxdf”¥U´½FüŠ@¤œœì„ Í죯 ¿cî©T¿å®Àc4602üÑ8Ôª«¬ ªå® « c cˆ¢cµ
 `£cðÇ `àB¤GS
¬—Éš Øš
î©£¯± ßüÙ3ãŸí Ÿ¡Ÿ ¡Íì¼°ÞÍì°âÍìȰ ñ'!°ް¢<>8:46ü“X¡(ù<(ù<ˆe(ý<Ù*EC ×Ï ÷(Œ>(Œ>ErrIntoÁ(>Ù*ðúDä!R+¼°°'#°Ȱްžž
¢¼°°ȰÙ*,¥üŽ Gã¤í¥Ÿ¦¤¦¥¢ë³ëÄë ¦ ÕëL› ް§Àc§+-0257üÜ Bß ­®¯ ­ް ® c cˆ¢cµ
 `£cðÇ `àB¤GS
¯—É£ ã £
§¼°°Ȱ± ê ü ˆã©íªŸ««©ª¢ë ³ë Äë ¨ ÕëL ‚Ø´ì4‘ ް¬­ƒØ„Ø­EGJLOQ  ¨¨´ìƒØüŒ
I$
°±²„¾„¾Ù’†¾ ˜X$]È=„kt• °ް ±ÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾å²œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃްƒØ¨ ž
¨
­¼°°Ȱ$”
àðª
Ĥ¤¯°¯°ì„ ©Þè ¬å®±²üì(üÃ$! Creates a new `AndThen` service.Áùî©£¯å®®®
±î©£¯Ù* w±wü‰%ü¿?< Returns a new [`Layer`] that produces [`AndThen`] services.Áƒúü‹KH This is a convenience function that simply calls [`AndThenLayer::new`].ÁÛúüã! [`Layer`]: tower_layer::LayerÁ,£¯À±®®
²î©£¯± üÕ¹¤´µ¨ !·´·µ
£¯î©‰®& ˜" !îÞè Ý»šÍìîùé&®„žæî©‰®&
îù'#„¾–"£¯ÛùÔ×ì„ ÚØ£¯'!îùL„宸¹º»¼& &
& & &
»¼MOÆÈËÍÇÉl•³³îù'"T²³³Áú³³Ä
Ä
ÔeÈ
Ù*_+/ŒÄ€û®& îù£¯ü„OT‡³´µ ³å® ´ÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åµœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
安®&
³ ³
»î©£¯‰®îù$—àðü—4 安®å®‰®& ³ Ÿ³
¼î©£¯‰®îùrequestÁ<ª¼°¾¾Íìš± µì°¿ 
ôüüÎ)& Creates a new [`AndThenLayer`] layer.Áš±ì°½½
¿š±±¶wüÁ;¤ÁÂÂÁì„ ÆÞè ÉìúÀ±ÃÄÄ*,/1<ˆÀÀå®ü¦*· ·À±î©À±î©À ¯À
Äî©£¯Ù*,¶L[,_ŒÆðšÄñÊ"D°Ï¤ˆ%¤Çù¥Õ'Ä¯*T“Ò§ø,„§ý¨L,Åϯ*TÒÆÇØ§×'¤,ÆÉK2†JÆÊÌ\DJ .ÆÌªœ,TÆÍÄ<o&ÆÎ¼~!giL,[\<LN<>´`/ü¯
üy# A boxed [`Layer`] trait object.Áúü¡VS [`BoxLayer`] turns a layer into a trait object, allowing both the [`Layer`] itselfÁüøLI and the output [`Service`] to be dynamic, while having consistent types.ÁÅúüÉLI This [`Layer`] produces [`BoxService`] instances erasing the type of theÁü–2/ [`Service`] produced by the wrapped [`Layer`].ÁÉú‘©Ûúüßda `BoxLayer` can, for example, be useful to create layers dynamically that otherwise wouldn't haveÁüÄC@ the same types. In this example, we include a [`Timeout`] layerÁüˆA> only if an environment variable is set. We can use `BoxLayer`ÁüÊDA to return a consistent type regardless of runtime configuration:Áú<“ÊÑä› use std::time::Duration;Áü¸C@ use tower::{Service, ServiceBuilder, BoxError, util::BoxLayer};Áüúü€DA fn common_layer<S, T>() -> BoxLayer<S, T, S::Response, BoxError>Á whereÁüÏ'$ S: Service<T> + Send + 'static,Áü÷" S::Future: Send + 'static,Áüš+( S::Error: Into<BoxError> + 'static,ÁüÌ+( let builder = ServiceBuilder::new()Áüø$! .concurrency_limit(100);Á úü¡ 1. if std::env::var("SET_TIMEOUT").is_ok() {ÁüÓ  let layer = builderÁüó 1. .timeout(Duration::from_secs(30))Áô¥
 .into_inner();ÁÄ
úüÈ
 BoxLayer::new(layer)Á„é

} else {Áüú
Îüš $! .map_err(Into::into)Áô¿ ±‘Þ úüâ å‘ , <“ ÊÑ úüŸ !ž÷üÁ '$ [`Service`]: tower_service::ServiceÁüé %" [`BoxService`]: super::BoxServiceÁü
 [`Timeout`]: crate::timeoutÁ
Ú"ХѦÒÓÒÐÑÓÍ쫲Ã
ø Ç
Íìµ² Ê
Í컲 Í
ý±Gø<p²©b`ÔHJMOIKEGüÖ
P
ÆÏφJ†JK‰Jµ 7ŠJphantomÁ7J¤7·0ØQd諲«²ÒÒ¯*ÖÙ*Ä?K®,… É䪵²»² Ìì˜Þü«'Ú"֥צØÙ×ÙØÖ –°ø ´¹– ·Ê– ºý±Ú#%(*-/24üüãôÙ Create a new [`BoxLayer`].Áƒý±ÕÛÛÕ Íìàš àš«²Ììàš àšàš&àš«²äªüî#à›äª& µ²à›äª&
»²L‡Ììà›$”à›<›Ììà›äª& Éœ<×
Ú«²äªµ²»²àš inner_layerÁ\Šýÿ„ƒÚ<closure_kind>ÁÜ<closure_signature>ÁÜ<upvars>ÁÜÜÚÜ«²äªµ²»²à𫲥˜àšüº5Ú"ޥߦàááàÞß –¿ø ù– ÆÊ– Éý±âãã2479<>ACÝÝ¥˜üŸ+¸ ¸ý±«²ý±«²Ý ¨Ý
㫲䪵²»²Ù*,¯üö1Ú"奿¦çèèæåç –ûø ÿ¹– Ê– ý±éÙé+-0257:<¼®¹ ¹ý±ý±ä ·ä
髲䪵²»²ü–6Ú"ë¥ì¦íîëíîì –ø Ÿ¹– ¢Ê– ¥ý±ïÀcï+-0257:<üÓ6Öº»¼ ºý± » c cˆ¢cµ
 `£cðÇ `àB¤GS
¼—Éê Úê
﫲䪵²»²×á| \Åù£0|µðñÚ×,¤,ðóK7†JðôÌ\DO .ðöªœ,Yð÷Ä<t&ðøäz&giL1[\ALN<>´e/ü­,ü~+( A [`Clone`] + [`Send`] boxed [`Layer`].Áªúü®b_ [`BoxCloneServiceLayer`] turns a layer into a trait object, allowing both the [`Layer`] itselfÁü‘L ‡ÞúüâQN This [`Layer`] produces [`BoxCloneService`] instances erasing the type of theÁü´2؈çúüëSP This is similar to [`BoxLayer`](super::BoxLayer) except the layer and resultingÁü¿! service implements [`Clone`].Ááú‘©óúü÷pm `BoxCloneServiceLayer` can, for example, be useful to create layers dynamically that otherwise wouldn't haveÁüèhe the same types, when the underlying service must be clone (for example, when building a MakeService)ÁüÑfc In this example, we include a [`Timeout`] layer only if an environment variable is set. We can useÁü¸VS `BoxCloneService` to return a consistent type regardless of runtime configuration:Áú<“ÊÑ䛥Œü¸30 use tower::{Service, ServiceBuilder, BoxError};Áüì=: use tower::util::{BoxCloneServiceLayer, BoxCloneService};Áª ú¬´  # struct Request;Á´Ê  # struct Response;Á¬á  # impl Response {Áü÷ # # fn new() -> Self { Self }Á<
ﯣ
úü§
PM fn common_layer<S, T>() -> BoxCloneServiceLayer<S, T, S::Response, BoxError>Á
ñü‚ /, S: Service<T> + Clone + Send + 'static,Áü² "µŽüÕ +áŽ, ü‡ +¤ü³ $ÙØ úüÜ 1üŽ
Îü®
1÷ôà
±‘ÿ
úüƒ,) BoxCloneServiceLayer::new(layer)Á„°Ž’üÁÎüá$¶’ô†±‘¥úü©,’³Š“œ“æúüê@= // We can clone the layer (this is true of BoxLayer as well)Áü«+( let boxed_clone_layer = common_layer();Á×úüÛ1. let cloned_layer = boxed_clone_layer.clone();Áúü‘IF // Using the `BoxCloneServiceLayer` we can create a `BoxCloneService`ÁüÛnk let service: BoxCloneService<Request, Response, BoxError> = ServiceBuilder::new().layer(boxed_clone_layer)ÁüÊ+( .service_fn(|req: Request| async {Áüö.+ Ok::<_, BoxError>(Response::new())Á });Á±úüµ,) # let service = assert_service(service);Áâúüæ)& // And we can still clone the serviceÁü)& let cloned_service = service.clone();Á®¯üÀ*' # fn assert_service<S, R>(svc: S) -> SÁüë! # where S: Service<R> { svc }Áú<‘ÊÑúü!ž÷ü¿'Ò“üç%ƒ”ü²”¤¸Ú"ú¥û¦üýúüýû –Íø ѹ– ÔÊ– ×â²ÿ8
ˆ=Ìeþ68;=@BEGüàUðùù†J†JK‰Jµ 7ŠJà–7‹J¤7·0ØQd諲«²µµ£0ºˆ© «¢OôV䪵²»² Ìì˜Þüº3Ú"¥¦ƒƒ –¿ø ù– ÆÊ– Éâ²#%(*-/24ü£ëüô*' Create a new [`BoxCloneServiceLayer`].Áªàšâ²ÿÿ
‰› ®š›®›¿›Ï›Ú›ü•#ù›œ¥œØà›¶œÁœ$ÿÜœ<†
«²äªµ²»²àšœ„²½œÖœôœ«²äªµ²»²àš²ž‚¿¾žüîAÚ"ˆ¥¦ŠˆŠ –óø ÷¹– úÊ– ýⲌ2479<>AC‚¿üä+½ ½â²«²â²«² í
«²äªµ²»²Ù*,ôü»=Ú"¥¦ –Àø Ĺ– ÇÊ– Êâ²Ù+-0257:<¼ÿ,¾ ¾â²â²Ž ˆŽ
«²äªµ²»²$‰üçBÚ"¥¦˜˜ –ìø ð¹– óÊ– öâ²Àc+-0257:<ü°6³¿ÀÁ ¿â² À c cˆ¢cµ
 `£cðÇ `àB¤GS
Á—É ·
«²äªµ²»²×¾¤Å£×
¤,šœK†JšÌ\D- .šŸªœ,7š Ä<R&š¡É3œmꚢÛz|Ln\_aOQ´CBü` 5ü­0üƒ63 A [`Clone`] + [`Send`] + [`Sync`] boxed [`Layer`].Áºúü¾fc [`BoxCloneSyncServiceLayer`] turns a layer into a trait object, allowing both the [`Layer`] itselfÁü¥L ‡òúüöUR This [`Layer`] produces [`BoxCloneSyncService`] instances erasing the type of theÁüÌ2؈ÿúüƒkh This is similar to [`BoxCloneServiceLayer`](super::BoxCloneServiceLayer) except the layer and resultingÁüï  service implements [`Sync`].Áúl”‘©¢úü¦tq `BoxCloneSyncServiceLayer` can, for example, be useful to create layers dynamically that otherwise wouldn't haveÁü›vs the same types, when the underlying service must be clone and sync (for example, when building a Hyper connector).Áü’f©¬üù_\ `BoxCloneSyncServiceLayer` to return a consistent type regardless of runtime configuration:ÁÙúÊÑä奌ü‚ 3Ÿ®ü¶ EB use tower::util::{BoxCloneSyncServiceLayer, BoxCloneSyncService};Áü ú,€
®¯¬†
¼¯´œ
Ú¯¬³
ù¯üÉ
#˜°
ï¯õ
úüù
TQ fn common_layer<S, T>() -> BoxCloneSyncServiceLayer<S, T, S::Response, BoxError>Á ñüØ 63 S: Service<T> + Clone + Send + Sync + 'static,Áü "µŽü² +Ꭰüä +¤ü
$Ùµ
úü¹
1üë
Îü‹1÷ô½±‘Üúüà0- BoxCloneSyncServiceLayer::new(layer)Á„‘Ž’ü¢ÎüÂ$¶’ô籑úüŠ0Ò׊“œ“ËúüÏ@¾´ü0- let boxed_clone_sync_layer = common_layer();ÁÁúüÅ;8 let cloned_sync_layer = boxed_clone_sync_layer.clone();Áúü…QN // Using the `BoxCloneSyncServiceLayer` we can create a `BoxCloneSyncService`Áü×ro let service: BoxCloneSyncService<Request, Response, BoxError> = ServiceBuilder::new().layer(cloned_sync_layer)ÁüÊ+Û·üö.¸Ǹ±úüµ,è¸âúüæ)ª¹ü)ݹ®¯üÀ*ºüë!Ѻú<‘ÊÑúü!ž÷ü¿'Ò“üç%ƒ”ü²”ĸÚ"¤¥¥¦¦§¥¦¤§ –Ñø Õ¹– ØÊ– ÛÁ³µ¦Y£yÈÔ¨68;=@BEGüäY𣣆J†JK‰Jµ 7ŠJà–7‹J¤7·0ØQd諲«²êêëÉ3ïˆÞ æR‚ºµ­‹äªµ²»² Ìì˜ÞüÂ7Ú"ª¥«¦¬­¬ª­« –Çø ˹– ÎÊ– ÑÁ³®#%(*-/24ü³òü€.+ Create a new [`BoxCloneSyncServiceLayer`].ÁºàšÁ³©¯¯©‰› ¾š›®›¿›$ϛڛü¥#ù›œ¥œ à›¾Â¶œÁœ$Üœ<
®«²äªµ²»²àšœ„É®½œ°Öœ°ôœ°°®°«²äªµ²»²àš²ž˜á¾žü‰EÚ"²¥³¦´µµ³´² –Žø ¹– Ê– ˜Á³··2479<>AC±±˜áü‡+ ÂÁ³«²Á³«²± ±
·«²äªµ²»²$‘Ù*,—üÞAÚ"¹¥º¦»¼»¹º¼ –ãø ç¹– êÊ– íÁ³½Ù½+-0257:<¼¦Ã ÃÁ³Á³¸ ¯¸
½«²äªµ²»²üŽ FÚ"¿¥À¦ÁÂÀÂÁ¿ –ø ¹– š Ê– Á³ÃÀcÃ+-0257:<üÛ 6Þ ÄÅÆ ÄÁ³ Å c cˆ¢cµ
 `£cðÇ `àB¤GS
Ɨɾ ⠾
ë²äªµ²»²×é D2$6ÅÒ×øXT ÄÅü Ì\D) .ÄÇLayerFnÁ<3ÄÈÄ<P&ÄÉ SyncWrapperÁ\l/
ÄÊ׃¤,ÄË‚ØÄÍÙ’°„¾ÄÎk<ÀÌÄзœØÄÑŒä\ÑÓ»½´A®Ì^•D~Œt—|D«küŒ1]_KMôá
üÔ*' A boxed `Service + Send` trait object.ÁÿúüƒMJ [`BoxService`] turns a service into a trait object, allowing the responseÁüÑJG future type to be dynamic. This type requires both the service and theÁüœ# response future to be [`Send`].ÁÀúüÄLI If you need a boxed [`Service`] that implements [`Clone`] consider usingÁü‘63 [`BoxCloneService`](crate::util::BoxCloneService).ÁÈúüÌOL Dynamically dispatched [`Service`] objects allow for erasing the underlyingÁüœRO [`Service`] type and using the `Service` instances as opaque handles. This canÁüïOL be useful when the service instance cannot be explicitly named for whateverÁ\¿ reason.ÁËú # ExamplesÁÞúÊÑÜê use std::future::ready;Áü†! # use tower_service::Service;Áü¨0- # use tower::util::{BoxService, service_fn};ÁüÙKH // Respond to requests using a closure, but closures cannot be named...Á¬¥ # pub fn main() {Áü»0- let svc = service_fn(|mut request: String| {Áüì&# request.push_str(" response");ÁÔ“  ready(Ok(request))Áò¬úüº GD let service: BoxService<String, String, ()> = BoxService::new(svc);Á¤‚
 # drop(service);Á,—
œ“<
ÊÑ¥
úü©
¸×¼É
 [`Rc`]: std::rc::RcÁ
¥Ó¦ÔÕÓÔÕÍ쬫 ÷
ÍìÑ´ ú
Íì×´ ý
Ÿ´?K®,… ÉÖ@B<>8:ü† i,† ÄÒÒ/
/
/óí/ˆ/ k(æmŒ“¬"žáÜ¡ˆˆ¢ˆl }.xÏ&¬«& ¬«„¾„¾Ù’†¾ ˜X$]È=„kt•žáÜ¡ˆˆ¢ˆl }.xς؃ØÑ”Ìì˜Þ&
¬«×´& ¬«Ñ´Ìì˜Þ¤†
L
Ä¥ØÙØÙ…ü
Íì ˜
„¾„¾Ù’†¾ ˜X$]È=„kt•žáÜ¡ˆˆ¢ˆl }.xς؃ØÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
¬«‹€Ìì˜ÞùûóõüÒ
!¥Û¦ÜÝÛÜÝ…ü ×
–ü Ú
§ü Ý
Ÿ´Þá #%(*ü•œ¤Ÿ´Ú¤ßßÚÍ캃  &ºƒ¬«üÊ#ºƒ¬«& Ñ´ºƒ¬«&
×´Ì캃ºƒÌ캃¬«& $“Ø„
Þ¬«Ñ´×´ºƒÙ*,££¥Þ½œàÖœàôœààÞଫѴ״ºƒØ„Í“üÖüÏFC Returns a [`Layer`] for wrapping a [`Service`] in a [`BoxService`]Á middleware.Á®úܶà×Åí±.äƒ5ظ³ºƒŸ´Ú¤ââÚムãôƒü—#ˆ„ž„´„Å„Єë„
ᬫѴ״ºƒRTü›0¥ä¦åææäå…ü  –ü £§ü ¦Ÿ´çèéêë& &
& & &
êë>@CEHJããÑ´ãã×´4‚ãã”þü¡EÇÈÉ ÇŸ´ ÈÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åɜ؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
×´ã ¯ã
ꬫѴ״àðºü 1Ê ÊŸ´¬«”þã ¨ã
묫Ѵ״üˆ0¥í¦îïîïí…ü –ü §ü Ÿ´ðÀcð#%(*-/ü¿6ÂËÌÍ ËŸ´ Ì c cˆ¢cµ
 `£cðÇ `àB¤GS
Í—Éì Æì
ð¬«Ñ´×´×ÍT<4@Åýþ
Ì\D .ñóÅí<ñôÄ<9&ñõ×L¤,ñö4h‚ØñøÙ’y„¾ñùk<‰Ìñû·$’œØñü\¥§—´*ˆDGzUt`nDt]üU1OQ=?üÃ$ü%" A boxed [`Service`] trait object.Á„Î¥þ¦ÿþÿ…ü ß–ü â§ü 嫵"Ý›Ž«.0358:üîSñýýžáÜ¡ˆˆ¢ˆl }.xÏ&¬«& ¬«„¾„¾Ù’†¾ ˜X$]È=„kt•žáÜ¡ˆˆ¢ˆl }.xς؃ØÑ”˜Þ&
¬«×´& ¬«Ñ´˜ÞÔßñ¥ƒƒ…ü ôƒ€ ÷„¾„¾Ù’†¾ ˜X$]È=„kt•žáÜ¡ˆˆ¢ˆl }.xς؃ؘޘüä'¥¦ˆˆ…ü é–ü ì§ü 﫵 #%(*ü­´ºƒ«µ¤ŠŠãƒ ¸ôƒüâ#ˆ„ž„Å„<ˆë„
¬«Ñ´×´ºƒÙ*,»JLüœü–YV Returns a [`Layer`] for wrapping a [`Service`] in an [`UnsyncBoxService`] middleware.ÁôúÜüà×Åí±.äƒ5ظ³ºƒ«µ¤ŒŒãƒ ©ôƒüÝ#ˆ„ž„Å„ë„
¬«Ñ´×´ºƒBDüÓ 6¥Ž¦Ž…ü Ø –ü Û §ü Þ «µ& &
& & &
>@CEHJl
D•
Ñ´

×´

Ò•üå
E
ÎÏРΫµ ÏÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åШŒ ó

¬«Ñ´×´
àðþ
üÚ 7 Ñ Ñ«µ¬«Ò• â 
¬«Ñ´×´  ü¾ 6¥¦˜˜…ü à –ü Æ §ü É «µšÀcš#%(*-/üû 6þ ÒÓÔ Ò«µ Ó c cˆ¢cµ
 `£cðÇ `àB¤GS
Ô—É

š¬«Ñ´×´
×
üó
u¤œ¨œì„ ø
³Ä
&î©ì¬„µî©î©ì¬& 󴞟 ¡¢& &
& & &
¡¢iknpî©ì¬& T,•î©ì¬&
„¾„¾Ù’†¾ ˜X$]È=„kt•žáÜ¡ˆˆ¢ˆl }.xς؃ØÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Ǧ릘ÞüüOTÿÕÖ× Õó´ ÖÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åל؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ó´ì¬&
 Š
¡î©ì¬$àðüû4Ø Øó´ì¬ó´ì¬&  ƒ
¢î©ì¬$Tüº!úSüÝ*ðS„åSÄŸÚS|f\jŒµÒøXT ©ªæ*L1' ©«×K¤,©­k<[Ì©¯·$dœØ©°Ì\D€ .©²Åí©³Ä&©´Œ¢ü@ˆÄ@z|ik\r[]JL´˜=¶ˆü±-* A [`Clone`] + [`Send`] boxed [`Service`].ÁßúüãIF [`BoxCloneService`] turns a service into a trait object, allowing theÁü­NK response future type to be dynamic, and allowing the service to be cloned.Áüúü€MJ This is similar to [`BoxService`](super::BoxService) except the resultingÁüÎ!í©ðú‘©ú<†ÊÑüŽJG use tower::{Service, ServiceBuilder, BoxError, util::BoxCloneService};ÁäÙ¥Œ®¯¬ü¼¯´’Ú¯¬©ù¯ü¿#˜°ï¯ëúüï;8 // This service has a complex type that is hard to nameÁü«'$ let service = ServiceBuilder::new()ÁäÓ .map_request(|req| {Áüð)& println!("received request");Á reqÁ })Áìµ .map_response(|res| {ÁüÓ*' println!("response produced");Á resÁ»´¤™ .load_shed()Áô® .concurrency_limit(64)ÁüÍ)& .timeout(Duration::from_secs(10))Áü÷*' .service_fn(|req: Request| async {Áü¢ .¸ǸüÝ ,踊
úüŽ
=: // `BoxCloneService` will erase the type so it's nameableÁüÌ
^[ let service: BoxCloneService<Request, Response, BoxError> = BoxCloneService::new(service);Áü« ,è¸Ø úüÜ )ª¹ü† )ݹ ®¯ü¶ *ºüá !Ѻ
ÊÑ|
¥·¦¸¹¸·¹…ü ¦
–ü ©
§ü ¬
ˆ¶ «¢OôVºžáÜ¡ˆˆ¢ˆl }.xÏÒ¬«& ¬«”þ&
¬«×´& ¬«Ñ´Ìì˜Þˆ¶¶ˆú©´»ˆ¶µµ
¬«Ñ´×´
ü´
~©µµ´»ü¸&¥¼¦½¾¼½¾…ü ½–ü À§ü ȶ¿Â #%(*üüå# Create a new `BoxCloneService`.Áºƒˆ¶»¤ÀÀ» ム˜ôƒüÂ#ˆ„ž„غƒ´„Å„Є$“ë„
¿¬«Ñ´×´ºƒÙ*,›jlο½œÁÖœÁôœÁÁ¿Á¬«Ñ´×´ºƒ…†ü¥¡ü™KH Returns a [`Layer`] for wrapping a [`Service`] in a [`BoxCloneService`]Áö…ýúÜ…à×Åí±.äƒ5ظ³ºƒˆ¶»¤Ãû ム²ôƒüæ#ˆ„ž„Lÿç¿´„$”Å„<›Єë„
¬«Ñ´×´ºƒZ\üò5¥Å¦ÆÇÇÅÆ…ü ÷–ü ú§ü ýˆ¶ÈÉÊËÌ& &
& & &
ÌË>@CEHJÄÄÑ´ÄÄ×´ÄÄ”þüœEÙÚÛ Ùˆ¶ ÚÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åÛ¨ŒÄ ªÄ
ˬ«Ñ´×´àðµü›.Ü Üˆ¶¬«ˆ¶¬«& Ä £Ä
̬«Ñ´×´üò0¥Î¦ÏÐÐÎÏ…ü ÷–ü ú§ü ýˆ¶ÑÙÑ#%(*-/¼©Ý ݈¶ˆ¶Í ²Í
Ѭ«Ñ´×´üí!©Ò£ÓÓÒ«úüíÒ&³ú£T„Íì¨Ë Ò«ú@žË/«úLžËÔÔ68ü•¨©Þ Þ³úžáÜ¡ˆˆ¢ˆl }.xÏÒ¨Ë& ¨Ë³ú¨Ë& &
¨Ë³ú¨Ë&
& ¨Ë³ú¨Ë& Ìì˜ÞÒ «Ò
Ô³ú¨ËüÁR£Ö¥××ÖÍìà¶ Æø É&äªà¶ÌìäªØäªäª<‹äªØÔØZ\_aüšƒL©ß ß䪞áÜ¡ˆˆ¢ˆl }.xÏÒà¶& à¶äªà¶& &
à¶äªà¶&
& à¶äªà¶& Ìì˜ÞÕ °Õ
Øà¶äªüÌ5¥Ú¦ÛÜÜÚÛ…ü Ñ–ü Ô§ü ׈¶ÝÀcÝ#%(*-/üˆ6àáâ àˆ¶ á c cˆ¢cµ
 `£cðÇ `àB¤GS
â—ÉÙ Ù
ݬ«Ñ´×´$פw„{ŒêëøXT Þßæ*L1' Þà×K¤,Þâk<[ÌÞä·$dœØÞåÌ\D€ .ÞçÅíÞèÄ&Þ錢ü@ˆÄ@z|ik\r[]JL´˜=ü±85 A [`Clone`] + [`Send`] + [`Sync`] boxed [`Service`].ÁêúüîMJ [`BoxCloneSyncService`] turns a service into a trait object, allowing theÁü¼YV response future type to be dynamic, and allowing the service to be cloned and shared.ÁúüšWT This is similar to [`BoxCloneService`](super::BoxCloneService) except the resultingÁüò åÏœž¥ì¦íîìîí…ü ²–ü µ§ü ¸÷¶æR‚ºµ­‹ëïžáÜ¡ˆˆ¢ˆl }.xϬ«& ¬«”þ&
¬«×´& ¬«Ñ´ Ìì˜Þ÷¶ÿÞÎÙ÷¶êê
묫Ѵ״ üÀÞêêÎÙü×*¥ñ¦òóóñò…ü Ü–ü ß§ü â÷¶ô÷ #%(*ü´œüˆ'$ Create a new `BoxCloneSyncService`.Á»ºƒ÷¶ð¤õõð
ム¿ôƒüé#ˆ„ž„L‚ç¿,´„$— ºƒÅ„Єë„
ô¬«Ñ´×´ºƒÙ*,Ârtüô½œöÖœöôœööôö¬«Ñ´×´ºƒ…†üÛ ¨üËOL Returns a [`Layer`] for wrapping a [`Service`] in a [`BoxCloneSyncService`]Áö…³ úÜ» à×Åí±.äƒ5ظ³ºƒ÷¶ð¤øøð
ムè ôƒüœ
#ˆ„
ž„
ç¿
´„
›Þ
Å„
Є
ë„

÷¬«Ñ´×´ºƒbdü¯ 9¥ú¦ûüûüú…ü ´ –ü · §ü º ÷¶ýþÿ& &
& & &
>@CEHJ  ùùÑ´T† ,‹ ùù×´  ùù”þüÝ E ãäå ã÷¶ äÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾å娌ù ë ù
¬«Ñ´×´ àðö üÜ
.
æ æ÷¶¬«÷¶¬«& ù ä
ù
¬«Ñ´×´

ü³4¥ƒ¦ƒ…ü ¸–ü »§ü ¾÷¶Ù#%(*-/¼îç ç÷¶÷¶ ÷
¬«Ñ´×´ü²!Þ£ˆˆ«úü²åžË³Ë Å«ú*žË&«ú6žË2‰68üÚ»Þè è³úžáÜ¡ˆˆ¢ˆl }.xϨË& ¨ËÍ&
¨Ë¤Í& ¨Ë»Í Ìì˜Þ ð
³ú¨Ëü™Y£¥ŒŒªÎ žø ¡ÃÎÖÎ äªçÎ÷ÎäªKMPRüù±Þé é䪞áÜ¡ˆˆ¢ˆl }.xÏà¶& à¶µÐ&
à¶ÌÐ& à¶ãÐ Ìì˜ÞŠ Š
à¶äª$üÕ9¥¦…ü Ú–ü ݧü à÷¶Àc#%(*-/ü•6˜êëì ê÷¶ ë c cˆ¢cµ
 `£cðÇ `àB¤GS
ì—ÉŽ œŽ
¬«Ñ´×´$×£dD‘Œ¸Õâi<ïÅ òÒp„ƒò ó¥ StreamÁ4'E´á\0×L¤,˜4]‚ØÙ’n„¾š§N,~¥‚œk<…Ì·œØžÄ&Ÿ¤¼ì­Až tUDi€üA:qs`bNP´œ@üìhã6¡¤¢¢£¢¡£Íìƹñê¹ öÍìй ù¿cƹT­'EŸ«¿cŸ«è¸¤Àc¤[]`b\^üÛ8Þíîï íè¸ î c cˆ¢cµ
 `£cðÇ `àB¤GS
ï—É  â 
¤ƹŸ«й± éüÔ!¥¦¥¦«úüÔ³Þè ë‚Ø£¯¥«ú3«ú¨©§¨©§©¨MOÜüDÿð ð³ú¥ ˆ¥
§³ú£¯$‰ôñ ñ³ú£¯¥ ¥¥
¨³ú£¯ßüÁDòóô ò³ú óÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åôœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ£¯ƒØ¥ É¥
©³ú£¯àðÔü‰mã6«¤¬¢­­«¬ÃôŽê¹ Üô &ƹäñ„»ýô¥йƹäñ& ”ã踮¯°±]_bdgiüýP ƹŸ«й踪ª
®ƹŸ«йì]ðx‘júxŸjyüŸ )T­ è¸ƹªª
¯ƹŸ«й ü» 7 õ„¾„¾Ù’†¾ ˜X$]È=„kt• õè¸ƹª à ª
°ƹŸ«й üí
D
è¸Á¼ªª
±ƹŸ«й$‰üÃxã6³¤´¢µ³µ´ÃôÈê¹ ÍÜô ÐÍý„€ýô4™èý”¨è¸·'F'G·@BEGJL²²Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ƹäñ& ƹäñ&
üöTö÷ø„¾„¾Ù’†¾ ˜X$]È=„kt• öè¸ ÷ÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åøœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙè¸'F² ²
·ƹŸ«йàðÅ Í ž ¸¹”ñ4‡ 'E¸º—º ¸»´á ¸¼ ‚ظ¾Ù’ „¾¸¿k<” ̸Á·$ œØ¸ÂÄ &¸Ã äù ³ü“$ ¥ì½ à ŠDÿ yüà1 kmY[´« Kü²L ã6ŤÆÅÆÃô· ê¹ ¼ Íý„Þ ýô ò¹ÇÈÉÊ,.13üÈ6 ü…& # Create new [`CallAll`] combinator.Á° úü¸X U Each request yielded by `stream` is passed to `svc`, and the resulting responses areÁü•R O yielded in the same order by the implementation of [`Stream`] for [`CallAll`].Áì úüôO L [`Stream`]: https://docs.rs/futures/latest/futures/stream/trait.Stream.htmlÁÏ ƹŸ«ò¹ÄÄ
ÇƹŸ«ì]<Ó ‘j4á ô¿! üù$ ! Extract the wrapped [`Service`].Á¢ ú # PanicsÁ» úüà 2 / Panics if [`take_service`] was already called.Áú úü‚!8 5 [`take_service`]: crate::util::CallAll::take_serviceÁTÆ! ò¹ƹÄÄ
ÈƹŸ«$Ñ! ü­$0 ü‹"$ Š´" úü¼"O L This [`CallAll`] can no longer be used after this function has been called.Á# úd˜# é# úü±#2 åè# úüð#8 ­Žd´$ ù„¾„¾Ù’†¾ ˜X$]È=„kt• ùò¹ƹÄ Ë$ Ä
ÉƹŸ«$Á$ üª'9 ü—%H E Return responses as they are ready, regardless of the initial order.Áä% úüì%= : This function must be called before the stream is polled.Á®& úd¶& ÃÇ& úüÏ&"  Panics if [`poll`] was called.Áö& úüþ&' $ [`poll`]: std::future::Future::pollÁL±' ò¹Á¼ÄÄ
ÊƹŸ«$»' üŽ(W ã6̤ÍÍÌÃô“( ê¹ ˜( Íý„Å( ýô4Þ( ò¹ÎÏ'F'GÏ0257Lì( $ñ( Ë˃ü )T L£) úûü„¾„¾Ù’†¾ ˜X$]È=„kt• úò¹ ûÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åüœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙò¹'FË ·) Ë
ÏƹŸ«$­) àðÃ) ü«*6 ÑѺ °* ‚Øš±4³* »ÒÓÔ§¨©ÔÒÓ:<Ôè* Dë* ý ý»Ð ô* Ð
Òš±$õ* ì·+ $º+ þ þ»š±Ð ¿+ Ð
Óš±$Ä+ ß4Ê+ ü’,C $•, ÿ ÿ» ÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙš±ƒØÐ š, Ð
Ôš±$Ÿ, àð¥, lûLÿò ú ž!ÕÖ”ñ4‡!'EÕ׿¼„©!(é"ÕØ´á!ÕÙ!‚ØÕÛÙ’!„¾ÕÜk<–!ÌÕÞ·!œØÕßÄ!&Õà!äù!³ü“&!¥ì¿!â!tí!ŠD!yüâ1!kmY[´­!KüËU!ã6â¤ãâãÃôÐ!ê¹ Õ!Íý„€!ýô4™!Á¼äåæ)+.0ü· ?!ü§/!, Create new [`CallAllUnordered`] combinator.ÁÛ!úüãO!Ú‹¾ !ƹŸ«Á¼áá
äƹŸ«
$!Š¥ !ú !þ !úüÆ 2!åý !úü… A!> [`take_service`]: crate::util::CallAllUnordered::take_serviceÁTÒ !Á¼ƹáá
åƹŸ« !üÉ0!ü—
"! Extract the wrapped `Service`.Á¾
!úüÆ
X!U This [`CallAllUnordered`] can no longer be used after this function has been called.Á£!ú!ü!úüÄ2!åû!úüƒA!ñ£!„¾„¾Ù’†¾ ˜X$]È=„kt• Á¼ƹá ç!á
æƹŸ«!ü±`!ã6è¤éèéÃô!ê¹ »!Íý„ñ!ýô!Á¼êë'F'Gë0257L˜!$!ççƒüÌT!LÏ!ƒ„¾„¾Ù’†¾ ˜X$]È=„kt• ƒÁ¼ ÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙÁ¼'Fç ã!ç
ëƹŸ«!àðï!ü×8!ííº Ü!êš!ܽîï𧨩ïðî13Ô–!D™! ܽì ¢!ì
îš±!ìç!$ê! ܽš±ì ï!ì
ïš±!ß!ü¿C!$Â!ˆŠ ˆܽ ÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åФžì Ç!ì
ðš±!àðÒ!$ß„æêÜøßT›ŒŸ ³ · Ü ã ë ´á\‡ôõ‚Øô÷Ù’¼„¾ôøk<ÌÌôú·œØôûªœôüÄ&ôýìu˜ŒD·{ü˜1mo[]”ãL´û=ü ÿ¨ÿ¶¿‰®& °¿‰®& ´¶¿‰®&
°¿‰®&
„¥»š&°¿‰®„ã&¶¿‰®üü:Íì°¿ ¥Íì¶¿ ¨è¾ƒ& &
& & &
?A;=þþþ³þþž´4ÿþþ³ ³ Út ô6ÇmV2E°¿‰®& ¶¿‰®& ü¹OŒ è¾ ŒÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
辉®&
þ Çþ
°¿¶¿‰®àðÒü° 4Ž Žè¾‰®è¾‰®& þ ¸ þ
°¿¶¿‰®ü˜hˆˆ¶¿ƒØ°¿ƒØ”ìð´  ‚ذ¿‚ض¿Ôåß´ ´ÀŠƒØ„ØSU\‡¯»ü¥I„¾„¾Ù’†¾ ˜X$]È=„kt• ´À ÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤Ã´ÀƒØ ·
°¿¶¿àðÃü£O¤ŽŽì„ ¨Íì–À «ÍìœÀ ®–ÀÀÂdf`b\^ŒŒŸ ¢ £ Øs¤ ˆ¥ ¦ ñs§ ˆenêÊ`
–ÀÀî©ü­* ³ÂÂ Œ
î©–ÀœÀÙ*,½”¨Œ
Š
× ¤,4%‚ØÙ’6„¾k<F̘·$OœØÄ<l&šD{toD11PR?A´]
üv96 Returns a new [`FutureService`] for the given future.Á°úü´b_ A [`FutureService`] allows you to treat a future that resolves to a service as a service. ThisÁü—?< can be useful for services that are created asynchronously.Á×ú‘©ÊÑüñ1. use tower::{service_fn, Service, ServiceExt};Áü£$! use tower::util::future_service;ÁüÈ!µ©êúŒîÙªl€óªüŽ<9 // A future which outputs a type implementing `Service`.ÁüË%" let future_of_a_service = async {ÁüñMJ let svc = service_fn(|_req: ()| async { Ok::<_, Infallible>("ok") });Áü¿  Ok::<_, Infallible>(svc)Á };ÁçúüëEB // Wrap the future with a `FutureService`, allowing it to be usedÁü±=: // as a service without awaiting the future's completion:Áüï@= let mut svc = future_service(Box::pin(future_of_a_service));Á°úü´A> // Now, when we wait for the service to become ready, it willÁüö1. // drive the future to completion internally.Áü¨)& let svc = svc.ready().await.unwrap();ÁüÒ*' let res = svc.call(()).await.unwrap();ÁÞ¯<† ï¯ÊÑ úüš # # Regarding the [`Unpin`] boundÁ¾ úü PM The [`Unpin`] bound on `F` is necessary because the future will be polled inÁü“
eb [`Service::poll_ready`] which doesn't have a pinned receiver (it takes `&mut self` and not `self:Áüù
YV Pin<&mut Self>`). So we cannot put the future into a `Pin` without requiring `Unpin`.ÁÓ úü× a^ This will most likely come up if you're calling `future_service` with an async block. In thatÁü¹ GD case you can use `Box::pin(async { ... })` as shown in the example.Átˆ
š±ŽÃœ¤£žŸŸžœ º
ê¹ š
ÍìÁÄ
Ê–  
êšìÒ
š±ƒØÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Ÿ«»²¬Ù
“íš±
&Ÿ«ÁĬ€Ÿ«ÁÄ&
»²L
š±Ÿ«ÁÄ»²ß
êìïñëíðòôŽ¡¤¢¡¢º ê¹ ŽÃ£üÝ#ü³9®ÃñúüùbýÃüà?éĤú‘©ÊÑüÊ1ØÅü€# use tower::util::FutureService;Áü¨!µ©ÎúŒÖÙªóªüþ<õÆü¿%»ÇüéMêÇü» ÁÈêÈëúüóE†Éü½=ÕÉüÿDA let mut svc = FutureService::new(Box::pin(future_of_a_service));ÁÈúüÐAòÊü–1½ËüÌ)øËüú*«ÌÞ¯ï¯ÊÑÎúüÖ#’Íþúü†PËÍüÛe¥ÎüÅY”Ï£úü«aƒÐü‘GîÐêš±ŽÃ  
£š±Ÿ«ß³züÏF¥¤¦¦¥º Ôê¹ ×ŒõŽÃ§Àc§#%(*üœ8Ÿ ŽÃ  c cˆ¢cµ
 `£cðÇ `àB¤GS
—ɤ £¤
§š±Ÿ«± ªü£!>©¤ªª©º ¨!ê¹ «!ŒõTÖ!ÖëÀc«#%(*üè!8ë!˜ Öà  c cˆ¢cµ
 `£cðÇ `àB¤GS
˜—ɨ ï!¨
«š±Ÿ«$ð!± ö!üØ$…­¤®£¯°¯­°® ÑÓ¬ %ÛÔLÒ%°Ó ã$Ê– æ$êšì™%º Ý$·Ô,¹%ÈÔ¬Ç%ê¹ à$ŽÃ±²³´µ& &
& & &
´µFH;=xz}lä%Dé%¬¬Ÿ«ÁÄ& T…&,Š&¬¬»²\™&4ž&¬¬Ÿ«ÁÄ& ü·&OTº&š ŽÃ šÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ŽÃÁÄ&
¬ Å&¬
´š±Ÿ«ÁÄ»²$Ê&àðÐ&üþ)*$*œ œŽÃÁÄŽÃÁÄ& ¬ †*¬
µš±Ÿ«ÁÄ»²$‹*“Ž‘*Œ
 
º
ß4(¸¾åd¹×3¤,ºk<H̼·$QœØ½ªœ,i¾Ä&¿dŽ~€D.qL<ceRT”\C´t4ü½?¤ÁÂÂÁì„ ÂÞè ÅïèÎÄÃÀcÃ#%(*üƒ8žŸ ÎÄ ž c cˆ¢cµ
 `£cðÇ `àB¤GS
Ÿ—ÉÀ ŠÀ
Ãî©£¯$‹± ¼¸¤ÅÆÆÅì„ ½Þè ÀÎÄÇÈü€(üÖ%" Creates a new [`MapErr`] service.Áî©£¯ÎÄÄÄ
Çî©£¯Ù*p{±z{üš
$üÒ>; Returns a new [`Layer`] that produces [`MapErr`] services.Áúü JG This is a convenience function that simply calls [`MapErrLayer::new`].Áì úüô !ž÷
£¯“ÇÄÄ
Èî©£¯± §
üä
¤Ê˨ÌôÍËÌÊÍ£¯³ú˜"ô Þè ì
»š
Íìãï
™ú„® –"£¯ÚïÌÇ ì„ é
ìú ÎÄÎÏÐÑÒ& &
& & &
ÒÑ68ƒ  ÉÉÝùT‘ ,– ÉÉãï  ÉÉ

ý|¹
Ù*–P çü£¯üæ O  ¡¢  ÎÄ ¡ÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾å¢œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Îĉ®&
É ô É
Ñî©£¯‰®ãï àðÿ ü‹4£ £Îĉ®Îĉ®& É É
Òî©£¯‰®ãï´—ÔÔº œ¢ÅÕ 
ôÛü´" Creates a new [`MapErrLayer`].Áèš±¢ÅÓÓ
Õš±±|üŸ:¤×Ø×Øì„ ¤Þè §ìú“ÇÙÚÚ*,/1ÖÖÎÄü‚*,…¤ ¤“Çî©“Çî©Ö Ö
Úî©£¯Ù*,’Œß
è
× ¤,ÛÜk<ÌÛÞ·$'œØÛߪœ,?ÛàÄ<Y&ÛáDeLWYFH”27´J(ü¡C¤ãäãäì„ ¦Þè ©ïèÐÇåÀcå#%(*üë8§ ¥ÐÇ ¦ c cˆ¢cµ
 `£cðÇ `àB¤GS
§—Éâ òâ
åî©£¯± ùÜܤçèçèì„ áÞè äÐÇéêü¬(üþ)& Creates a new [`MapRequest`] service.Á¹î©£¯ÐÇææ
éî©£¯Ù*Å|±Ï|üÒ(ü‚B? Returns a new [`Layer`] that produces [`MapRequest`] services.ÁÉúüÑNK This is a convenience function that simply calls [`MapRequestLayer::new`].Á¤úü¬!ž÷£¯ùÈææ
êî©£¯± ßü¤e¤ìí½BîÇBïìîïí£¯§È˜"ÇBÞè ¬Íì§È¯Íìý³&î©ý“"£¯ôì„ ©ÐÇðñòóô& &
& & &
óô.0ŒŽˆŠl D• ëëî©ý& T± ëëî©ý&
ëëî©ý& üø L¨©ª ¨ÐÇ ©ÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åªœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
øƒë
ë
óî©£¯§Èý$‹
àð
ü‚ ,$… « «ÐǧȜ„ë Š ë
ôî©£¯§Èý$ <• Ô‡
ööº Œ
´È÷ 
ôÓ
ü¨
&# Creates a new [`MapRequestLayer`].Áà
š±´Èõõ
÷š±±o}ü›>¤ùúùúì„  Þè £ìúùÈûüü*,/1øøÐÇü†*,‰¬ ¬ùÈî©ùÈî©ø ø
üî©£¯$Ù*,–„ÚŒñ
ú
MapOkÁ,(€@ýÿ¾åd"ý×:¤,ýk<OÌýƒ·$XœØýªœ,pýÄ&ýdlD5rLCdfSU”cD´{5üØD¤ˆˆì„ ÝÞè àïèT‘·ÉŠÀcŠ#%(*ü£8¦­®¯ ­·É ® c cˆ¢cµ
 `£cðÇ `àB¤GS
¯—É ª
Šî©£¯± ±äó¤ŒŒì„ øÞè û·ÉŽüÃ(ü–(% Creates a new `MapResponse` service.ÁÐî©£¯·É
Žî©£¯Ù*$~±.~üì
)üš C@ Returns a new [`Layer`] that produces [`MapResponse`] services.Áâ úüê OL This is a convenience function that simply calls [`MapResponseLayer::new`].Á¾
úüÆ
!ž÷
£¯þË
î©£¯± ù
üÀ ¤¨ä£¯Ûù˜"ä Þè È »š Íì¾” ™ú„’ Ðúü« ì„ Å ìú ·É˜& &
& & &
˜68uwz|vx  ¾”  ³ú\“
4˜
å‚Ù*ýÒʼn(UKöŒçü£¯üÕ
O
°±² °·É ±ÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾å²œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
·É‰®&
 ã

˜î©£¯‰®¾”
àðî
üâ4³ ³·É‰®·É‰®&  ê
î©£¯‰®¾”Üòº ÷ŒÊœ 
ôÆü”-* Creates a new [`MapResponseLayer`] layer.ÁÓš±ŒÊšš
œš±±Î~ü?¤žŸŸžì„ Þè ìúþË ¡¡*,/1·Éüü*,ÿ´ ´þËî©þËî© 
¡î©£¯$†Ù*,ŒŒ¹ÂØÜMapÁ (Æ6¢¤ FutureExtÁL ¢¥×5 ¤,¢¦k<J Ì¢¨·$S œØ¢©ªœ,k ¢ªÄ<… &¢«d \ šD0 rL> dfSU”^ D´v 5üËB ¤­®­®ì„ Ð Þè Ó ïèT‚ ¼Ì¯Àc¯#%(*ü”8  µ· µ¼Ì  c cˆ¢cµ
 `£cðÇ `àB¤GS
·—ɬ  ¬
¯î©£¯ ± ¢ ÔÔ ¤±²±²ì„ Ù Þè Ü ¼Ì³´ü¢( üõ( % Creates a new [`MapResult`] service.Á¯ î©£¯¼Ì°°
³î©£¯Ù*ƒ±üÅ
' ü÷A > Returns a new [`Layer`] that produces [`MapResult`] services.Á½ úüÅ M J This is a convenience function that simply calls [`MapResultLayer::new`].Á
úüŸ
! ž÷
£¯ƒÏ°°
´î©£¯± Ò
ü• Ô ¤·¨¸ä¹ôº¸¹·º
£¯Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Ýù³ú˜"Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
¾”ô¼É Þè »š Ø” ÍìϨ ™ú„ì éϨ³út‰ –"£¯¢§ü  @ ì„ š ìú ¼Ì»¼½¾¿& &
& & &
¿¾68Ÿ¢¤§©£¥ µµ¾”
,“
µµϨ
µµØØ®‡ÛÙ*¢
,WS°çü£¯üæ
O Té
¸¹º ¸¼Ì ¹ÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åºœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
¼Ì‰®&
µ ô
µ
¾î©£¯‰®¾”Ϩ
àðÿ
ü‡4 $Š » »¼Ì‰®¼Ì‰®& µ  µ
¿î©£¯‰®¾”Ϩ$”  Ì’ ÁÁº  ‘Í 
ôâ ü²+ ( Creates a new [`MapResultLayer`] layer.Áï š±‘ÍÀÀ
š±±-€ü©= ¤ÄÅÄÅì„ ® Þè ± ìú ƒÏÆÇÇ*,/1 ÃüÌü’* ,• ¼ ¼ƒÏÏî©Ã  Ã
Çî©£¯ Ù*,¢TŒŠ×
¤,ÈÊ4
‚ØÈËk<3
ÌÈÍ·$<
œØÈΪœ,W
ÈÏÄ<q
&ÈÐ
z|t
,
_aNP”J
?´b
0Ô»
¤ÒÓÓÒì„ À
Þè Ã
ÁÏÔÕÖר!$&ü‰(
üÜ(
% Creates a new [`MapFuture`] service.Á
î©£¯ÁÏÑÑ
Ôî©£¯Ù*Ù€±ã€ü§'
üÙA
> Returns a new [`Layer`] that produces [`MapFuture`] services.ÁŸ
úü§M
J This is a convenience function that simply calls [`MapFutureLayer::new`].Áù
úü!
ž÷
£¯ŸÑÑÑ
Õî©£¯± ´
ܨ
üû(
% Get a reference to the inner serviceÁ<¯
½ ½ÁÏ ½î©Ñ ·
Ñ
Öî©£¯$¸
üš#
üå0
- Get a mutable reference to the inner serviceÁ<¡
¾ ¾ÁÏ ¾î©Ñ ©
Ñ
×î©£¯
ä—
üã/
, Consume `self`, returning the inner serviceÁTž
ÁÏî©ÑÑ
Øî©£¯
üÒ¯
£Ú¤ÛÜ¥ÝÞ !ßÜÚÞßÝÛ ÉП«à¶& ˜" !¾
ˆ½ƒØÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
¥¬ê
ÍìÉÐ Ý
Íìì½ à
Íìò½ ã
Í숽æ
&Ÿ«à¶T—
“"ÉÐõ¼¼ª
ªÎ ×
éò½Ÿ«à¶&
‚؈½ìã
ê¹ Ú
ŠÐàáâãä& &
& & &
ãäeg;=áãÝßÙÛÕ×
D
ÙÙì½
ÙÙò½
4¸
ÙÙˆ½üË
O
¿ÀÁ ¿ŠÐ ÀÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åÁœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ŠÐà¶&
Ù Ù
Ù
ãà¶Ÿ«ÉÐì½ò½ˆ½
àðä
üÞ *
 ŠÐà¶ŠÐà¶& Ù æ
Ù
äà¶Ÿ«ÉÐì½ò½ˆ½
“Žñ
ü» B
¤æççæì„ À
Þè Ã
ïè
ÁÏèÀcè#%(*ü„
8

ÃÄÅ ÃÁÏ Ä c cˆ¢cµ
 `£cðÇ `àB¤GS
Å—Éå
å
èî©£¯
±
ÌŽ
êêº 
åÐë 
ôÞ
ü®+
( Creates a new [`MapFutureLayer`] layer.Áë
š±åÐéé
ëš±±ü›=
¤íîîíì„  
Þè £
ìú
ŸÑïðð*,/1

ììÁÏü„*
,‡
Æ ÆŸÑÑî©ì 
ì
ðî©£¯
Ù*,”
üè(
òòº í
åÐóÀcóü—8
š
ÇÈÉ ÇåÐ È c cˆ¢cµ
 `£cðÇ `àB¤GS
É—Éñ ž
ñ
óš±
± ¥
\<‘Œ˜½ÇÒ´á\ ôõ×2 ¤,ô÷4C ‚ØôøÙ’T „¾ôù§N,d ¥‚ôûk<k Ìôü·$t œØôýÄ< &ôþì ¦' ™t; ŠDO yü': jlY[HJ´‚ ;üï( ¤éJì„ ô Íì›Ò &î©›Ò ‚Ôƒ24.0üž4  ôî©Ê…‚Ôÿÿ܈ˆŽD‚“Ž“‚ü„' 4 ô¶‡‚Ôÿÿ
ƒî©›Ò¬ŽDƒüÔf ¤éJì„ Ù šÏÜ «Ïd‹ ïè ¿c›Ò ‚ÔÀc;=@BüÁ8 Ä ÊËÌ Ê‚Ô Ë c cˆ¢cµ
 `£cðÇ `àB¤GS
Ì—É È 
î©›Ò ± Ï üñ 7 ¤éJŠŠì„ ö šÏù «Ïd›
èÑ "üÊ
* ×
î©›Òèшˆ
î©›ÒˆŽh„“Žr„üÑB ¤éJŽŽì„ Ö šÏÙ «Ïd† èу؄Ø,.13  ŒŒÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
î©›Ò& î©›Ò&
üÌI  ÍÎÏ„¾„¾Ù’†¾ ˜X$]È=„kt• ÍèÑ ÎÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åϜ؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤Ãèу، Þ Œ
î©›Ò àðê Œ„‘ ï­k<Œ ̯·$• œØ°Ä &±l— üu!  Error types for [`Optional`].Á êëL,
פ,(*Õܱ¿Õ
ÔéÕÅcüŠ6ÐÑÒ ÐÕ Ñ c cˆ¢cµ
 `£cðÇ `àB¤GS
җɘ ˜
$’טÔèÕ ü¦"  Future types for [`Optional`].Á ïõL, "œ´á\("4L"‚؟ْ]"„¾ k<m"Ì¢·$v"œØ£d""m9"tD"aDX"Pü91"BD13Ìà"¥¥¥…ü å"ßÕ¦ 
ü€8"Ž"¯‹ßÕ¤¤
¦¬«Ù*,"üåt"¨¥©ª¨©ªš±ƒØÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
äª×´¬¤"ø í"§ü ð"êšì"º ê"æ×´žáÜ¡ˆˆ¢ˆl }.xϾ Ìì˜Þ¬Ã"ëÖ«¬ƒØ„ج©«®°"4å"§§Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
䪞âüI"$"ÓÔÕ„¾„¾Ù’†¾ ˜X$]È=„kt• ÓëÖ ÔÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾å՜؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤Ãëփا ¡"§
¬š±äª×´$—"àð­"äÞ ˜L€ Ž{~´  oœË ¥³³…ü Ð ¥×´ 
üˆŠ ôå  Create a new [`Optional`].Á ¯‹¥×²¨µµ²³Ä<™ &¬«ì¬„Ø æ¬«ì¬&
žâ¬ü
´¬«ì¬Ù*x…KMü½u ¥·¨¸¸·…ü  ³Ä éè„ü ü謜 ¥×¹º»¼½& &
& & &
½¼FHKM  ¬«ì¬& TÚ  žâ 4 ïï„‘ñÙ*/ÄÏâdtªM¬«ì¬& üªO T­ Öר Ö¥× ×ÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾å؜؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
¥×ì¬&
 ¸ 
¼¬«ì¬ àðà üÈ 4 Ù Ù¥×쬥×ì¬&  Ð 
½¬«ì¬  « ½½œ¾Öœ¾ôœ¾¾½¾¬«ì¬ ¬«Ñë쬌Ëàá×
¤,¿Áƒ\
¿Âƒ¿Â4=
‚Ø¿ÄÙ’N
„¾¿Å§N,^
¥‚¿Çk<e
̿ȷ$n
œØ¿ÉÄ<‹
&¿Ê
½¿œ
¯*
t5
DI
|ü*1
mo\^KM´|
#
ü•N
K A [`Future`] that yields the service when it is ready to accept a request.Áä
úüèJ
G [`ReadyOneshot`] values are produced by [`ServiceExt::ready_oneshot`].Á³
úü·I
F [`ServiceExt::ready_oneshot`]: crate::util::ServiceExt::ready_oneshotÁ
¥Ì¨ÍÌÍ…ü 
³Ä
î×åØ9³yȦÎÏ(*-/„«

¿Ë˯‹üÁ
Á
¿ËËõü§3
¥Ñ¨ÒÑÒ…ü ¬
³Ä
î×üßH
¥Ô¨ÕÔÕ…ü ä
³Ä
éè„–
î×Ö "üÉ$
Ö
¬«î×ÓÓ
Ö¬«ì¬ì]_†üÑS
¥Ø¨ÙØÙ…ü Ö
³Ä
éè„“
î×Úۃ؄ØÛ,.13

××Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
¬«ƒéüÓM

ÚÛÜ„¾„¾Ù’†¾ ˜X$]È=„kt• Úî× ÛÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åܜ؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤Ãî׃Ø× é
×
Û¬«ì¬
àðõ
üƒ
Q
¥Ý¨ÞÝÞ…ü ˆ
³Ä<
¿c¬«
î×ßÀcß+-02üÛ
4
Þ
ÝÞß Ýî× Þ c cˆ¢cµ
 `£cðÇ `àB¤GS
ß—ÉÜ â
Ü
߬«ì¬
± é
íŒü a
^ A future that yields a mutable reference to the service when it is ready to accept a request.Áã
úüç ;
8 [`Ready`] values are produced by [`ServiceExt::ready`].Á£
úü§
9
6 [`ServiceExt::ready`]: crate::util::ServiceExt::readyÁ
Æâ¥ã¨äãâäø ö
»š
äªÆü‚
–ÙG‚‘C+{ÕáåËËëNÎÙ*¿Ï—O¿åØ9³yȦ Æäª‰®–ÙíŒË¿Á‚–Ùàà
áÆäª‰®ò
ÛÝàâÞà¿ààÁ‚üú0
8à¥ç¨èèàçø ÿ
»š<
ÏØü¯I
Æê¥ë¨ììêëø ¸
»š
&䪉®„ç
–Ùí´
,.13üš&
¡
û‚–Ùéé
íÆäª‰®ì]<¥
üõT
Æï¥ð¨ñïðñø þ
»š<
Å…„¸
–ÙòóƒØ„Øóú
2479

îîÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
û‚䪉®&
ü€M

áâㄾ„¾Ù’†¾ ˜X$]È=„kt• á–Ù âÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åãœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤Ã–ÙƒØî 
î
óÆäª‰®
àð¢
ü€N
8ä¥õ¨öäõöø 
»š<ˆ
¿cäª
ÏØ÷Àc÷+-02üÕ4
Ø
åæç åÏØ æ c cˆ¢cµ
 `£cðÇ `àB¤GS
ç—Éô Ü
ô
÷8䪉®
± ã
Œÿ× #¤,øù4#‚Øøúk<7#Ìøü·$@#œØøýÄ<Z#&øþD##VL+#GI68´K#(üÔ*#üd7#4 Returns a new [`ServiceFn`] with the given closure.Áœ#úü W#T This lets you build a [`Service`] from an async function that returns a [`Result`].Áø#ú#‘©Š#ú#ÊÑü–;#8 use tower::{service_fn, Service, ServiceExt, BoxError};Á¬Ò#¼¯¤è# # impl Request {Áüý##˜°#ï¯ü©$#! # struct Response(&'static str);Á¬Î#ù¯üä.#+ # fn new(body: &'static str) -> Self {ÁÄ“# # Self(body)Á# # }Áü¸7#4 # fn into_body(self) -> &'static str { self.0 }Á#ï¯ø#ú¤ü# # #[tokio::main]Áü‘/#, # async fn main() -> Result<(), BoxError> {ÁüÁE#B async fn handle(request: Request) -> Result<Response, BoxError> {Áü‡6#3 let response = Response::new("Hello, World!");Á¤¾# Ok(response)Á#œ“Ù#úüÝ)#& let mut service = service_fn(handle);Á#úÔ‹# let response = serviceÁ„¦#
.ready()Á# .await?ÁìÇ# .call(Request::new())Á„å#
.await?;Áö#úüú6#3 assert_eq!("Hello, World!", response.into_body());Á#®¯# # Ok(())Á#ï¯#ÊÑ#¬«èÙ¥…ü æ#
ÿ¬«± é#ü¯
##¥…ü ´
#èÙƒÀcƒüÙ
8#Ü
#èéê èèÙ é c cˆ¢cµ
 `£cðÇ `àB¤GS
ê—É à
#
ƒ¬«
#± ç
#ü  ƒ#¥¨£ˆˆ ¬«‰®˜"£¯ û #£¯ƒØÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
£ò½¬Œ
#»š #Íì¯ ´ #ž¾ · #“"¬«Äœœé #…ü ¥ #Ù÷ì…
#Þè ¨ #èÙŠŒŽ& &
& & &
Ž>@;=Ž
#D¯
#¯
#,Æ
#ò½
#4Ú
#£¯üë
D#Tî
#ëìí ëèÙ ìÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åíœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ò½ ù
#
¬«£¯‰®¯ò½
# #üÓ0#$Ö#î îèÙ‰®èÙ‰®&  Û#
ެ«£¯‰®¯ò½#“Žæ#DÃŒ¡ªÃÈß4(ëL×6¤,4G‚Øk<ZÌ·$cœØ˜ªœ,~Ä<˜&šd£¥+ˆt?yü+,kmZ\”qK´‰=üË=¤œœì„ ÐÞè ÓïèÆÚžÀcž#%(*ü8ïðñ ïÆÚ ð c cˆ¢cµ
 `£cðÇ `àB¤GS
ñ—É 
žî©£¯$—± ¬‘¤ ¡¡ ì„ Þè ÆÚ¢£üÓ(ü­! Creates a new `Then` service.Áàî©£¯ÆÚŸŸ
¢î©£¯Ù*K‡±U‡üç"ü£<9 Returns a new [`Layer`] that produces [`Then`] services.ÁäúüìHE This is a convenience function that simply calls [`ThenLayer::new`].Á¹úüÁ!ž÷£¯•ÝŸŸ
£î©£¯± ôüÛ
󤥦¨§ä¨ô© !ª©§¥ª¦¨
£¯¢§˜"ˆ½ ˆ½ƒØý§ü¬ »š
Ø”
ñ¨
¯¾ ™ú„² æ³úϨ ž©üæ ,ì„ à
ìú,• ¿ü¥ (Þè ã
ÆÚ«¬­®¯& &
& & &
¯®GI;=¦¨«­°²µ·  ¤¤¾”  ¤¤Ϩ\‹
4
¤¤ÃÃ¥–ÇÙ*­úCkÇ"ñ®çüˆ½£¯üË
O
òóô òÆÚ óÌÌkÎàÿ¸Ïóÿ¸ÐŒ€¸Ñ³¸Ò«€¸f'EwÚ]¾åôœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ÆÚ‰®&
¤ Ù
¤
®î©£¯‰®¾”Ϩˆ½
àðä
üì4õ õÆÚ‰®ÆÚ‰®& ¤ ô¤
¯î©£¯‰®¾”Ϩˆ½<ÿ¤ó±±º ø›Û² 
ô¹üŽ&# Creates a new [`ThenLayer`] layer.ÁÆš±›Û°°
²š±±ÿ‡üû8¤´µµ´ì„ Þè ƒìú•Ý··*,/1<¿³³ÆÚüÚ*ö ö•Ýî©•Ý ã³
·î©£¯Ù*,êü*' [PRNG] utilities for tower middleware.Á+úü/IF This module provides a generic [`Rng`] trait and a [`HasherRng`] thatÁüyJG implements the trait based on [`RandomState`] or any other [`Hasher`].ÁÄúüÈPM These utilities replace tower's internal usage of `rand` with these smaller,Áü™LI more lightweight methods. Most of the implementations are extracted fromÁüæ/, their corresponding `rand` implementations.ÁúüšGD [PRNG]: https://en.wikipedia.org/wiki/Pseudorandom_number_generatorÁÖ¿ôçÞ\‰ÖJ¸º\\¡Åe¸¼¢e¸½¹£¸¾çüò"Züç7MO<>T»/lÒüË:7 A simple [PRNG] trait for use within tower middleware.ÁúüŠG©ºÜ¿¿«úüÒ®¿«ú«ú ÀÁÂÀÁÂÁÀÂô‰ôæ Generate a random [`u64`].ÁDŒ÷ ÷³ú¿ ¿
À³úìáü­/, Generate a random [`f64`] between `[0, 1)`.ÁDäø ø³ú¿ í¿
Á³úü£ 2üŒ
+( Randomly pick a value within the range.Á¼
ú
 # PanicÁÔ
úüÜ
B? - If `range.start >= range.end` this will panic in debug mode.ÁT¦ ù ù³ú££¹ƒ£¹„£þ-'ºˆÉ¬g¿ ± ¿
³ú rangeÁ,¼ ü‚$£ÄÄÎìà¶ ¿à¶ŠÓÝÅÀÅ#%ì­ú úÓÝà ¹Ã
Åà¶ ßǤèü¼'$ Create a new default [`HasherRng`].Áï ßÆÆ
ÇÔ¥ ßɴɤƠßÈÈ
ɤËËÍìˆß ¢ËÞÌ 
üõ%ü¸85 Create a new [`HasherRng`] with the provided hasher.Á\üˆßËÞÊÊ
̈ßÙüÏ6ÎÎ­Æ ÔÅeˆßËÞÏÀÏ#%ìŒDû ûËÞÍ ˜Í
ψß$¤äæïæïøïøïüä8
ð
ð ð ðbðä‹xðü­%ŠðtØœðüä®ð®ðÀðÀðüäÄÒðÒðäðäðüäë÷ð÷ð
ñ
ñüäññ/ñüäÊUñüäû{ñ„‚Žñ”˜¡ñüäѳñ³ñÅñÅñüäø×ñ×ñêñêñüäýñýñòòt 8òœÑNòäëeòlŠ  Error typesÁ, òKDÕ € ´» „÷ –ÞÔel¦
Ä
 Út¤Ð
³ ƒ ý|d‚ 
傌± ®‡ ØòKD› ¥– È ô•
‚üÁ
#wäò
küœ &_üÐ "S¼€ G¼± :ü¦
>üÍ KH An extension trait for `Service`s that provides a variety of convenientÁd™
 adaptersÁ
¨Š Š «úü¦
°þ&³úì¬üÅ
³Ä
«ú7ÉÎ'«úCÉÎ3 Œ Ž ˜ œ Ÿ ¤ © ª Œ Ž ˜ œ Ÿ ¤ © ª
Ÿ ª Œ © Ž ¤ œ ˜ ¢¤üÃNüë
SP Yields a mutable reference to the service when it is ready to accept a request.Á,Æü ü³úààáÈ刿 G‚‘C+{Õü³úì¬ Ìí±,‹
³úì¬üýTü¼<9 Yields the service when it is ready to accept a request.Ál€³úËËëNÎÙ*¿Ï—O¿åØ9³yȦ³úì¬í±
Œ ³úì¬üÚWüƒRO Consume this `Service`, calling it with the provided request once it is ready.Á<ݳú쬺ô˜M£Ÿ1^³úì¬í±
³ú쬓Žëü±üã`] Process all requests from the given [`Stream`], and produce a [`Stream`] of their responses.ÁÈúüÐVS This is essentially [`Stream<Item = Request>`][stream] + `Self` => [`Stream<Item =Áü«B? Response>`][stream]. See the documentation for [`CallAll`] forÁ details.Áƒúü‹OÚ‹üßMJ [stream]: https://docs.rs/futures/latest/futures/stream/trait.Stream.htmlÁD´³úʸÅ Å âiÈ Ù*¸JzÁ„æ³úʸ¤  ŸØ ½í±'Eʸü$ʸ'Fì¬
Ž ³úì¬ʸreqsÁ$ÆRTüÜ'_üåIF Executes a new future after this service's future resolves. This doesÁü³96 not alter the behaviour of the [`poll_ready`] method.ÁñúüùJG This method can be used to change the [`Response`] type of the serviceÁüÈXU into a different type. You can use this method to chain along a computation once theÁü¥)& service's response has been resolved.ÁÓúüÛ*' [`Response`]: crate::Service::ResponseÁüŠ.+ [`poll_ready`]: crate::Service::poll_readyÁ½ú‘©ÊÑüã%" # use std::task::{Poll, Context};Áü'$ # use tower::{Service, ServiceExt};Á®¯ìà # struct DatabaseService;Áäå # impl DatabaseService {Áü†'$ # fn new(address: &str) -> Self {Áܲ # DatabaseServiceÁ # }Áﯮ¯¬ö # struct Record {ÁÌ # pub name: String,Á¤® # pub age: u16Áﯮ¯üÝ-* # impl Service<u32> for DatabaseService {Áü # type Response = Record;Áij # type Error = u8;ÁüÐ=: # type Future = std::future::Ready<Result<Record, u8>>;Á, ®¯üœ YV # fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {Áüú  # Poll::Ready(Ok(()))ÁLž!§à,¬!®¯ü¶!:7 # fn call(&mut self, request: u32) -> Self::Future {Áüõ!KH # std::future::ready(Ok(Record { name: "Jack".into(), age: 32 }))ÁLÅ"§à<Ó"ï¯,ß"®¯üé"PM # async fn avatar_lookup(name: String) -> Result<Vec<u8>, u8> { Ok(vec![]) }Á,¾#®¯ŒÈ#Ùª„Þ#
# async {Áüó#,) // A service returning Result<Record, _>Áü¤$96 let service = DatabaseService::new("127.0.0.1:8080");Áâ$úüê$+( // Map the response into a new responseÁüš%HE let mut new_service = service.and_then(|record: Record| async move {Áüç% let name = record.name;Áü‹&! avatar_lookup(name).awaitÁ<±&ò¬½&úÜÅ& // Call the new serviceÁ„å&
let id = 13;Áüú&52 let avatar = new_service.call(id).await.unwrap();Á\´' # };Á<Ä'ï¯<Ð'ÊÑDß'³úÉл
»
ˆe¾
Ù*¿
±ë=i›ß”Ó—³úÉÐü½ è'í±,£(ØÉÐ,µ(
³úì¬ÉÐ$ë'± ñ'<>ü°8üë(JG Maps this service's response value to a different value. This does notÁüº)52 alter the behaviour of the [`poll_ready`] method.Áô)úüü)J”ÛüË*?< into a different type. It is similar to the [`Result::map`]Áü+IF method. You can use this method to chain along a computation once theÁüÝ+)ÊÜ‹,úü“,*‰ÝüÂ,.½Ýõ,úlý,‘©<-ÊÑü›-%›ÞüÅ-'ÊÞ,ñ-®¯ìû-‡ßä.­ßü¾.'ÓßÜê.ƒàLŠ/§à<˜/ï¯,¤/®¯¬®/ÓàÌÈ/ñà¤æ/“á<ÿ/ï¯,‹0®¯ü•0-ËáüÇ0‚âÄë0ªâüˆ1=Ìâ,Ê1®¯üÔ1Y ãü²2ƒäLÖ2§à,ä2®¯üî2:Æäü­3KŠåLý3§à<‹4ï¯,—4®¯Œ¡4Ùª„·4ùæüÌ4,“çüý49Éç»5úüÃ5+˜èüó5EB let mut new_service = service.map_response(|record| record.name);Á½6úÜÅ6‹ê„å6¯êÔú6 let name = new_serviceÁ„™7––|®7¯–ŒÂ7 .call(id)Á„Ø7í–´í7 # Ok::<(), u8>(())Á\ˆ8‡ë<˜8ï¯<¤8ÊÑd³8³úÉÐñ
ñ
ä€ô
Ù*ýõ
±ýü®qcjÓ ³úÉÐäü½ À8Ø”DÃ8í±,‰9–"Éгúì¬& ü›9"ÉÐÒø˜"¾”Dµ9Àí,À9
³úì¬Éо”$Í8± Ó8xz}ü¶Hƒüú9GD Maps this service's error value to a different value. This does notÁüÆ:5áí€;úüˆ;GD This method can be used to change the [`Error`] type of the serviceÁüÔ;KH into a different type. It is similar to the [`Result::map_err`] method.Á¤<úü¬<$! [`Error`]: crate::Service::ErrorÁüÕ<.½Ýˆ=úl=‘©<¢=ÊÑü®=%›ÞüØ='ÊÞ,„>®¯ìŽ>‡ßä°>­ßüÑ>'ÓßÜý>ƒàL?§à<«?ï¯,·?®¯¤Á? # struct Error {Á´Ú? # pub code: u32,ÁÜõ? # pub message: StringÁ<•@ï¯,¡@®¯ü«@-ËáüÝ@ # type Response = String;ÁÜA # type Error = Error;Áü¡A@= # type Future = std::future::Ready<Result<String, Error>>;Á,æA®¯üðAY ãüÎBƒäLòB§à,€C®¯üŠC:ÆäüÉC1. # std::future::ready(Ok(String::new()))ÁLÿC§à<Dï¯,™D®¯Œ£DÙª|¹D # async {ÁüÍD+( // A service returning Result<_, Error>ÁüýD9Éç»EúüÃE# // Map the error to a new errorÁüëE:7 let mut new_service = service.map_err(|err| err.code);ÁªFúܲF‹ê„ÒF¯êÔçF let code = new_serviceÁ„†G––|›G¯–Œ¯G¶õtÅG .awaitÁ´ØG .unwrap_err();Á¼óG # Ok::<(), u32>(())ÁTH # };Á<žHï¯<ªHÊÑ<¹H³úÉÐ

†{š
Ù*
±%òB:³úÉÐôü½ ÁHýï,ÄHí±,‚I–"Éгúì¬&
ä”IÉа† ˜"ãï,«IÀí,³I
³úì¬ÉÐãï$ËH± ÑHwy|~üé†ßüèIKH Maps this service's result type (`Result<Self::Response, Self::Error>`)Áü¸JFC to a different value, regardless of whether the future succeeds orÁTƒK fails.ÁKúüšKHE This is similar to the [`map_response`] and [`map_err`] combinators,ÁüçKHE except that the *same* function is invoked when the service's futureÁü´LHE completes, whether it completes successfully or fails. This functionÁüMHE takes the [`Result`] returned by the service's future, and returns aÁ|ÎM [`Result`].ÁâMúüêMHE Like the standard library's [`Result::and_then`], this method can beÁü·NLI used to implement control flow based on `Result` values. For example, itÁüˆODA may be used to implement error recovery, by turning some [`Err`]ÁüÑOEB responses from the service into [`Ok`] responses. Similarly, someÁü›PLI successful responses from the service could be rejected, by returning anÁüìPMJ [`Err`] conditionally, depending on the value inside the [`Ok`]. Finally,Áü¾QLI this method can also be used to implement behaviors that must run when aÁüRMJ service's future completes, regardless of whether it succeeded or failed.ÁáRúüéRJ”Ûü¸SKH into a different type. It can also be used to change the [`Error`] typeÁüˆTOL of the service. However, because the [`map_result`] function is not appliedÁüÜTJG to the errors returned by the service's [`poll_ready`] method, it mustÁü«UKH be possible to convert the service's [`Error`] type into the error typeÁüûUNK returned by the [`map_result`] function. This is trivial when the functionÁüÎVJG returns the same error type as the service, but in other cases, it canÁüWA> be useful to use [`BoxError`] to erase differing error types.ÁãWútëW»õþWúü†X# Recovering from certain errors:Á®Xú<¶XÊÑüÂX%›ÞüìX'ÊÞ,˜Y®¯ì¢Y‡ßäÄY­ßüåY'ÓßÜ‘ZƒàL±Z§à<¿Zï¯,ËZ®¯¬ÕZÓàÌïZñà¤[“á<¦[ﯴ²[ # #[derive(Debug)]Á¤Í[ # enum DbError {Áüæ['$ # Parse(std::num::ParseIntError),Á¼’\ # NoRecordsFound,Á<®\ï¯,º\®¯üÄ\-Ëáüö\$! # type Response = Vec<Record>;ÁìŸ] # type Error = DbError;ÁüÁ]GD # type Future = std::future::Ready<Result<Vec<Record>, DbError>>;Á,^®¯ü—^Y ãüõ^ƒäL™_§à,§_®¯ü±_:Æäüð_QN # std::future::ready(Ok(vec![Record { name: "Jack".into(), age: 32 }]))ÁLÆ`§à<Ô`ï¯,à`®¯Œê`Ùª„€aùæü•a74 // A service returning Result<Vec<Record>, DbError>ÁüÑa9Éçbúü—bUR // If the database returns no records for the query, we just want an empty `Vec`.ÁüñbDA let mut new_service = service.map_result(|result| match result {ÁüºcTQ // If the error indicates that no records matched the query, return an emptyÁÌ“d // `Vec` instead.Áü±d74 Err(DbError::NoRecordsFound) => Ok(Vec::new()),ÁüídC@ // Propagate all other responses (`Ok` and `Err`) unchangedÁ|µe x => x,Á<Éeò¬ÕeúÜÝe‹ê„ýe¯êÔ’fùô„±f––|Æf¯–ŒÚf¶õ„ðfí–Ü…g # Ok::<(), DbError>(())Á\¥g‡ë<µgï¯<ÁgÊÑÍgúüÕg" Rejecting some `Ok` responses:Áügú<„hÊÑüh%›Þüºh'ÊÞ,æh®¯ìðh‡ßä’i­ßü³i'ÓßÜßiƒàLÿi§à<jï¯,™j®¯¬£jÓà̽jñà¤Ûj“á<ôjï¯ä€k # type DbError = String;Áì¡k # type AppError = String;Á,Ãk®¯üÍk-Ëáüÿk‚âì£lð˜ üÅlB? # type Future = std::future::Ready<Result<Record, DbError>>;Á,Œm®¯ü–mY ãüômƒä
ü½ ôñˆú÷ñÍìäDüñÍìô,†òí±,Çò“"Éгúì¬& ÔÙòÉÐýò ˜"îùðòéÝò ²† Œ„ó‚Øîùü¤ó(îùƒØÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Éò Ýò ü«ó 
¤ ³úì¬ÉÐîùÉò Ýò $ò± “ò69<?7:25üòý˜üÿóC@ Convert the service into a [`Service`] + [`Send`] trait object.ÁÇôúüÏô(% See [`BoxService`] for more details.Áüôúü„õHE If `Self` implements the [`Clone`] trait, the [`boxed_clone`] methodÁüÑõC@ can be used instead, to produce a boxed service which will alsoÁÄ™ö implement [`Clone`].Á¶öúl¾ö‘©Ðöú<ØöÊÑüäöMJ use tower::{Service, ServiceExt, BoxError, service_fn, util::BoxService};Á,¶÷®¯¬À÷¼¯´Ú÷Ú¯¬õ÷ù¯üø#˜°<·øï¯ÃøúüËø30 let service = service_fn(|req: Request| async {Áüƒù*' Ok::<_, BoxError>(Response::new())Á<²ùò¬¾ùúüÆùB? let service: BoxService<Request, Response, BoxError> = serviceÁäú˳ü®ú)ñ³|Üú£´Tðú»´ìÿúδü¡û*õ´|Ðû¨µTäû»´Œóû .boxed();Áü‰ü,è¸üºü*ºüéü!Ѻ<ýÊÑ›ýúü£ý¸×üÇý&# [`boxed_clone`]: Self::boxed_cloneÁ,õý³úÒÒ¯*ÖÙ*Ä?K®,… Éì¬Ôø²† í±,ÍþÌì³ú$Õþ³ú<ÜþÌìÿò $ûþÿò <‚ÿ
© ³úì¬$ûýüú‰«üºÿOL Convert the service into a [`Service`] + [`Clone`] + [`Send`] trait object.ÁŽ€úü–€RO This is similar to the [`boxed`] method, but it requires that `Self` implementÁüí€C@ [`Clone`], and the returned boxed service implements [`Clone`].Áüµ-* See [`BoxCloneService`] for more details.Áçú‘©ú<‰‚ÊÑü•‚RO use tower::{Service, ServiceExt, BoxError, service_fn, util::BoxCloneService};Á,ì‚®¯¬ö‚¼¯´ƒÚ¯¬«ƒù¯üŃ#˜°<íƒï¯ùƒúü3…ù ü¹„*Ãù <è„ò¬ô„úüü„GD let service: BoxCloneService<Request, Response, BoxError> = serviceÁäÈ…˳üé…)ñ³|—†£´T«†»´캆δü܆*õ´|‹‡¨µTŸ‡»´¼®‡ .boxed_clone();ÁʇúüÒ‡-* // The boxed service can still be cloned.Á¤„ˆ service.clone();Áüˆ,è¸üΈ*ºüýˆ!Ѻ<£‰Êѯ‰úü·‰¸×ÔÛ‰ [`boxed`]: Self::boxedÁ\ý‰³úµµ£0ºˆ© «¢OôVì¬Ôø²† í±,èŠØ³ú,àŠÝþ $ðŠïþ <÷Šûþ $–‹ÿ <
ª ³úì¬$‰ŠüØ‹[¥¬ ¨­ ¬ ­ Î쬫 Ý‹³Ä<è‹éèü”Œ¬« "ü¿‘?ü¸Œ0- Convert an `Option<Layer>` into a [`Layer`].ÁéŒú<íŒÊÑôõŒ # use std::time::Duration;ÁÌ” # use tower::Service;Áü®)& # use tower::builder::ServiceBuilder;ÁüØ" use tower::util::option_layer;Áüû'$ # use tower::timeout::TimeoutLayer;Áü£Žmj # async fn wrap<S>(svc: S) where S: Service<(), Error = &'static str> + 'static + Send, S::Future: Send {Áü‘/, # let timeout = Some(Duration::new(10, 0));ÁüÁ-* // Layer to apply a timeout if configuredÁüïEB let maybe_timeout = option_layer(timeout.map(TimeoutLayer::new));Áµú̹ ServiceBuilder::new()ÁìÓ .layer(maybe_timeout)Á´ñ .service(svc);Á<ˆ‘ï¯<Êј‘úüœ‘" [`Layer`]: crate::layer::LayerÁdƑۼݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙöàŸ ¢ £ Øs¤ ˆ¥ ¦ ñs§ ˆenêÊ`
öà²á¯ ¯
Çའ¿ Á Ã Ç É Ë Í Ï Ñ Ó Ô Ö Ø Ù Û à ã æ ACü³ >ü¯41 Add a new layer `T` into the [`ServiceBuilder`].ÁèúüðLI This wraps the inner service with the service provided by a user-definedÁüÁEB [`Layer`]. The provided layer must implement the [`Layer`] trait.Á úÜ“ à×ÇàäªþþŠšö ° ÁjÊ
ÑÆi”Ñ’
Ù*.outerÁ.È­ù—äªöà» ¥¾ ¾ » ø À 
½ öàäªö ,É  "üÉ&ƒüÔ!?< Optionally add a new layer `T` into the [`ServiceBuilder`].Á˜"ú< "ÊÑô¬"ˆŠ
ÌÏ"°Š