From 5ea691fa74c069ea4b72ee6f7ae48b2d26868a3e Mon Sep 17 00:00:00 2001 From: Jacek Czaja Date: Fri, 9 Aug 2024 11:03:00 +0200 Subject: [PATCH 1/7] - Initial changes to accomodate dividend data from CSV of revolut --- ...ent_2024-01-01_2024-08-04_pl-pl_8e8783.csv | 17 ++++++++ src/csvparser.rs | 40 ++++++++++++++++--- src/lib.rs | 10 ++--- src/main.rs | 2 + src/transactions.rs | 8 ++-- 5 files changed, 60 insertions(+), 17 deletions(-) create mode 100644 revolut_data/trading-pnl-statement_2024-01-01_2024-08-04_pl-pl_8e8783.csv diff --git a/revolut_data/trading-pnl-statement_2024-01-01_2024-08-04_pl-pl_8e8783.csv b/revolut_data/trading-pnl-statement_2024-01-01_2024-08-04_pl-pl_8e8783.csv new file mode 100644 index 0000000..d2c1af9 --- /dev/null +++ b/revolut_data/trading-pnl-statement_2024-01-01_2024-08-04_pl-pl_8e8783.csv @@ -0,0 +1,17 @@ +Income from Sells +Date acquired,Date sold,Symbol,Security name,ISIN,Country,Quantity,Cost basis,Gross proceeds,Gross PnL,Currency + +Other income & fees +Date,Symbol,Security name,ISIN,Country,Gross amount,Withholding tax,Net Amount,Currency +2024-03-04,TFC,Truist Financial Corp,US89832Q1094,US,617.00,92.57 PLN,524.43 PLN,PLN +2024-03-21,AMCR,Amcor,JE00BJ1F3079,JE,259.17,$0,259.17 PLN,PLN +2024-03-25,PXD,Pioneer Natural Resources,US7237871071,US,212.39,31.87 PLN,180.52 PLN,PLN +2024-05-16,EPR,EPR Properties,US26884U1097,US,700.17,105.04 PLN,595.13 PLN,PLN +2024-05-31,UPS,UPS,US9113121068,US,875.82,131.38 PLN,744.44 PLN,PLN +2024-06-03,ABR,Arbor Realty Trust,US0389231087,US,488.26,73.25 PLN,415.01 PLN,PLN +2024-06-04,TFC,Truist Financial Corp,US89832Q1094,US,613.20,92 PLN,521.20 PLN,PLN +2024-06-11,XOM,Exxon Mobil,US30231G1022,US,186.16,27.92 PLN,158.24 PLN,PLN +2024-06-13,AMCR,Amcor,JE00BJ1F3079,JE,264.74,$0,264.74 PLN,PLN +2024-06-18,EPR,EPR Properties,US26884U1097,US,858.33,128.74 PLN,729.59 PLN,PLN +2024-07-12,BBY,Best Buy,US0865161014,US,421.50,63.23 PLN,358.27 PLN,PLN +2024-07-16,EPR,EPR Properties,US26884U1097,US,834.55,125.18 PLN,709.37 PLN,PLN diff --git a/src/csvparser.rs b/src/csvparser.rs index 3075e8d..2d778c5 100644 --- a/src/csvparser.rs +++ b/src/csvparser.rs @@ -166,9 +166,11 @@ fn parse_incomes(df: DataFrame, col: &str) -> Result, &'sta Ok(incomes) } +/// Parse revolut CSV documents (savings account and trading) +/// returns: transactions in a form: date, gross income , tax taken pub fn parse_revolut_transactions( csvtoparse: &str, -) -> Result, &str> { +) -> Result, &str> { let df = CsvReader::from_path(csvtoparse) .map_err(|_| "Error: opening CSV")? .has_header(true) @@ -177,10 +179,11 @@ pub fn parse_revolut_transactions( log::info!("CSV DataFrame: {df}"); - let mut transactions: Vec<(String, crate::Currency)> = vec![]; + let mut transactions: Vec<(String, crate::Currency, crate::Currency)> = vec![]; let dates: Vec; let incomes: Vec; + let taxes: Vec; if df .select(&["Completed Date", "Description", "Money in"]) .is_ok() @@ -196,6 +199,9 @@ pub fn parse_revolut_transactions( incomes = parse_incomes(filtred_df, "Money in")?; log::info!("Incomes: {:?}", incomes); + // Taxes are not automatically taken from savings account + // so we will put zeros as tax taken + taxes = incomes.iter().map(|i| i.derive(0.0)).collect(); } else if df.select(&["Type", "Price per share"]).is_ok() { log::info!("Detected Investment account statement: {csvtoparse}"); let filtred_df = extract_investment_gains_and_costs_transactions(&df)?; @@ -204,13 +210,14 @@ pub fn parse_revolut_transactions( log::info!("Investment/Fees Dates: {:?}", dates); incomes = parse_incomes(filtred_df, "Total Amount")?; log::info!("Incomes: {:?}", incomes); + taxes = incomes.iter().map(|i| i.derive(0.0)).collect(); } else { return Err("ERROR: Unsupported CSV type of document: {csvtoparse}"); } - let iter = std::iter::zip(dates, incomes); - iter.for_each(|(d, m)| { - transactions.push((d, m)); + let iter = std::iter::zip(dates, std::iter::zip(incomes,taxes)); + iter.for_each(|(d, (m, t))| { + transactions.push((d, m, t)); }); Ok(transactions) } @@ -535,6 +542,29 @@ mod tests { Ok(()) } + #[test] + fn test_parse_revolut_investment_gain_and_losses() -> Result<(), String> { + +/* +2024-03-04 617 92.57 PLN 524.43 PLN PLN +2024-03-21 259.17 $0 259.17 PLN PLN +2024-03-25 212.39 31.87 PLN 180.52 PLN PLN +2024-05-16 700.17 105.04 PLN 595.13 PLN PLN +2024-05-31 875.82 131.38 PLN 744.44 PLN PLN +2024-06-03 488.26 73.25 PLN 415.01 PLN PLN +2024-06-04 613.2 92 PLN 521.20 PLN PLN +2024-06-11 186.16 27.92 PLN 158.24 PLN PLN +2024-06-13 264.74 $0 264.74 PLN PLN +2024-06-18 858.33 128.74 PLN 729.59 PLN PLN +2024-07-12 421.5 63.23 PLN 358.27 PLN PLN +2024-07-16 834.55 125.18 PLN 709.37 PLN PLN +*/ + + + Ok(()) + } + + #[test] fn test_parse_revolut_transactions_english_statement_pln() -> Result<(), String> { let expected_result = Ok(vec![ diff --git a/src/lib.rs b/src/lib.rs index 74b1803..05fd45d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -323,7 +323,7 @@ pub fn run_taxation( let mut parsed_div_transactions: Vec<(String, f32, f32)> = vec![]; let mut parsed_sold_transactions: Vec<(String, String, f32, f32, f32)> = vec![]; let mut parsed_gain_and_losses: Vec<(String, String, f32, f32, f32)> = vec![]; - let mut parsed_revolut_transactions: Vec<(String, Currency)> = vec![]; + let mut parsed_revolut_transactions: Vec<(String, Currency, Currency)> = vec![]; // 1. Parse PDF,XLSX and CSV documents to get list of transactions names.iter().try_for_each(|x| { @@ -393,12 +393,8 @@ pub fn run_taxation( ); parsed_revolut_transactions .iter() - .for_each(|(trade_date, currency)| { - let ex = match currency { - Currency::EUR(_) => Exchange::EUR(trade_date.clone()), - Currency::PLN(_) => Exchange::PLN(trade_date.clone()), - Currency::USD(_) => Exchange::USD(trade_date.clone()), - }; + .for_each(|(trade_date, gross, _)| { + let ex = gross.derive_exchange(trade_date.clone()); if dates.contains_key(&ex) == false { dates.insert(ex, None); } diff --git a/src/main.rs b/src/main.rs index 101f1c2..6383b15 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,6 +11,8 @@ mod gui; use etradeTaxReturnHelper::run_taxation; use logging::ResultExt; +// TODO: Make UT and parsing of revolut CSV documents from gain and losses + // TODO: When there is no proxy (on intel account) there are problems (UT do not work // getting_Exchange_rate) // TODO: Make a parsing of incomplete date diff --git a/src/transactions.rs b/src/transactions.rs index fcc83d8..aa367a5 100644 --- a/src/transactions.rs +++ b/src/transactions.rs @@ -119,16 +119,15 @@ pub fn reconstruct_sold_transactions( } pub fn create_detailed_revolut_transactions( - transactions: Vec<(String, crate::Currency)>, + transactions: Vec<(String, crate::Currency, crate::Currency)>, dates: &std::collections::HashMap>, ) -> Result, &str> { let mut detailed_transactions: Vec = Vec::new(); transactions .iter() - .try_for_each(|(transaction_date, gross)| { + .try_for_each(|(transaction_date, gross, tax)| { let (exchange_rate_date, exchange_rate) = dates - //[&crate::Exchange::USD(transaction_date.clone())] [&gross.derive_exchange(transaction_date.clone())] .clone() .unwrap(); @@ -136,8 +135,7 @@ pub fn create_detailed_revolut_transactions( let transaction = Transaction { transaction_date: transaction_date.clone(), gross: *gross, - //Revolut does not take taxes in savings account - tax_paid: gross.derive(0.0), + tax_paid: *tax, exchange_rate_date, exchange_rate, }; From 67dc53fc9a591649b278ce457ebe38e226e80d0a Mon Sep 17 00:00:00 2001 From: Jacek Czaja Date: Sun, 11 Aug 2024 07:56:20 +0200 Subject: [PATCH 2/7] - Added CSV to detect type of CSV document --- Cargo.lock | 22 ++ Cargo.toml | 1 + src/csvparser.rs | 493 +++++++++++++++++++++++--------------------- src/transactions.rs | 8 +- 4 files changed, 280 insertions(+), 244 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6795805..6db18f5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -481,6 +481,27 @@ dependencies = [ "winapi", ] +[[package]] +name = "csv" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +dependencies = [ + "memchr", +] + [[package]] name = "deflate" version = "0.9.1" @@ -576,6 +597,7 @@ dependencies = [ "calamine", "chrono", "clap", + "csv", "fltk", "log", "nom", diff --git a/Cargo.toml b/Cargo.toml index 50e9a52..f1e90bb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,3 +28,4 @@ wild = "2.2.0" fltk = {version = "=1.3.24", features = ["fltk-bundled"], optional = true} nom = "7.1.3" polars = "0.35.4" +csv = "1.3.0" diff --git a/src/csvparser.rs b/src/csvparser.rs index 2d778c5..6bb3160 100644 --- a/src/csvparser.rs +++ b/src/csvparser.rs @@ -170,25 +170,25 @@ fn parse_incomes(df: DataFrame, col: &str) -> Result, &'sta /// returns: transactions in a form: date, gross income , tax taken pub fn parse_revolut_transactions( csvtoparse: &str, -) -> Result, &str> { - let df = CsvReader::from_path(csvtoparse) - .map_err(|_| "Error: opening CSV")? - .has_header(true) - .finish() - .map_err(|_| "Error: opening CSV")?; - - log::info!("CSV DataFrame: {df}"); +) -> Result, String> { let mut transactions: Vec<(String, crate::Currency, crate::Currency)> = vec![]; - let dates: Vec; - let incomes: Vec; - let taxes: Vec; - if df - .select(&["Completed Date", "Description", "Money in"]) - .is_ok() - { + let mut dates: Vec = vec![]; + let mut incomes: Vec = vec![]; + let mut taxes: Vec = vec![]; + let mut rdr = csv::Reader::from_path(csvtoparse).map_err(|_| "Error: opening CSV")?; + let result = rdr.headers().map_err(|e| format!("Error: scanning CSV header: {e}"))?; + //let header_string : String = result.deserialize(None).map_err(|e| format!("Error: deserializing CSV header: {e}"))?; + if result.iter().any(|field| field == "Completed Date") { log::info!("Detected Savings account statement: {csvtoparse}"); + let df = CsvReader::from_path(csvtoparse) + .map_err(|_| "Error: opening CSV")? + .has_header(true) + .finish() + .map_err(|e| format!("Error reading CSV: {e}"))?; + + log::info!("CSV DataFrame: {df}"); let filtred_df = extract_intrest_rate_transactions(&df)?; @@ -202,8 +202,15 @@ pub fn parse_revolut_transactions( // Taxes are not automatically taken from savings account // so we will put zeros as tax taken taxes = incomes.iter().map(|i| i.derive(0.0)).collect(); - } else if df.select(&["Type", "Price per share"]).is_ok() { + } else if result.iter().any(|field| field == "Price per share") { log::info!("Detected Investment account statement: {csvtoparse}"); + let df = CsvReader::from_path(csvtoparse) + .map_err(|_| "Error: opening CSV")? + .has_header(true) + .finish() + .map_err(|e| format!("Error reading CSV: {e}"))?; + + log::info!("CSV DataFrame: {df}"); let filtred_df = extract_investment_gains_and_costs_transactions(&df)?; log::info!("Filtered Data of interest: {filtred_df}"); dates = parse_investment_transaction_dates(&filtred_df)?; @@ -211,8 +218,10 @@ pub fn parse_revolut_transactions( incomes = parse_incomes(filtred_df, "Total Amount")?; log::info!("Incomes: {:?}", incomes); taxes = incomes.iter().map(|i| i.derive(0.0)).collect(); + } else if result.iter().any(|field| field == "Income from Sells") { + return Err("ERROR: Unsupported CSV type of document: {csvtoparse}".to_string()); } else { - return Err("ERROR: Unsupported CSV type of document: {csvtoparse}"); + return Err("ERROR: Unsupported CSV type of document: {csvtoparse}".to_string()); } let iter = std::iter::zip(dates, std::iter::zip(incomes,taxes)); @@ -333,102 +342,102 @@ mod tests { #[test] fn test_parse_revolut_transactions_eur() -> Result<(), String> { let expected_result = Ok(vec![ - ("08/24/23".to_owned(), crate::Currency::EUR(0.05)), - ("08/25/23".to_owned(), crate::Currency::EUR(0.07)), - ("08/26/23".to_owned(), crate::Currency::EUR(0.06)), - ("08/27/23".to_owned(), crate::Currency::EUR(0.06)), - ("08/28/23".to_owned(), crate::Currency::EUR(0.06)), - ("08/29/23".to_owned(), crate::Currency::EUR(0.06)), - ("08/30/23".to_owned(), crate::Currency::EUR(0.06)), - ("08/31/23".to_owned(), crate::Currency::EUR(0.06)), - ("09/01/23".to_owned(), crate::Currency::EUR(0.06)), - ("09/02/23".to_owned(), crate::Currency::EUR(0.06)), - ("09/03/23".to_owned(), crate::Currency::EUR(0.06)), - ("09/04/23".to_owned(), crate::Currency::EUR(0.06)), - ("09/05/23".to_owned(), crate::Currency::EUR(0.06)), - ("09/06/23".to_owned(), crate::Currency::EUR(0.06)), - ("09/07/23".to_owned(), crate::Currency::EUR(0.06)), - ("09/08/23".to_owned(), crate::Currency::EUR(0.06)), - ("09/09/23".to_owned(), crate::Currency::EUR(0.06)), - ("09/10/23".to_owned(), crate::Currency::EUR(0.06)), - ("09/11/23".to_owned(), crate::Currency::EUR(0.06)), - ("09/12/23".to_owned(), crate::Currency::EUR(0.06)), - ("09/13/23".to_owned(), crate::Currency::EUR(0.24)), - ("09/14/23".to_owned(), crate::Currency::EUR(0.24)), - ("09/15/23".to_owned(), crate::Currency::EUR(0.24)), - ("09/16/23".to_owned(), crate::Currency::EUR(0.24)), - ("09/17/23".to_owned(), crate::Currency::EUR(0.25)), - ("09/18/23".to_owned(), crate::Currency::EUR(0.24)), - ("09/19/23".to_owned(), crate::Currency::EUR(0.24)), - ("09/20/23".to_owned(), crate::Currency::EUR(0.24)), - ("09/21/23".to_owned(), crate::Currency::EUR(0.24)), - ("09/22/23".to_owned(), crate::Currency::EUR(0.24)), - ("09/23/23".to_owned(), crate::Currency::EUR(0.24)), - ("09/24/23".to_owned(), crate::Currency::EUR(0.24)), - ("09/25/23".to_owned(), crate::Currency::EUR(0.25)), - ("09/26/23".to_owned(), crate::Currency::EUR(0.24)), - ("09/27/23".to_owned(), crate::Currency::EUR(0.24)), - ("09/28/23".to_owned(), crate::Currency::EUR(0.24)), - ("09/29/23".to_owned(), crate::Currency::EUR(0.24)), - ("09/30/23".to_owned(), crate::Currency::EUR(0.24)), - ("10/01/23".to_owned(), crate::Currency::EUR(0.24)), - ("10/02/23".to_owned(), crate::Currency::EUR(0.24)), - ("10/03/23".to_owned(), crate::Currency::EUR(0.25)), - ("10/04/23".to_owned(), crate::Currency::EUR(0.24)), - ("10/05/23".to_owned(), crate::Currency::EUR(0.24)), - ("10/06/23".to_owned(), crate::Currency::EUR(0.24)), - ("10/07/23".to_owned(), crate::Currency::EUR(0.24)), - ("10/08/23".to_owned(), crate::Currency::EUR(0.24)), - ("10/09/23".to_owned(), crate::Currency::EUR(0.24)), - ("10/10/23".to_owned(), crate::Currency::EUR(0.24)), - ("10/11/23".to_owned(), crate::Currency::EUR(0.25)), - ("10/12/23".to_owned(), crate::Currency::EUR(0.24)), - ("10/13/23".to_owned(), crate::Currency::EUR(0.24)), - ("10/14/23".to_owned(), crate::Currency::EUR(0.24)), - ("10/15/23".to_owned(), crate::Currency::EUR(0.24)), - ("10/16/23".to_owned(), crate::Currency::EUR(0.24)), - ("10/17/23".to_owned(), crate::Currency::EUR(0.24)), - ("10/18/23".to_owned(), crate::Currency::EUR(0.25)), - ("10/19/23".to_owned(), crate::Currency::EUR(0.24)), - ("10/20/23".to_owned(), crate::Currency::EUR(0.24)), - ("10/21/23".to_owned(), crate::Currency::EUR(0.24)), - ("10/22/23".to_owned(), crate::Currency::EUR(0.24)), - ("10/23/23".to_owned(), crate::Currency::EUR(0.24)), - ("10/24/23".to_owned(), crate::Currency::EUR(0.25)), - ("10/25/23".to_owned(), crate::Currency::EUR(0.25)), - ("10/26/23".to_owned(), crate::Currency::EUR(0.25)), - ("10/27/23".to_owned(), crate::Currency::EUR(0.24)), - ("10/28/23".to_owned(), crate::Currency::EUR(0.25)), - ("10/29/23".to_owned(), crate::Currency::EUR(0.25)), - ("10/30/23".to_owned(), crate::Currency::EUR(0.25)), - ("10/31/23".to_owned(), crate::Currency::EUR(0.24)), - ("11/01/23".to_owned(), crate::Currency::EUR(0.25)), - ("11/02/23".to_owned(), crate::Currency::EUR(0.25)), - ("11/03/23".to_owned(), crate::Currency::EUR(0.25)), - ("11/04/23".to_owned(), crate::Currency::EUR(0.24)), - ("11/05/23".to_owned(), crate::Currency::EUR(0.25)), - ("11/06/23".to_owned(), crate::Currency::EUR(0.25)), - ("11/07/23".to_owned(), crate::Currency::EUR(0.25)), - ("11/08/23".to_owned(), crate::Currency::EUR(0.24)), - ("11/09/23".to_owned(), crate::Currency::EUR(0.25)), - ("11/10/23".to_owned(), crate::Currency::EUR(0.27)), - ("11/11/23".to_owned(), crate::Currency::EUR(0.26)), - ("11/12/23".to_owned(), crate::Currency::EUR(0.27)), - ("11/13/23".to_owned(), crate::Currency::EUR(0.26)), - ("11/14/23".to_owned(), crate::Currency::EUR(0.27)), - ("11/15/23".to_owned(), crate::Currency::EUR(0.26)), - ("11/16/23".to_owned(), crate::Currency::EUR(0.27)), - ("11/17/23".to_owned(), crate::Currency::EUR(0.27)), - ("11/18/23".to_owned(), crate::Currency::EUR(0.26)), - ("11/19/23".to_owned(), crate::Currency::EUR(0.27)), - ("11/20/23".to_owned(), crate::Currency::EUR(0.26)), - ("11/21/23".to_owned(), crate::Currency::EUR(0.27)), - ("11/22/23".to_owned(), crate::Currency::EUR(0.26)), - ("11/23/23".to_owned(), crate::Currency::EUR(0.27)), - ("11/24/23".to_owned(), crate::Currency::EUR(0.27)), - ("11/25/23".to_owned(), crate::Currency::EUR(0.26)), - ("11/26/23".to_owned(), crate::Currency::EUR(0.27)), - ("11/27/23".to_owned(), crate::Currency::EUR(0.26)), + ("08/24/23".to_owned(), crate::Currency::EUR(0.05), crate::Currency::EUR(0.00)), + ("08/25/23".to_owned(), crate::Currency::EUR(0.07), crate::Currency::EUR(0.00)), + ("08/26/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), + ("08/27/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), + ("08/28/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), + ("08/29/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), + ("08/30/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), + ("08/31/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), + ("09/01/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), + ("09/02/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), + ("09/03/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), + ("09/04/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), + ("09/05/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), + ("09/06/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), + ("09/07/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), + ("09/08/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), + ("09/09/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), + ("09/10/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), + ("09/11/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), + ("09/12/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), + ("09/13/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("09/14/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("09/15/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("09/16/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("09/17/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), + ("09/18/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("09/19/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("09/20/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("09/21/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("09/22/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("09/23/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("09/24/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("09/25/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), + ("09/26/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("09/27/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("09/28/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("09/29/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("09/30/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("10/01/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("10/02/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("10/03/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), + ("10/04/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("10/05/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("10/06/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("10/07/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("10/08/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("10/09/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("10/10/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("10/11/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), + ("10/12/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("10/13/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("10/14/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("10/15/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("10/16/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("10/17/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("10/18/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), + ("10/19/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("10/20/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("10/21/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("10/22/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("10/23/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("10/24/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), + ("10/25/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), + ("10/26/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), + ("10/27/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("10/28/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), + ("10/29/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), + ("10/30/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), + ("10/31/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("11/01/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), + ("11/02/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), + ("11/03/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), + ("11/04/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("11/05/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), + ("11/06/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), + ("11/07/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), + ("11/08/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), + ("11/09/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), + ("11/10/23".to_owned(), crate::Currency::EUR(0.27), crate::Currency::EUR(0.00)), + ("11/11/23".to_owned(), crate::Currency::EUR(0.26), crate::Currency::EUR(0.00)), + ("11/12/23".to_owned(), crate::Currency::EUR(0.27), crate::Currency::EUR(0.00)), + ("11/13/23".to_owned(), crate::Currency::EUR(0.26), crate::Currency::EUR(0.00)), + ("11/14/23".to_owned(), crate::Currency::EUR(0.27), crate::Currency::EUR(0.00)), + ("11/15/23".to_owned(), crate::Currency::EUR(0.26), crate::Currency::EUR(0.00)), + ("11/16/23".to_owned(), crate::Currency::EUR(0.27), crate::Currency::EUR(0.00)), + ("11/17/23".to_owned(), crate::Currency::EUR(0.27), crate::Currency::EUR(0.00)), + ("11/18/23".to_owned(), crate::Currency::EUR(0.26), crate::Currency::EUR(0.00)), + ("11/19/23".to_owned(), crate::Currency::EUR(0.27), crate::Currency::EUR(0.00)), + ("11/20/23".to_owned(), crate::Currency::EUR(0.26), crate::Currency::EUR(0.00)), + ("11/21/23".to_owned(), crate::Currency::EUR(0.27), crate::Currency::EUR(0.00)), + ("11/22/23".to_owned(), crate::Currency::EUR(0.26), crate::Currency::EUR(0.00)), + ("11/23/23".to_owned(), crate::Currency::EUR(0.27), crate::Currency::EUR(0.00)), + ("11/24/23".to_owned(), crate::Currency::EUR(0.27), crate::Currency::EUR(0.00)), + ("11/25/23".to_owned(), crate::Currency::EUR(0.26), crate::Currency::EUR(0.00)), + ("11/26/23".to_owned(), crate::Currency::EUR(0.27), crate::Currency::EUR(0.00)), + ("11/27/23".to_owned(), crate::Currency::EUR(0.26), crate::Currency::EUR(0.00)), ]); assert_eq!( @@ -442,97 +451,97 @@ mod tests { #[test] fn test_parse_revolut_transactions_pln() -> Result<(), String> { let expected_result = Ok(vec![ - ("08/29/23".to_owned(), crate::Currency::PLN(0.44)), - ("08/30/23".to_owned(), crate::Currency::PLN(0.45)), - ("08/31/23".to_owned(), crate::Currency::PLN(0.44)), - ("09/01/23".to_owned(), crate::Currency::PLN(0.45)), - ("09/02/23".to_owned(), crate::Currency::PLN(0.44)), - ("09/03/23".to_owned(), crate::Currency::PLN(0.44)), - ("09/04/23".to_owned(), crate::Currency::PLN(0.45)), - ("09/05/23".to_owned(), crate::Currency::PLN(0.77)), - ("09/06/23".to_owned(), crate::Currency::PLN(0.78)), - ("09/07/23".to_owned(), crate::Currency::PLN(0.78)), - ("09/08/23".to_owned(), crate::Currency::PLN(0.78)), - ("09/09/23".to_owned(), crate::Currency::PLN(0.77)), - ("09/10/23".to_owned(), crate::Currency::PLN(0.78)), - ("09/11/23".to_owned(), crate::Currency::PLN(0.78)), - ("09/12/23".to_owned(), crate::Currency::PLN(0.78)), - ("09/13/23".to_owned(), crate::Currency::PLN(0.77)), - ("09/14/23".to_owned(), crate::Currency::PLN(0.78)), - ("09/15/23".to_owned(), crate::Currency::PLN(0.78)), - ("09/16/23".to_owned(), crate::Currency::PLN(0.78)), - ("09/17/23".to_owned(), crate::Currency::PLN(0.78)), - ("09/18/23".to_owned(), crate::Currency::PLN(0.77)), - ("09/19/23".to_owned(), crate::Currency::PLN(1.0)), - ("09/20/23".to_owned(), crate::Currency::PLN(1.01)), - ("09/21/23".to_owned(), crate::Currency::PLN(1.0)), - ("09/22/23".to_owned(), crate::Currency::PLN(1.0)), - ("09/23/23".to_owned(), crate::Currency::PLN(1.0)), - ("09/24/23".to_owned(), crate::Currency::PLN(1.0)), - ("09/25/23".to_owned(), crate::Currency::PLN(1.0)), - ("09/26/23".to_owned(), crate::Currency::PLN(1.0)), - ("09/27/23".to_owned(), crate::Currency::PLN(1.0)), - ("09/28/23".to_owned(), crate::Currency::PLN(1.0)), - ("09/29/23".to_owned(), crate::Currency::PLN(1.0)), - ("09/30/23".to_owned(), crate::Currency::PLN(1.0)), - ("10/01/23".to_owned(), crate::Currency::PLN(1.01)), - ("10/02/23".to_owned(), crate::Currency::PLN(1.0)), - ("10/03/23".to_owned(), crate::Currency::PLN(1.0)), - ("10/04/23".to_owned(), crate::Currency::PLN(1.06)), - ("10/05/23".to_owned(), crate::Currency::PLN(1.05)), - ("10/06/23".to_owned(), crate::Currency::PLN(1.06)), - ("10/07/23".to_owned(), crate::Currency::PLN(1.06)), - ("10/08/23".to_owned(), crate::Currency::PLN(1.06)), - ("10/09/23".to_owned(), crate::Currency::PLN(1.05)), - ("10/10/23".to_owned(), crate::Currency::PLN(1.06)), - ("10/11/23".to_owned(), crate::Currency::PLN(1.06)), - ("10/12/23".to_owned(), crate::Currency::PLN(1.06)), - ("10/13/23".to_owned(), crate::Currency::PLN(1.06)), - ("10/14/23".to_owned(), crate::Currency::PLN(1.06)), - ("10/15/23".to_owned(), crate::Currency::PLN(1.05)), - ("10/16/23".to_owned(), crate::Currency::PLN(1.06)), - ("10/17/23".to_owned(), crate::Currency::PLN(1.06)), - ("10/18/23".to_owned(), crate::Currency::PLN(1.06)), - ("10/19/23".to_owned(), crate::Currency::PLN(1.06)), - ("10/20/23".to_owned(), crate::Currency::PLN(1.06)), - ("10/21/23".to_owned(), crate::Currency::PLN(1.06)), - ("10/22/23".to_owned(), crate::Currency::PLN(1.06)), - ("10/23/23".to_owned(), crate::Currency::PLN(1.06)), - ("10/24/23".to_owned(), crate::Currency::PLN(1.06)), - ("10/25/23".to_owned(), crate::Currency::PLN(1.06)), - ("10/26/23".to_owned(), crate::Currency::PLN(1.06)), - ("10/27/23".to_owned(), crate::Currency::PLN(1.06)), - ("10/28/23".to_owned(), crate::Currency::PLN(1.06)), - ("10/29/23".to_owned(), crate::Currency::PLN(1.06)), - ("10/30/23".to_owned(), crate::Currency::PLN(1.06)), - ("10/31/23".to_owned(), crate::Currency::PLN(1.06)), - ("11/01/23".to_owned(), crate::Currency::PLN(1.06)), - ("11/02/23".to_owned(), crate::Currency::PLN(1.06)), - ("11/03/23".to_owned(), crate::Currency::PLN(1.06)), - ("11/04/23".to_owned(), crate::Currency::PLN(1.12)), - ("11/05/23".to_owned(), crate::Currency::PLN(1.11)), - ("11/06/23".to_owned(), crate::Currency::PLN(1.12)), - ("11/07/23".to_owned(), crate::Currency::PLN(1.12)), - ("11/08/23".to_owned(), crate::Currency::PLN(1.11)), - ("11/09/23".to_owned(), crate::Currency::PLN(1.12)), - ("11/10/23".to_owned(), crate::Currency::PLN(1.12)), - ("11/11/23".to_owned(), crate::Currency::PLN(1.12)), - ("11/12/23".to_owned(), crate::Currency::PLN(1.11)), - ("11/13/23".to_owned(), crate::Currency::PLN(1.12)), - ("11/14/23".to_owned(), crate::Currency::PLN(1.12)), - ("11/15/23".to_owned(), crate::Currency::PLN(1.12)), - ("11/16/23".to_owned(), crate::Currency::PLN(1.11)), - ("11/17/23".to_owned(), crate::Currency::PLN(1.12)), - ("11/18/23".to_owned(), crate::Currency::PLN(1.12)), - ("11/19/23".to_owned(), crate::Currency::PLN(1.12)), - ("11/20/23".to_owned(), crate::Currency::PLN(1.12)), - ("11/21/23".to_owned(), crate::Currency::PLN(1.12)), - ("11/22/23".to_owned(), crate::Currency::PLN(0.82)), - ("11/23/23".to_owned(), crate::Currency::PLN(0.83)), - ("11/24/23".to_owned(), crate::Currency::PLN(0.83)), - ("11/25/23".to_owned(), crate::Currency::PLN(0.83)), - ("11/26/23".to_owned(), crate::Currency::PLN(0.83)), - ("11/27/23".to_owned(), crate::Currency::PLN(0.83)), + ("08/29/23".to_owned(), crate::Currency::PLN(0.44),crate::Currency::PLN(0.00)), + ("08/30/23".to_owned(), crate::Currency::PLN(0.45),crate::Currency::PLN(0.00)), + ("08/31/23".to_owned(), crate::Currency::PLN(0.44),crate::Currency::PLN(0.00)), + ("09/01/23".to_owned(), crate::Currency::PLN(0.45),crate::Currency::PLN(0.00)), + ("09/02/23".to_owned(), crate::Currency::PLN(0.44),crate::Currency::PLN(0.00)), + ("09/03/23".to_owned(), crate::Currency::PLN(0.44),crate::Currency::PLN(0.00)), + ("09/04/23".to_owned(), crate::Currency::PLN(0.45),crate::Currency::PLN(0.00)), + ("09/05/23".to_owned(), crate::Currency::PLN(0.77),crate::Currency::PLN(0.00)), + ("09/06/23".to_owned(), crate::Currency::PLN(0.78),crate::Currency::PLN(0.00)), + ("09/07/23".to_owned(), crate::Currency::PLN(0.78),crate::Currency::PLN(0.00)), + ("09/08/23".to_owned(), crate::Currency::PLN(0.78),crate::Currency::PLN(0.00)), + ("09/09/23".to_owned(), crate::Currency::PLN(0.77),crate::Currency::PLN(0.00)), + ("09/10/23".to_owned(), crate::Currency::PLN(0.78),crate::Currency::PLN(0.00)), + ("09/11/23".to_owned(), crate::Currency::PLN(0.78),crate::Currency::PLN(0.00)), + ("09/12/23".to_owned(), crate::Currency::PLN(0.78),crate::Currency::PLN(0.00)), + ("09/13/23".to_owned(), crate::Currency::PLN(0.77),crate::Currency::PLN(0.00)), + ("09/14/23".to_owned(), crate::Currency::PLN(0.78),crate::Currency::PLN(0.00)), + ("09/15/23".to_owned(), crate::Currency::PLN(0.78),crate::Currency::PLN(0.00)), + ("09/16/23".to_owned(), crate::Currency::PLN(0.78),crate::Currency::PLN(0.00)), + ("09/17/23".to_owned(), crate::Currency::PLN(0.78),crate::Currency::PLN(0.00)), + ("09/18/23".to_owned(), crate::Currency::PLN(0.77),crate::Currency::PLN(0.00)), + ("09/19/23".to_owned(), crate::Currency::PLN(1.0),crate::Currency::PLN(0.00)), + ("09/20/23".to_owned(), crate::Currency::PLN(1.01),crate::Currency::PLN(0.00)), + ("09/21/23".to_owned(), crate::Currency::PLN(1.0),crate::Currency::PLN(0.00)), + ("09/22/23".to_owned(), crate::Currency::PLN(1.0),crate::Currency::PLN(0.00)), + ("09/23/23".to_owned(), crate::Currency::PLN(1.0),crate::Currency::PLN(0.00)), + ("09/24/23".to_owned(), crate::Currency::PLN(1.0),crate::Currency::PLN(0.00)), + ("09/25/23".to_owned(), crate::Currency::PLN(1.0),crate::Currency::PLN(0.00)), + ("09/26/23".to_owned(), crate::Currency::PLN(1.0),crate::Currency::PLN(0.00)), + ("09/27/23".to_owned(), crate::Currency::PLN(1.0),crate::Currency::PLN(0.00)), + ("09/28/23".to_owned(), crate::Currency::PLN(1.0),crate::Currency::PLN(0.00)), + ("09/29/23".to_owned(), crate::Currency::PLN(1.0),crate::Currency::PLN(0.00)), + ("09/30/23".to_owned(), crate::Currency::PLN(1.0),crate::Currency::PLN(0.00)), + ("10/01/23".to_owned(), crate::Currency::PLN(1.01),crate::Currency::PLN(0.00)), + ("10/02/23".to_owned(), crate::Currency::PLN(1.0),crate::Currency::PLN(0.00)), + ("10/03/23".to_owned(), crate::Currency::PLN(1.0),crate::Currency::PLN(0.00)), + ("10/04/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("10/05/23".to_owned(), crate::Currency::PLN(1.05),crate::Currency::PLN(0.00)), + ("10/06/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("10/07/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("10/08/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("10/09/23".to_owned(), crate::Currency::PLN(1.05),crate::Currency::PLN(0.00)), + ("10/10/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("10/11/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("10/12/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("10/13/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("10/14/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("10/15/23".to_owned(), crate::Currency::PLN(1.05),crate::Currency::PLN(0.00)), + ("10/16/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("10/17/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("10/18/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("10/19/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("10/20/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("10/21/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("10/22/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("10/23/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("10/24/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("10/25/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("10/26/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("10/27/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("10/28/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("10/29/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("10/30/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("10/31/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("11/01/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("11/02/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("11/03/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), + ("11/04/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), + ("11/05/23".to_owned(), crate::Currency::PLN(1.11),crate::Currency::PLN(0.00)), + ("11/06/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), + ("11/07/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), + ("11/08/23".to_owned(), crate::Currency::PLN(1.11),crate::Currency::PLN(0.00)), + ("11/09/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), + ("11/10/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), + ("11/11/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), + ("11/12/23".to_owned(), crate::Currency::PLN(1.11),crate::Currency::PLN(0.00)), + ("11/13/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), + ("11/14/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), + ("11/15/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), + ("11/16/23".to_owned(), crate::Currency::PLN(1.11),crate::Currency::PLN(0.00)), + ("11/17/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), + ("11/18/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), + ("11/19/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), + ("11/20/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), + ("11/21/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), + ("11/22/23".to_owned(), crate::Currency::PLN(0.82),crate::Currency::PLN(0.00)), + ("11/23/23".to_owned(), crate::Currency::PLN(0.83),crate::Currency::PLN(0.00)), + ("11/24/23".to_owned(), crate::Currency::PLN(0.83),crate::Currency::PLN(0.00)), + ("11/25/23".to_owned(), crate::Currency::PLN(0.83),crate::Currency::PLN(0.00)), + ("11/26/23".to_owned(), crate::Currency::PLN(0.83),crate::Currency::PLN(0.00)), + ("11/27/23".to_owned(), crate::Currency::PLN(0.83),crate::Currency::PLN(0.00)), ]); assert_eq!( parse_revolut_transactions("revolut_data/Revolut_30cze2023_27lis2023.csv"), @@ -545,21 +554,25 @@ mod tests { #[test] fn test_parse_revolut_investment_gain_and_losses() -> Result<(), String> { -/* -2024-03-04 617 92.57 PLN 524.43 PLN PLN -2024-03-21 259.17 $0 259.17 PLN PLN -2024-03-25 212.39 31.87 PLN 180.52 PLN PLN -2024-05-16 700.17 105.04 PLN 595.13 PLN PLN -2024-05-31 875.82 131.38 PLN 744.44 PLN PLN -2024-06-03 488.26 73.25 PLN 415.01 PLN PLN -2024-06-04 613.2 92 PLN 521.20 PLN PLN -2024-06-11 186.16 27.92 PLN 158.24 PLN PLN -2024-06-13 264.74 $0 264.74 PLN PLN -2024-06-18 858.33 128.74 PLN 729.59 PLN PLN -2024-07-12 421.5 63.23 PLN 358.27 PLN PLN -2024-07-16 834.55 125.18 PLN 709.37 PLN PLN -*/ + let expected_result = Ok(vec![ + ("03/04/24".to_owned(), crate::Currency::PLN(617.00),crate::Currency::PLN(92.57 )), + ("03/21/24".to_owned(), crate::Currency::PLN(259.17),crate::Currency::PLN(0.0)), + ("03/25/24".to_owned(), crate::Currency::PLN(212.39),crate::Currency::PLN(31.87)), + ("05/16/24".to_owned(), crate::Currency::PLN(700.17),crate::Currency::PLN(105.04)), + ("05/31/24".to_owned(), crate::Currency::PLN(875.82),crate::Currency::PLN(131.38)), + ("06/03/24".to_owned(), crate::Currency::PLN(488.26),crate::Currency::PLN(73.25 )), + ("06/04/24".to_owned(), crate::Currency::PLN(613.2 ),crate::Currency::PLN(92.00)), + ("06/11/24".to_owned(), crate::Currency::PLN(186.16),crate::Currency::PLN(27.92)), + ("06/13/24".to_owned(), crate::Currency::PLN(264.74),crate::Currency::PLN(0.00)), + ("06/18/24".to_owned(), crate::Currency::PLN(858.33),crate::Currency::PLN(128.74)), + ("07/12/24".to_owned(), crate::Currency::PLN(421.5 ),crate::Currency::PLN(63.23 )), + ("07/16/24".to_owned(), crate::Currency::PLN(834.55),crate::Currency::PLN(125.18)), + ]); + assert_eq!( + parse_revolut_transactions("revolut_data/trading-pnl-statement_2024-01-01_2024-08-04_pl-pl_8e8783.csv"), + expected_result + ); Ok(()) } @@ -568,25 +581,25 @@ mod tests { #[test] fn test_parse_revolut_transactions_english_statement_pln() -> Result<(), String> { let expected_result = Ok(vec![ - ("12/12/23".to_owned(), crate::Currency::PLN(0.21)), - ("12/13/23".to_owned(), crate::Currency::PLN(0.20)), - ("12/15/23".to_owned(), crate::Currency::PLN(0.21)), - ("12/16/23".to_owned(), crate::Currency::PLN(0.21)), - ("12/17/23".to_owned(), crate::Currency::PLN(0.21)), - ("12/18/23".to_owned(), crate::Currency::PLN(0.21)), - ("12/19/23".to_owned(), crate::Currency::PLN(0.41)), - ("12/20/23".to_owned(), crate::Currency::PLN(0.21)), - ("12/21/23".to_owned(), crate::Currency::PLN(0.21)), - ("12/22/23".to_owned(), crate::Currency::PLN(0.21)), - ("12/23/23".to_owned(), crate::Currency::PLN(0.21)), - ("12/24/23".to_owned(), crate::Currency::PLN(0.21)), - ("12/25/23".to_owned(), crate::Currency::PLN(0.21)), - ("12/26/23".to_owned(), crate::Currency::PLN(0.21)), - ("12/27/23".to_owned(), crate::Currency::PLN(0.21)), - ("12/28/23".to_owned(), crate::Currency::PLN(0.21)), - ("12/29/23".to_owned(), crate::Currency::PLN(0.21)), - ("12/30/23".to_owned(), crate::Currency::PLN(0.21)), - ("12/31/23".to_owned(), crate::Currency::PLN(0.21)), + ("12/12/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), + ("12/13/23".to_owned(), crate::Currency::PLN(0.20),crate::Currency::PLN(0.00)), + ("12/15/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), + ("12/16/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), + ("12/17/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), + ("12/18/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), + ("12/19/23".to_owned(), crate::Currency::PLN(0.41),crate::Currency::PLN(0.00)), + ("12/20/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), + ("12/21/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), + ("12/22/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), + ("12/23/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), + ("12/24/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), + ("12/25/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), + ("12/26/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), + ("12/27/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), + ("12/28/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), + ("12/29/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), + ("12/30/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), + ("12/31/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), ]); assert_eq!( parse_revolut_transactions("revolut_data/revolut-savings-eng.csv"), @@ -599,9 +612,9 @@ mod tests { #[test] fn test_parse_revolut_investment_transactions_usd() -> Result<(), String> { let expected_result = Ok(vec![ - ("11/02/23".to_owned(), crate::Currency::USD(-0.02)), - ("12/01/23".to_owned(), crate::Currency::USD(-0.51)), - ("12/14/23".to_owned(), crate::Currency::USD(2.94)), + ("11/02/23".to_owned(), crate::Currency::USD(-0.02),crate::Currency::USD(0.00)), + ("12/01/23".to_owned(), crate::Currency::USD(-0.51),crate::Currency::USD(0.00)), + ("12/14/23".to_owned(), crate::Currency::USD(2.94),crate::Currency::USD(0.00)), ]); assert_eq!( parse_revolut_transactions("revolut_data/revolut_div.csv"), diff --git a/src/transactions.rs b/src/transactions.rs index aa367a5..a61df60 100644 --- a/src/transactions.rs +++ b/src/transactions.rs @@ -286,8 +286,8 @@ mod tests { #[test] fn test_create_detailed_revolut_transactions_eur() -> Result<(), String> { let parsed_transactions = vec![ - ("03/01/21".to_owned(), crate::Currency::EUR(0.05)), - ("04/11/21".to_owned(), crate::Currency::EUR(0.07)), + ("03/01/21".to_owned(), crate::Currency::EUR(0.05),crate::Currency::EUR(0.00)), + ("04/11/21".to_owned(), crate::Currency::EUR(0.07),crate::Currency::EUR(0.00)), ]; let mut dates: std::collections::HashMap> = @@ -329,8 +329,8 @@ mod tests { #[test] fn test_create_detailed_revolut_transactions_pln() -> Result<(), String> { let parsed_transactions = vec![ - ("03/01/21".to_owned(), crate::Currency::PLN(0.44)), - ("04/11/21".to_owned(), crate::Currency::PLN(0.45)), + ("03/01/21".to_owned(), crate::Currency::PLN(0.44), crate::Currency::PLN(0.00)), + ("04/11/21".to_owned(), crate::Currency::PLN(0.45), crate::Currency::PLN(0.00)), ]; let mut dates: std::collections::HashMap> = From 87f182c234d5498218d9ce5c9e542c3133b23fb8 Mon Sep 17 00:00:00 2001 From: Jacek Czaja Date: Wed, 14 Aug 2024 09:29:43 +0200 Subject: [PATCH 3/7] - Dividends parsing works from revolut gain and posses CSV document --- src/csvparser.rs | 1521 ++++++++++++++++++++++++++++++++++++------- src/transactions.rs | 24 +- 2 files changed, 1302 insertions(+), 243 deletions(-) diff --git a/src/csvparser.rs b/src/csvparser.rs index 6bb3160..40281e3 100644 --- a/src/csvparser.rs +++ b/src/csvparser.rs @@ -13,6 +13,40 @@ use nom::{ }; use polars::prelude::*; +fn extract_cash_with_currency(cashline: &str, currency: &str) -> Result { + log::info!("Entry cacheline: {cashline}"); + log::info!("Entry currency: {currency}"); + + println!("Entry cacheline: {cashline}"); + println!("Entry currency: {currency}"); + + let cashline_string: String = cashline.to_string().replace(",", ""); + let mut pln_parser = tuple((double::<&str, Error<_>>, take(1usize), tag("PLN"))); + let mut usd_parser = tuple((tag("$"), double::<&str, Error<_>>)); + + // Let's check if We can convert value of currency to f64 directly + let value: f64 = cashline_string + .parse::() + .map_err(|_| format!("error parsing \"{cashline_string}\" to f64")) + .or_else(|_| { + let (_, (value, _, _)) = pln_parser(cashline_string.as_str()) + .map_err(|_| format!("error converting string: \"{cashline_string}\" to f64"))?; + Ok::(value) + }) + .or_else(|_| { + let (_, (_, value)) = usd_parser(cashline_string.as_str()) + .map_err(|_| format!("error converting string: \"{cashline_string}\" to f64"))?; + Ok::(value) + })?; + + match currency { + "PLN" => Ok(crate::Currency::PLN(value)), + "USD" => Ok(crate::Currency::USD(value)), + "EUR" => Ok(crate::Currency::EUR(value)), + _ => Err(format!("Error converting: {cashline_string}")), + } +} + fn extract_cash(cashline: &str) -> Result { // We need to erase "," before processing it by parser log::info!("Entry moneyin/total amount line: {cashline}"); @@ -40,6 +74,14 @@ fn extract_cash(cashline: &str) -> Result { } } +fn extract_dividends_transactions(df: &DataFrame) -> Result { + let mut df_transactions = df + .select(&["Date", "Gross amount", "Withholding tax", "Currency"]) + .map_err(|_| "Error: Unable to select dividend data")?; + + Ok(df_transactions) +} + fn extract_investment_gains_and_costs_transactions( df: &DataFrame, ) -> Result { @@ -108,7 +150,7 @@ fn extract_intrest_rate_transactions(df: &DataFrame) -> Result Result, &'static str> { let date = df .column("Date") - .map_err(|_| "Error: Unable to select Complete Date")?; + .map_err(|_| "Error: Unable to select Date")?; let mut dates: Vec = vec![]; let possible_dates = date .utf8() @@ -116,6 +158,7 @@ fn parse_investment_transaction_dates(df: &DataFrame) -> Result, &'s possible_dates.into_iter().try_for_each(|x| { if let Some(d) = x { let cd = chrono::NaiveDate::parse_from_str(&d, "%Y-%m-%dT%H:%M:%S%.fZ") + .or_else(|_| chrono::NaiveDate::parse_from_str(&d, "%Y-%m-%d")) .map_err(|_| "Error converting cell to NaiveDate")? .format("%m/%d/%y") .to_string(); @@ -166,21 +209,77 @@ fn parse_incomes(df: DataFrame, col: &str) -> Result, &'sta Ok(incomes) } +fn parse_income_with_currency( + df: &DataFrame, + income_col: &str, + currency_col: &str, +) -> Result, String> { + let mut incomes: Vec = vec![]; + let moneyin = df + .column(income_col) + .map_err(|_| "Error: Unable to select Income column")?; + let currency = df + .column(currency_col) + .map_err(|_| "Error: Unable to select Currency column")?; + let possible_currency = currency + .utf8() + .map_err(|e| format!("Unable to convert to utf8. Error: {e}"))?; + match moneyin.dtype() { + DataType::Float64 => { + let possible_incomes = moneyin + .f64() + .map_err(|e| format!("Unable to convert to f64. Error: {e}"))?; + + possible_incomes + .into_iter() + .zip(possible_currency) + .try_for_each(|(x, y)| { + if let (Some(d), Some(c)) = (x, y) { + incomes.push(extract_cash_with_currency(&format!("{d}"), c)?); + } + Ok::<(), String>(()) + })?; + } + DataType::Utf8 => { + let possible_incomes = moneyin + .utf8() + .map_err(|e| format!("Unable to convert to utf8. Error: {e}"))?; + + possible_incomes + .into_iter() + .zip(possible_currency) + .try_for_each(|(x, y)| { + if let (Some(d), Some(c)) = (x, y) { + incomes.push(extract_cash_with_currency(d, c)?); + } + Ok::<(), String>(()) + })?; + } + _ => return Err("Error: Unable to convert to utf8 or f64".to_string()), + } + + Ok(incomes) +} + /// Parse revolut CSV documents (savings account and trading) /// returns: transactions in a form: date, gross income , tax taken pub fn parse_revolut_transactions( csvtoparse: &str, ) -> Result, String> { - let mut transactions: Vec<(String, crate::Currency, crate::Currency)> = vec![]; let mut dates: Vec = vec![]; let mut incomes: Vec = vec![]; let mut taxes: Vec = vec![]; - let mut rdr = csv::Reader::from_path(csvtoparse).map_err(|_| "Error: opening CSV")?; - let result = rdr.headers().map_err(|e| format!("Error: scanning CSV header: {e}"))?; - //let header_string : String = result.deserialize(None).map_err(|e| format!("Error: deserializing CSV header: {e}"))?; - if result.iter().any(|field| field == "Completed Date") { + //let mut rdr = csv::Reader::from_path(csvtoparse).map_err(|_| "Error: opening CSV")?; + let mut rdr = csv::ReaderBuilder::new() + .flexible(true) + .from_path(csvtoparse) + .map_err(|_| "Error: opening CSV")?; + let result = rdr + .headers() + .map_err(|e| format!("Error: scanning CSV header: {e}"))?; + if result.iter().any(|field| field == "Completed Date") { log::info!("Detected Savings account statement: {csvtoparse}"); let df = CsvReader::from_path(csvtoparse) .map_err(|_| "Error: opening CSV")? @@ -195,14 +294,12 @@ pub fn parse_revolut_transactions( log::info!("Filtered data of Interest: {filtred_df}"); dates = parse_transaction_dates(&filtred_df)?; - log::info!("Dates: {:?}", dates); incomes = parse_incomes(filtred_df, "Money in")?; - log::info!("Incomes: {:?}", incomes); // Taxes are not automatically taken from savings account // so we will put zeros as tax taken taxes = incomes.iter().map(|i| i.derive(0.0)).collect(); - } else if result.iter().any(|field| field == "Price per share") { + } else if result.iter().any(|field| field == "Price per share") { log::info!("Detected Investment account statement: {csvtoparse}"); let df = CsvReader::from_path(csvtoparse) .map_err(|_| "Error: opening CSV")? @@ -214,17 +311,60 @@ pub fn parse_revolut_transactions( let filtred_df = extract_investment_gains_and_costs_transactions(&df)?; log::info!("Filtered Data of interest: {filtred_df}"); dates = parse_investment_transaction_dates(&filtred_df)?; - log::info!("Investment/Fees Dates: {:?}", dates); incomes = parse_incomes(filtred_df, "Total Amount")?; - log::info!("Incomes: {:?}", incomes); taxes = incomes.iter().map(|i| i.derive(0.0)).collect(); - } else if result.iter().any(|field| field == "Income from Sells") { - return Err("ERROR: Unsupported CSV type of document: {csvtoparse}".to_string()); + } else if result.iter().any(|field| field == "Income from Sells") { + let mut content1 = String::new(); + let mut content2 = String::new(); + let mut switch = false; + for result in rdr.records() { + let record = result.map_err(|e| format!("Error reading CSV: {e}"))?; + let line = record.into_iter().collect::>().join(","); + if line.starts_with("Other income & fees") { + switch = true; + } else { + if switch { + content2.push_str(&line); + content2.push('\n'); + } else { + content1.push_str(&line); + content1.push('\n'); + } + } + } + log::info!("Content of first to be DataFrame: {content1}"); + log::info!("Content of second to be DataFrame: {content2}"); + + let sales = CsvReader::new(std::io::Cursor::new(content1.as_bytes())) + .finish() + .map_err(|e| format!("Error reading CSV: {e}"))?; + + let others = CsvReader::new(std::io::Cursor::new(content2.as_bytes())) + .finish() + .map_err(|e| format!("Error reading CSV: {e}"))?; + + log::info!("Content of first to be DataFrame: {sales}"); + log::info!("Content of second to be DataFrame: {others}"); + + println!("Content of second to be DataFrame: {others}"); + + let filtred_df = extract_dividends_transactions(&others)?; + log::info!("Filtered Data of interest: {filtred_df}"); + dates = parse_investment_transaction_dates(&filtred_df)?; + // parse income + incomes = parse_income_with_currency(&filtred_df, "Gross amount", "Currency")?; + // parse taxes + taxes = parse_income_with_currency(&filtred_df, "Withholding tax", "Currency")?; + + // TODO: sales } else { return Err("ERROR: Unsupported CSV type of document: {csvtoparse}".to_string()); } - let iter = std::iter::zip(dates, std::iter::zip(incomes,taxes)); + log::info!("Investment/Fees Dates: {:?}", dates); + log::info!("Incomes: {:?}", incomes); + log::info!("Taxes: {:?}", taxes); + let iter = std::iter::zip(dates, std::iter::zip(incomes, taxes)); iter.for_each(|(d, (m, t))| { transactions.push((d, m, t)); }); @@ -339,105 +479,508 @@ mod tests { Ok(()) } + #[test] + fn test_parse_gain_and_losses_transaction_dates() -> Result<(), String> { + let completed_dates = Series::new("Date", vec!["2024-03-04", "2024-07-16"]); + let description = Series::new("Type", vec!["DIVIDEND", "CUSTODY FEE"]); + + let df = DataFrame::new(vec![description, completed_dates]) + .map_err(|_| "Error creating DataFrame")?; + + let expected_first_date = "03/04/24".to_owned(); + let expected_second_date = "07/16/24".to_owned(); + + assert_eq!( + parse_investment_transaction_dates(&df), + Ok(vec![expected_first_date, expected_second_date]) + ); + + Ok(()) + } + #[test] fn test_parse_revolut_transactions_eur() -> Result<(), String> { let expected_result = Ok(vec![ - ("08/24/23".to_owned(), crate::Currency::EUR(0.05), crate::Currency::EUR(0.00)), - ("08/25/23".to_owned(), crate::Currency::EUR(0.07), crate::Currency::EUR(0.00)), - ("08/26/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), - ("08/27/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), - ("08/28/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), - ("08/29/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), - ("08/30/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), - ("08/31/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), - ("09/01/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), - ("09/02/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), - ("09/03/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), - ("09/04/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), - ("09/05/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), - ("09/06/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), - ("09/07/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), - ("09/08/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), - ("09/09/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), - ("09/10/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), - ("09/11/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), - ("09/12/23".to_owned(), crate::Currency::EUR(0.06), crate::Currency::EUR(0.00)), - ("09/13/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("09/14/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("09/15/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("09/16/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("09/17/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), - ("09/18/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("09/19/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("09/20/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("09/21/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("09/22/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("09/23/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("09/24/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("09/25/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), - ("09/26/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("09/27/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("09/28/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("09/29/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("09/30/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("10/01/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("10/02/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("10/03/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), - ("10/04/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("10/05/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("10/06/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("10/07/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("10/08/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("10/09/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("10/10/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("10/11/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), - ("10/12/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("10/13/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("10/14/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("10/15/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("10/16/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("10/17/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("10/18/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), - ("10/19/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("10/20/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("10/21/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("10/22/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("10/23/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("10/24/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), - ("10/25/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), - ("10/26/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), - ("10/27/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("10/28/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), - ("10/29/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), - ("10/30/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), - ("10/31/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("11/01/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), - ("11/02/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), - ("11/03/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), - ("11/04/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("11/05/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), - ("11/06/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), - ("11/07/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), - ("11/08/23".to_owned(), crate::Currency::EUR(0.24), crate::Currency::EUR(0.00)), - ("11/09/23".to_owned(), crate::Currency::EUR(0.25), crate::Currency::EUR(0.00)), - ("11/10/23".to_owned(), crate::Currency::EUR(0.27), crate::Currency::EUR(0.00)), - ("11/11/23".to_owned(), crate::Currency::EUR(0.26), crate::Currency::EUR(0.00)), - ("11/12/23".to_owned(), crate::Currency::EUR(0.27), crate::Currency::EUR(0.00)), - ("11/13/23".to_owned(), crate::Currency::EUR(0.26), crate::Currency::EUR(0.00)), - ("11/14/23".to_owned(), crate::Currency::EUR(0.27), crate::Currency::EUR(0.00)), - ("11/15/23".to_owned(), crate::Currency::EUR(0.26), crate::Currency::EUR(0.00)), - ("11/16/23".to_owned(), crate::Currency::EUR(0.27), crate::Currency::EUR(0.00)), - ("11/17/23".to_owned(), crate::Currency::EUR(0.27), crate::Currency::EUR(0.00)), - ("11/18/23".to_owned(), crate::Currency::EUR(0.26), crate::Currency::EUR(0.00)), - ("11/19/23".to_owned(), crate::Currency::EUR(0.27), crate::Currency::EUR(0.00)), - ("11/20/23".to_owned(), crate::Currency::EUR(0.26), crate::Currency::EUR(0.00)), - ("11/21/23".to_owned(), crate::Currency::EUR(0.27), crate::Currency::EUR(0.00)), - ("11/22/23".to_owned(), crate::Currency::EUR(0.26), crate::Currency::EUR(0.00)), - ("11/23/23".to_owned(), crate::Currency::EUR(0.27), crate::Currency::EUR(0.00)), - ("11/24/23".to_owned(), crate::Currency::EUR(0.27), crate::Currency::EUR(0.00)), - ("11/25/23".to_owned(), crate::Currency::EUR(0.26), crate::Currency::EUR(0.00)), - ("11/26/23".to_owned(), crate::Currency::EUR(0.27), crate::Currency::EUR(0.00)), - ("11/27/23".to_owned(), crate::Currency::EUR(0.26), crate::Currency::EUR(0.00)), + ( + "08/24/23".to_owned(), + crate::Currency::EUR(0.05), + crate::Currency::EUR(0.00), + ), + ( + "08/25/23".to_owned(), + crate::Currency::EUR(0.07), + crate::Currency::EUR(0.00), + ), + ( + "08/26/23".to_owned(), + crate::Currency::EUR(0.06), + crate::Currency::EUR(0.00), + ), + ( + "08/27/23".to_owned(), + crate::Currency::EUR(0.06), + crate::Currency::EUR(0.00), + ), + ( + "08/28/23".to_owned(), + crate::Currency::EUR(0.06), + crate::Currency::EUR(0.00), + ), + ( + "08/29/23".to_owned(), + crate::Currency::EUR(0.06), + crate::Currency::EUR(0.00), + ), + ( + "08/30/23".to_owned(), + crate::Currency::EUR(0.06), + crate::Currency::EUR(0.00), + ), + ( + "08/31/23".to_owned(), + crate::Currency::EUR(0.06), + crate::Currency::EUR(0.00), + ), + ( + "09/01/23".to_owned(), + crate::Currency::EUR(0.06), + crate::Currency::EUR(0.00), + ), + ( + "09/02/23".to_owned(), + crate::Currency::EUR(0.06), + crate::Currency::EUR(0.00), + ), + ( + "09/03/23".to_owned(), + crate::Currency::EUR(0.06), + crate::Currency::EUR(0.00), + ), + ( + "09/04/23".to_owned(), + crate::Currency::EUR(0.06), + crate::Currency::EUR(0.00), + ), + ( + "09/05/23".to_owned(), + crate::Currency::EUR(0.06), + crate::Currency::EUR(0.00), + ), + ( + "09/06/23".to_owned(), + crate::Currency::EUR(0.06), + crate::Currency::EUR(0.00), + ), + ( + "09/07/23".to_owned(), + crate::Currency::EUR(0.06), + crate::Currency::EUR(0.00), + ), + ( + "09/08/23".to_owned(), + crate::Currency::EUR(0.06), + crate::Currency::EUR(0.00), + ), + ( + "09/09/23".to_owned(), + crate::Currency::EUR(0.06), + crate::Currency::EUR(0.00), + ), + ( + "09/10/23".to_owned(), + crate::Currency::EUR(0.06), + crate::Currency::EUR(0.00), + ), + ( + "09/11/23".to_owned(), + crate::Currency::EUR(0.06), + crate::Currency::EUR(0.00), + ), + ( + "09/12/23".to_owned(), + crate::Currency::EUR(0.06), + crate::Currency::EUR(0.00), + ), + ( + "09/13/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "09/14/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "09/15/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "09/16/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "09/17/23".to_owned(), + crate::Currency::EUR(0.25), + crate::Currency::EUR(0.00), + ), + ( + "09/18/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "09/19/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "09/20/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "09/21/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "09/22/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "09/23/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "09/24/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "09/25/23".to_owned(), + crate::Currency::EUR(0.25), + crate::Currency::EUR(0.00), + ), + ( + "09/26/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "09/27/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "09/28/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "09/29/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "09/30/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "10/01/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "10/02/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "10/03/23".to_owned(), + crate::Currency::EUR(0.25), + crate::Currency::EUR(0.00), + ), + ( + "10/04/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "10/05/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "10/06/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "10/07/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "10/08/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "10/09/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "10/10/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "10/11/23".to_owned(), + crate::Currency::EUR(0.25), + crate::Currency::EUR(0.00), + ), + ( + "10/12/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "10/13/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "10/14/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "10/15/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "10/16/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "10/17/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "10/18/23".to_owned(), + crate::Currency::EUR(0.25), + crate::Currency::EUR(0.00), + ), + ( + "10/19/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "10/20/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "10/21/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "10/22/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "10/23/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "10/24/23".to_owned(), + crate::Currency::EUR(0.25), + crate::Currency::EUR(0.00), + ), + ( + "10/25/23".to_owned(), + crate::Currency::EUR(0.25), + crate::Currency::EUR(0.00), + ), + ( + "10/26/23".to_owned(), + crate::Currency::EUR(0.25), + crate::Currency::EUR(0.00), + ), + ( + "10/27/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "10/28/23".to_owned(), + crate::Currency::EUR(0.25), + crate::Currency::EUR(0.00), + ), + ( + "10/29/23".to_owned(), + crate::Currency::EUR(0.25), + crate::Currency::EUR(0.00), + ), + ( + "10/30/23".to_owned(), + crate::Currency::EUR(0.25), + crate::Currency::EUR(0.00), + ), + ( + "10/31/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "11/01/23".to_owned(), + crate::Currency::EUR(0.25), + crate::Currency::EUR(0.00), + ), + ( + "11/02/23".to_owned(), + crate::Currency::EUR(0.25), + crate::Currency::EUR(0.00), + ), + ( + "11/03/23".to_owned(), + crate::Currency::EUR(0.25), + crate::Currency::EUR(0.00), + ), + ( + "11/04/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "11/05/23".to_owned(), + crate::Currency::EUR(0.25), + crate::Currency::EUR(0.00), + ), + ( + "11/06/23".to_owned(), + crate::Currency::EUR(0.25), + crate::Currency::EUR(0.00), + ), + ( + "11/07/23".to_owned(), + crate::Currency::EUR(0.25), + crate::Currency::EUR(0.00), + ), + ( + "11/08/23".to_owned(), + crate::Currency::EUR(0.24), + crate::Currency::EUR(0.00), + ), + ( + "11/09/23".to_owned(), + crate::Currency::EUR(0.25), + crate::Currency::EUR(0.00), + ), + ( + "11/10/23".to_owned(), + crate::Currency::EUR(0.27), + crate::Currency::EUR(0.00), + ), + ( + "11/11/23".to_owned(), + crate::Currency::EUR(0.26), + crate::Currency::EUR(0.00), + ), + ( + "11/12/23".to_owned(), + crate::Currency::EUR(0.27), + crate::Currency::EUR(0.00), + ), + ( + "11/13/23".to_owned(), + crate::Currency::EUR(0.26), + crate::Currency::EUR(0.00), + ), + ( + "11/14/23".to_owned(), + crate::Currency::EUR(0.27), + crate::Currency::EUR(0.00), + ), + ( + "11/15/23".to_owned(), + crate::Currency::EUR(0.26), + crate::Currency::EUR(0.00), + ), + ( + "11/16/23".to_owned(), + crate::Currency::EUR(0.27), + crate::Currency::EUR(0.00), + ), + ( + "11/17/23".to_owned(), + crate::Currency::EUR(0.27), + crate::Currency::EUR(0.00), + ), + ( + "11/18/23".to_owned(), + crate::Currency::EUR(0.26), + crate::Currency::EUR(0.00), + ), + ( + "11/19/23".to_owned(), + crate::Currency::EUR(0.27), + crate::Currency::EUR(0.00), + ), + ( + "11/20/23".to_owned(), + crate::Currency::EUR(0.26), + crate::Currency::EUR(0.00), + ), + ( + "11/21/23".to_owned(), + crate::Currency::EUR(0.27), + crate::Currency::EUR(0.00), + ), + ( + "11/22/23".to_owned(), + crate::Currency::EUR(0.26), + crate::Currency::EUR(0.00), + ), + ( + "11/23/23".to_owned(), + crate::Currency::EUR(0.27), + crate::Currency::EUR(0.00), + ), + ( + "11/24/23".to_owned(), + crate::Currency::EUR(0.27), + crate::Currency::EUR(0.00), + ), + ( + "11/25/23".to_owned(), + crate::Currency::EUR(0.26), + crate::Currency::EUR(0.00), + ), + ( + "11/26/23".to_owned(), + crate::Currency::EUR(0.27), + crate::Currency::EUR(0.00), + ), + ( + "11/27/23".to_owned(), + crate::Currency::EUR(0.26), + crate::Currency::EUR(0.00), + ), ]); assert_eq!( @@ -451,97 +994,461 @@ mod tests { #[test] fn test_parse_revolut_transactions_pln() -> Result<(), String> { let expected_result = Ok(vec![ - ("08/29/23".to_owned(), crate::Currency::PLN(0.44),crate::Currency::PLN(0.00)), - ("08/30/23".to_owned(), crate::Currency::PLN(0.45),crate::Currency::PLN(0.00)), - ("08/31/23".to_owned(), crate::Currency::PLN(0.44),crate::Currency::PLN(0.00)), - ("09/01/23".to_owned(), crate::Currency::PLN(0.45),crate::Currency::PLN(0.00)), - ("09/02/23".to_owned(), crate::Currency::PLN(0.44),crate::Currency::PLN(0.00)), - ("09/03/23".to_owned(), crate::Currency::PLN(0.44),crate::Currency::PLN(0.00)), - ("09/04/23".to_owned(), crate::Currency::PLN(0.45),crate::Currency::PLN(0.00)), - ("09/05/23".to_owned(), crate::Currency::PLN(0.77),crate::Currency::PLN(0.00)), - ("09/06/23".to_owned(), crate::Currency::PLN(0.78),crate::Currency::PLN(0.00)), - ("09/07/23".to_owned(), crate::Currency::PLN(0.78),crate::Currency::PLN(0.00)), - ("09/08/23".to_owned(), crate::Currency::PLN(0.78),crate::Currency::PLN(0.00)), - ("09/09/23".to_owned(), crate::Currency::PLN(0.77),crate::Currency::PLN(0.00)), - ("09/10/23".to_owned(), crate::Currency::PLN(0.78),crate::Currency::PLN(0.00)), - ("09/11/23".to_owned(), crate::Currency::PLN(0.78),crate::Currency::PLN(0.00)), - ("09/12/23".to_owned(), crate::Currency::PLN(0.78),crate::Currency::PLN(0.00)), - ("09/13/23".to_owned(), crate::Currency::PLN(0.77),crate::Currency::PLN(0.00)), - ("09/14/23".to_owned(), crate::Currency::PLN(0.78),crate::Currency::PLN(0.00)), - ("09/15/23".to_owned(), crate::Currency::PLN(0.78),crate::Currency::PLN(0.00)), - ("09/16/23".to_owned(), crate::Currency::PLN(0.78),crate::Currency::PLN(0.00)), - ("09/17/23".to_owned(), crate::Currency::PLN(0.78),crate::Currency::PLN(0.00)), - ("09/18/23".to_owned(), crate::Currency::PLN(0.77),crate::Currency::PLN(0.00)), - ("09/19/23".to_owned(), crate::Currency::PLN(1.0),crate::Currency::PLN(0.00)), - ("09/20/23".to_owned(), crate::Currency::PLN(1.01),crate::Currency::PLN(0.00)), - ("09/21/23".to_owned(), crate::Currency::PLN(1.0),crate::Currency::PLN(0.00)), - ("09/22/23".to_owned(), crate::Currency::PLN(1.0),crate::Currency::PLN(0.00)), - ("09/23/23".to_owned(), crate::Currency::PLN(1.0),crate::Currency::PLN(0.00)), - ("09/24/23".to_owned(), crate::Currency::PLN(1.0),crate::Currency::PLN(0.00)), - ("09/25/23".to_owned(), crate::Currency::PLN(1.0),crate::Currency::PLN(0.00)), - ("09/26/23".to_owned(), crate::Currency::PLN(1.0),crate::Currency::PLN(0.00)), - ("09/27/23".to_owned(), crate::Currency::PLN(1.0),crate::Currency::PLN(0.00)), - ("09/28/23".to_owned(), crate::Currency::PLN(1.0),crate::Currency::PLN(0.00)), - ("09/29/23".to_owned(), crate::Currency::PLN(1.0),crate::Currency::PLN(0.00)), - ("09/30/23".to_owned(), crate::Currency::PLN(1.0),crate::Currency::PLN(0.00)), - ("10/01/23".to_owned(), crate::Currency::PLN(1.01),crate::Currency::PLN(0.00)), - ("10/02/23".to_owned(), crate::Currency::PLN(1.0),crate::Currency::PLN(0.00)), - ("10/03/23".to_owned(), crate::Currency::PLN(1.0),crate::Currency::PLN(0.00)), - ("10/04/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("10/05/23".to_owned(), crate::Currency::PLN(1.05),crate::Currency::PLN(0.00)), - ("10/06/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("10/07/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("10/08/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("10/09/23".to_owned(), crate::Currency::PLN(1.05),crate::Currency::PLN(0.00)), - ("10/10/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("10/11/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("10/12/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("10/13/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("10/14/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("10/15/23".to_owned(), crate::Currency::PLN(1.05),crate::Currency::PLN(0.00)), - ("10/16/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("10/17/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("10/18/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("10/19/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("10/20/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("10/21/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("10/22/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("10/23/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("10/24/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("10/25/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("10/26/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("10/27/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("10/28/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("10/29/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("10/30/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("10/31/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("11/01/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("11/02/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("11/03/23".to_owned(), crate::Currency::PLN(1.06),crate::Currency::PLN(0.00)), - ("11/04/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), - ("11/05/23".to_owned(), crate::Currency::PLN(1.11),crate::Currency::PLN(0.00)), - ("11/06/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), - ("11/07/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), - ("11/08/23".to_owned(), crate::Currency::PLN(1.11),crate::Currency::PLN(0.00)), - ("11/09/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), - ("11/10/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), - ("11/11/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), - ("11/12/23".to_owned(), crate::Currency::PLN(1.11),crate::Currency::PLN(0.00)), - ("11/13/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), - ("11/14/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), - ("11/15/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), - ("11/16/23".to_owned(), crate::Currency::PLN(1.11),crate::Currency::PLN(0.00)), - ("11/17/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), - ("11/18/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), - ("11/19/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), - ("11/20/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), - ("11/21/23".to_owned(), crate::Currency::PLN(1.12),crate::Currency::PLN(0.00)), - ("11/22/23".to_owned(), crate::Currency::PLN(0.82),crate::Currency::PLN(0.00)), - ("11/23/23".to_owned(), crate::Currency::PLN(0.83),crate::Currency::PLN(0.00)), - ("11/24/23".to_owned(), crate::Currency::PLN(0.83),crate::Currency::PLN(0.00)), - ("11/25/23".to_owned(), crate::Currency::PLN(0.83),crate::Currency::PLN(0.00)), - ("11/26/23".to_owned(), crate::Currency::PLN(0.83),crate::Currency::PLN(0.00)), - ("11/27/23".to_owned(), crate::Currency::PLN(0.83),crate::Currency::PLN(0.00)), + ( + "08/29/23".to_owned(), + crate::Currency::PLN(0.44), + crate::Currency::PLN(0.00), + ), + ( + "08/30/23".to_owned(), + crate::Currency::PLN(0.45), + crate::Currency::PLN(0.00), + ), + ( + "08/31/23".to_owned(), + crate::Currency::PLN(0.44), + crate::Currency::PLN(0.00), + ), + ( + "09/01/23".to_owned(), + crate::Currency::PLN(0.45), + crate::Currency::PLN(0.00), + ), + ( + "09/02/23".to_owned(), + crate::Currency::PLN(0.44), + crate::Currency::PLN(0.00), + ), + ( + "09/03/23".to_owned(), + crate::Currency::PLN(0.44), + crate::Currency::PLN(0.00), + ), + ( + "09/04/23".to_owned(), + crate::Currency::PLN(0.45), + crate::Currency::PLN(0.00), + ), + ( + "09/05/23".to_owned(), + crate::Currency::PLN(0.77), + crate::Currency::PLN(0.00), + ), + ( + "09/06/23".to_owned(), + crate::Currency::PLN(0.78), + crate::Currency::PLN(0.00), + ), + ( + "09/07/23".to_owned(), + crate::Currency::PLN(0.78), + crate::Currency::PLN(0.00), + ), + ( + "09/08/23".to_owned(), + crate::Currency::PLN(0.78), + crate::Currency::PLN(0.00), + ), + ( + "09/09/23".to_owned(), + crate::Currency::PLN(0.77), + crate::Currency::PLN(0.00), + ), + ( + "09/10/23".to_owned(), + crate::Currency::PLN(0.78), + crate::Currency::PLN(0.00), + ), + ( + "09/11/23".to_owned(), + crate::Currency::PLN(0.78), + crate::Currency::PLN(0.00), + ), + ( + "09/12/23".to_owned(), + crate::Currency::PLN(0.78), + crate::Currency::PLN(0.00), + ), + ( + "09/13/23".to_owned(), + crate::Currency::PLN(0.77), + crate::Currency::PLN(0.00), + ), + ( + "09/14/23".to_owned(), + crate::Currency::PLN(0.78), + crate::Currency::PLN(0.00), + ), + ( + "09/15/23".to_owned(), + crate::Currency::PLN(0.78), + crate::Currency::PLN(0.00), + ), + ( + "09/16/23".to_owned(), + crate::Currency::PLN(0.78), + crate::Currency::PLN(0.00), + ), + ( + "09/17/23".to_owned(), + crate::Currency::PLN(0.78), + crate::Currency::PLN(0.00), + ), + ( + "09/18/23".to_owned(), + crate::Currency::PLN(0.77), + crate::Currency::PLN(0.00), + ), + ( + "09/19/23".to_owned(), + crate::Currency::PLN(1.0), + crate::Currency::PLN(0.00), + ), + ( + "09/20/23".to_owned(), + crate::Currency::PLN(1.01), + crate::Currency::PLN(0.00), + ), + ( + "09/21/23".to_owned(), + crate::Currency::PLN(1.0), + crate::Currency::PLN(0.00), + ), + ( + "09/22/23".to_owned(), + crate::Currency::PLN(1.0), + crate::Currency::PLN(0.00), + ), + ( + "09/23/23".to_owned(), + crate::Currency::PLN(1.0), + crate::Currency::PLN(0.00), + ), + ( + "09/24/23".to_owned(), + crate::Currency::PLN(1.0), + crate::Currency::PLN(0.00), + ), + ( + "09/25/23".to_owned(), + crate::Currency::PLN(1.0), + crate::Currency::PLN(0.00), + ), + ( + "09/26/23".to_owned(), + crate::Currency::PLN(1.0), + crate::Currency::PLN(0.00), + ), + ( + "09/27/23".to_owned(), + crate::Currency::PLN(1.0), + crate::Currency::PLN(0.00), + ), + ( + "09/28/23".to_owned(), + crate::Currency::PLN(1.0), + crate::Currency::PLN(0.00), + ), + ( + "09/29/23".to_owned(), + crate::Currency::PLN(1.0), + crate::Currency::PLN(0.00), + ), + ( + "09/30/23".to_owned(), + crate::Currency::PLN(1.0), + crate::Currency::PLN(0.00), + ), + ( + "10/01/23".to_owned(), + crate::Currency::PLN(1.01), + crate::Currency::PLN(0.00), + ), + ( + "10/02/23".to_owned(), + crate::Currency::PLN(1.0), + crate::Currency::PLN(0.00), + ), + ( + "10/03/23".to_owned(), + crate::Currency::PLN(1.0), + crate::Currency::PLN(0.00), + ), + ( + "10/04/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "10/05/23".to_owned(), + crate::Currency::PLN(1.05), + crate::Currency::PLN(0.00), + ), + ( + "10/06/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "10/07/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "10/08/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "10/09/23".to_owned(), + crate::Currency::PLN(1.05), + crate::Currency::PLN(0.00), + ), + ( + "10/10/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "10/11/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "10/12/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "10/13/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "10/14/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "10/15/23".to_owned(), + crate::Currency::PLN(1.05), + crate::Currency::PLN(0.00), + ), + ( + "10/16/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "10/17/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "10/18/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "10/19/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "10/20/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "10/21/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "10/22/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "10/23/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "10/24/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "10/25/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "10/26/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "10/27/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "10/28/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "10/29/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "10/30/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "10/31/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "11/01/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "11/02/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "11/03/23".to_owned(), + crate::Currency::PLN(1.06), + crate::Currency::PLN(0.00), + ), + ( + "11/04/23".to_owned(), + crate::Currency::PLN(1.12), + crate::Currency::PLN(0.00), + ), + ( + "11/05/23".to_owned(), + crate::Currency::PLN(1.11), + crate::Currency::PLN(0.00), + ), + ( + "11/06/23".to_owned(), + crate::Currency::PLN(1.12), + crate::Currency::PLN(0.00), + ), + ( + "11/07/23".to_owned(), + crate::Currency::PLN(1.12), + crate::Currency::PLN(0.00), + ), + ( + "11/08/23".to_owned(), + crate::Currency::PLN(1.11), + crate::Currency::PLN(0.00), + ), + ( + "11/09/23".to_owned(), + crate::Currency::PLN(1.12), + crate::Currency::PLN(0.00), + ), + ( + "11/10/23".to_owned(), + crate::Currency::PLN(1.12), + crate::Currency::PLN(0.00), + ), + ( + "11/11/23".to_owned(), + crate::Currency::PLN(1.12), + crate::Currency::PLN(0.00), + ), + ( + "11/12/23".to_owned(), + crate::Currency::PLN(1.11), + crate::Currency::PLN(0.00), + ), + ( + "11/13/23".to_owned(), + crate::Currency::PLN(1.12), + crate::Currency::PLN(0.00), + ), + ( + "11/14/23".to_owned(), + crate::Currency::PLN(1.12), + crate::Currency::PLN(0.00), + ), + ( + "11/15/23".to_owned(), + crate::Currency::PLN(1.12), + crate::Currency::PLN(0.00), + ), + ( + "11/16/23".to_owned(), + crate::Currency::PLN(1.11), + crate::Currency::PLN(0.00), + ), + ( + "11/17/23".to_owned(), + crate::Currency::PLN(1.12), + crate::Currency::PLN(0.00), + ), + ( + "11/18/23".to_owned(), + crate::Currency::PLN(1.12), + crate::Currency::PLN(0.00), + ), + ( + "11/19/23".to_owned(), + crate::Currency::PLN(1.12), + crate::Currency::PLN(0.00), + ), + ( + "11/20/23".to_owned(), + crate::Currency::PLN(1.12), + crate::Currency::PLN(0.00), + ), + ( + "11/21/23".to_owned(), + crate::Currency::PLN(1.12), + crate::Currency::PLN(0.00), + ), + ( + "11/22/23".to_owned(), + crate::Currency::PLN(0.82), + crate::Currency::PLN(0.00), + ), + ( + "11/23/23".to_owned(), + crate::Currency::PLN(0.83), + crate::Currency::PLN(0.00), + ), + ( + "11/24/23".to_owned(), + crate::Currency::PLN(0.83), + crate::Currency::PLN(0.00), + ), + ( + "11/25/23".to_owned(), + crate::Currency::PLN(0.83), + crate::Currency::PLN(0.00), + ), + ( + "11/26/23".to_owned(), + crate::Currency::PLN(0.83), + crate::Currency::PLN(0.00), + ), + ( + "11/27/23".to_owned(), + crate::Currency::PLN(0.83), + crate::Currency::PLN(0.00), + ), ]); assert_eq!( parse_revolut_transactions("revolut_data/Revolut_30cze2023_27lis2023.csv"), @@ -553,53 +1460,177 @@ mod tests { #[test] fn test_parse_revolut_investment_gain_and_losses() -> Result<(), String> { - - let expected_result = Ok(vec![ - ("03/04/24".to_owned(), crate::Currency::PLN(617.00),crate::Currency::PLN(92.57 )), - ("03/21/24".to_owned(), crate::Currency::PLN(259.17),crate::Currency::PLN(0.0)), - ("03/25/24".to_owned(), crate::Currency::PLN(212.39),crate::Currency::PLN(31.87)), - ("05/16/24".to_owned(), crate::Currency::PLN(700.17),crate::Currency::PLN(105.04)), - ("05/31/24".to_owned(), crate::Currency::PLN(875.82),crate::Currency::PLN(131.38)), - ("06/03/24".to_owned(), crate::Currency::PLN(488.26),crate::Currency::PLN(73.25 )), - ("06/04/24".to_owned(), crate::Currency::PLN(613.2 ),crate::Currency::PLN(92.00)), - ("06/11/24".to_owned(), crate::Currency::PLN(186.16),crate::Currency::PLN(27.92)), - ("06/13/24".to_owned(), crate::Currency::PLN(264.74),crate::Currency::PLN(0.00)), - ("06/18/24".to_owned(), crate::Currency::PLN(858.33),crate::Currency::PLN(128.74)), - ("07/12/24".to_owned(), crate::Currency::PLN(421.5 ),crate::Currency::PLN(63.23 )), - ("07/16/24".to_owned(), crate::Currency::PLN(834.55),crate::Currency::PLN(125.18)), + let expected_result = Ok(vec![ + ( + "03/04/24".to_owned(), + crate::Currency::PLN(617.00), + crate::Currency::PLN(92.57), + ), + ( + "03/21/24".to_owned(), + crate::Currency::PLN(259.17), + crate::Currency::PLN(0.0), + ), + ( + "03/25/24".to_owned(), + crate::Currency::PLN(212.39), + crate::Currency::PLN(31.87), + ), + ( + "05/16/24".to_owned(), + crate::Currency::PLN(700.17), + crate::Currency::PLN(105.04), + ), + ( + "05/31/24".to_owned(), + crate::Currency::PLN(875.82), + crate::Currency::PLN(131.38), + ), + ( + "06/03/24".to_owned(), + crate::Currency::PLN(488.26), + crate::Currency::PLN(73.25), + ), + ( + "06/04/24".to_owned(), + crate::Currency::PLN(613.2), + crate::Currency::PLN(92.00), + ), + ( + "06/11/24".to_owned(), + crate::Currency::PLN(186.16), + crate::Currency::PLN(27.92), + ), + ( + "06/13/24".to_owned(), + crate::Currency::PLN(264.74), + crate::Currency::PLN(0.00), + ), + ( + "06/18/24".to_owned(), + crate::Currency::PLN(858.33), + crate::Currency::PLN(128.74), + ), + ( + "07/12/24".to_owned(), + crate::Currency::PLN(421.5), + crate::Currency::PLN(63.23), + ), + ( + "07/16/24".to_owned(), + crate::Currency::PLN(834.55), + crate::Currency::PLN(125.18), + ), ]); assert_eq!( - parse_revolut_transactions("revolut_data/trading-pnl-statement_2024-01-01_2024-08-04_pl-pl_8e8783.csv"), + parse_revolut_transactions( + "revolut_data/trading-pnl-statement_2024-01-01_2024-08-04_pl-pl_8e8783.csv" + ), expected_result ); Ok(()) } - #[test] fn test_parse_revolut_transactions_english_statement_pln() -> Result<(), String> { let expected_result = Ok(vec![ - ("12/12/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), - ("12/13/23".to_owned(), crate::Currency::PLN(0.20),crate::Currency::PLN(0.00)), - ("12/15/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), - ("12/16/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), - ("12/17/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), - ("12/18/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), - ("12/19/23".to_owned(), crate::Currency::PLN(0.41),crate::Currency::PLN(0.00)), - ("12/20/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), - ("12/21/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), - ("12/22/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), - ("12/23/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), - ("12/24/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), - ("12/25/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), - ("12/26/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), - ("12/27/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), - ("12/28/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), - ("12/29/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), - ("12/30/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), - ("12/31/23".to_owned(), crate::Currency::PLN(0.21),crate::Currency::PLN(0.00)), + ( + "12/12/23".to_owned(), + crate::Currency::PLN(0.21), + crate::Currency::PLN(0.00), + ), + ( + "12/13/23".to_owned(), + crate::Currency::PLN(0.20), + crate::Currency::PLN(0.00), + ), + ( + "12/15/23".to_owned(), + crate::Currency::PLN(0.21), + crate::Currency::PLN(0.00), + ), + ( + "12/16/23".to_owned(), + crate::Currency::PLN(0.21), + crate::Currency::PLN(0.00), + ), + ( + "12/17/23".to_owned(), + crate::Currency::PLN(0.21), + crate::Currency::PLN(0.00), + ), + ( + "12/18/23".to_owned(), + crate::Currency::PLN(0.21), + crate::Currency::PLN(0.00), + ), + ( + "12/19/23".to_owned(), + crate::Currency::PLN(0.41), + crate::Currency::PLN(0.00), + ), + ( + "12/20/23".to_owned(), + crate::Currency::PLN(0.21), + crate::Currency::PLN(0.00), + ), + ( + "12/21/23".to_owned(), + crate::Currency::PLN(0.21), + crate::Currency::PLN(0.00), + ), + ( + "12/22/23".to_owned(), + crate::Currency::PLN(0.21), + crate::Currency::PLN(0.00), + ), + ( + "12/23/23".to_owned(), + crate::Currency::PLN(0.21), + crate::Currency::PLN(0.00), + ), + ( + "12/24/23".to_owned(), + crate::Currency::PLN(0.21), + crate::Currency::PLN(0.00), + ), + ( + "12/25/23".to_owned(), + crate::Currency::PLN(0.21), + crate::Currency::PLN(0.00), + ), + ( + "12/26/23".to_owned(), + crate::Currency::PLN(0.21), + crate::Currency::PLN(0.00), + ), + ( + "12/27/23".to_owned(), + crate::Currency::PLN(0.21), + crate::Currency::PLN(0.00), + ), + ( + "12/28/23".to_owned(), + crate::Currency::PLN(0.21), + crate::Currency::PLN(0.00), + ), + ( + "12/29/23".to_owned(), + crate::Currency::PLN(0.21), + crate::Currency::PLN(0.00), + ), + ( + "12/30/23".to_owned(), + crate::Currency::PLN(0.21), + crate::Currency::PLN(0.00), + ), + ( + "12/31/23".to_owned(), + crate::Currency::PLN(0.21), + crate::Currency::PLN(0.00), + ), ]); assert_eq!( parse_revolut_transactions("revolut_data/revolut-savings-eng.csv"), @@ -612,9 +1643,21 @@ mod tests { #[test] fn test_parse_revolut_investment_transactions_usd() -> Result<(), String> { let expected_result = Ok(vec![ - ("11/02/23".to_owned(), crate::Currency::USD(-0.02),crate::Currency::USD(0.00)), - ("12/01/23".to_owned(), crate::Currency::USD(-0.51),crate::Currency::USD(0.00)), - ("12/14/23".to_owned(), crate::Currency::USD(2.94),crate::Currency::USD(0.00)), + ( + "11/02/23".to_owned(), + crate::Currency::USD(-0.02), + crate::Currency::USD(0.00), + ), + ( + "12/01/23".to_owned(), + crate::Currency::USD(-0.51), + crate::Currency::USD(0.00), + ), + ( + "12/14/23".to_owned(), + crate::Currency::USD(2.94), + crate::Currency::USD(0.00), + ), ]); assert_eq!( parse_revolut_transactions("revolut_data/revolut_div.csv"), diff --git a/src/transactions.rs b/src/transactions.rs index a61df60..0d0a194 100644 --- a/src/transactions.rs +++ b/src/transactions.rs @@ -286,8 +286,16 @@ mod tests { #[test] fn test_create_detailed_revolut_transactions_eur() -> Result<(), String> { let parsed_transactions = vec![ - ("03/01/21".to_owned(), crate::Currency::EUR(0.05),crate::Currency::EUR(0.00)), - ("04/11/21".to_owned(), crate::Currency::EUR(0.07),crate::Currency::EUR(0.00)), + ( + "03/01/21".to_owned(), + crate::Currency::EUR(0.05), + crate::Currency::EUR(0.00), + ), + ( + "04/11/21".to_owned(), + crate::Currency::EUR(0.07), + crate::Currency::EUR(0.00), + ), ]; let mut dates: std::collections::HashMap> = @@ -329,8 +337,16 @@ mod tests { #[test] fn test_create_detailed_revolut_transactions_pln() -> Result<(), String> { let parsed_transactions = vec![ - ("03/01/21".to_owned(), crate::Currency::PLN(0.44), crate::Currency::PLN(0.00)), - ("04/11/21".to_owned(), crate::Currency::PLN(0.45), crate::Currency::PLN(0.00)), + ( + "03/01/21".to_owned(), + crate::Currency::PLN(0.44), + crate::Currency::PLN(0.00), + ), + ( + "04/11/21".to_owned(), + crate::Currency::PLN(0.45), + crate::Currency::PLN(0.00), + ), ]; let mut dates: std::collections::HashMap> = From 3dc96e214e6272de4c845459c64dc656b5be2466 Mon Sep 17 00:00:00 2001 From: Jacek Czaja Date: Wed, 14 Aug 2024 09:44:00 +0200 Subject: [PATCH 4/7] - updated doc --- README.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 15eacb4..46eccf7 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,16 @@ # etradeTaxReturnHelper -Project that parse e-trade PDF account statements and Gain and Losses documents and compute total gross gain and tax paid in US that are needed for tax return forms out of US. +Project that parse e-trade and revolut account statements and Gain and Losses documents in order to compute total gross gain and tax paid in US that are needed for tax return forms out of US. ### Data for Tax form from capital gains (PIT-38 in Poland) 1. Install this program: `cargo install etradeTaxReturnHelper` -2. Download PDF documents from a year you are filling your tax return form for example: `Brokerage Statement .pdf` and `MS_ClientStatements_.pdf`: - 1. Login to e-trade, navigate to [Documents/Brokerage Statements](https://edoc.etrade.com/e/t/onlinedocs/docsearch?doc_type=stmt) - 2. Select date period - 3. Download all `ACCOUNT STATEMENT` and `Single Account Statement` documents +2. Download financial data : + a. Etrade: Download PDF documents from a year you are filling your tax return form for example: `Brokerage Statement .pdf` and `MS_ClientStatements_.pdf`: + 1. Login to e-trade, navigate to [Documents/Brokerage Statements](https://edoc.etrade.com/e/t/onlinedocs/docsearch?doc_type=stmt) + 2. Select date period + 3. Download all `ACCOUNT STATEMENT` and `Single Account Statement` documents + b. Revolut: + 1. Download from your Revolut mobile app "Profit and Losses" documents in CSV format in you investment account. + 2. Download from your Revolut mobile app Statement account documents in CSV format in saving account. 3. Run: 1. `etradeTaxReturnHelper ` 2. Alternatively you can just run `etradeTaxReturnHelper` to have program running with GUI (graphical user interface): From edf286fe34cd80dd4cec48b435fdb8352957d243 Mon Sep 17 00:00:00 2001 From: Jacek Czaja Date: Wed, 14 Aug 2024 09:47:12 +0200 Subject: [PATCH 5/7] - Bumped version to 0.6.0 and removed obsolate scripts --- Cargo.lock | 2 +- Cargo.toml | 6 ++-- scripts/README.md | 54 -------------------------------- scripts/e-trade_tax_dividends.sh | 49 ----------------------------- 4 files changed, 4 insertions(+), 107 deletions(-) delete mode 100644 scripts/README.md delete mode 100755 scripts/e-trade_tax_dividends.sh diff --git a/Cargo.lock b/Cargo.lock index 6db18f5..132f1a1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -592,7 +592,7 @@ checksum = "b90ca2580b73ab6a1f724b76ca11ab632df820fd6040c336200d2c1df7b3c82c" [[package]] name = "etradeTaxReturnHelper" -version = "0.5.5" +version = "0.6.0" dependencies = [ "calamine", "chrono", diff --git a/Cargo.toml b/Cargo.toml index f1e90bb..9569054 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,11 +1,11 @@ [package] name = "etradeTaxReturnHelper" -version = "0.5.5" +version = "0.6.0" edition = "2021" -description = "Parses etrade financial documents for transaction details (income, tax paid, cost basis) and compute total income and total tax paid according to chosen tax residency (currency)" +description = "Parses etrade and revolut financial documents for transaction details (income, tax paid, cost basis) and compute total income and total tax paid according to chosen tax residency (currency)" license = "BSD-3-Clause" readme = "README.md" -keywords = ["etrade"] +keywords = ["etrade","revolut"] repository = "https://github.com/jczaja/e-trade-tax-return-pl-helper" homepage = "https://github.com/jczaja/e-trade-tax-return-pl-helper" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/scripts/README.md b/scripts/README.md deleted file mode 100644 index 33e2cf6..0000000 --- a/scripts/README.md +++ /dev/null @@ -1,54 +0,0 @@ -# e-trade-tax-return-pl-helper -Scripts helpful in computing data for tax return form related to financial instruments - -### Data for Tax return form (PIT-38) -1) Download PDF documents from a year you are filling your tax return form for example: Brokerage Statement .pdf -2) Run program -e-trade_tax_dividends.sh | octave - -### Dependencies -- octave -- pdftotex -- curl - -### Tested on: -- Fedora 29 - -### FAQ -1) How to remove first page from e-trade brokarage statement -Fedora: pdfseparate -f 2 -l 8 %d.pdf - pdfunite %d.pdf .pdf -Ubuntu: pdftk cat 2-8 output -2) It does not work for my PDF with error : "panicked at index out of bound" - It could be that your PDF stripped (removed some pages) and PDF meta data does not correspond to actual number of pages. - -### License -BSD 3-Clause License - -Copyright (c) 2022, Jacek Czaja -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/scripts/e-trade_tax_dividends.sh b/scripts/e-trade_tax_dividends.sh deleted file mode 100755 index a7d9be9..0000000 --- a/scripts/e-trade_tax_dividends.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash -# Arg: YYYY-MM-DD -function GetRate() { - -prev_day=`date -d "$1 1 day ago" +'%F'` -kurs=`curl -X GET "https://api.nbp.pl/api/exchangerates/rates/a/usd/$prev_day/?format=json"` - -while [ "$kurs" = "404 NotFound - Not Found - Brak danych" ]; do -prev_day=`date -d "$prev_day 1 day ago" +'%F'` -kurs=`curl -X GET "https://api.nbp.pl/api/exchangerates/rates/a/usd/$prev_day/?format=json"` -done - -# Extract value from Json output -kurs=`echo $kurs | cut -d ':' -f 8 | tr -d '}]'` - -echo "$kurs # Transaction date: $1. Rate from: $prev_day" -} - - -# A day before given date -# Try to get exchange rate -# If good then ok if not then earlier day -echo "# Gross Tax_US exchange_rate" -echo "div_trans = [" -for brokarage_statement in "$@" -do - #GetRate $transaction_date - echo "# Processing: $brokarage_statement" 1>&2 - extraction=/tmp/`cat /dev/urandom | tr -cd 'a-f0-9' | head -c 8` - touch $extraction - pdftotext "$brokarage_statement" $extraction - transaction_date=`cat $extraction | grep -v Dividends | grep -e Dividend | cut -f 1 -d ' '` - #if empty skip if non-empty then convert data to format YYYY-MM-DD and get exchange rate - if [ -n "$transaction_date" ]; then - converted_transaction_date=`date -d"$transaction_date" +'%F'` - exchange_rate=`GetRate $converted_transaction_date` - - tax_and_gross=`cat $extraction | grep CREDITED -A 4 | grep -Eo '[0-9]+([.][0-9]+)?'` - readarray -t y <<< "$tax_and_gross" - echo "${y[1]} ${y[0]} $exchange_rate" - fi -done -echo "]" - -echo "PRZYCHOD=sum(div_trans(:,1) .* div_trans(:,3))" -echo "PODATEK_ZAPLACONY_ZA_GRANICA=sum(div_trans(:,2) .* div_trans(:,3))" -echo "PODATEK_NALEZNY_W_POLSCE = sum((div_trans(:,1) .* div_trans(:,3)) * 19/100)" -echo "ROZNICA_DO_ZAPLACENIA_W_POLSCE=(PODATEK_NALEZNY_W_POLSCE - PODATEK_ZAPLACONY_ZA_GRANICA)" - From a63aa7af795a274b5968da4bd566f83e6304782f Mon Sep 17 00:00:00 2001 From: Jacek Czaja Date: Wed, 14 Aug 2024 10:07:23 +0200 Subject: [PATCH 6/7] - Update dependencies --- Cargo.lock | 99 ++++++++++++----------------------------------------- src/main.rs | 4 +-- 2 files changed, 23 insertions(+), 80 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 132f1a1..2a996b8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -357,7 +357,7 @@ checksum = "2674ec482fbc38012cf31e6c42ba0177b431a0cb6f15fe40efa5aab1bda516f6" dependencies = [ "is-terminal", "lazy_static", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -581,7 +581,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -862,7 +862,7 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -1012,7 +1012,7 @@ checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ "hermit-abi 0.3.3", "rustix", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -1173,7 +1173,7 @@ checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" dependencies = [ "libc", "wasi", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -1925,7 +1925,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -1946,7 +1946,7 @@ version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -2048,14 +2048,14 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "simple_logger" -version = "4.2.0" +version = "4.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2230cd5c29b815c9b699fb610b49a5ed65588f3509d9f0108be3a885da629333" +checksum = "8e7e46c8c90251d47d08b28b8a419ffb4aede0f87c2eea95e17d1d5bacbf3ef1" dependencies = [ "colored", "log", "time", - "windows-sys 0.42.0", + "windows-sys", ] [[package]] @@ -2122,7 +2122,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -2261,7 +2261,7 @@ dependencies = [ "fastrand", "redox_syscall", "rustix", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -2352,7 +2352,7 @@ dependencies = [ "num_cpus", "pin-project-lite", "socket2 0.5.5", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -2615,21 +2615,6 @@ dependencies = [ "windows-targets", ] -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" @@ -2645,93 +2630,51 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -2745,7 +2688,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ "cfg-if", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] diff --git a/src/main.rs b/src/main.rs index 6383b15..f26f0d3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,8 +11,8 @@ mod gui; use etradeTaxReturnHelper::run_taxation; use logging::ResultExt; -// TODO: Make UT and parsing of revolut CSV documents from gain and losses - +//TODO: Extend revolut CSV with sold transactions support +// TODO: remove support for account statement of investment account of revolut // TODO: When there is no proxy (on intel account) there are problems (UT do not work // getting_Exchange_rate) // TODO: Make a parsing of incomplete date From c3183f03c3cbeb75f8207dbdfebe1ec346bad7f7 Mon Sep 17 00:00:00 2001 From: Jacek Czaja Date: Wed, 14 Aug 2024 10:39:55 +0200 Subject: [PATCH 7/7] - Updated even more dependencies --- Cargo.lock | 897 ++++++++++++++++++++++++++++------------------------- 1 file changed, 480 insertions(+), 417 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2a996b8..381887a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -56,9 +56,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.6" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", "getrandom", @@ -69,18 +69,18 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] [[package]] name = "allocator-api2" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "android-tzdata" @@ -105,9 +105,9 @@ checksum = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6" [[package]] name = "argminmax" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "202108b46429b765ef483f8a24d5c46f48c14acfdacc086dd4ab6dddf6bcdbd2" +checksum = "52424b59d69d69d5056d508b260553afd91c57e21849579cd1f50ee8b8b88eaa" dependencies = [ "num-traits", ] @@ -139,9 +139,9 @@ dependencies = [ [[package]] name = "atoi_simd" -version = "0.15.5" +version = "0.15.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccfc14f5c3e34de57539a7ba9c18ecde3d9bbde48d232ea1da3e468adb307fd0" +checksum = "9ae037714f313c1353189ead58ef9eec30a8e8dc101b2622d461418fd59e28a9" [[package]] name = "atty" @@ -156,15 +156,15 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", @@ -177,9 +177,9 @@ dependencies = [ [[package]] name = "base64" -version = "0.21.5" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "bitflags" @@ -195,9 +195,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "block-buffer" @@ -226,28 +226,28 @@ checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.14.0" +version = "1.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +checksum = "102087e286b4677862ea56cf8fc58bb2cdfa8725c40ffb80fe3a008eb7f2fc83" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.5.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" +checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.74", ] [[package]] @@ -258,9 +258,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.5.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" [[package]] name = "calamine" @@ -279,9 +279,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.83" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "e9e8aabfac534be767c909e0690571677d49f41bd8465ae876fe043d52ba5292" dependencies = [ "jobserver", "libc", @@ -295,16 +295,16 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "wasm-bindgen", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -342,41 +342,40 @@ dependencies = [ [[package]] name = "codepage" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b0e9222c0cdf2c6ac27d73f664f9520266fa911c3106329d359f8861cb8bde9" +checksum = "48f68d061bc2828ae826206326e61251aca94c1e4a5305cf52d9138639c918b4" dependencies = [ "encoding_rs", ] [[package]] name = "colored" -version = "2.0.4" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2674ec482fbc38012cf31e6c42ba0177b431a0cb6f15fe40efa5aab1bda516f6" +checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" dependencies = [ - "is-terminal", "lazy_static", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "comfy-table" -version = "7.1.0" +version = "7.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c64043d6c7b7a4c58e39e7efccfdea7b93d885a795d0c054a69dbbf4dd52686" +checksum = "b34115915337defe99b2aff5c2ce6771e5fbc4079f4b506301f5cf394c8452f7" dependencies = [ "crossterm", "strum", - "strum_macros", + "strum_macros 0.26.4", "unicode-width", ] [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -384,80 +383,70 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.11" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.8" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.15" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", - "memoffset", - "scopeguard", ] [[package]] name = "crossbeam-queue" -version = "0.3.8" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crossterm" @@ -465,7 +454,7 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.6.0", "crossterm_winapi", "libc", "parking_lot", @@ -513,9 +502,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.9" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", ] @@ -537,35 +526,35 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] name = "dyn-clone" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" [[package]] name = "either" -version = "1.9.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "encoding_rs" -version = "0.8.33" +version = "0.8.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" dependencies = [ "cfg-if", ] [[package]] name = "enum_dispatch" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f33313078bb8d4d05a2733a94ac4c2d8a0df9a2b84424ebf4f33bfc224a890e" +checksum = "aa18ce2bc66555b3218614519ac839ddb759a7d6720732f979ef8d13be147ecd" dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.74", ] [[package]] @@ -576,12 +565,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.5" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -618,9 +607,9 @@ checksum = "95765f67b4b18863968b4a1bd5bb576f732b29a4a28c7cd84c09fa3e2875f33c" [[package]] name = "fastrand" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "fax" @@ -642,17 +631,11 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "finl_unicode" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" - [[package]] name = "flate2" -version = "1.0.28" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "7f211bbe8e69bbd0cfdea405084f128ae8b4aaa6b0b522fc8f2b009084797920" dependencies = [ "crc32fast", "miniz_oxide", @@ -709,51 +692,51 @@ checksum = "ee1b05cbd864bcaecbd3455d6d967862d446e4ebfc3c2e5e5b9841e53cba6673" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", ] [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-io" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-core", "futures-io", @@ -776,9 +759,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.11" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "js-sys", @@ -789,9 +772,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "glob" @@ -801,9 +784,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "h2" -version = "0.3.21" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ "bytes", "fnv", @@ -811,7 +794,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 1.9.3", + "indexmap", "slab", "tokio", "tokio-util", @@ -820,15 +803,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.12.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", "allocator-api2", @@ -841,6 +818,12 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -852,24 +835,24 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "home" -version = "0.5.5" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" dependencies = [ - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "http" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", @@ -878,9 +861,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http", @@ -889,9 +872,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] name = "httpdate" @@ -901,9 +884,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.27" +version = "0.14.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" dependencies = [ "bytes", "futures-channel", @@ -916,7 +899,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.10", + "socket2", "tokio", "tower-service", "tracing", @@ -938,9 +921,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.58" +version = "0.1.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -961,9 +944,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -971,22 +954,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", -] - -[[package]] -name = "indexmap" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown", ] [[package]] @@ -1004,17 +977,6 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" -[[package]] -name = "is-terminal" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" -dependencies = [ - "hermit-abi 0.3.3", - "rustix", - "windows-sys", -] - [[package]] name = "itertools" version = "0.10.5" @@ -1026,15 +988,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jobserver" -version = "0.1.27" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] @@ -1047,24 +1009,24 @@ checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2" [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ "wasm-bindgen", ] [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.149" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libm" @@ -1074,15 +1036,15 @@ checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "linux-raw-sys" -version = "0.4.10" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -1090,15 +1052,15 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "lz4" -version = "1.24.0" +version = "1.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9e2dd86df36ce760a60f6ff6ad526f7ba1f14ba0356f8254fb6905e6494df1" +checksum = "958b4caa893816eea05507c20cfe47574a43d9a697138a7872990bba8a0ece68" dependencies = [ "libc", "lz4-sys", @@ -1106,9 +1068,9 @@ dependencies = [ [[package]] name = "lz4-sys" -version = "1.9.4" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d27b317e207b10f69f5e75494119e391a96f48861ae870d1da6edac98ca900" +checksum = "109de74d5d2353660401699a4174a4ff23fcc649caf553df71933c7fb45ad868" dependencies = [ "cc", "libc", @@ -1122,9 +1084,9 @@ checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap2" @@ -1135,15 +1097,6 @@ dependencies = [ "libc", ] -[[package]] -name = "memoffset" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" -dependencies = [ - "autocfg", -] - [[package]] name = "mime" version = "0.3.17" @@ -1158,29 +1111,30 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", ] [[package]] name = "mio" -version = "0.8.9" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ + "hermit-abi 0.3.9", "libc", "wasi", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "multiversion" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2c7b9d7fe61760ce5ea19532ead98541f6b4c495d87247aff9826445cf6872a" +checksum = "c4851161a11d3ad0bf9402d90ffc3967bf231768bfd7aeb61755ad06dbf1a142" dependencies = [ "multiversion-macros", "target-features", @@ -1188,9 +1142,9 @@ dependencies = [ [[package]] name = "multiversion-macros" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26a83d8500ed06d68877e9de1dde76c1dbb83885dcdbda4ef44ccbc3fbda2ac8" +checksum = "79a74ddee9e0c27d2578323c13905793e91622148f138ba29738f9dddb835e90" dependencies = [ "proc-macro2", "quote", @@ -1200,11 +1154,10 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -1245,62 +1198,58 @@ dependencies = [ ] [[package]] -name = "num-traits" -version = "0.2.17" +name = "num-conv" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" -dependencies = [ - "autocfg", - "libm", -] +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] -name = "num_cpus" -version = "1.16.0" +name = "num-traits" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ - "hermit-abi 0.3.3", - "libc", + "autocfg", + "libm", ] [[package]] name = "num_threads" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" dependencies = [ "libc", ] [[package]] name = "object" -version = "0.32.1" +version = "0.36.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openssl" -version = "0.10.57" +version = "0.10.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bac25ee399abb46215765b1cb35bc0212377e58a061560d8b29b024fd0430e7c" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.6.0", "cfg-if", "foreign-types", "libc", @@ -1317,7 +1266,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.74", ] [[package]] @@ -1328,9 +1277,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.93" +version = "0.9.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db4d56a4c0478783083cfafcc42493dd4a981d41669da64b4572a2a089b51b1d" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" dependencies = [ "cc", "libc", @@ -1346,9 +1295,9 @@ checksum = "91409674c628d07a6b4b79cc877c6b63ba5ccbfbadddd77ca822f55069ed1bd4" [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -1356,22 +1305,22 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pdf" @@ -1414,15 +1363,15 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -1432,9 +1381,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "planus" @@ -1478,7 +1427,7 @@ dependencies = [ "fast-float", "foreign_vec", "getrandom", - "hashbrown 0.14.3", + "hashbrown", "itoa", "lz4", "multiversion", @@ -1500,13 +1449,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae73d5b8e55decde670caba1cc82b61f14bfb9a72503198f0997d657a98dcfd6" dependencies = [ "ahash", - "bitflags 2.4.1", + "bitflags 2.6.0", "bytemuck", "chrono", "comfy-table", "either", - "hashbrown 0.14.3", - "indexmap 2.1.0", + "hashbrown", + "indexmap", "num-traits", "once_cell", "polars-arrow", @@ -1572,7 +1521,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3555f759705be6dd0d3762d16a0b8787b2dc4da73b57465f3b2bf1a070ba8f20" dependencies = [ "ahash", - "bitflags 2.4.1", + "bitflags 2.6.0", "glob", "once_cell", "polars-arrow", @@ -1598,8 +1547,8 @@ dependencies = [ "argminmax", "bytemuck", "either", - "hashbrown 0.14.3", - "indexmap 2.1.0", + "hashbrown", + "indexmap", "memchr", "num-traits", "polars-arrow", @@ -1621,7 +1570,7 @@ dependencies = [ "crossbeam-channel", "crossbeam-queue", "enum_dispatch", - "hashbrown 0.14.3", + "hashbrown", "num-traits", "polars-arrow", "polars-core", @@ -1654,7 +1603,7 @@ dependencies = [ "rayon", "regex", "smartstring", - "strum_macros", + "strum_macros 0.25.3", "version_check", ] @@ -1713,8 +1662,8 @@ checksum = "da6ce68169fe61d46958c8eab7447360f30f2f23f6e24a0ce703a14b0a3cfbfc" dependencies = [ "ahash", "bytemuck", - "hashbrown 0.14.3", - "indexmap 2.1.0", + "hashbrown", + "indexmap", "num-traits", "once_cell", "polars-error", @@ -1732,15 +1681,18 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] @@ -1757,9 +1709,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.33" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -1806,9 +1758,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -1816,9 +1768,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -1826,18 +1778,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.4.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", ] [[package]] name = "regex" -version = "1.10.2" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", @@ -1847,9 +1799,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", @@ -1858,15 +1810,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "reqwest" -version = "0.11.22" +version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ "base64", "bytes", @@ -1886,9 +1838,11 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", + "sync_wrapper", "system-configuration", "tokio", "tokio-native-tls", @@ -1902,9 +1856,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc_version" @@ -1917,36 +1871,45 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.21" +version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64", ] [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "schannel" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" dependencies = [ - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1957,11 +1920,11 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "2.9.2" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "core-foundation", "core-foundation-sys", "libc", @@ -1970,9 +1933,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" dependencies = [ "core-foundation-sys", "libc", @@ -1980,37 +1943,38 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.20" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.190" +version = "1.0.207" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" +checksum = "5665e14a49a4ea1b91029ba7d3bca9f299e1f7cfa194388ccc20f14743e784f2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.190" +version = "1.0.207" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" +checksum = "6aea2634c86b0e8ef2cfdc0c340baede54ec27b1e46febd7f80dffb2aa44a00e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.74", ] [[package]] name = "serde_json" -version = "1.0.107" +version = "1.0.124" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +checksum = "66ad62847a56b3dba58cc891acd13884b9c61138d330c0d7b6181713d4fce38d" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -2055,7 +2019,7 @@ dependencies = [ "colored", "log", "time", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2069,9 +2033,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "smartstring" @@ -2107,22 +2071,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "socket2" -version = "0.5.5" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -2154,13 +2108,13 @@ checksum = "fe895eb47f22e2ddd4dabc02bce419d2e643c8e3b585c78158b349195bc24d82" [[package]] name = "stringprep" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" dependencies = [ - "finl_unicode", "unicode-bidi", "unicode-normalization", + "unicode-properties", ] [[package]] @@ -2171,9 +2125,9 @@ checksum = "b4d15c810519a91cf877e7e36e63fe068815c678181439f2f29e2562147c3694" [[package]] name = "strum" -version = "0.25.0" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" [[package]] name = "strum_macros" @@ -2181,11 +2135,24 @@ version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" dependencies = [ - "heck", + "heck 0.4.1", "proc-macro2", "quote", "rustversion", - "syn 2.0.38", + "syn 2.0.74", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.74", ] [[package]] @@ -2201,15 +2168,21 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.38" +version = "2.0.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +checksum = "1fceb41e3d546d0bd83421d3409b1460cc7444cd389341a4c880fe7a042cb3d7" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "sysinfo" version = "0.29.11" @@ -2247,21 +2220,21 @@ dependencies = [ [[package]] name = "target-features" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfb5fa503293557c5158bd215fdc225695e567a77e453f5d4452a50a193969bd" +checksum = "c1bbb9f3c5c463a01705937a24fdabc5047929ac764b2d5b9cf681c1f5041ed5" [[package]] name = "tempfile" -version = "3.8.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" dependencies = [ "cfg-if", "fastrand", - "redox_syscall", + "once_cell", "rustix", - "windows-sys", + "windows-sys 0.59.0", ] [[package]] @@ -2275,33 +2248,34 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.50" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.50" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.74", ] [[package]] name = "time" -version = "0.3.30" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", "libc", + "num-conv", "num_threads", "powerfmt", "serde", @@ -2317,18 +2291,19 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.15" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ + "num-conv", "time-core", ] [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -2341,18 +2316,17 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.33.0" +version = "1.39.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" +checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "pin-project-lite", - "socket2 0.5.5", - "windows-sys", + "socket2", + "windows-sys 0.52.0", ] [[package]] @@ -2367,23 +2341,22 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -2406,9 +2379,9 @@ dependencies = [ [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "ttf-parser" @@ -2424,9 +2397,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" @@ -2436,24 +2409,30 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-properties" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4259d9d4425d9f0661581b804cb85fe66a4c631cadd8f490d1c13a35d5d9291" + [[package]] name = "unicode-width" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" [[package]] name = "url" -version = "2.4.1" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", @@ -2474,9 +2453,9 @@ checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "want" @@ -2495,34 +2474,35 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.74", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.37" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" dependencies = [ "cfg-if", "js-sys", @@ -2532,9 +2512,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2542,28 +2522,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.74", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" dependencies = [ "js-sys", "wasm-bindgen", @@ -2571,15 +2551,15 @@ dependencies = [ [[package]] name = "weezl" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" [[package]] name = "wild" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10d01931a94d5a115a53f95292f51d316856b68a035618eb831bbba593a30b67" +checksum = "a3131afc8c575281e1e80f36ed6a092aa502c08b18ed7524e86fbbb12bb410e1" dependencies = [ "glob", ] @@ -2608,11 +2588,11 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" -version = "0.51.1" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -2621,7 +2601,25 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -2630,13 +2628,29 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -2645,42 +2659,90 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + [[package]] name = "winreg" version = "0.50.0" @@ -2688,33 +2750,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ "cfg-if", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "xxhash-rust" -version = "0.8.7" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9828b178da53440fa9c766a3d2f73f7cf5d0ac1fe3980c1e5018d899fd19e07b" +checksum = "6a5cbf750400958819fb6178eaa83bee5cd9c29a26a40cc241df8c70fdd46984" [[package]] name = "zerocopy" -version = "0.7.28" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d6f15f7ade05d2a4935e34a457b936c23dc70a05cc1d97133dc99e7a3fe0f0e" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.28" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbbad221e3f78500350ecbd7dfa4e63ef945c05f4c61cb7f4d3f84cd0bba649b" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.74", ] [[package]] @@ -2731,27 +2794,27 @@ dependencies = [ [[package]] name = "zstd" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bffb3309596d527cfcba7dfc6ed6052f1d39dfbd7c867aa2e865e4a449c10110" +checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "7.0.0" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43747c7422e2924c11144d5229878b98180ef8b06cca4ab5af37afc8a8d8ea3e" +checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.9+zstd.1.5.5" +version = "2.0.13+zstd.1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" +checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" dependencies = [ "cc", "pkg-config",