feat: update file writing methods to use async I/O and improve dependency versions

main
Xerxes-2 2025-07-17 19:41:38 +10:00
parent 0056b4fa7b
commit 96ac85072e
No known key found for this signature in database
GPG Key ID: A6C508165D76B601
4 changed files with 76 additions and 20 deletions

60
Cargo.lock generated
View File

@ -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"

View File

@ -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"

View File

@ -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<tokio::fs::File>,
key: &ApiKey,
) -> Result<()> {
file.write_all(key.as_str().as_bytes()).await?;
Ok(())
}

View File

@ -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);
}
}