added changes saving to seperate folder
This commit is contained in:
60
src/main.rs
60
src/main.rs
@@ -274,11 +274,16 @@ fn detect_changes(old: &EconomicEvent, new: &EconomicEvent, now: &str) -> Vec<Ev
|
|||||||
let mut changes = Vec::new();
|
let mut changes = Vec::new();
|
||||||
let timestamp = Local::now().format("%Y-%m-%d %H:%M:%S").to_string();
|
let timestamp = Local::now().format("%Y-%m-%d %H:%M:%S").to_string();
|
||||||
|
|
||||||
|
println!("🔍 Checking event: {} on {} (now: {})", new.event, new.date, now);
|
||||||
|
|
||||||
// Only track changes for future events
|
// Only track changes for future events
|
||||||
if new.date.as_str() <= now {
|
if new.date.as_str() <= now {
|
||||||
|
println!(" ⏭️ Skipped: Event is in the past/today");
|
||||||
return changes;
|
return changes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
println!(" 📅 Event is in the future - checking for changes...");
|
||||||
|
|
||||||
let fields = [
|
let fields = [
|
||||||
("actual", &old.actual, &new.actual),
|
("actual", &old.actual, &new.actual),
|
||||||
("forecast", &old.forecast, &new.forecast),
|
("forecast", &old.forecast, &new.forecast),
|
||||||
@@ -288,6 +293,8 @@ fn detect_changes(old: &EconomicEvent, new: &EconomicEvent, now: &str) -> Vec<Ev
|
|||||||
|
|
||||||
for (field_name, old_val, new_val) in fields {
|
for (field_name, old_val, new_val) in fields {
|
||||||
if old_val != new_val {
|
if old_val != new_val {
|
||||||
|
println!(" 🔄 CHANGE DETECTED in '{}': '{}' -> '{}'",
|
||||||
|
field_name, old_val, new_val);
|
||||||
changes.push(EventChange {
|
changes.push(EventChange {
|
||||||
date: new.date.clone(),
|
date: new.date.clone(),
|
||||||
event: new.event.clone(),
|
event: new.event.clone(),
|
||||||
@@ -300,6 +307,12 @@ fn detect_changes(old: &EconomicEvent, new: &EconomicEvent, now: &str) -> Vec<Ev
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if changes.is_empty() {
|
||||||
|
println!(" ✅ No changes detected");
|
||||||
|
} else {
|
||||||
|
println!(" 🎯 Total changes: {}", changes.len());
|
||||||
|
}
|
||||||
|
|
||||||
changes
|
changes
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -387,11 +400,14 @@ async fn load_existing_events(chunks: &[ChunkInfo]) -> anyhow::Result<HashMap<St
|
|||||||
/// Save or append changes to monthly change files
|
/// Save or append changes to monthly change files
|
||||||
async fn save_changes(changes: &[EventChange]) -> anyhow::Result<()> {
|
async fn save_changes(changes: &[EventChange]) -> anyhow::Result<()> {
|
||||||
if changes.is_empty() {
|
if changes.is_empty() {
|
||||||
|
println!("ℹ️ No changes to save");
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
let events_dir = PathBuf::from("economic_events");
|
println!("\n💾 Saving {} changes...", changes.len());
|
||||||
fs::create_dir_all(&events_dir).await?;
|
|
||||||
|
let changes_dir = PathBuf::from("economic_event_changes");
|
||||||
|
fs::create_dir_all(&changes_dir).await?;
|
||||||
|
|
||||||
// Group changes by month
|
// Group changes by month
|
||||||
let mut changes_by_month: HashMap<String, Vec<EventChange>> = HashMap::new();
|
let mut changes_by_month: HashMap<String, Vec<EventChange>> = HashMap::new();
|
||||||
@@ -403,12 +419,21 @@ async fn save_changes(changes: &[EventChange]) -> anyhow::Result<()> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
println!("📂 Grouped into {} month(s)", changes_by_month.len());
|
||||||
|
|
||||||
// Save each month's changes
|
// Save each month's changes
|
||||||
for (month_key, month_changes) in changes_by_month {
|
for (month_key, month_changes) in changes_by_month {
|
||||||
let filename = format!("event_changes_{}.json", month_key);
|
let filename = format!("event_changes_{}.json", month_key);
|
||||||
let filepath = events_dir.join(&filename);
|
let filepath = changes_dir.join(&filename);
|
||||||
|
|
||||||
// Load existing changes if file exists
|
// Load existing changes if file exists
|
||||||
|
let existing_count = if filepath.exists() {
|
||||||
|
let content = fs::read_to_string(&filepath).await?;
|
||||||
|
serde_json::from_str::<Vec<EventChange>>(&content).unwrap_or_default().len()
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
let mut all_changes = if filepath.exists() {
|
let mut all_changes = if filepath.exists() {
|
||||||
let content = fs::read_to_string(&filepath).await?;
|
let content = fs::read_to_string(&filepath).await?;
|
||||||
serde_json::from_str::<Vec<EventChange>>(&content).unwrap_or_default()
|
serde_json::from_str::<Vec<EventChange>>(&content).unwrap_or_default()
|
||||||
@@ -417,13 +442,14 @@ async fn save_changes(changes: &[EventChange]) -> anyhow::Result<()> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Append new changes
|
// Append new changes
|
||||||
all_changes.extend(month_changes);
|
all_changes.extend(month_changes.clone());
|
||||||
|
|
||||||
// Save combined changes
|
// Save combined changes
|
||||||
let json = serde_json::to_string_pretty(&all_changes)?;
|
let json = serde_json::to_string_pretty(&all_changes)?;
|
||||||
fs::write(&filepath, json).await?;
|
fs::write(&filepath, json).await?;
|
||||||
|
|
||||||
println!("🔄 Updated changes file: {} ({} total changes)", filename, all_changes.len());
|
println!(" ✅ {}: {} existing + {} new = {} total changes",
|
||||||
|
filename, existing_count, month_changes.len(), all_changes.len());
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -523,6 +549,9 @@ async fn scrape_and_update(
|
|||||||
let mut all_changes = Vec::new();
|
let mut all_changes = Vec::new();
|
||||||
let now = Local::now().naive_local().date().format("%Y-%m-%d").to_string();
|
let now = Local::now().naive_local().date().format("%Y-%m-%d").to_string();
|
||||||
|
|
||||||
|
println!("📅 Current date for comparison: {}", now);
|
||||||
|
println!("🔍 Starting change detection...\n");
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
set_date_range(client, ¤t_start, end).await?;
|
set_date_range(client, ¤t_start, end).await?;
|
||||||
sleep(Duration::from_secs(3)).await;
|
sleep(Duration::from_secs(3)).await;
|
||||||
@@ -536,22 +565,38 @@ async fn scrape_and_update(
|
|||||||
println!(" 📦 Fetched {} events", events.len());
|
println!(" 📦 Fetched {} events", events.len());
|
||||||
|
|
||||||
// Process events: detect changes and update map
|
// Process events: detect changes and update map
|
||||||
|
let mut new_events_count = 0;
|
||||||
|
let mut updated_events_count = 0;
|
||||||
|
|
||||||
for new_event in events.clone() {
|
for new_event in events.clone() {
|
||||||
let key = event_key(&new_event);
|
let key = event_key(&new_event);
|
||||||
|
|
||||||
if let Some(old_event) = existing_events.get(&key) {
|
if let Some(old_event) = existing_events.get(&key) {
|
||||||
// Event exists - check for changes
|
// Event exists - check for changes
|
||||||
|
println!("\n 🔎 Comparing existing event:");
|
||||||
|
println!(" Event: {}", new_event.event);
|
||||||
|
println!(" Date: {} | Time: {}", new_event.date, new_event.time);
|
||||||
|
|
||||||
let changes = detect_changes(old_event, &new_event, &now);
|
let changes = detect_changes(old_event, &new_event, &now);
|
||||||
if !changes.is_empty() {
|
if !changes.is_empty() {
|
||||||
println!(" 🔄 Detected {} change(s) in: {}", changes.len(), new_event.event);
|
println!(" ✨ {} change(s) detected and recorded!", changes.len());
|
||||||
all_changes.extend(changes);
|
all_changes.extend(changes);
|
||||||
|
updated_events_count += 1;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
new_events_count += 1;
|
||||||
|
println!(" ➕ New event: {} on {}", new_event.event, new_event.date);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Insert or update event
|
// Insert or update event
|
||||||
existing_events.insert(key, new_event);
|
existing_events.insert(key, new_event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
println!("\n 📊 Batch summary:");
|
||||||
|
println!(" New events: {}", new_events_count);
|
||||||
|
println!(" Updated events: {}", updated_events_count);
|
||||||
|
println!(" Changes tracked: {}", all_changes.len());
|
||||||
|
|
||||||
let next = match calculate_next_start_date(&events) {
|
let next = match calculate_next_start_date(&events) {
|
||||||
Ok(n) => n,
|
Ok(n) => n,
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
@@ -569,6 +614,9 @@ async fn scrape_and_update(
|
|||||||
sleep(Duration::from_secs(2)).await;
|
sleep(Duration::from_secs(2)).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
println!("\n🎯 SCRAPE COMPLETE:");
|
||||||
|
println!(" Total changes detected: {}", all_changes.len());
|
||||||
|
|
||||||
Ok(all_changes)
|
Ok(all_changes)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user