This commit is contained in:
Villers Krisztián 2026-05-04 21:24:24 +02:00
parent 2228a6e03e
commit de03588cfc
3 changed files with 66 additions and 35 deletions

View File

@ -1,41 +1,55 @@
use reqwest::blocking::Client;
use std::error::Error;
use std::fs;
use std::time::Duration;
mod api; mod api;
mod template; mod template;
mod tools; mod tools;
use reqwest::blocking::Client;
use std::{
error::Error,
fs,
time::Duration,
io::{
Error as IO_Error,
ErrorKind::{
Other,
ConnectionRefused
}
}
};
use api::make_url; use api::make_url;
use template::antares::Antares; use template::antares::Antares;
use tools::{Logger, export_to_excel}; use tools::{
Logger,
get_env,
export_to_excel
};
fn make_request( const URL_KEY: &str = "URL";
url: &str, const USERCODE_KEY: &str = "ANTARES_USERCODE";
logger: &Logger, const PASSWORD_KEY: &str = "ANTARES_PASSWORD";
) -> Result<String, Box<dyn Error>> { const OUT_KEY: &str = "OUT";
fn make_request(url: &str, logger: &Logger) -> Result<String, Box<dyn Error>> {
let client = Client::builder() let client = Client::builder()
.timeout(Duration::from_secs(300)) .timeout(Duration::from_secs(300))
.build().map_err(|e| { .build().map_err(|e| {
logger.log_error(&format!("Failed to create HTTP client: {}", e)); logger.log_error(&format!("Failed to create HTTP client: {}", e));
Box::new(std::io::Error::new(std::io::ErrorKind::Other, e.to_string())) Box::new(IO_Error::new(Other, e.to_string()))
})?; })?;
let response = client.get(url).send().map_err(|e| { let response = client.get(url).send().map_err(|e| {
logger.log_error(&format!("HTTP request failed: {}", e)); logger.log_error(&format!("HTTP request failed: {}", e));
Box::new(std::io::Error::new(std::io::ErrorKind::ConnectionRefused, e.to_string())) Box::new(IO_Error::new(ConnectionRefused, e.to_string()))
})?; })?;
if response.status().is_success() { if response.status().is_success() {
Ok(response.text().map_err(|e| { Ok(response.text().map_err(|e| {
logger.log_error(&format!("Failed to read response body: {}", e)); logger.log_error(&format!("Failed to read response body: {}", e));
Box::new(std::io::Error::new(std::io::ErrorKind::Other, e.to_string())) Box::new(IO_Error::new(Other, e.to_string()))
})?) })?)
} else { } else {
let error_msg = format!("HTTP error: {:?}", response.status()); let error_msg = format!("HTTP error: {:?}", response.status());
logger.log_error(&error_msg); logger.log_error(&error_msg);
Err(Box::new(std::io::Error::new(std::io::ErrorKind::ConnectionRefused, error_msg))) Err(Box::new(IO_Error::new(ConnectionRefused, error_msg)))
} }
} }
@ -45,31 +59,33 @@ fn main() -> Result<(), Box<dyn Error>> {
dotenv::dotenv().ok(); dotenv::dotenv().ok();
let usercode = std::env::var("ANTARES_USERCODE") let usercode = get_env(USERCODE_KEY)
.map_err(|e| { .map_err(|e| {
logger.log_error(&format!("Missing environment variable: ANTARES_USERCODE. {}", e)); logger.log_error(&e);
Box::new(std::io::Error::new(std::io::ErrorKind::Other, "Missing ANTARES_USERCODE env var".to_string())) e
})?;
let password = std::env::var("ANTARES_PASSWORD")
.map_err(|e| {
logger.log_error(&format!("Missing environment variable: ANTARES_PASSWORD. {}", e));
Box::new(std::io::Error::new(std::io::ErrorKind::Other, "Missing ANTARES_PASSWORD env var".to_string()))
})?;
let out_path = std::env::var("OUT")
.map_err(|e| {
logger.log_error(&format!("Missing environment variable: OUT. {}", e));
Box::new(std::io::Error::new(std::io::ErrorKind::Other, "Missing OUT env var".to_string()))
})?; })?;
let base = std::env::var("URL") let password = get_env(PASSWORD_KEY)
.map_err(|e| { .map_err(|e| {
logger.log_error(&format!("Missing environment variable: URL. {}", e)); logger.log_error(&e);
Box::new(std::io::Error::new(std::io::ErrorKind::Other, "Missing URL env var".to_string())) e
})?;
let out_path = get_env(OUT_KEY)
.map_err(|e| {
logger.log_error(&e);
e
})?;
let url = get_env(URL_KEY)
.map_err(|e| {
logger.log_error(&e);
e
})?; })?;
let cikkszam = ""; // supply a value if needed; let cikkszam = ""; // supply a value if needed;
let url = make_url(&base, &usercode, &password, cikkszam); let url = make_url(&url, &usercode, &password, cikkszam);
let response = match make_request(&url, &logger) { let response = match make_request(&url, &logger) {
Ok(resp) => { Ok(resp) => {
@ -86,7 +102,7 @@ fn main() -> Result<(), Box<dyn Error>> {
let antares_file = format!("{}/antares.json", temp_dir); let antares_file = format!("{}/antares.json", temp_dir);
fs::create_dir_all(temp_dir).map_err(|e| { fs::create_dir_all(temp_dir).map_err(|e| {
logger.log_error(&format!("Failed to create temp directory '{}': {}", temp_dir, e)); logger.log_error(&format!("Failed to create temp directory '{}': {}", temp_dir, e));
Box::new(std::io::Error::new(std::io::ErrorKind::Other, e.to_string())) Box::new(IO_Error::new(Other, e.to_string()))
})?; })?;
// Try to deserialize into strongly-typed `Antares` list. // Try to deserialize into strongly-typed `Antares` list.
@ -102,7 +118,7 @@ fn main() -> Result<(), Box<dyn Error>> {
}; };
fs::write(&antares_file, &pretty).map_err(|e| { fs::write(&antares_file, &pretty).map_err(|e| {
logger.log_error(&format!("Failed to write {}: {}", antares_file, e)); logger.log_error(&format!("Failed to write {}: {}", antares_file, e));
Box::new(std::io::Error::new(std::io::ErrorKind::Other, e.to_string())) Box::new(IO_Error::new(Other, e.to_string()))
})?; })?;
logger.log(&format!("API call successful - Fetched {} items", items.len())); logger.log(&format!("API call successful - Fetched {} items", items.len()));
items items
@ -119,13 +135,13 @@ fn main() -> Result<(), Box<dyn Error>> {
}; };
fs::write(&antares_file, &pretty).map_err(|e| { fs::write(&antares_file, &pretty).map_err(|e| {
logger.log_error(&format!("Failed to write {}: {}", antares_file, e)); logger.log_error(&format!("Failed to write {}: {}", antares_file, e));
Box::new(std::io::Error::new(std::io::ErrorKind::Other, e.to_string())) Box::new(IO_Error::new(Other, e.to_string()))
})?; })?;
logger.log_info("Response saved as JSON (schema mismatch)"); logger.log_info("Response saved as JSON (schema mismatch)");
} else { } else {
fs::write(&antares_file, &response).map_err(|e| { fs::write(&antares_file, &response).map_err(|e| {
logger.log_error(&format!("Failed to write {}: {}", antares_file, e)); logger.log_error(&format!("Failed to write {}: {}", antares_file, e));
Box::new(std::io::Error::new(std::io::ErrorKind::Other, e.to_string())) Box::new(IO_Error::new(Other, e.to_string()))
})?; })?;
logger.log_info("Response saved as raw text (not valid JSON)"); logger.log_info("Response saved as raw text (not valid JSON)");
} }

13
src/tools/env.rs Normal file
View File

@ -0,0 +1,13 @@
// .env handling
use std::env;
pub fn get_env(key_name: &str) -> Result<String, String> {
match env::var(key_name) {
Ok(value) => Ok(value),
Err(e) => Err(format!(
"Failed to read environment variable key: {}, error: {}",
key_name,
e
))
}
}

View File

@ -1,5 +1,7 @@
pub mod excel; pub mod excel;
pub mod logger; pub mod logger;
pub mod env;
pub use excel::export_to_excel; pub use excel::export_to_excel;
pub use logger::Logger; pub use logger::Logger;
pub use env::get_env;