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(())
}