racing_scraper/racing/
mod.rs

1use chrono::Utc;
2use std::fs;
3use std::thread::sleep;
4use std::time::Duration;
5use crate::common::model::ScrapingError;
6use crate::racing::sports_bet::fetch::{get_event_detail, get_event_list, get_event_srm};
7use crate::racing::sports_bet::models::{EventDetail};
8use crate::racing::sports_bet::utils::{sb_to_event_detail, sbevent_detail_to_event_detail};
9pub mod sports_bet;
10
11pub async fn generate_data() {
12    let events = get_event_list().await.expect("fetch events failed");
13    println!(
14        "number of events returned from event list api: {}",
15        events.len()
16    );
17    let mut count = 0;
18    for event in events {
19        match get_racing_data(&event.id).await {
20            Ok(event_detail) => {
21                if let Err(e) = write_to_file(event_detail) {
22                    println!("{:?}", e);
23                } else {
24                    count = count + 1;
25                }
26            },
27            Err(e) => {
28                println!("{:?}",e);
29            }
30        }
31        sleep(Duration::from_millis(100));
32
33    }
34    println!("Found valid set for {count} events");
35}
36
37pub async fn get_racing_data(event_id: &u64) -> Result<EventDetail, ScrapingError> {
38    let srm_event_detail_fut = get_event_srm(event_id);
39    let event_detail_fut = get_event_detail(event_id);
40    let sb_event_detail = event_detail_fut.await?;
41    match sb_to_event_detail(&sb_event_detail) {
42        Ok(evt_detail) => Ok(evt_detail),
43        Err(e) => {
44            println!(
45                "Error while building data_set for event id: {} using single api call {:?}",
46                event_id, e
47            );
48            let srm_event_detail = srm_event_detail_fut.await?;
49            let evt_detail = sbevent_detail_to_event_detail(&sb_event_detail, &srm_event_detail)?;
50            Ok(evt_detail)
51        }
52    }
53}
54
55fn write_to_file(event_detail: EventDetail) -> Result<(), ScrapingError>{
56    let path = format!(
57        "{}/{}-{}-{}-{}.json",
58        event_detail.race_type,
59        Utc::now().format("%Y%m%d"),
60        event_detail.race_type,
61        event_detail.meeting_name,
62        event_detail.race_number
63    );
64    fs::create_dir_all(event_detail.race_type.to_string())?;
65    let _ = fs::write(
66        path,
67        serde_json::to_string(&event_detail).unwrap().as_bytes(),
68    )?;
69    Ok(())
70}