refactor(web): extract map_details to fix too-many-lines clippy warning

Extract the detail-mapping loop from TimelineEventView::from_domain
into a private map_details helper method, bringing the function under
clippy's 100-line limit.
This commit is contained in:
Jon Seager 2026-02-03 16:39:11 +00:00
parent 9420711a13
commit 4b55d1b65c
No known key found for this signature in database

View file

@ -6,7 +6,7 @@ use crate::domain::gear::Gear;
use crate::domain::listing::{DEFAULT_PAGE_SIZE, ListRequest, Page, PageSize, SortKey}; use crate::domain::listing::{DEFAULT_PAGE_SIZE, ListRequest, Page, PageSize, SortKey};
use crate::domain::roasters::Roaster; use crate::domain::roasters::Roaster;
use crate::domain::roasts::{Roast, RoastWithRoaster}; use crate::domain::roasts::{Roast, RoastWithRoaster};
use crate::domain::timeline::TimelineEvent; use crate::domain::timeline::{TimelineEvent, TimelineEventDetail};
pub struct Paginated<T> { pub struct Paginated<T> {
pub items: Vec<T>, pub items: Vec<T>,
@ -542,36 +542,7 @@ impl TimelineEventView {
_ => String::from("#"), _ => String::from("#"),
}; };
let mut mapped_details = Vec::new(); let (mapped_details, external_link) = Self::map_details(details);
let mut external_link = None;
for detail in details {
if detail.label.eq_ignore_ascii_case("homepage")
|| detail.label.eq_ignore_ascii_case("website")
{
let trimmed = detail.value.trim();
if !trimmed.is_empty() && trimmed != "" {
external_link = Some(trimmed.to_string());
}
} else if detail.label.eq_ignore_ascii_case("position") {
let trimmed = detail.value.trim();
if !trimmed.is_empty() {
let display = trimmed
.strip_prefix("https://www.google.com/maps?q=")
.unwrap_or(trimmed);
mapped_details.push(TimelineEventDetailView {
label: detail.label,
value: display.to_string(),
link: Some(trimmed.to_string()),
});
}
} else {
mapped_details.push(TimelineEventDetailView {
label: detail.label,
value: detail.value,
link: None,
});
}
}
let tasting_notes = if entity_type == "roast" { let tasting_notes = if entity_type == "roast" {
let notes = tasting_notes let notes = tasting_notes
@ -613,6 +584,42 @@ impl TimelineEventView {
brew_data: brew_data_view, brew_data: brew_data_view,
} }
} }
fn map_details(
details: Vec<TimelineEventDetail>,
) -> (Vec<TimelineEventDetailView>, Option<String>) {
let mut mapped = Vec::new();
let mut external_link = None;
for detail in details {
if detail.label.eq_ignore_ascii_case("homepage")
|| detail.label.eq_ignore_ascii_case("website")
{
let trimmed = detail.value.trim();
if !trimmed.is_empty() && trimmed != "" {
external_link = Some(trimmed.to_string());
}
} else if detail.label.eq_ignore_ascii_case("position") {
let trimmed = detail.value.trim();
if !trimmed.is_empty() {
let display = trimmed
.strip_prefix("https://www.google.com/maps?q=")
.unwrap_or(trimmed);
mapped.push(TimelineEventDetailView {
label: detail.label,
value: display.to_string(),
link: Some(trimmed.to_string()),
});
}
} else {
mapped.push(TimelineEventDetailView {
label: detail.label,
value: detail.value,
link: None,
});
}
}
(mapped, external_link)
}
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]