summaryrefslogtreecommitdiff
path: root/rust/scraper/src
diff options
context:
space:
mode:
authorGravatar Anshul Gupta <ansg191@yahoo.com> 2022-08-19 21:39:04 -0700
committerGravatar Anshul Gupta <ansg191@yahoo.com> 2022-08-19 21:39:04 -0700
commit9bd4a6b7e6ba217d7f9a34d538c80b7c468bfbf2 (patch)
tree4ed0b41f627a676f523adf9d77c2ebd2f26a6501 /rust/scraper/src
parentf7d0cea466b391c467b1767d65557d3dc027c5fb (diff)
downloadtouchpad-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.rs85
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};