From 1d686e1859df056e635b77739af516e369f1a62e Mon Sep 17 00:00:00 2001 From: "Dwight J. Browne" Date: Wed, 19 Nov 2025 17:51:07 -0800 Subject: [PATCH] Clippy changes. unwrap checks. --- Cargo.toml | 4 ++-- DOT_env_EXAMPLE | 8 ++++++++ crates/av-cli/src/commands/load/crypto.rs | 6 +++--- .../av-cli/src/commands/load/crypto_intraday.rs | 6 +++--- .../av-cli/src/commands/load/crypto_metadata.rs | 2 +- .../av-cli/src/commands/load/crypto_overview.rs | 6 +++--- crates/av-cli/src/commands/load/crypto_prices.rs | 10 +++++----- crates/av-cli/src/commands/load/intraday.rs | 12 +++++++----- crates/av-cli/src/commands/load/news.rs | 2 +- .../src/commands/update/crypto_metadata_etl.rs | 10 +++++++--- .../commands/update/crypto_update_functions.rs | 11 ++++------- crates/av-core/src/types/market.rs | 2 +- crates/av-loaders/src/batch_processor.rs | 8 +++++++- crates/av-loaders/src/crypto/database.rs | 2 +- crates/av-loaders/src/crypto/intraday_loader.rs | 4 ++-- crates/av-loaders/src/crypto/markets_loader.rs | 2 +- crates/av-loaders/src/crypto/metadata_loader.rs | 3 +-- crates/av-loaders/src/csv_processor.rs | 6 ++++++ crates/av-loaders/src/intraday_price_loader.rs | 14 +++++--------- crates/av-loaders/src/news_loader.rs | 16 +--------------- crates/av-loaders/src/overview_loader.rs | 2 +- crates/av-loaders/src/process_tracker.rs | 6 ++++++ crates/av-loaders/src/security_loader.rs | 9 ++------- crates/av-loaders/src/summary_price_loader.rs | 4 ++-- 24 files changed, 80 insertions(+), 75 deletions(-) create mode 100644 DOT_env_EXAMPLE diff --git a/Cargo.toml b/Cargo.toml index 34a392a..fc7f326 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,8 +14,8 @@ authors = ["Dwight Browne Result<()> { // Create database context and crypto repository let db_context = av_database_postgres::repository::DatabaseContext::new(&config.database_url) .map_err(|e| anyhow::anyhow!("Failed to create database context: {}", e))?; - let crypto_repo: Arc = - Arc::new(db_context.crypto_repository()); + let _crypto_repo: Arc = + Arc::new(db_context.crypto_repository()); // todo: Fix this!!! // Create cache repository for API response caching let cache_repo: Arc = @@ -664,7 +664,7 @@ async fn save_crypto_symbols_to_db( let new_symbol = NewSymbolOwned { sid: new_sid, symbol: crypto_symbol.symbol.clone(), - priority: crypto_symbol.priority.clone(), + priority: crypto_symbol.priority, name: crypto_symbol.name.clone(), sec_type: "Cryptocurrency".to_string(), region: "Global".to_string(), // ADD this line diff --git a/crates/av-cli/src/commands/load/crypto_intraday.rs b/crates/av-cli/src/commands/load/crypto_intraday.rs index 9b7c7c3..eedb540 100644 --- a/crates/av-cli/src/commands/load/crypto_intraday.rs +++ b/crates/av-cli/src/commands/load/crypto_intraday.rs @@ -159,7 +159,7 @@ async fn get_latest_timestamps( async fn save_crypto_intraday_prices_optimized( config: &Config, prices: Vec, - update_existing: bool, + _update_existing: bool, //todo: fix this!! update_symbols: bool, check_each_record: bool, latest_timestamps: HashMap>, @@ -187,10 +187,10 @@ async fn save_crypto_intraday_prices_optimized( // Group prices by symbol for efficient processing let mut prices_by_symbol: HashMap> = HashMap::new(); for price in prices { - prices_by_symbol.entry(price.sid).or_insert_with(Vec::new).push(price); + prices_by_symbol.entry(price.sid).or_default().push(price); } - for (sid, mut symbol_prices) in prices_by_symbol { + for (sid, symbol_prices) in prices_by_symbol { let original_count = symbol_prices.len(); let latest_existing = latest_timestamps.get(&sid); diff --git a/crates/av-cli/src/commands/load/crypto_metadata.rs b/crates/av-cli/src/commands/load/crypto_metadata.rs index cf1038d..79276d2 100644 --- a/crates/av-cli/src/commands/load/crypto_metadata.rs +++ b/crates/av-cli/src/commands/load/crypto_metadata.rs @@ -404,7 +404,7 @@ async fn save_metadata_to_db( .first::(&mut conn) .optional()?; - if let Some(_) = exists { + if exists.is_some() { if update_existing { // Update existing record diesel::update(crypto_metadata::table.find(meta.sid)) diff --git a/crates/av-cli/src/commands/load/crypto_overview.rs b/crates/av-cli/src/commands/load/crypto_overview.rs index b899666..d755e98 100644 --- a/crates/av-cli/src/commands/load/crypto_overview.rs +++ b/crates/av-cli/src/commands/load/crypto_overview.rs @@ -1301,7 +1301,7 @@ async fn fetch_github_data( let caps = re.captures(link)?; caps.get(1)?.as_str().parse::().ok() }) - .or_else(|| Some(1)) + .or(Some(1)) } else { None }; @@ -1332,7 +1332,7 @@ async fn fetch_github_data( let caps = re.captures(link)?; caps.get(1)?.as_str().parse::().ok() }) - .or_else(|| Some(1)) + .or(Some(1)) } else { None }; @@ -1359,7 +1359,7 @@ async fn fetch_github_data( let caps = re.captures(link)?; caps.get(1)?.as_str().parse::().ok() }) - .or_else(|| Some(1)) + .or(Some(1)) } else { None }; diff --git a/crates/av-cli/src/commands/load/crypto_prices.rs b/crates/av-cli/src/commands/load/crypto_prices.rs index 871596a..c9252cb 100644 --- a/crates/av-cli/src/commands/load/crypto_prices.rs +++ b/crates/av-cli/src/commands/load/crypto_prices.rs @@ -330,7 +330,7 @@ async fn fetch_from_coingecko( })?; let timestamp = if let Some(ts) = coin_data.get("last_updated_at").and_then(|v| v.as_i64()) { - DateTime::from_timestamp(ts, 0).unwrap_or_else(|| Utc::now()) + DateTime::from_timestamp(ts, 0).unwrap_or_else(Utc::now) } else { Utc::now() }; @@ -530,7 +530,7 @@ async fn fetch_price_parallel( client: &reqwest::Client, symbol_with_mappings: &SymbolWithMappings, source_priority: &[String], - parallel_fetch: bool, + _parallel_fetch: bool, //todo: fix this!!! coingecko_api_key: Option<&str>, coinmarketcap_api_key: Option<&str>, alphavantage_api_key: Option<&str>, @@ -827,7 +827,7 @@ pub async fn execute(args: CryptoPricesArgs, config: Config) -> Result<()> { // Group mappings by sid let mut mappings_by_sid: HashMap> = HashMap::new(); for mapping in all_mappings { - mappings_by_sid.entry(mapping.sid).or_insert_with(Vec::new).push(mapping); + mappings_by_sid.entry(mapping.sid).or_default().push(mapping); } // Combine symbols with their mappings @@ -836,7 +836,7 @@ pub async fn execute(args: CryptoPricesArgs, config: Config) -> Result<()> { .map(|(sid, symbol)| SymbolWithMappings { sid, symbol, - mappings: mappings_by_sid.remove(&sid).unwrap_or_else(Vec::new), + mappings: mappings_by_sid.remove(&sid).unwrap_or_default(), }) .collect(); @@ -938,7 +938,7 @@ pub async fn execute(args: CryptoPricesArgs, config: Config) -> Result<()> { } // Try cache first - let cache_key = generate_cache_key(sid, &symbol); + let cache_key = generate_cache_key(sid, symbol); let price = if let Some(cached) = get_cached_price(&cache_config, &cache_key).await { cache_hits += 1; Some(cached) diff --git a/crates/av-cli/src/commands/load/intraday.rs b/crates/av-cli/src/commands/load/intraday.rs index 7857ac4..30a7b46 100644 --- a/crates/av-cli/src/commands/load/intraday.rs +++ b/crates/av-cli/src/commands/load/intraday.rs @@ -27,7 +27,7 @@ * SOFTWARE. */ -use anyhow::Result; +use anyhow::{Result, anyhow}; use chrono::{DateTime, Utc}; use clap::Parser; use diesel::prelude::*; @@ -204,7 +204,7 @@ async fn get_latest_timestamps( async fn save_intraday_prices_optimized( config: &Config, prices: Vec, - update_existing: bool, + _update_existing: bool, //todo: FIX THIS!! update_symbols: bool, check_each_record: bool, latest_timestamps: HashMap>, @@ -232,10 +232,10 @@ async fn save_intraday_prices_optimized( // Group prices by symbol for efficient processing let mut prices_by_symbol: HashMap> = HashMap::new(); for price in prices { - prices_by_symbol.entry(price.sid).or_insert_with(Vec::new).push(price); + prices_by_symbol.entry(price.sid).or_default().push(price); } - for (sid, mut symbol_prices) in prices_by_symbol { + for (sid, symbol_prices) in prices_by_symbol { unique_sids.insert(sid); let original_count = symbol_prices.len(); let latest_existing = latest_timestamps.get(&sid); @@ -424,7 +424,9 @@ pub async fn execute(args: IntradayArgs, config: Config) -> Result<()> { // Configure the loader let loader_cfg = IntradayPriceConfig { - interval: IntradayInterval::from_str(args.interval.as_str()).unwrap(), + interval: IntradayInterval::from_str(args.interval.as_str()).ok_or_else(|| { + anyhow!("Invalid interval: {}. Must be 1min, 5min, 15min, 30min, or 60min", args.interval) + })?, extended_hours: args.extended_hours, adjusted: args.adjusted, month: args.month.clone(), diff --git a/crates/av-cli/src/commands/load/news.rs b/crates/av-cli/src/commands/load/news.rs index f5ec0a1..7433985 100644 --- a/crates/av-cli/src/commands/load/news.rs +++ b/crates/av-cli/src/commands/load/news.rs @@ -121,7 +121,7 @@ pub async fn execute(args: NewsArgs, config: Config) -> Result<()> { return Err(anyhow!("Limit must be at least 1")); } - let continue_on_error = if args.stop_on_error { false } else { args.continue_on_error }; + let _continue_on_error = if args.stop_on_error { false } else { args.continue_on_error }; //todo:: fix this // Create API client let client = Arc::new(AlphaVantageClient::new(config.api_config.clone())); diff --git a/crates/av-cli/src/commands/update/crypto_metadata_etl.rs b/crates/av-cli/src/commands/update/crypto_metadata_etl.rs index f865dcd..9727023 100644 --- a/crates/av-cli/src/commands/update/crypto_metadata_etl.rs +++ b/crates/av-cli/src/commands/update/crypto_metadata_etl.rs @@ -98,8 +98,12 @@ pub fn execute_metadata_etl(database_url: &str) -> Result<()> { } info!( - "ETL Complete: processed={}, basic={}, social={}, technical={}", - stats.total_processed, stats.basic_updated, stats.social_updated, stats.technical_updated + "ETL Complete: processed={}, basic={}, social={}, technical={}, errors={}", + stats.total_processed, + stats.basic_updated, + stats.social_updated, + stats.technical_updated, + stats.errors ); Ok(()) @@ -272,7 +276,7 @@ fn process_social(conn: &mut PgConnection, sid: i64, data: &Value) -> Result<()> let discord_url = links .and_then(|l| l.get("chat_url")) .and_then(|urls| urls.as_array()) - .and_then(|arr| arr.iter().find(|url| url.as_str().map_or(false, |s| s.contains("discord")))) + .and_then(|arr| arr.iter().find(|url| url.as_str().is_some_and(|s| s.contains("discord")))) .and_then(|v| v.as_str()) .map(|s| s.to_string()); diff --git a/crates/av-cli/src/commands/update/crypto_update_functions.rs b/crates/av-cli/src/commands/update/crypto_update_functions.rs index c93290a..70a6ece 100644 --- a/crates/av-cli/src/commands/update/crypto_update_functions.rs +++ b/crates/av-cli/src/commands/update/crypto_update_functions.rs @@ -42,19 +42,16 @@ pub async fn update_crypto_command(args: UpdateCryptoArgs, _config: Config) -> R } if args.basic_only { - println!("Updating basic crypto data..."); + unimplemented!("basic crypto data version date: TBD"); // TODO: Implement basic crypto data update } else if args.social_only { - println!("Updating social crypto data..."); + unimplemented!("social crypto data version date: TBD"); // TODO: Implement social crypto data update } else if args.technical_only { - println!("Updating technical crypto data..."); + unimplemented!("Technical crypto data version date: TBD"); // TODO: Implement technical crypto data update } else { - println!("Updating all crypto data..."); + unimplemented!("Updating all crypto data version date: TBD"); // TODO: Implement comprehensive crypto data update } - - println!("Crypto update completed"); - Ok(()) } diff --git a/crates/av-core/src/types/market.rs b/crates/av-core/src/types/market.rs index f41ed28..cbcfee0 100644 --- a/crates/av-core/src/types/market.rs +++ b/crates/av-core/src/types/market.rs @@ -376,7 +376,7 @@ impl SecurityType { SecurityType::TreasuryBill => (TYPE_T_BILL as i64) << SHIFT_6BIT | id as i64, SecurityType::Other => (TYPE_OTHER as i64) << SHIFT_6BIT | id as i64, }; - unsigned_result as i64 + unsigned_result } /// Decode SecurityType from an encoded SID diff --git a/crates/av-loaders/src/batch_processor.rs b/crates/av-loaders/src/batch_processor.rs index bd4f62a..aff060e 100644 --- a/crates/av-loaders/src/batch_processor.rs +++ b/crates/av-loaders/src/batch_processor.rs @@ -76,6 +76,12 @@ pub struct BatchResult { pub total_processed: usize, } +impl Default for BatchResult { + fn default() -> Self { + Self::new() + } +} + impl BatchResult { pub fn new() -> Self { Self { success: Vec::new(), failures: Vec::new(), total_processed: 0 } @@ -130,7 +136,7 @@ impl BatchProcessor { debug!("Processing {} items in batches of {}", total_items, self.config.batch_size); let mut batch_idx = 0; - let total_batches = (total_items + self.config.batch_size - 1) / self.config.batch_size; + let total_batches = total_items.div_ceil(self.config.batch_size); // Process items in chunks by draining from the vector while !items.is_empty() { diff --git a/crates/av-loaders/src/crypto/database.rs b/crates/av-loaders/src/crypto/database.rs index 5f58d0d..0bcba7b 100644 --- a/crates/av-loaders/src/crypto/database.rs +++ b/crates/av-loaders/src/crypto/database.rs @@ -307,7 +307,7 @@ impl CryptoDbLoader { let mut symbol_groups: HashMap> = HashMap::new(); for token in tokens.iter_mut() { - symbol_groups.entry(token.symbol.clone()).or_insert_with(Vec::new).push(token); + symbol_groups.entry(token.symbol.clone()).or_default().push(token); } // Process each symbol group diff --git a/crates/av-loaders/src/crypto/intraday_loader.rs b/crates/av-loaders/src/crypto/intraday_loader.rs index 6dd76ad..2309163 100644 --- a/crates/av-loaders/src/crypto/intraday_loader.rs +++ b/crates/av-loaders/src/crypto/intraday_loader.rs @@ -492,7 +492,7 @@ impl DataLoader for CryptoIntradayLoader { let mut all_prices = Vec::new(); let mut symbols_loaded = 0; let mut symbols_failed = 0; - let mut symbols_skipped = 0; + let symbols_skipped = 0; let mut failed_symbols = Vec::new(); // Filter symbols if primary_only is set @@ -523,7 +523,7 @@ impl DataLoader for CryptoIntradayLoader { progress.set_message(format!("Loading {} ({})", symbol, market)); match loader - .fetch_crypto_intraday_csv(&context, &symbol, &market, &interval_str, sid) + .fetch_crypto_intraday_csv(context, &symbol, &market, &interval_str, sid) .await { Ok(prices) => { diff --git a/crates/av-loaders/src/crypto/markets_loader.rs b/crates/av-loaders/src/crypto/markets_loader.rs index 837f7cb..3513cbb 100644 --- a/crates/av-loaders/src/crypto/markets_loader.rs +++ b/crates/av-loaders/src/crypto/markets_loader.rs @@ -536,7 +536,7 @@ impl CryptoMarketsLoader { // Log first 200 chars for debugging if response_text.len() > 200 { info!("📄 Response preview for {}: {}...", symbol.symbol, &response_text[..200]); - } else if response_text.len() > 0 { + } else if !response_text.is_empty() { info!("📄 Full response for {}: {}", symbol.symbol, response_text); } diff --git a/crates/av-loaders/src/crypto/metadata_loader.rs b/crates/av-loaders/src/crypto/metadata_loader.rs index 879fcdb..2e23e4f 100644 --- a/crates/av-loaders/src/crypto/metadata_loader.rs +++ b/crates/av-loaders/src/crypto/metadata_loader.rs @@ -286,8 +286,7 @@ impl CryptoMetadataLoader { match self.load_alphavantage_metadata_fresh(symbol).await { Ok((metadata, response, url, _status)) => { // Cache the successful response - let response_json = - serde_json::to_value(&response).unwrap_or_else(|_| serde_json::Value::Null); + let response_json = serde_json::to_value(&response).unwrap_or(serde_json::Value::Null); self.cache_response(cache_repo, &cache_key, "alphavantage", &url, &response_json).await; diff --git a/crates/av-loaders/src/csv_processor.rs b/crates/av-loaders/src/csv_processor.rs index 5c80788..14dd69f 100644 --- a/crates/av-loaders/src/csv_processor.rs +++ b/crates/av-loaders/src/csv_processor.rs @@ -45,6 +45,12 @@ use std::path::Path; pub struct CsvProcessor; +impl Default for CsvProcessor { + fn default() -> Self { + Self::new() + } +} + impl CsvProcessor { pub fn new() -> Self { Self diff --git a/crates/av-loaders/src/intraday_price_loader.rs b/crates/av-loaders/src/intraday_price_loader.rs index f5891d9..a105699 100644 --- a/crates/av-loaders/src/intraday_price_loader.rs +++ b/crates/av-loaders/src/intraday_price_loader.rs @@ -48,8 +48,9 @@ use tokio::time::sleep; use tracing::{debug, error, info, warn}; /// Supported intervals for intraday data -#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] pub enum IntradayInterval { + #[default] Min1, Min5, Min15, @@ -93,12 +94,6 @@ impl IntradayInterval { } } -impl Default for IntradayInterval { - fn default() -> Self { - IntradayInterval::Min1 // Default to 1-minute intervals - } -} - /// Configuration for intraday price loading #[derive(Debug, Clone)] pub struct IntradayPriceConfig { @@ -332,6 +327,7 @@ impl IntradayPriceLoader { let expires_at = Utc::now() + chrono::Duration::hours(self.config.cache_ttl_hours as i64); // Try to insert, if it fails due to duplicate, update instead + let insert_result = sql_query( "INSERT INTO api_response_cache (cache_key, api_source, endpoint_url, response_data, status_code, expires_at, cached_at) @@ -448,7 +444,7 @@ impl IntradayPriceLoader { /// Fetch intraday data in CSV format from API or cache async fn fetch_intraday_csv( &self, - context: &LoaderContext, + _context: &LoaderContext, symbol: &str, interval: &str, month: Option<&str>, @@ -595,7 +591,7 @@ impl DataLoader for IntradayPriceLoader { progress.set_message(format!("Loading {}", symbol)); match loader - .fetch_intraday_csv(&context, &symbol, &interval_str, month.as_deref(), sid) + .fetch_intraday_csv(context, &symbol, &interval_str, month.as_deref(), sid) .await { Ok(prices) => { diff --git a/crates/av-loaders/src/news_loader.rs b/crates/av-loaders/src/news_loader.rs index 0fceb39..ccb006f 100644 --- a/crates/av-loaders/src/news_loader.rs +++ b/crates/av-loaders/src/news_loader.rs @@ -73,7 +73,7 @@ pub struct NewsLoaderInput { } /// Output from news loader -#[derive(Debug)] +#[derive(Debug, Default)] pub struct NewsLoaderOutput { pub data: Vec, pub loaded_count: usize, @@ -84,20 +84,6 @@ pub struct NewsLoaderOutput { pub no_data_count: usize, } -impl Default for NewsLoaderOutput { - fn default() -> Self { - Self { - data: Vec::new(), - loaded_count: 0, - articles_processed: 0, - cache_hits: 0, - api_calls: 0, - errors: Vec::new(), - no_data_count: 0, - } - } -} - /// News loader implementation pub struct NewsLoader { config: NewsLoaderConfig, diff --git a/crates/av-loaders/src/overview_loader.rs b/crates/av-loaders/src/overview_loader.rs index ca456f4..321f4a9 100644 --- a/crates/av-loaders/src/overview_loader.rs +++ b/crates/av-loaders/src/overview_loader.rs @@ -162,7 +162,7 @@ impl OverviewLoader { &self, client: &Arc, symbol: &str, - retry_delay: u64, + _retry_delay: u64, // todo::Fix this!! ) -> Result, av_client::Error> { match client.fundamentals().company_overview(symbol).await { Ok(overview) => { diff --git a/crates/av-loaders/src/process_tracker.rs b/crates/av-loaders/src/process_tracker.rs index 8a5b26f..6621d04 100644 --- a/crates/av-loaders/src/process_tracker.rs +++ b/crates/av-loaders/src/process_tracker.rs @@ -58,6 +58,12 @@ pub struct ProcessTracker { processes: Arc>>, } +impl Default for ProcessTracker { + fn default() -> Self { + Self::new() + } +} + impl ProcessTracker { pub fn new() -> Self { Self { processes: Arc::new(Mutex::new(Vec::new())) } diff --git a/crates/av-loaders/src/security_loader.rs b/crates/av-loaders/src/security_loader.rs index c030fde..19c4fc5 100644 --- a/crates/av-loaders/src/security_loader.rs +++ b/crates/av-loaders/src/security_loader.rs @@ -51,22 +51,17 @@ use av_models::common::SymbolMatch; use av_models::time_series::SymbolSearch; /// Configuration for symbol matching behavior -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Default)] pub enum SymbolMatchMode { /// Only accept exact symbol matches (case-insensitive) ExactMatch, /// Accept all symbols returned from search + #[default] AllMatches, /// Accept top N matches based on match score TopMatches(usize), } -impl Default for SymbolMatchMode { - fn default() -> Self { - SymbolMatchMode::AllMatches - } -} - /// Configuration for security loader caching behavior #[derive(Debug, Clone)] pub struct SecurityLoaderConfig { diff --git a/crates/av-loaders/src/summary_price_loader.rs b/crates/av-loaders/src/summary_price_loader.rs index 52dd712..1c6d84f 100644 --- a/crates/av-loaders/src/summary_price_loader.rs +++ b/crates/av-loaders/src/summary_price_loader.rs @@ -321,7 +321,7 @@ impl SummaryPriceLoader { /// Fetch daily prices in CSV format from API or cache async fn fetch_daily_csv( &self, - context: &LoaderContext, + _context: &LoaderContext, //todo:: fix this symbol: &str, outputsize: &str, sid: i64, @@ -459,7 +459,7 @@ impl DataLoader for SummaryPriceLoader { let mut all_prices = Vec::new(); let mut loaded_count = 0; let mut error_count = 0; - let mut skipped_count = 0; + let skipped_count = 0; // Process symbols sequentially with rate limiting for (sid, symbol) in input.symbols.iter() {