diff --git a/Cargo.lock b/Cargo.lock index 36880da..732f43e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -303,7 +303,7 @@ dependencies = [ "atomic", "pear", "serde", - "toml", + "toml 0.8.23", "uncased", "version_check", ] @@ -442,7 +442,7 @@ dependencies = [ "serde", "serde_json", "tokio", - "toml", + "toml 0.9.2", "url", ] @@ -1259,6 +1259,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -1461,11 +1470,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", - "serde_spanned", - "toml_datetime", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", "toml_edit", ] +[[package]] +name = "toml" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed0aee96c12fa71097902e0bb061a5e1ebd766a6636bb605ba401c45c1650eac" +dependencies = [ + "indexmap", + "serde", + "serde_spanned 1.0.0", + "toml_datetime 0.7.0", + "toml_parser", + "toml_writer", + "winnow", +] + [[package]] name = "toml_datetime" version = "0.6.11" @@ -1475,6 +1499,15 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_datetime" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" +dependencies = [ + "serde", +] + [[package]] name = "toml_edit" version = "0.22.27" @@ -1483,18 +1516,33 @@ checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", "serde", - "serde_spanned", - "toml_datetime", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", "toml_write", "winnow", ] +[[package]] +name = "toml_parser" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97200572db069e74c512a14117b296ba0a80a30123fbbb5aa1f4a348f639ca30" +dependencies = [ + "winnow", +] + [[package]] name = "toml_write" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" +[[package]] +name = "toml_writer" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" + [[package]] name = "tower" version = "0.5.2" diff --git a/Cargo.toml b/Cargo.toml index c52160c..d6285fc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,14 +6,19 @@ edition = "2024" [dependencies] anyhow = "1.0.98" backon = "1" -clap = { version = "4.5.40", features = ["derive"] } +clap = { version = "4", features = ["derive"] } futures = "0.3" regex = "1.11.1" reqwest = { version = "0.12.22", features = ["json"] } serde_json = "1.0.140" -tokio = { version = "1.46", features = ["macros", "rt-multi-thread", "time"] } +tokio = { version = "1.46", features = [ + "macros", + "rt-multi-thread", + "time", + "fs", +] } url = { version = "2.5.4", features = ["serde"] } async-stream = "0.3" figment = { version = "0.10.19", features = ["env", "toml"] } serde = { version = "1.0.219", features = ["derive"] } -toml = "0.8" +toml = "0.9" diff --git a/src/adapters/output/local.rs b/src/adapters/output/local.rs index 96e8bfd..e0ad252 100644 --- a/src/adapters/output/local.rs +++ b/src/adapters/output/local.rs @@ -1,11 +1,15 @@ use crate::types::ApiKey; use anyhow::Result; use std::{fs, io::Write}; +use tokio::io::{AsyncWriteExt, BufWriter}; use toml::Value; // Write valid key to output file -pub fn write_keys_txt_file(file: &mut fs::File, key: &ApiKey) -> Result<()> { - writeln!(file, "{}", key.as_str())?; +pub async fn write_keys_txt_file( + file: &mut BufWriter, + key: &ApiKey, +) -> Result<()> { + file.write_all(key.as_str().as_bytes()).await?; Ok(()) } @@ -13,11 +17,11 @@ pub fn write_keys_txt_file(file: &mut fs::File, key: &ApiKey) -> Result<()> { pub fn write_keys_clewdr_format(file: &mut fs::File, key: &ApiKey) -> Result<()> { let mut table = toml::value::Table::new(); table.insert("key".to_string(), Value::String(key.as_str().to_string())); - + let gemini_keys = Value::Array(vec![Value::Table(table)]); let mut root = toml::value::Table::new(); root.insert("gemini_keys".to_string(), gemini_keys); - + let toml_string = toml::to_string(&Value::Table(root))?; write!(file, "{}", toml_string)?; Ok(()) diff --git a/src/validation.rs b/src/validation.rs index 54ce76c..9fe6ced 100644 --- a/src/validation.rs +++ b/src/validation.rs @@ -2,8 +2,8 @@ use anyhow::Result; use async_stream::stream; use futures::{pin_mut, stream::StreamExt}; use reqwest::Client; -use std::{fs, time::Instant}; -use tokio::sync::mpsc; +use std::time::Instant; +use tokio::{fs, sync::mpsc}; use crate::adapters::write_keys_txt_file; use crate::config::KeyCheckerConfig; @@ -42,20 +42,19 @@ impl ValidationService { // Create stream to validate keys concurrently let valid_keys_stream = stream - .map(|key| { - validate_key_with_retry(self.client.to_owned(), self.config.api_host(), key) - }) + .map(|key| validate_key_with_retry(self.client.to_owned(), self.config.api_host(), key)) .buffer_unordered(self.config.concurrency()) .filter_map(|r| async { r }); pin_mut!(valid_keys_stream); // Open output file for writing valid keys - let mut output_file = fs::File::create(&self.config.output_path())?; + let output_file = fs::File::create(&self.config.output_path()).await?; + let mut buffer_writer = tokio::io::BufWriter::new(output_file); // Process validated keys and write to output file while let Some(valid_key) = valid_keys_stream.next().await { println!("Valid key found: {}", valid_key.as_str()); - if let Err(e) = write_keys_txt_file(&mut output_file, &valid_key) { + if let Err(e) = write_keys_txt_file(&mut buffer_writer, &valid_key).await { eprintln!("Failed to write key to output file: {}", e); } }