Skip to content

Commit e4c46df

Browse files
committed
Try Associated Type
Build error below occurs: error[E0207]: the lifetime parameter `'a` is not constrained by the impl trait, self type, or predicates --> src/encoding/proto.rs:199:6 | 199 | impl<'a, N, A> EncodeMetric for Counter<N, A> | ^^ unconstrained lifetime parameter
1 parent c3856bf commit e4c46df

1 file changed

Lines changed: 45 additions & 25 deletions

File tree

src/encoding/proto.rs

Lines changed: 45 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -77,19 +77,23 @@ impl From<MetricType> for openmetrics_data_model::MetricType {
7777

7878
/// Trait implemented by each metric type, e.g. [`Counter`], to implement its encoding.
7979
pub trait EncodeMetric {
80+
type Iterator: Iterator<Item = openmetrics_data_model::Metric>;
81+
8082
fn encode(
8183
&self,
8284
labels: Vec<openmetrics_data_model::Label>,
83-
) -> Vec<openmetrics_data_model::Metric>;
85+
) -> Self::Iterator;
8486

8587
fn metric_type(&self) -> MetricType;
8688
}
8789

88-
impl EncodeMetric for Box<dyn EncodeMetric> {
90+
impl<'a> EncodeMetric for Box<dyn EncodeMetric<Iterator = std::slice::Iter<'a, openmetrics_data_model::Metric>>> {
91+
type Iterator = std::slice::Iter<'a, openmetrics_data_model::Metric>;
92+
8993
fn encode(
9094
&self,
9195
labels: Vec<openmetrics_data_model::Label>,
92-
) -> Vec<openmetrics_data_model::Metric> {
96+
) -> Self::Iterator {
9397
self.deref().encode(labels)
9498
}
9599

@@ -102,11 +106,13 @@ pub trait SendEncodeMetric: EncodeMetric + Send {}
102106

103107
impl<T: EncodeMetric + Send> SendEncodeMetric for T {}
104108

105-
impl EncodeMetric for Box<dyn SendEncodeMetric> {
109+
impl<'a> EncodeMetric for Box<dyn SendEncodeMetric<Iterator = std::slice::Iter<'a, openmetrics_data_model::Metric>>> {
110+
type Iterator = std::slice::Iter<'a, openmetrics_data_model::Metric>;
111+
106112
fn encode(
107113
&self,
108114
labels: Vec<openmetrics_data_model::Label>,
109-
) -> Vec<openmetrics_data_model::Metric> {
115+
) -> Self::Iterator {
110116
self.deref().encode(labels)
111117
}
112118

@@ -183,32 +189,36 @@ where
183189
N: EncodeCounterValue,
184190
A: counter::Atomic<N>,
185191
{
192+
type Iterator = std::slice::Iter<'a, openmetrics_data_model::Metric>;
193+
186194
fn encode(
187195
&self,
188196
labels: Vec<openmetrics_data_model::Label>,
189-
) -> Vec<openmetrics_data_model::Metric> {
197+
) -> Self::Iterator {
190198
let mut metric = encode_counter_with_maybe_exemplar(self.get(), None);
191199
metric.labels = labels;
192200

193-
vec![metric]
201+
vec![metric].iter()
194202
}
195203

196204
fn metric_type(&self) -> MetricType {
197205
Self::TYPE
198206
}
199207
}
200208

201-
impl<S, N, A> EncodeMetric for CounterWithExemplar<S, N, A>
209+
impl<'a, S, N, A> EncodeMetric for CounterWithExemplar<S, N, A>
202210
where
203211
S: EncodeLabel,
204212
N: Clone + EncodeCounterValue,
205213
A: counter::Atomic<N>,
206214
f64: From<N>,
207215
{
216+
type Iterator = std::slice::Iter<'a, openmetrics_data_model::Metric>;
217+
208218
fn encode(
209219
&self,
210220
labels: Vec<openmetrics_data_model::Label>,
211-
) -> Vec<openmetrics_data_model::Metric> {
221+
) -> Self::Iterator {
212222
let (value, exemplar) = self.get();
213223

214224
let exemplar_proto = if let Some(e) = exemplar.as_ref() {
@@ -220,7 +230,7 @@ where
220230
let mut metric = encode_counter_with_maybe_exemplar(value.clone(), exemplar_proto);
221231
metric.labels = labels;
222232

223-
vec![metric]
233+
vec![metric].iter()
224234
}
225235

226236
fn metric_type(&self) -> MetricType {
@@ -275,15 +285,17 @@ impl EncodeGaugeValue for f64 {
275285
}
276286
}
277287

278-
impl<N, A> EncodeMetric for Gauge<N, A>
288+
impl<'a, N, A> EncodeMetric for Gauge<N, A>
279289
where
280290
N: EncodeGaugeValue,
281291
A: gauge::Atomic<N>,
282292
{
293+
type Iterator = std::slice::Iter<'a, openmetrics_data_model::Metric>;
294+
283295
fn encode(
284296
&self,
285297
labels: Vec<openmetrics_data_model::Label>,
286-
) -> Vec<openmetrics_data_model::Metric> {
298+
) -> Self::Iterator {
287299
let mut metric = openmetrics_data_model::Metric::default();
288300

289301
metric.metric_points = {
@@ -301,7 +313,7 @@ where
301313
};
302314

303315
metric.labels = labels;
304-
vec![metric]
316+
vec![metric].iter()
305317
}
306318

307319
fn metric_type(&self) -> MetricType {
@@ -312,16 +324,18 @@ where
312324
/////////////////////////////////////////////////////////////////////////////////
313325
// Family
314326

315-
impl<S, M, C> EncodeMetric for Family<S, M, C>
327+
impl<'a, S, M, C> EncodeMetric for Family<S, M, C>
316328
where
317329
S: Clone + std::hash::Hash + Eq + EncodeLabel,
318330
M: EncodeMetric + TypedMetric,
319331
C: MetricConstructor<M>,
320332
{
333+
type Iterator = std::slice::Iter<'a, openmetrics_data_model::Metric>;
334+
321335
fn encode(
322336
&self,
323337
labels: Vec<openmetrics_data_model::Label>,
324-
) -> Vec<openmetrics_data_model::Metric> {
338+
) -> Self::Iterator {
325339
let mut metrics = vec![];
326340

327341
let guard = self.read();
@@ -331,7 +345,7 @@ where
331345
metrics.extend(metric.encode(label));
332346
}
333347

334-
metrics
348+
metrics.iter()
335349
}
336350

337351
fn metric_type(&self) -> MetricType {
@@ -342,37 +356,41 @@ where
342356
/////////////////////////////////////////////////////////////////////////////////
343357
// Histogram
344358

345-
impl EncodeMetric for Histogram {
359+
impl<'a> EncodeMetric for Histogram {
360+
type Iterator = std::slice::Iter<'a, openmetrics_data_model::Metric>;
361+
346362
fn encode(
347363
&self,
348364
labels: Vec<openmetrics_data_model::Label>,
349-
) -> Vec<openmetrics_data_model::Metric> {
365+
) -> Self::Iterator {
350366
let (sum, count, buckets) = self.get();
351367
// TODO: Would be better to use never type instead of `()`.
352368
let mut metric = encode_histogram_with_maybe_exemplars::<()>(sum, count, &buckets, None);
353369
metric.labels = labels;
354-
vec![metric]
370+
vec![metric].iter()
355371
}
356372

357373
fn metric_type(&self) -> MetricType {
358374
Self::TYPE
359375
}
360376
}
361377

362-
impl<S> EncodeMetric for HistogramWithExemplars<S>
378+
impl<'a, S> EncodeMetric for HistogramWithExemplars<S>
363379
where
364380
S: EncodeLabel,
365381
{
382+
type Iterator = std::slice::Iter<'a, openmetrics_data_model::Metric>;
383+
366384
fn encode(
367385
&self,
368386
labels: Vec<openmetrics_data_model::Label>,
369-
) -> Vec<openmetrics_data_model::Metric> {
387+
) -> Self::Iterator {
370388
let inner = self.inner();
371389
let (sum, count, buckets) = inner.histogram.get();
372390
let mut metric =
373391
encode_histogram_with_maybe_exemplars(sum, count, &buckets, Some(&inner.exemplars));
374392
metric.labels = labels;
375-
vec![metric]
393+
vec![metric].iter()
376394
}
377395

378396
fn metric_type(&self) -> MetricType {
@@ -423,14 +441,16 @@ fn encode_histogram_with_maybe_exemplars<S: EncodeLabel>(
423441
/////////////////////////////////////////////////////////////////////////////////
424442
// Info
425443

426-
impl<S> EncodeMetric for Info<S>
444+
impl<'a, S> EncodeMetric for Info<S>
427445
where
428446
S: EncodeLabel,
429447
{
448+
type Iterator = std::slice::Iter<'a, openmetrics_data_model::Metric>;
449+
430450
fn encode(
431451
&self,
432452
labels: Vec<openmetrics_data_model::Label>,
433-
) -> Vec<openmetrics_data_model::Metric> {
453+
) -> Self::Iterator {
434454
let mut metric = openmetrics_data_model::Metric::default();
435455

436456
metric.metric_points = {
@@ -450,7 +470,7 @@ where
450470
vec![metric_point]
451471
};
452472

453-
vec![metric]
473+
vec![metric].iter()
454474
}
455475

456476
fn metric_type(&self) -> MetricType {

0 commit comments

Comments
 (0)