Skip to content

Commit 4026b21

Browse files
committed
Refactor HostName.
- The internal structure is now private. - Use ::try_from or parse() to create the type. - Rename as_str and as_string to to_str and to_string.
1 parent 17fc1a0 commit 4026b21

File tree

6 files changed

+55
-55
lines changed

6 files changed

+55
-55
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,17 @@ async fn main() -> Result<(), CVMFSScraperError> {
2222
Server::new(
2323
ServerType::Stratum1,
2424
ServerBackendType::CVMFS,
25-
Hostname("azure-us-east-s1.eessi.science".to_string()),
25+
Hostname::try_from("azure-us-east-s1.eessi.science")?,
2626
),
2727
Server::new(
2828
ServerType::Stratum1,
2929
ServerBackendType::AutoDetect,
30-
Hostname("aws-eu-central-s1.eessi.science".to_string()),
30+
Hostname::try_from("aws-eu-central-s1.eessi.science")?,
3131
),
3232
Server::new(
3333
ServerType::SyncServer,
3434
ServerBackendType::S3,
35-
Hostname("aws-eu-west-s1-sync.eessi.science".to_string()),
35+
Hostname::try_from("aws-eu-west-s1-sync.eessi.science")?,
3636
),
3737
];
3838
let repolist = vec!["software.eessi.io", "dev.eessi.io", "riscv.eessi.io"];

src/lib.rs

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
//! # Examples
2020
//!
2121
//! ```no_run
22-
//! use cvmfs_server_scraper::{Hostname, Server, ServerBackendType, ServerType
22+
//! use cvmfs_server_scraper::{Hostname, Server, ServerBackendType, ServerType,
2323
//! ScrapedServer, ScraperCommon, Scraper, CVMFSScraperError, DEFAULT_GEOAPI_SERVERS};
2424
//!
2525
//! #[tokio::main]
@@ -28,17 +28,17 @@
2828
//! Server::new(
2929
//! ServerType::Stratum1,
3030
//! ServerBackendType::CVMFS,
31-
//! Hostname("azure-us-east-s1.eessi.science".to_string()),
31+
//! Hostname::try_from("azure-us-east-s1.eessi.science").unwrap(),
3232
//! ),
3333
//! Server::new(
3434
//! ServerType::Stratum1,
3535
//! ServerBackendType::AutoDetect,
36-
//! Hostname("aws-eu-central-s1.eessi.science".to_string()),
36+
//! Hostname::try_from("aws-eu-central-s1.eessi.science").unwrap(),
3737
//! ),
3838
//! Server::new(
3939
//! ServerType::SyncServer,
4040
//! ServerBackendType::S3,
41-
//! Hostname("aws-eu-west-s1-sync.eessi.science".to_string()),
41+
//! Hostname::try_from("aws-eu-west-s1-sync.eessi.science").unwrap(),
4242
//! ),
4343
//! ];
4444
//!
@@ -98,17 +98,17 @@ mod tests {
9898
Server::new(
9999
ServerType::Stratum1,
100100
ServerBackendType::CVMFS,
101-
Hostname("azure-us-east-s1.eessi.science".to_string()),
101+
Hostname::try_from("azure-us-east-s1.eessi.science").unwrap(),
102102
),
103103
Server::new(
104104
ServerType::Stratum1,
105105
ServerBackendType::CVMFS,
106-
Hostname("aws-eu-central-s1.eessi.science".to_string()),
106+
Hostname::try_from("aws-eu-central-s1.eessi.science").unwrap(),
107107
),
108108
Server::new(
109109
ServerType::SyncServer,
110110
ServerBackendType::S3,
111-
Hostname("aws-eu-west-s1-sync.eessi.science".to_string()),
111+
Hostname::try_from("aws-eu-west-s1-sync.eessi.science").unwrap(),
112112
),
113113
];
114114

