Struct qiniu_http_client::HttpClient
source · pub struct HttpClient { /* private fields */ }
Expand description
HTTP 客户端
用于发送 HTTP 请求的入口。
其中 HTTP 请求将由 HttpCaller
实现的实例来发送,如果不指定,默认通过当前启用的功能来判定。
私有云获取当前账户的 Buckets 列表
阻塞代码示例
use qiniu_credential::Credential;
use qiniu_http_client::{Authorization, HttpClient, Region, RegionsProviderEndpoints, ServiceName};
let region = Region::builder("z0")
.add_uc_preferred_endpoint("uc-qos.pocdemo.qiniu.io".parse()?)
.build();
let credential = Credential::new("abcdefghklmnopq", "1234567890");
let bucket_names: Vec<String> = HttpClient::default()
.get(&[ServiceName::Uc], RegionsProviderEndpoints::new(region))
.use_https(false)
.authorization(Authorization::v2(credential))
.accept_json()
.path("/buckets")
.call()?
.parse_json()?
.into_body();
异步代码示例
use qiniu_credential::Credential;
use qiniu_http_client::{Authorization, HttpClient, Region, RegionsProviderEndpoints, ServiceName};
let region = Region::builder("z0")
.add_uc_preferred_endpoint("uc-qos.pocdemo.qiniu.io".parse()?)
.build();
let credential = Credential::new("abcdefghklmnopq", "1234567890");
let bucket_names: Vec<String> = HttpClient::default()
.async_get(&[ServiceName::Uc], RegionsProviderEndpoints::new(region))
.use_https(false)
.authorization(Authorization::v2(credential))
.accept_json()
.path("/buckets")
.call()
.await?
.parse_json()
.await?
.into_body();
Implementations§
source§impl HttpClient
impl HttpClient
sourcepub fn ureq() -> Self
Available on crate feature ureq
only.
pub fn ureq() -> Self
ureq
only.创建一个新的 HTTP 客户端,使用 crate::ureq::Client
作为 HttpCaller
实现
sourcepub fn isahc() -> Result<Self, IsahcError>
Available on crate feature isahc
only.
pub fn isahc() -> Result<Self, IsahcError>
isahc
only.创建一个新的 HTTP 客户端,使用 crate::isahc::Client
作为 HttpCaller
实现
sourcepub fn reqwest_sync() -> Self
Available on crate feature reqwest
only.
pub fn reqwest_sync() -> Self
reqwest
only.创建一个新的 HTTP 客户端,使用 crate::reqwest::SyncClient
作为 HttpCaller
实现
sourcepub fn reqwest_async() -> Self
Available on crate features reqwest
and async
only.
pub fn reqwest_async() -> Self
reqwest
and async
only.创建一个新的 HTTP 客户端,使用 crate::reqwest::AsyncClient
作为 HttpCaller
实现
sourcepub fn build_default() -> HttpClientBuilder
pub fn build_default() -> HttpClientBuilder
创建一个新的 HTTP 客户端,根据当前环境变量选择 HttpCaller
实现
Examples found in repository?
More examples
sourcepub fn build_ureq() -> HttpClientBuilder
Available on crate feature ureq
only.
pub fn build_ureq() -> HttpClientBuilder
ureq
only.创建一个新的 HTTP 客户端构建器,使用 crate::ureq::Client
作为 HttpCaller
实现
sourcepub fn build_isahc() -> Result<HttpClientBuilder, IsahcError>
Available on crate feature isahc
only.
pub fn build_isahc() -> Result<HttpClientBuilder, IsahcError>
isahc
only.创建一个新的 HTTP 客户端构建器,使用 crate::isahc::Client
作为 HttpCaller
实现
sourcepub fn build_reqwest_sync() -> HttpClientBuilder
Available on crate feature reqwest
only.
pub fn build_reqwest_sync() -> HttpClientBuilder
reqwest
only.创建一个新的 HTTP 客户端构建器,使用 crate::reqwest::SyncClient
作为 HttpCaller
实现
sourcepub fn build_reqwest_async() -> HttpClientBuilder
Available on crate features reqwest
and async
only.
pub fn build_reqwest_async() -> HttpClientBuilder
reqwest
and async
only.创建一个新的 HTTP 客户端构建器,使用 crate::reqwest::AsyncClient
作为 HttpCaller
实现
sourcepub fn new(http_caller: impl HttpCaller + 'static) -> Self
pub fn new(http_caller: impl HttpCaller + 'static) -> Self
创建一个新的 HTTP 客户端,需要指定 HttpCaller
实现
sourcepub fn builder(http_caller: impl HttpCaller + 'static) -> HttpClientBuilder
pub fn builder(http_caller: impl HttpCaller + 'static) -> HttpClientBuilder
创建一个新的 HTTP 客户端构建器,需要指定 HttpCaller
实现
sourcepub fn get<'r, E: EndpointsProvider + 'r>(
&'r self,
service_names: &'r [ServiceName],
endpoints_provider: E
) -> SyncRequestBuilder<'r, E>
pub fn get<'r, E: EndpointsProvider + 'r>(
&'r self,
service_names: &'r [ServiceName],
endpoints_provider: E
) -> SyncRequestBuilder<'r, E>
创建 GET 请求的请求构建器
该方法的异步版本为 HttpClient::async_get
。
Examples found in repository?
More examples
286 287 288 289 290 291 292 293 294 295 296 297 298
fn do_sync_query(&self) -> ApiResult<GotRegions> {
handle_response_body(
self.queryer
.http_client
.get(&[ServiceName::Uc, ServiceName::Api], &self.queryer.uc_endpoints)
.path("/v4/query")
.append_query_pair("ak", self.access_key.as_str())
.append_query_pair("bucket", self.bucket_name.as_str())
.accept_json()
.call()?
.parse_json::<ResponseBody>()?,
)
}
272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288
fn do_sync_query(&self) -> ApiResult<Endpoints> {
let endpoints: Endpoints = self
.queryer
.http_client
.get(&[ServiceName::Uc], &self.queryer.uc_endpoints)
.path("/v2/domains")
.authorization(Authorization::v2(&self.credential))
.append_query_pair("tbl", self.bucket_name.as_str())
.accept_json()
.call()?
.parse_json::<Vec<String>>()?
.into_body()
.into_iter()
.map(Endpoint::from)
.collect();
Ok(endpoints)
}
sourcepub fn post<'r, E: EndpointsProvider + 'r>(
&'r self,
service_names: &'r [ServiceName],
endpoints_provider: E
) -> SyncRequestBuilder<'r, E>
pub fn post<'r, E: EndpointsProvider + 'r>(
&'r self,
service_names: &'r [ServiceName],
endpoints_provider: E
) -> SyncRequestBuilder<'r, E>
创建 POST 请求的请求构建器
该方法的异步版本为 HttpClient::async_post
。
sourcepub fn put<'r, E: EndpointsProvider + 'r>(
&'r self,
service_names: &'r [ServiceName],
endpoints_provider: E
) -> SyncRequestBuilder<'r, E>
pub fn put<'r, E: EndpointsProvider + 'r>(
&'r self,
service_names: &'r [ServiceName],
endpoints_provider: E
) -> SyncRequestBuilder<'r, E>
创建 PUT 请求的请求构建器
该方法的异步版本为 HttpClient::async_put
。
sourcepub fn delete<'r, E: EndpointsProvider + 'r>(
&'r self,
service_names: &'r [ServiceName],
endpoints_provider: E
) -> SyncRequestBuilder<'r, E>
pub fn delete<'r, E: EndpointsProvider + 'r>(
&'r self,
service_names: &'r [ServiceName],
endpoints_provider: E
) -> SyncRequestBuilder<'r, E>
创建 DELETE 请求的请求构建器
该方法的异步版本为 HttpClient::async_delete
。
sourcepub fn new_request<'r, E: EndpointsProvider + 'r>(
&'r self,
method: Method,
service_names: &'r [ServiceName],
endpoints_provider: E
) -> SyncRequestBuilder<'r, E>
pub fn new_request<'r, E: EndpointsProvider + 'r>(
&'r self,
method: Method,
service_names: &'r [ServiceName],
endpoints_provider: E
) -> SyncRequestBuilder<'r, E>
创建请求的请求构建器
该方法的异步版本为 HttpClient::new_async_request
。
Examples found in repository?
196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238
pub fn get<'r, E: EndpointsProvider + 'r>(
&'r self,
service_names: &'r [ServiceName],
endpoints_provider: E,
) -> SyncRequestBuilder<'r, E> {
self.new_request(Method::GET, service_names, endpoints_provider)
}
/// 创建 POST 请求的请求构建器
///
/// 该方法的异步版本为 [`HttpClient::async_post`]。
#[inline]
pub fn post<'r, E: EndpointsProvider + 'r>(
&'r self,
service_names: &'r [ServiceName],
endpoints_provider: E,
) -> SyncRequestBuilder<'r, E> {
self.new_request(Method::POST, service_names, endpoints_provider)
}
/// 创建 PUT 请求的请求构建器
///
/// 该方法的异步版本为 [`HttpClient::async_put`]。
#[inline]
pub fn put<'r, E: EndpointsProvider + 'r>(
&'r self,
service_names: &'r [ServiceName],
endpoints_provider: E,
) -> SyncRequestBuilder<'r, E> {
self.new_request(Method::PUT, service_names, endpoints_provider)
}
/// 创建 DELETE 请求的请求构建器
///
/// 该方法的异步版本为 [`HttpClient::async_delete`]。
#[inline]
pub fn delete<'r, E: EndpointsProvider + 'r>(
&'r self,
service_names: &'r [ServiceName],
endpoints_provider: E,
) -> SyncRequestBuilder<'r, E> {
self.new_request(Method::DELETE, service_names, endpoints_provider)
}
sourcepub fn async_get<'r, E: EndpointsProvider + 'r>(
&'r self,
service_names: &'r [ServiceName],
endpoints_provider: E
) -> AsyncRequestBuilder<'r, E>
Available on crate feature async
only.
pub fn async_get<'r, E: EndpointsProvider + 'r>(
&'r self,
service_names: &'r [ServiceName],
endpoints_provider: E
) -> AsyncRequestBuilder<'r, E>
async
only.创建 GET 请求的异步请求构建器
Examples found in repository?
270 271 272 273 274 275 276 277 278 279 280 281 282
async fn do_async_query(&self) -> ApiResult<GotRegions> {
handle_response_body(
self.http_client
.async_get(&[ServiceName::Uc], &self.uc_endpoints)
.path("/regions")
.authorization(Authorization::v2(&self.credential_provider))
.accept_json()
.call()
.await?
.parse_json::<ResponseBody>()
.await?,
)
}
More examples
301 302 303 304 305 306 307 308 309 310 311 312 313 314 315
async fn do_async_query(&self) -> ApiResult<GotRegions> {
handle_response_body(
self.queryer
.http_client
.async_get(&[ServiceName::Uc, ServiceName::Api], &self.queryer.uc_endpoints)
.path("/v4/query")
.append_query_pair("ak", self.access_key.as_str())
.append_query_pair("bucket", self.bucket_name.as_str())
.accept_json()
.call()
.await?
.parse_json::<ResponseBody>()
.await?,
)
}
291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309
async fn do_async_query(&self) -> ApiResult<Endpoints> {
let endpoints: Endpoints = self
.queryer
.http_client
.async_get(&[ServiceName::Uc], &self.queryer.uc_endpoints)
.path("/v2/domains")
.authorization(Authorization::v2(&self.credential))
.append_query_pair("tbl", self.bucket_name.as_str())
.accept_json()
.call()
.await?
.parse_json::<Vec<String>>()
.await?
.into_body()
.into_iter()
.map(Endpoint::from)
.collect();
Ok(endpoints)
}
sourcepub fn async_post<'r, E: EndpointsProvider + 'r>(
&'r self,
service_names: &'r [ServiceName],
endpoints_provider: E
) -> AsyncRequestBuilder<'r, E>
Available on crate feature async
only.
pub fn async_post<'r, E: EndpointsProvider + 'r>(
&'r self,
service_names: &'r [ServiceName],
endpoints_provider: E
) -> AsyncRequestBuilder<'r, E>
async
only.创建 POST 请求的异步请求构建器
sourcepub fn async_put<'r, E: EndpointsProvider + 'r>(
&'r self,
service_names: &'r [ServiceName],
endpoints_provider: E
) -> AsyncRequestBuilder<'r, E>
Available on crate feature async
only.
pub fn async_put<'r, E: EndpointsProvider + 'r>(
&'r self,
service_names: &'r [ServiceName],
endpoints_provider: E
) -> AsyncRequestBuilder<'r, E>
async
only.创建 PUT 请求的异步请求构建器
sourcepub fn async_delete<'r, E: EndpointsProvider + 'r>(
&'r self,
service_names: &'r [ServiceName],
endpoints_provider: E
) -> AsyncRequestBuilder<'r, E>
Available on crate feature async
only.
pub fn async_delete<'r, E: EndpointsProvider + 'r>(
&'r self,
service_names: &'r [ServiceName],
endpoints_provider: E
) -> AsyncRequestBuilder<'r, E>
async
only.创建 DELETE 请求的异步请求构建器
sourcepub fn new_async_request<'r, E: EndpointsProvider + 'r>(
&'r self,
method: Method,
service_names: &'r [ServiceName],
endpoints_provider: E
) -> AsyncRequestBuilder<'r, E>
pub fn new_async_request<'r, E: EndpointsProvider + 'r>(
&'r self,
method: Method,
service_names: &'r [ServiceName],
endpoints_provider: E
) -> AsyncRequestBuilder<'r, E>
创建异步请求的请求构建器
Examples found in repository?
257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299
pub fn async_get<'r, E: EndpointsProvider + 'r>(
&'r self,
service_names: &'r [ServiceName],
endpoints_provider: E,
) -> AsyncRequestBuilder<'r, E> {
self.new_async_request(Method::GET, service_names, endpoints_provider)
}
/// 创建 POST 请求的异步请求构建器
#[inline]
#[cfg(feature = "async")]
#[cfg_attr(feature = "docs", doc(cfg(feature = "async")))]
pub fn async_post<'r, E: EndpointsProvider + 'r>(
&'r self,
service_names: &'r [ServiceName],
endpoints_provider: E,
) -> AsyncRequestBuilder<'r, E> {
self.new_async_request(Method::POST, service_names, endpoints_provider)
}
/// 创建 PUT 请求的异步请求构建器
#[inline]
#[cfg(feature = "async")]
#[cfg_attr(feature = "docs", doc(cfg(feature = "async")))]
pub fn async_put<'r, E: EndpointsProvider + 'r>(
&'r self,
service_names: &'r [ServiceName],
endpoints_provider: E,
) -> AsyncRequestBuilder<'r, E> {
self.new_async_request(Method::PUT, service_names, endpoints_provider)
}
/// 创建 DELETE 请求的异步请求构建器
#[inline]
#[cfg(feature = "async")]
#[cfg_attr(feature = "docs", doc(cfg(feature = "async")))]
pub fn async_delete<'r, E: EndpointsProvider + 'r>(
&'r self,
service_names: &'r [ServiceName],
endpoints_provider: E,
) -> AsyncRequestBuilder<'r, E> {
self.new_async_request(Method::DELETE, service_names, endpoints_provider)
}
source§impl HttpClient
impl HttpClient
sourcepub fn default_http_caller() -> Box<dyn HttpCaller>
pub fn default_http_caller() -> Box<dyn HttpCaller>
获得默认的 HttpCaller
实例
默认通过当前启用的功能来判定
sourcepub fn default_resolver() -> Box<dyn Resolver>
pub fn default_resolver() -> Box<dyn Resolver>
获得默认的 Resolver
实例
默认通过当前启用的功能来判定,并使用 CachedResolver
和 ShuffledResolver
对其进行包装。
sourcepub fn default_chooser() -> Box<dyn Chooser>
pub fn default_chooser() -> Box<dyn Chooser>
获得默认的 Chooser
实例
默认使用 SubnetChooser
,并使用 ShuffledChooser
和 NeverEmptyHandedChooser
对其进行包装。
sourcepub fn default_retrier() -> Box<dyn RequestRetrier>
pub fn default_retrier() -> Box<dyn RequestRetrier>
获得默认的 RequestRetrier
实例
默认使用 ErrorRetrier
,并使用 LimitedRetrier
对其进行包装。
sourcepub fn default_backoff() -> Box<dyn Backoff>
pub fn default_backoff() -> Box<dyn Backoff>
获得默认的 Backoff
实例
默认使用 ExponentialBackoff
,并使用 LimitedBackoff
和 RandomizedBackoff
对其进行包装。
Trait Implementations§
source§impl Clone for HttpClient
impl Clone for HttpClient
source§fn clone(&self) -> HttpClient
fn clone(&self) -> HttpClient
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl Debug for HttpClient
impl Debug for HttpClient
Auto Trait Implementations§
impl !RefUnwindSafe for HttpClient
impl Send for HttpClient
impl Sync for HttpClient
impl Unpin for HttpClient
impl !UnwindSafe for HttpClient
Blanket Implementations§
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moresource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moresource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> Rwhere
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> Rwhere
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
self
, then passes self.as_ref()
into the pipe function.source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
self
, then passes self.as_mut()
into the pipe
function.source§impl<T> Tap for T
impl<T> Tap for T
source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
Borrow<B>
of a value. Read moresource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
BorrowMut<B>
of a value. Read moresource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
AsRef<R>
view of a value. Read moresource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
AsMut<R>
view of a value. Read moresource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere
Self: Deref<Target = T>,
T: ?Sized,
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere
Self: Deref<Target = T>,
T: ?Sized,
Deref::Target
of a value. Read moresource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
Deref::Target
of a value. Read moresource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
.tap_borrow()
only in debug builds, and is erased in release
builds.source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
.tap_ref()
only in debug builds, and is erased in release
builds.source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
.tap_ref_mut()
only in debug builds, and is erased in release
builds.