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

View File

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

View File

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

View File

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