1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
use chrono::Utc;
use std::fs;
use std::thread::sleep;
use std::time::Duration;
use crate::common::model::ScrapingError;
use crate::racing::sports_bet::fetch::{get_event_detail, get_event_list, get_event_srm};
use crate::racing::sports_bet::models::{EventDetail};
use crate::racing::sports_bet::utils::{sb_to_event_detail, sbevent_detail_to_event_detail};
pub mod sports_bet;

pub async fn generate_data() {
    let events = get_event_list().await.expect("fetch events failed");
    println!(
        "number of events returned from event list api: {}",
        events.len()
    );
    let mut count = 0;
    for event in events {
        match get_racing_data(&event.id).await {
            Ok(event_detail) => {
                if let Err(e) = write_to_file(event_detail) {
                    println!("{:?}", e);
                } else {
                    count = count + 1;
                }
            },
            Err(e) => {
                println!("{:?}",e);
            }
        }
        sleep(Duration::from_millis(100));

    }
    println!("Found valid set for {count} events");
}

pub async fn get_racing_data(event_id: &u64) -> Result<EventDetail, ScrapingError> {
    let srm_event_detail_fut = get_event_srm(event_id);
    let event_detail_fut = get_event_detail(event_id);
    let sb_event_detail = event_detail_fut.await?;
    match sb_to_event_detail(&sb_event_detail) {
        Ok(evt_detail) => Ok(evt_detail),
        Err(e) => {
            println!(
                "Error while building data_set for event id: {} using single api call {:?}",
                event_id, e
            );
            let srm_event_detail = srm_event_detail_fut.await?;
            let evt_detail = sbevent_detail_to_event_detail(&sb_event_detail, &srm_event_detail)?;
            Ok(evt_detail)
        }
    }
}

fn write_to_file(event_detail: EventDetail) -> Result<(), ScrapingError>{
    let path = format!(
        "{}/{}-{}-{}-{}.json",
        event_detail.race_type,
        Utc::now().format("%Y%m%d"),
        event_detail.race_type,
        event_detail.meeting_name,
        event_detail.race_number
    );
    fs::create_dir_all(event_detail.race_type.to_string())?;
    let _ = fs::write(
        path,
        serde_json::to_string(&event_detail).unwrap().as_bytes(),
    )?;
    Ok(())
}