qiniu_http_client/client/chooser/
feedback.rs

1use super::super::{
2    super::regions::{DomainWithPort, IpAddrWithPort},
3    ResponseError, RetriedStatsInfo,
4};
5use maybe_owned::{MaybeOwned, MaybeOwnedMut};
6use qiniu_http::{Extensions, Metrics};
7use std::mem::replace;
8
9/// 选择器反馈
10///
11/// 用以修正选择器的选择逻辑,优化选择结果
12#[derive(Debug)]
13pub struct ChooserFeedback<'f> {
14    ips: &'f [IpAddrWithPort],
15    domain: Option<&'f DomainWithPort>,
16    retried: MaybeOwned<'f, RetriedStatsInfo>,
17    extensions: MaybeOwnedMut<'f, Extensions>,
18    metrics: Option<&'f Metrics>,
19    error: Option<&'f ResponseError>,
20}
21
22impl<'f> ChooserFeedback<'f> {
23    /// 创建选择器反馈构建器
24    #[inline]
25    pub fn builder(ips: &'f [IpAddrWithPort]) -> ChooserFeedbackBuilder<'f> {
26        ChooserFeedbackBuilder::new(ips)
27    }
28
29    /// 获取 IP 地址列表
30    #[inline]
31    pub fn ips(&'f self) -> &'f [IpAddrWithPort] {
32        self.ips
33    }
34
35    /// 获取域名
36    ///
37    /// 如果不存在域名的话,则返回 [`None`]
38    #[inline]
39    pub fn domain(&'f self) -> Option<&'f DomainWithPort> {
40        self.domain
41    }
42
43    /// 获取重试统计信息
44    #[inline]
45    pub fn retried(&'f self) -> &'f RetriedStatsInfo {
46        &self.retried
47    }
48
49    /// 获取扩展信息
50    #[inline]
51    pub fn extensions(&'f self) -> &'f Extensions {
52        &self.extensions
53    }
54
55    /// 获取扩展信息的可变引用
56    #[inline]
57    pub fn extensions_mut(&'f mut self) -> &'f mut Extensions {
58        &mut self.extensions
59    }
60
61    /// 获取 HTTP 响应的指标信息
62    #[inline]
63    pub fn metrics(&'f self) -> Option<&'f Metrics> {
64        self.metrics
65    }
66
67    /// 获取 HTTP 响应错误
68    #[inline]
69    pub fn error(&'f self) -> Option<&'f ResponseError> {
70        self.error
71    }
72}
73
74/// 选择器反馈构建器
75#[derive(Debug)]
76pub struct ChooserFeedbackBuilder<'f>(ChooserFeedback<'f>);
77
78impl<'f> ChooserFeedbackBuilder<'f> {
79    /// 创建选择器反馈构建器
80    #[inline]
81    pub fn new(ips: &'f [IpAddrWithPort]) -> Self {
82        Self(ChooserFeedback {
83            ips,
84            domain: None,
85            metrics: None,
86            error: None,
87            retried: Default::default(),
88            extensions: Default::default(),
89        })
90    }
91
92    /// 设置域名
93    #[inline]
94    pub fn domain(&mut self, domain: &'f DomainWithPort) -> &mut Self {
95        self.0.domain = Some(domain);
96        self
97    }
98
99    /// 设置重试统计信息
100    #[inline]
101    pub fn retried(&mut self, retried: &'f RetriedStatsInfo) -> &mut Self {
102        self.0.retried = MaybeOwned::from(retried);
103        self
104    }
105
106    /// 获取扩展信息的可变引用
107    #[inline]
108    pub fn extensions(&mut self, extensions: &'f mut Extensions) -> &mut Self {
109        self.0.extensions = MaybeOwnedMut::from(extensions);
110        self
111    }
112
113    /// 设置 HTTP 响应的指标信息
114    #[inline]
115    pub fn metrics(&mut self, metrics: &'f Metrics) -> &mut Self {
116        self.0.metrics = Some(metrics);
117        self
118    }
119
120    /// 设置 HTTP 响应错误
121    #[inline]
122    pub fn error(&mut self, error: &'f ResponseError) -> &mut Self {
123        self.0.error = Some(error);
124        self
125    }
126
127    /// 构建选择器反馈器
128    #[inline]
129    pub fn build(&mut self) -> ChooserFeedback<'f> {
130        let ips = self.0.ips;
131        replace(
132            &mut self.0,
133            ChooserFeedback {
134                ips,
135                domain: None,
136                metrics: None,
137                error: None,
138                retried: Default::default(),
139                extensions: Default::default(),
140            },
141        )
142    }
143}