Skip to content

Commit 690f211

Browse files
committed
refactor(ads-client): use any for simpler telemetry type
1 parent d4ab496 commit 690f211

File tree

9 files changed

+181
-210
lines changed

9 files changed

+181
-210
lines changed

components/ads-client/src/client.rs

Lines changed: 35 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,14 @@
44
*/
55

66
use std::collections::HashMap;
7-
use std::sync::Arc;
87
use std::time::Duration;
98

109
use crate::client::ad_response::{
1110
pop_request_hash_from_url, AdImage, AdResponse, AdResponseValue, AdSpoc, AdTile,
1211
};
1312
use crate::client::config::AdsClientConfig;
14-
use crate::client::telemetry::ClientOperationEvent;
1513
use crate::error::{RecordClickError, RecordImpressionError, ReportAdError, RequestAdsError};
16-
use crate::http_cache::{CacheOutcome, HttpCache, HttpCacheBuilderError, RequestCachePolicy};
14+
use crate::http_cache::{HttpCache, RequestCachePolicy};
1715
use crate::mars::MARSClient;
1816
use crate::telemetry::Telemetry;
1917
use ad_request::{AdPlacementRequest, AdRequest};
@@ -26,37 +24,22 @@ use crate::http_cache::{ByteSize, HttpCacheError};
2624
pub mod ad_request;
2725
pub mod ad_response;
2826
pub mod config;
29-
pub mod telemetry;
3027

3128
const DEFAULT_TTL_SECONDS: u64 = 300;
3229
const DEFAULT_MAX_CACHE_SIZE_MIB: u64 = 10;
3330

3431
pub struct AdsClient<T>
3532
where
36-
T: Telemetry<CacheOutcome>
37-
+ Telemetry<ClientOperationEvent>
38-
+ Telemetry<HttpCacheBuilderError>
39-
+ Telemetry<RecordClickError>
40-
+ Telemetry<RecordImpressionError>
41-
+ Telemetry<ReportAdError>
42-
+ Telemetry<RequestAdsError>
43-
+ Telemetry<serde_json::Error>,
33+
T: Clone + Telemetry,
4434
{
4535
client: MARSClient<T>,
4636
context_id_component: ContextIDComponent,
47-
telemetry: Arc<T>,
37+
telemetry: T,
4838
}
4939

5040
impl<T> AdsClient<T>
5141
where
52-
T: Telemetry<CacheOutcome>
53-
+ Telemetry<serde_json::Error>
54-
+ Telemetry<ClientOperationEvent>
55-
+ Telemetry<HttpCacheBuilderError>
56-
+ Telemetry<RecordClickError>
57-
+ Telemetry<RecordImpressionError>
58-
+ Telemetry<ReportAdError>
59-
+ Telemetry<RequestAdsError>,
42+
T: Clone + Telemetry,
6043
{
6144
pub fn new(client_config: AdsClientConfig<T>) -> Self {
6245
let context_id = Uuid::new_v4().to_string();
@@ -66,6 +49,7 @@ where
6649
cfg!(test),
6750
Box::new(DefaultContextIdCallback),
6851
);
52+
let telemetry = client_config.telemetry;
6953

7054
// Configure the cache if a path is provided.
7155
// Defaults for ttl and cache size are also set if unspecified.
@@ -85,36 +69,28 @@ where
8569
{
8670
Ok(cache) => Some(cache),
8771
Err(e) => {
88-
client_config.telemetry.record(&e);
72+
telemetry.record(&e);
8973
None
9074
}
9175
};
9276

93-
let client = MARSClient::new(
94-
client_config.environment,
95-
http_cache,
96-
client_config.telemetry.clone(),
97-
);
77+
let client = MARSClient::new(client_config.environment, http_cache, telemetry.clone());
9878
let client = Self {
9979
context_id_component,
10080
client,
101-
telemetry: client_config.telemetry.clone(),
81+
telemetry: telemetry.clone(),
10282
};
103-
client.telemetry.record(&ClientOperationEvent::New);
83+
telemetry.record(&ClientOperationEvent::New);
10484
return client;
10585
}
10686

107-
let client = MARSClient::new(
108-
client_config.environment,
109-
None,
110-
client_config.telemetry.clone(),
111-
);
87+
let client = MARSClient::new(client_config.environment, None, telemetry.clone());
11288
let client = Self {
11389
context_id_component,
11490
client,
115-
telemetry: client_config.telemetry.clone(),
91+
telemetry: telemetry.clone(),
11692
};
117-
client.telemetry.record(&ClientOperationEvent::New);
93+
telemetry.record(&ClientOperationEvent::New);
11894
client
11995
}
12096

