diff options
author | 2022-08-19 21:39:04 -0700 | |
---|---|---|
committer | 2022-08-19 21:39:04 -0700 | |
commit | 9bd4a6b7e6ba217d7f9a34d538c80b7c468bfbf2 (patch) | |
tree | 4ed0b41f627a676f523adf9d77c2ebd2f26a6501 /rust/scraper/src | |
parent | f7d0cea466b391c467b1767d65557d3dc027c5fb (diff) | |
download | touchpad-9bd4a6b7e6ba217d7f9a34d538c80b7c468bfbf2.tar.gz touchpad-9bd4a6b7e6ba217d7f9a34d538c80b7c468bfbf2.tar.zst touchpad-9bd4a6b7e6ba217d7f9a34d538c80b7c468bfbf2.zip |
Adds relay_event method to TouchpadLiveClient
Diffstat (limited to 'rust/scraper/src')
-rw-r--r-- | rust/scraper/src/touchpad/mod.rs | 85 |
1 files changed, 75 insertions, 10 deletions
diff --git a/rust/scraper/src/touchpad/mod.rs b/rust/scraper/src/touchpad/mod.rs index d263dbe..182edc9 100644 --- a/rust/scraper/src/touchpad/mod.rs +++ b/rust/scraper/src/touchpad/mod.rs @@ -75,7 +75,7 @@ impl<'a> TouchpadLiveClient<'a> { } pub async fn events(&self, id: u32) -> Result<Vec<v1::Event>, TouchpadLiveError> { - let events = get_events(self.client.clone(), &self.url, id).await?; + let events = get_events(self, id).await?; events.into_iter() .map(|ev| Ok(v1::Event { @@ -116,7 +116,7 @@ impl<'a> TouchpadLiveClient<'a> { .collect() ); - let events = get_events(self.client.clone(), &self.url, id); + let events = get_events(self, id); future::try_join3(swimmers, swimmer_map, events) } @@ -127,9 +127,9 @@ impl<'a> TouchpadLiveClient<'a> { pub async fn individual_event(&self, meet_id: u32, ev_id: u32) -> Result<v1::Event, TouchpadLiveError> { let (events, times) = { - let events = get_events(self.client.clone(), &self.url, meet_id); + let events = get_events(self, meet_id); - let event = get_event(self.client.clone(), &self.url, "individual", meet_id, ev_id); + let event = get_event(self, "individual", meet_id, ev_id); future::try_join(events, event) }.await?; @@ -141,12 +141,35 @@ impl<'a> TouchpadLiveClient<'a> { create_individual_event_proto(meet_id, event, times) } + + pub async fn relay_event(&self, meet_id: u32, ev_id: u32) -> Result<v1::Event, TouchpadLiveError> { + let (events, times) = { + let events = get_events(self, meet_id); + let event = get_event(self, "relay", meet_id, ev_id); + + future::try_join(events, event) + }.await?; + + let event = events + .into_iter() + .find(|ev| ev.id == ev_id) + .ok_or(TouchpadLiveError::NotFoundError)?; + + create_relay_event_proto(meet_id, event, times) + } } /// Gets the events for a meet from TouchpadLive -async fn get_events(client: Client, base_url: &str, id: u32) -> Result<Vec<EventsResponse>, TouchpadLiveError> { - Ok(client - .get(format!("{}/meets/{}/events", base_url, id)) +/// +/// # Arguments +/// +/// * `client`: TouchpadLiveClient +/// * `id`: Meet ID +/// +/// returns: Result<Vec<EventsResponse, Global>, TouchpadLiveError> +async fn get_events(client: &TouchpadLiveClient<'_>, id: u32) -> Result<Vec<EventsResponse>, TouchpadLiveError> { + Ok(client.client + .get(format!("{}/meets/{}/events", client.url, id)) .send() .await? .json() @@ -154,9 +177,18 @@ async fn get_events(client: Client, base_url: &str, id: u32) -> Result<Vec<Event } /// Gets event timings given a meet_id, ev_id, and event type (tp) -async fn get_event(client: Client, base_url: &str, tp: &str, meet_id: u32, ev_id: u32) -> Result<Vec<EventTimeResponse>, TouchpadLiveError> { - Ok(client - .get(format!("{}/meets/{}/{}/{}", base_url, meet_id, tp, ev_id)) +/// +/// # Arguments +/// +/// * `client`: TouchpadLiveClient +/// * `tp`: Type of event ('individual' or 'relay') +/// * `meet_id`: Meet ID +/// * `ev_id`: Event ID +/// +/// returns: Result<Vec<EventTimeResponse, Global>, TouchpadLiveError> +async fn get_event(client: &TouchpadLiveClient<'_>, tp: &str, meet_id: u32, ev_id: u32) -> Result<Vec<EventTimeResponse>, TouchpadLiveError> { + Ok(client.client + .get(format!("{}/meets/{}/{}/{}", client.url, meet_id, tp, ev_id)) .send() .await? .json() @@ -233,6 +265,39 @@ fn create_individual_event_proto( }) } +fn create_relay_event_proto( + meet_id: u32, + event: EventsResponse, + times: Vec<EventTimeResponse>, +) -> Result<v1::Event, TouchpadLiveError> { + let ev_id = event.id; + + let proto_times = times + .into_iter() + .filter_map(|mut t| Some(v1::relay_event::RelayEventTime { + name: t.name.take()?, + time: Some(t.into_proto(ev_id)), + })) + .collect(); + + Ok(v1::Event { + age_hi: event.age_hi as u32, + age_lo: event.age_lo as u32, + distance: event.distance, + event_num: event.event_number.parse()?, + gender: v1::Gender::from_touchpad(event.gender.as_str()) as i32, + id: ev_id, + meet_id, + stroke: v1::Stroke::from_touchpad(event.stroke.as_str()) as i32, + is_relay: event.relay, + event: Some(v1::event::Event::Relay( + v1::RelayEvent { + times: proto_times + } + )), + }) +} + #[cfg(test)] mod tests { use chrono::{TimeZone, Utc}; |