@@ -138,7 +138,7 @@ mod tests {
138138
let server = Server::new(
139139
ServerType::Stratum0,
140140
ServerBackendType::CVMFS,
141-
Hostname("aws-eu-central-s1.eessi.science".to_string()),
141+
Hostname::try_from("aws-eu-central-s1.eessi.science").unwrap(),
142142
);
143143

144144
let repolist = vec!["software.eessi.io", "dev.eessi.io"];
@@ -158,7 +158,7 @@ mod tests {
158158
let server = Server::new(
159159
ServerType::Stratum1,
160160
ServerBackendType::CVMFS,
161-
Hostname("aws-eu-central-s1.eessi.science".to_string()),
161+
Hostname::try_from("aws-eu-central-s1.eessi.science").unwrap(),
162162
);
163163

164164
let repolist = vec!["software.eessi.io", "dev.eessi.io", "riscv.eessi.io"];
@@ -181,7 +181,7 @@ mod tests {
181181
let server = Server::new(
182182
ServerType::Stratum1,
183183
ServerBackendType::AutoDetect,
184-
Hostname("aws-eu-central-s1.eessi.science".to_string()),
184+
Hostname::try_from("aws-eu-central-s1.eessi.science").unwrap(),
185185
);
186186

187187
let repolist = vec!["software.eessi.io", "dev.eessi.io", "riscv.eessi.io"];
@@ -199,7 +199,7 @@ mod tests {
199199
let server = Server::new(
200200
ServerType::Stratum1,
201201
ServerBackendType::AutoDetect,
202-
Hostname("aws-eu-central-s1.eessi.science".to_string()),
202+
Hostname::try_from("aws-eu-central-s1.eessi.science").unwrap(),
203203
);
204204

205205
let repoparams: Vec<String> = Vec::new();
@@ -215,7 +215,7 @@ mod tests {
215215
let server = Server::new(
216216
ServerType::Stratum1,
217217
ServerBackendType::AutoDetect,
218-
Hostname("aws-eu-west-s1-sync.eessi.science".to_string()),
218+
Hostname::try_from("aws-eu-west-s1-sync.eessi.science").unwrap(),
219219
);
220220

221221
let repolist = vec!["software.eessi.io", "dev.eessi.io", "riscv.eessi.io"];
@@ -233,7 +233,7 @@ mod tests {
233233
let server = Server::new(
234234
ServerType::Stratum1,
235235
ServerBackendType::CVMFS,
236-
Hostname("aws-eu-central-s1.eessi.science".to_string()),
236+
Hostname::try_from("aws-eu-central-s1.eessi.science").unwrap(),
237237
);
238238

239239
let repolist = vec!["software.eessi.io", "dev.eessi.io", "riscv.eessi.io"];
@@ -264,7 +264,7 @@ mod tests {
264264
let server = Server::new(
265265
ServerType::SyncServer,
266266
ServerBackendType::S3,
267-
Hostname("aws-eu-west-s1-sync.eessi.science".to_string()),
267+
Hostname::try_from("aws-eu-west-s1-sync.eessi.science").unwrap(),
268268
);
269269

270270
let repolist = vec!["software.eessi.io", "dev.eessi.io", "riscv.eessi.io"];
@@ -286,7 +286,7 @@ mod tests {
286286
let server = Server::new(
287287
ServerType::Stratum1,
288288
ServerBackendType::CVMFS,
289-
Hostname("aws-eu-central-s1.eessi.science".to_string()),
289+
Hostname::try_from("aws-eu-central-s1.eessi.science").unwrap(),
290290
);
291291

292292
let repolist = vec!["software.eessi.io", "dev.eessi.io", "riscv.eessi.io"];
@@ -312,17 +312,17 @@ mod tests {
312312
Server::new(
313313
ServerType::Stratum1,
314314
ServerBackendType::CVMFS,
315-
Hostname("azure-us-east-s1.eessi.science".to_string()),
315+
Hostname::try_from("azure-us-east-s1.eessi.science").unwrap(),
316316
),
317317
Server::new(
318318
ServerType::Stratum1,
319319
ServerBackendType::AutoDetect,
320-
Hostname("aws-eu-central-s1.eessi.science".to_string()),
320+
Hostname::try_from("aws-eu-central-s1.eessi.science").unwrap(),
321321
),
322322
Server::new(
323323
ServerType::SyncServer,
324324
ServerBackendType::S3,
325-
Hostname("aws-eu-west-s1-sync.eessi.science".to_string()),
325+
Hostname::try_from("aws-eu-west-s1-sync.eessi.science").unwrap(),
326326
),
327327
]);
328328

@@ -350,7 +350,7 @@ mod tests {
350350
.with_servers(vec![Server::new(
351351
ServerType::Stratum1,
352352
ServerBackendType::AutoDetect,
353-
Hostname("aws-eu-central-s1.eessi.science".to_string()),
353+
Hostname::try_from("aws-eu-central-s1.eessi.science").unwrap(),
354354
)]);
355355

356356
let results = scraper.validate().unwrap().scrape().await;

src/models/generic.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ use crate::errors::{HostnameError, ManifestError, ScrapeError};
88
/// This type is used to represent a hostname string. It is a wrapper around a `String` and
99
/// provides validation for hostnames.
1010
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
11-
pub struct Hostname(pub String);
11+
pub struct Hostname(String);
1212

1313
impl std::str::FromStr for Hostname {
1414
type Err = HostnameError;
1515

16-
fn from_str(s: &str) -> Result<Self, HostnameError> {
16+
fn from_str(s: &str) -> Result<Self, Self::Err> {
1717
if s.len() > 255 {
1818
return Err(HostnameError::TooLong(s.to_string()));
1919
}
@@ -67,11 +67,11 @@ impl TryFrom<String> for Hostname {
6767
}
6868

6969
impl Hostname {
70-
pub fn as_str(&self) -> &str {
70+
pub fn to_str(&self) -> &str {
7171
&self.0
7272
}
7373

74-
pub fn as_string(&self) -> String {
74+
pub fn to_string(&self) -> String {
7575
self.0.clone()
7676
}
7777
}
@@ -274,12 +274,12 @@ mod tests {
274274
#[test]
275275
fn test_hostname_as_str() {
276276
let hostname = Hostname("example.com".to_string());
277-
assert_eq!(hostname.as_str(), "example.com");
277+
assert_eq!(hostname.to_str(), "example.com");
278278
}
279279

280280
#[test]
281281
fn test_hostname_as_string() {
282282
let hostname = Hostname("example.com".to_string());
283-
assert_eq!(hostname.as_string(), "example.com");
283+
assert_eq!(hostname.to_string(), "example.com");
284284
}
285285
}

src/models/geoapi.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ impl GeoapiServerQuery {
8585
if self.response.len() != self.geoapi_hosts.len() {
8686
return Err(ScrapeError::GeoAPIFailure(format!(
8787
"GeoAPI response count mismatch for repository {}: expected {}, got {}",
88-
self.hostname.0,
88+
self.hostname,
8989
self.geoapi_hosts.len(),
9090
self.response.len()
9191
)));

src/models/servers.rs

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ impl Server {
138138
backend_type: ServerBackendType,
139139
hostname: Hostname,
140140
) -> Self {
141-
trace!("Creating server object for {}", hostname.0);
141+
trace!("Creating server object for {}", hostname);
142142
Server {
143143
server_type,
144144
backend_type,
@@ -176,7 +176,7 @@ impl Server {
176176
where
177177
R: AsRef<str> + std::fmt::Display + Clone,
178178
{
179-
debug!("Scraping server {}", self.hostname.0);
179+
debug!("Scraping server {}", self.hostname);
180180

181181
let geoapi_servers = match geoapi_servers {
182182
Some(servers) => servers,
@@ -216,7 +216,7 @@ impl Server {
216216
match self.backend_type {
217217
ServerBackendType::AutoDetect => match self.fetch_repos_json(&client).await {
218218
Ok(repo_json) => {
219-
debug!("Detected CVMFS backend for {}", self.hostname.0);
219+
debug!("Detected CVMFS backend for {}", self.hostname);
220220
match self.validate_repo_json_and_server_type(&repo_json) {
221221
Ok(_) => {}
222222
Err(error) => return ScrapedServer::Failed(self.as_failed_server(error)),
@@ -238,7 +238,7 @@ impl Server {
238238
}
239239
Err(error) => match error {
240240
ScrapeError::FetchError(_) => {
241-
debug!("Detected S3 backend for {}", self.hostname.0);
241+
debug!("Detected S3 backend for {}", self.hostname);
242242
backend_detected = ServerBackendType::S3;
243243
}
244244
_ => return ScrapedServer::Failed(self.as_failed_server(error.into())),
@@ -248,10 +248,10 @@ impl Server {
248248
if all_repos.is_empty() {
249249
error!(
250250
"Empty repository list with explicit S3 backend: {}",
251-
self.hostname.0
251+
self.hostname
252252
);
253253
return ScrapedServer::Failed(self.as_failed_server(
254-
ScrapeError::EmptyRepositoryList(self.hostname.0.clone()).into(),
254+
ScrapeError::EmptyRepositoryList(self.hostname.to_string()).into(),
255255
));
256256
}
257257
}
@@ -341,15 +341,15 @@ impl Server {
341341
) -> Result<RepositoriesJSON, ScrapeError> {
342342
fetch_json(
343343
client,
344-
format!("http://{}/cvmfs/info/v1/repositories.json", self.hostname.0),
344+
format!("http://{}/cvmfs/info/v1/repositories.json", self.hostname),
345345
)
346346
.await
347347
}
348348

349349
async fn fetch_meta_json(&self, client: &reqwest::Client) -> Result<MetaJSON, ScrapeError> {
350350
fetch_json(
351351
client,
352-
format!("http://{}/cvmfs/info/v1/meta.json", self.hostname.0),
352+
format!("http://{}/cvmfs/info/v1/meta.json", self.hostname),
353353
)
354354
.await
355355
}
@@ -363,7 +363,7 @@ impl Server {
363363
) -> Result<GeoapiServerQuery, ScrapeError> {
364364
// S3 servers do not have GeoAPI support. S3 _is_ the GeoAPI.
365365
if *backend_type == ServerBackendType::S3 {
366-
debug!("Skipping GeoAPI for S3 server {}", self.hostname.0);
366+
debug!("Skipping GeoAPI for S3 server {}", self.hostname);
367367
return Ok(GeoapiServerQuery {
368368
hostname: self.hostname.clone(),
369369
geoapi_hosts,
@@ -374,17 +374,17 @@ impl Server {
374374
let random_string = generate_random_string(12);
375375
trace!(
376376
"Fetching geoapi for {} (using {} as the random string)",
377-
self.hostname.0,
377+
self.hostname,
378378
random_string
379379
);
380380
let url = format!(
381381
"http://{}/cvmfs/{}/api/v1.0/geo/{}/{}",
382-
self.hostname.0,
382+
self.hostname,
383383
repository_name,
384384
random_string,
385385
geoapi_hosts
386386
.iter()
387-
.map(|hostname| hostname.as_str())
387+
.map(|hostname| hostname.to_str())
388388
.collect::<Vec<&str>>()
389389
.join(",")
390390
);
@@ -403,7 +403,7 @@ impl Server {
403403
Err(_) => {
404404
let error_string = format!(
405405
"Failed to fetch geoapi for {} on {:?} (with {})",
406-
self.hostname.0, self.backend_type, random_string
406+
self.hostname, self.backend_type, random_string
407407
);
408408
warn!("{}", error_string);
409409
return Err(ScrapeError::GeoAPIFailure(error_string));
@@ -421,24 +421,24 @@ impl Server {
421421
&self,
422422
repo_json: &RepositoriesJSON,
423423
) -> Result<(), CVMFSScraperError> {
424-
trace!("Validating {}", self.hostname.0);
424+
trace!("Validating {}", self.hostname);
425425
match (self.server_type, repo_json.replicas.is_empty()) {
426426
(ServerType::Stratum0, false) => Err(CVMFSScraperError::ScrapeError(
427427
ScrapeError::ServerTypeMismatch(format!(
428428
"{} is a Stratum0 server, but replicas were found in the repositories.json",
429-
self.hostname.0
429+
self.hostname
430430
)),
431431
)),
432432
(ServerType::Stratum1, true) => Err(CVMFSScraperError::ScrapeError(
433433
ScrapeError::ServerTypeMismatch(format!(
434434
"{} is a Stratum1 server, but no replicas were found in the repositories.json",
435-
self.hostname.0
435+
self.hostname
436436
)),
437437
)),
438438
(ServerType::SyncServer, true) => Err(CVMFSScraperError::ScrapeError(
439439
ScrapeError::ServerTypeMismatch(format!(
440440
"{} is a SyncServer, but no replicas were found in the repositories.json",
441-
self.hostname.0
441+
self.hostname
442442
)),
443443
)),
444444
_ => Ok(()),
@@ -477,7 +477,7 @@ impl std::fmt::Display for PopulatedServer {
477477
write!(
478478
f,
479479
"{} ({:?}, {:?})",
480-
self.hostname.0, self.server_type, self.backend_type
480+
self.hostname, self.server_type, self.backend_type
481481
)
482482
}
483483
}
@@ -671,7 +671,7 @@ impl RepositoryOrReplica {
671671
) -> Result<Manifest, ManifestError> {
672672
let url = format!(
673673
"http://{}/cvmfs/{}/.cvmfspublished",
674-
self.server.hostname.0, self.name
674+
self.server.hostname, self.name
675675
);
676676
let response = client.get(url).send().await?;
677677
response.error_for_status()?.text().await?.parse()
@@ -685,7 +685,7 @@ impl RepositoryOrReplica {
685685
client,
686686
format!(
687687
"http://{}/cvmfs/{}/.cvmfs_status.json",
688-
self.server.hostname.0, self.name
688+
self.server.hostname, self.name
689689
),
690690
)
691691
.await

0 commit comments

Comments
 (0)