@@ -238,19 +214,31 @@ where
238214
}
239215
}
240216

217+
#[derive(Clone, Debug, PartialEq, Eq)]
218+
pub enum ClientOperationEvent {
219+
New,
220+
RecordClick,
221+
RecordImpression,
222+
ReportAd,
223+
RequestAds,
224+
}
225+
241226
#[cfg(test)]
242227
mod tests {
243228
use crate::{
244229
client::config::Environment,
230+
ffi::telemetry::MozAdsTelemetryWrapper,
245231
test_utils::{
246232
get_example_happy_image_response, get_example_happy_spoc_response,
247-
get_example_happy_uatile_response, make_happy_placement_requests, PrintAdsTelemetry,
233+
get_example_happy_uatile_response, make_happy_placement_requests,
248234
},
249235
};
250236

251237
use super::*;
252238

253-
fn new_with_mars_client(client: MARSClient<PrintAdsTelemetry>) -> AdsClient<PrintAdsTelemetry> {
239+
fn new_with_mars_client(
240+
client: MARSClient<MozAdsTelemetryWrapper>,
241+
) -> AdsClient<MozAdsTelemetryWrapper> {
254242
let context_id_component = ContextIDComponent::new(
255243
&uuid::Uuid::new_v4().to_string(),
256244
0,
@@ -260,17 +248,16 @@ mod tests {
260248
AdsClient {
261249
context_id_component,
262250
client,
263-
telemetry: Arc::new(PrintAdsTelemetry),
251+
telemetry: MozAdsTelemetryWrapper::noop(),
264252
}
265253
}
266254

267255
#[test]
268256
fn test_get_context_id() {
269-
use std::sync::Arc;
270257
let config = AdsClientConfig {
271258
environment: Environment::Test,
272259
cache_config: None,
273-
telemetry: Arc::new(PrintAdsTelemetry),
260+
telemetry: MozAdsTelemetryWrapper::noop(),
274261
};
275262
let client = AdsClient::new(config);
276263
let context_id = client.get_context_id().unwrap();
@@ -279,11 +266,10 @@ mod tests {
279266

280267
#[test]
281268
fn test_cycle_context_id() {
282-
use std::sync::Arc;
283269
let config = AdsClientConfig {
284270
environment: Environment::Test,
285271
cache_config: None,
286-
telemetry: Arc::new(PrintAdsTelemetry),
272+
telemetry: MozAdsTelemetryWrapper::noop(),
287273
};
288274
let mut client = AdsClient::new(config);
289275
let old_id = client.get_context_id().unwrap();
@@ -304,8 +290,8 @@ mod tests {
304290
.with_body(serde_json::to_string(&expected_response.data).unwrap())
305291
.create();
306292

307-
let telemetry = Arc::new(PrintAdsTelemetry);
308-
let mars_client = MARSClient::new(Environment::Test, None, telemetry.clone());
293+
let telemetry = MozAdsTelemetryWrapper::noop();
294+
let mars_client = MARSClient::new(Environment::Test, None, telemetry);
309295
let ads_client = new_with_mars_client(mars_client);
310296

311297
let ad_placement_requests = make_happy_placement_requests();
@@ -326,8 +312,8 @@ mod tests {
326312
.with_body(serde_json::to_string(&expected_response.data).unwrap())
327313
.create();
328314

329-
let telemetry = Arc::new(PrintAdsTelemetry);
330-
let mars_client = MARSClient::new(Environment::Test, None, telemetry.clone());
315+
let telemetry = MozAdsTelemetryWrapper::noop();
316+
let mars_client = MARSClient::new(Environment::Test, None, telemetry);
331317
let ads_client = new_with_mars_client(mars_client);
332318

333319
let ad_placement_requests = make_happy_placement_requests();
@@ -348,7 +334,7 @@ mod tests {
348334
.with_body(serde_json::to_string(&expected_response.data).unwrap())
349335
.create();
350336

351-
let telemetry = Arc::new(PrintAdsTelemetry);
337+
let telemetry = MozAdsTelemetryWrapper::noop();
352338
let mars_client = MARSClient::new(Environment::Test, None, telemetry.clone());
353339
let ads_client = new_with_mars_client(mars_client);
354340

@@ -365,7 +351,7 @@ mod tests {
365351
let cache = HttpCache::builder("test_record_click_invalidates_cache")
366352
.build()
367353
.unwrap();
368-
let telemetry = Arc::new(PrintAdsTelemetry);
354+
let telemetry = MozAdsTelemetryWrapper::noop();
369355
let mars_client = MARSClient::new(Environment::Test, Some(cache), telemetry.clone());
370356
let ads_client = new_with_mars_client(mars_client);
371357

components/ads-client/src/client/ad_response.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ pub struct AdResponse<A: AdResponseValue> {
1616
}
1717

1818
impl<A: AdResponseValue> AdResponse<A> {
19-
pub fn parse<T: Telemetry<serde_json::Error> + ?Sized>(
19+
pub fn parse<T: Telemetry>(
2020
data: serde_json::Value,
2121
telemetry: &T,
2222
) -> Result<AdResponse<A>, serde_json::Error> {
@@ -175,7 +175,7 @@ impl AdResponseValue for AdTile {
175175

176176
#[cfg(test)]
177177
mod tests {
178-
use crate::test_utils::PrintAdsTelemetry;
178+
use crate::ffi::telemetry::MozAdsTelemetryWrapper;
179179

180180
use super::*;
181181
use serde_json::{from_str, json};
@@ -317,7 +317,8 @@ mod tests {
317317
]
318318
});
319319

320-
let parsed = AdResponse::<AdImage>::parse(raw_ad_response, &PrintAdsTelemetry).unwrap();
320+
let parsed =
321+
AdResponse::<AdImage>::parse(raw_ad_response, &MozAdsTelemetryWrapper::noop()).unwrap();
321322

322323
let expected = AdResponse {
323324
data: HashMap::from([(
@@ -353,7 +354,8 @@ mod tests {
353354
"example_placement_2": []
354355
});
355356

356-
let parsed = AdResponse::<AdImage>::parse(raw_ad_response, &PrintAdsTelemetry).unwrap();
357+
let parsed =
358+
AdResponse::<AdImage>::parse(raw_ad_response, &MozAdsTelemetryWrapper::noop()).unwrap();
357359

358360
let expected = AdResponse {
359361
data: HashMap::from([]),

components/ads-client/src/client/config.rs

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,9 @@
33
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
44
*/
55

6-
use std::sync::Arc;
7-
86
use once_cell::sync::Lazy;
97
use url::Url;
108

11-
use crate::client::telemetry::ClientOperationEvent;
12-
use crate::error::{RecordClickError, RecordImpressionError, ReportAdError, RequestAdsError};
13-
use crate::http_cache::{CacheOutcome, HttpCacheBuilderError};
149
use crate::telemetry::Telemetry;
1510

1611
static MARS_API_ENDPOINT_PROD: Lazy<Url> =
@@ -22,18 +17,11 @@ static MARS_API_ENDPOINT_STAGING: Lazy<Url> =
2217

2318
pub struct AdsClientConfig<T>
2419
where
25-
T: Telemetry<CacheOutcome>
26-
+ Telemetry<ClientOperationEvent>
27-
+ Telemetry<HttpCacheBuilderError>
28-
+ Telemetry<RecordClickError>
29-
+ Telemetry<RecordImpressionError>
30-
+ Telemetry<ReportAdError>
31-
+ Telemetry<RequestAdsError>
32-
+ Telemetry<serde_json::Error>,
20+
T: Telemetry,
3321
{
3422
pub environment: Environment,
3523
pub cache_config: Option<AdsCacheConfig>,
36-
pub telemetry: Arc<T>,
24+
pub telemetry: T,
3725
}
3826

3927
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]

components/ads-client/src/client/telemetry.rs

Lines changed: 0 additions & 15 deletions
This file was deleted.

components/ads-client/src/ffi.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crate::client::ad_response::{
1313
};
1414
use crate::client::config::{AdsCacheConfig, AdsClientConfig, Environment};
1515
use crate::error::ComponentError;
16-
use crate::ffi::telemetry::{MozAdsTelemetryWrapper, NoopMozAdsTelemetry};
16+
use crate::ffi::telemetry::MozAdsTelemetryWrapper;
1717
use crate::http_cache::{CacheMode, RequestCachePolicy};
1818
use error_support::{ErrorHandling, GetErrorHandling};
1919
use url::Url;
@@ -99,12 +99,8 @@ impl From<MozAdsClientConfig> for AdsClientConfig<MozAdsTelemetryWrapper> {
9999
fn from(config: MozAdsClientConfig) -> Self {
100100
let telemetry = config
101101
.telemetry
102-
.map(|t| Arc::new(MozAdsTelemetryWrapper { inner: t }))
103-
.unwrap_or_else(|| {
104-
Arc::new(MozAdsTelemetryWrapper {
105-
inner: Arc::new(NoopMozAdsTelemetry),
106-
})
107-
});
102+
.map(MozAdsTelemetryWrapper::new)
103+
.unwrap_or_else(MozAdsTelemetryWrapper::noop);
108104
Self {
109105
environment: config.environment.into(),
110106
cache_config: config.cache_config.map(Into::into),

0 commit comments

Comments
 (0)