use std::fs; use walkdir::WalkDir; use crate::config::Settings; use crate::error::StreamdError; use crate::extract::parse_markdown_file; use crate::localize::localize_stream_file; use crate::models::LocalizedShard; use crate::timesheet::{extract_timesheets, BasicTimesheetConfiguration}; fn all_files() -> Result, StreamdError> { let settings = Settings::load()?; let mut shards = Vec::new(); for entry in WalkDir::new(&settings.base_folder) .max_depth(1) .into_iter() .filter_map(|e| e.ok()) { let path = entry.path(); if path.extension().map(|e| e == "md").unwrap_or(false) { let file_name = path.to_string_lossy().to_string(); let content = fs::read_to_string(path)?; let stream_file = parse_markdown_file(&file_name, &content); if let Ok(shard) = localize_stream_file(&stream_file, &BasicTimesheetConfiguration) { shards.push(shard); } } } Ok(shards) } pub fn run() -> Result<(), StreamdError> { let all_shards = all_files()?; let mut sheets = extract_timesheets(&all_shards)?; sheets.sort_by_key(|s| s.date); for sheet in sheets { println!("{}", sheet.date); let times: Vec = sheet .timecards .iter() .map(|card| format!("{},{}", card.from_time, card.to_time)) .collect(); println!("{}", times.join(",")); } Ok(()) }