feat: update file writing methods to use async I/O and improve dependency versions
parent
0056b4fa7b
commit
96ac85072e
|
@ -303,7 +303,7 @@ dependencies = [
|
||||||
"atomic",
|
"atomic",
|
||||||
"pear",
|
"pear",
|
||||||
"serde",
|
"serde",
|
||||||
"toml",
|
"toml 0.8.23",
|
||||||
"uncased",
|
"uncased",
|
||||||
"version_check",
|
"version_check",
|
||||||
]
|
]
|
||||||
|
@ -442,7 +442,7 @@ dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"tokio",
|
"tokio",
|
||||||
"toml",
|
"toml 0.9.2",
|
||||||
"url",
|
"url",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -1259,6 +1259,15 @@ dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_spanned"
|
||||||
|
version = "1.0.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_urlencoded"
|
name = "serde_urlencoded"
|
||||||
version = "0.7.1"
|
version = "0.7.1"
|
||||||
|
@ -1461,11 +1470,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362"
|
checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
"serde_spanned",
|
"serde_spanned 0.6.9",
|
||||||
"toml_datetime",
|
"toml_datetime 0.6.11",
|
||||||
"toml_edit",
|
"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]]
|
[[package]]
|
||||||
name = "toml_datetime"
|
name = "toml_datetime"
|
||||||
version = "0.6.11"
|
version = "0.6.11"
|
||||||
|
@ -1475,6 +1499,15 @@ dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml_datetime"
|
||||||
|
version = "0.7.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "toml_edit"
|
name = "toml_edit"
|
||||||
version = "0.22.27"
|
version = "0.22.27"
|
||||||
|
@ -1483,18 +1516,33 @@ checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"indexmap",
|
"indexmap",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_spanned",
|
"serde_spanned 0.6.9",
|
||||||
"toml_datetime",
|
"toml_datetime 0.6.11",
|
||||||
"toml_write",
|
"toml_write",
|
||||||
"winnow",
|
"winnow",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml_parser"
|
||||||
|
version = "1.0.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "97200572db069e74c512a14117b296ba0a80a30123fbbb5aa1f4a348f639ca30"
|
||||||
|
dependencies = [
|
||||||
|
"winnow",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "toml_write"
|
name = "toml_write"
|
||||||
version = "0.1.2"
|
version = "0.1.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801"
|
checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml_writer"
|
||||||
|
version = "1.0.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tower"
|
name = "tower"
|
||||||
version = "0.5.2"
|
version = "0.5.2"
|
||||||
|
|
11
Cargo.toml
11
Cargo.toml
|
@ -6,14 +6,19 @@ edition = "2024"
|
||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow = "1.0.98"
|
anyhow = "1.0.98"
|
||||||
backon = "1"
|
backon = "1"
|
||||||
clap = { version = "4.5.40", features = ["derive"] }
|
clap = { version = "4", features = ["derive"] }
|
||||||
futures = "0.3"
|
futures = "0.3"
|
||||||
regex = "1.11.1"
|
regex = "1.11.1"
|
||||||
reqwest = { version = "0.12.22", features = ["json"] }
|
reqwest = { version = "0.12.22", features = ["json"] }
|
||||||
serde_json = "1.0.140"
|
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"] }
|
url = { version = "2.5.4", features = ["serde"] }
|
||||||
async-stream = "0.3"
|
async-stream = "0.3"
|
||||||
figment = { version = "0.10.19", features = ["env", "toml"] }
|
figment = { version = "0.10.19", features = ["env", "toml"] }
|
||||||
serde = { version = "1.0.219", features = ["derive"] }
|
serde = { version = "1.0.219", features = ["derive"] }
|
||||||
toml = "0.8"
|
toml = "0.9"
|
||||||
|
|
|
@ -1,11 +1,15 @@
|
||||||
use crate::types::ApiKey;
|
use crate::types::ApiKey;
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use std::{fs, io::Write};
|
use std::{fs, io::Write};
|
||||||
|
use tokio::io::{AsyncWriteExt, BufWriter};
|
||||||
use toml::Value;
|
use toml::Value;
|
||||||
|
|
||||||
// Write valid key to output file
|
// Write valid key to output file
|
||||||
pub fn write_keys_txt_file(file: &mut fs::File, key: &ApiKey) -> Result<()> {
|
pub async fn write_keys_txt_file(
|
||||||
writeln!(file, "{}", key.as_str())?;
|
file: &mut BufWriter<tokio::fs::File>,
|
||||||
|
key: &ApiKey,
|
||||||
|
) -> Result<()> {
|
||||||
|
file.write_all(key.as_str().as_bytes()).await?;
|
||||||
Ok(())
|
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<()> {
|
pub fn write_keys_clewdr_format(file: &mut fs::File, key: &ApiKey) -> Result<()> {
|
||||||
let mut table = toml::value::Table::new();
|
let mut table = toml::value::Table::new();
|
||||||
table.insert("key".to_string(), Value::String(key.as_str().to_string()));
|
table.insert("key".to_string(), Value::String(key.as_str().to_string()));
|
||||||
|
|
||||||
let gemini_keys = Value::Array(vec![Value::Table(table)]);
|
let gemini_keys = Value::Array(vec![Value::Table(table)]);
|
||||||
let mut root = toml::value::Table::new();
|
let mut root = toml::value::Table::new();
|
||||||
root.insert("gemini_keys".to_string(), gemini_keys);
|
root.insert("gemini_keys".to_string(), gemini_keys);
|
||||||
|
|
||||||
let toml_string = toml::to_string(&Value::Table(root))?;
|
let toml_string = toml::to_string(&Value::Table(root))?;
|
||||||
write!(file, "{}", toml_string)?;
|
write!(file, "{}", toml_string)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
@ -2,8 +2,8 @@ use anyhow::Result;
|
||||||
use async_stream::stream;
|
use async_stream::stream;
|
||||||
use futures::{pin_mut, stream::StreamExt};
|
use futures::{pin_mut, stream::StreamExt};
|
||||||
use reqwest::Client;
|
use reqwest::Client;
|
||||||
use std::{fs, time::Instant};
|
use std::time::Instant;
|
||||||
use tokio::sync::mpsc;
|
use tokio::{fs, sync::mpsc};
|
||||||
|
|
||||||
use crate::adapters::write_keys_txt_file;
|
use crate::adapters::write_keys_txt_file;
|
||||||
use crate::config::KeyCheckerConfig;
|
use crate::config::KeyCheckerConfig;
|
||||||
|
@ -42,20 +42,19 @@ impl ValidationService {
|
||||||
|
|
||||||
// Create stream to validate keys concurrently
|
// Create stream to validate keys concurrently
|
||||||
let valid_keys_stream = stream
|
let valid_keys_stream = stream
|
||||||
.map(|key| {
|
.map(|key| validate_key_with_retry(self.client.to_owned(), self.config.api_host(), key))
|
||||||
validate_key_with_retry(self.client.to_owned(), self.config.api_host(), key)
|
|
||||||
})
|
|
||||||
.buffer_unordered(self.config.concurrency())
|
.buffer_unordered(self.config.concurrency())
|
||||||
.filter_map(|r| async { r });
|
.filter_map(|r| async { r });
|
||||||
pin_mut!(valid_keys_stream);
|
pin_mut!(valid_keys_stream);
|
||||||
|
|
||||||
// Open output file for writing valid keys
|
// 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
|
// Process validated keys and write to output file
|
||||||
while let Some(valid_key) = valid_keys_stream.next().await {
|
while let Some(valid_key) = valid_keys_stream.next().await {
|
||||||
println!("Valid key found: {}", valid_key.as_str());
|
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);
|
eprintln!("Failed to write key to output file: {}", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue