From 3cae734dbd106dba4f1ed87d9ccc3925a501b4ac Mon Sep 17 00:00:00 2001 From: ppc Date: Fri, 9 Jan 2026 20:30:18 +0000 Subject: [PATCH] expose public api, enable rust library output --- amnet-server/Cargo.toml | 2 +- amnet-server/src/config.rs | 4 ++-- amnet-server/src/lib.rs | 15 +++++++++++---- amnet-server/src/metrics.rs | 2 +- amnet-server/src/utils.rs | 4 ++-- 5 files changed, 17 insertions(+), 10 deletions(-) diff --git a/amnet-server/Cargo.toml b/amnet-server/Cargo.toml index c5b45fe..0a36683 100644 --- a/amnet-server/Cargo.toml +++ b/amnet-server/Cargo.toml @@ -8,7 +8,7 @@ description.workspace = true [lib] name = "amnet" -crate-type = ["cdylib"] +crate-type = ["cdylib", "rlib"] [profile.release] lto = true diff --git a/amnet-server/src/config.rs b/amnet-server/src/config.rs index 7f46642..008a80d 100644 --- a/amnet-server/src/config.rs +++ b/amnet-server/src/config.rs @@ -24,7 +24,7 @@ mod limits { static CONFIG: OnceLock = OnceLock::new(); -pub (crate) struct Config { +pub struct Config { /// Game ID (4 characters or none) pub game_id: Option, @@ -58,7 +58,7 @@ impl Config { fn load() -> Result> { let config_path = env::var(defaults::CONFIG_FILE_ENV).unwrap_or_else(|_| defaults::CONFIG_FILE.to_string()); - let ini = Ini::load_from_file(&config_path).map_err(|e| format!("Failed to load config file '{}': {}", config_path, e))?; + let ini = Ini::load_from_file(&config_path)?; let io_section = ini.section(Some("aimeio")).ok_or("Missing [aimeio] section")?; let aime_section = ini.section(Some("aime")); diff --git a/amnet-server/src/lib.rs b/amnet-server/src/lib.rs index 25d2094..3ec3d9a 100644 --- a/amnet-server/src/lib.rs +++ b/amnet-server/src/lib.rs @@ -4,10 +4,6 @@ use tokio::net::TcpListener; use tokio::runtime::Runtime; use tracing::{debug, info, warn}; -use crate::card::CardPresenter; -use crate::config::Config; -use crate::metrics::SystemMetrics; - mod config; mod card; mod webapi; @@ -15,6 +11,17 @@ mod metrics; mod utils; mod webserver; +use card::CardPresenter; +use config::Config; +use metrics::SystemMetrics; + +// Re-export public API for library users +pub use config::Config as ServerConfig; +pub use card::{CardPresenter as CardSlot, StoredCard, CardPresentResult}; +pub use metrics::SystemMetrics as Metrics; +pub use webserver::build_server; +pub use utils::{format_hex_bytes, parse_access_code, parse_idm_hex}; + static WEBSERVER_INIT: OnceLock<()> = OnceLock::<()>::new(); #[unsafe(no_mangle)] diff --git a/amnet-server/src/metrics.rs b/amnet-server/src/metrics.rs index ba6dbea..6dc5a12 100644 --- a/amnet-server/src/metrics.rs +++ b/amnet-server/src/metrics.rs @@ -3,7 +3,7 @@ use std::{sync::{Mutex, OnceLock}, time::{Duration, Instant}}; static METRICS: OnceLock = OnceLock::new(); #[derive(Debug)] -pub (crate) struct SystemMetrics { +pub struct SystemMetrics { start_time: OnceLock, last_poll_time: Mutex>, } diff --git a/amnet-server/src/utils.rs b/amnet-server/src/utils.rs index 98f8254..f5f1380 100644 --- a/amnet-server/src/utils.rs +++ b/amnet-server/src/utils.rs @@ -5,7 +5,7 @@ pub fn format_hex_bytes(bytes: &[u8]) -> String { .join(" ") } -pub (crate) fn parse_access_code(code: &String) -> Option<[u8; 10]> { +pub fn parse_access_code(code: &String) -> Option<[u8; 10]> { let matrix_code = code.replace(" ", ""); if code.chars().any(|c| !c.is_ascii_hexdigit() && !c.is_whitespace()) && matrix_code.len() != 20 { @@ -24,7 +24,7 @@ pub (crate) fn parse_access_code(code: &String) -> Option<[u8; 10]> { Some(bytes) } -pub (crate) fn parse_idm_hex(idm_hex: &String) -> Option<[u8; 8]> { +pub fn parse_idm_hex(idm_hex: &String) -> Option<[u8; 8]> { if idm_hex.len() != 16 || idm_hex.chars().any(|c| !c.is_ascii_hexdigit()) { return None; }