first commit

This commit is contained in:
2026-05-21 23:45:42 +02:00
commit b1d35d5ce1
6 changed files with 398 additions and 0 deletions
+60
View File
@@ -0,0 +1,60 @@
pub struct Config {
pub token: String,
pub device_id: String,
pub base_url: String,
pub max_output_bytes: u64,
pub writer_channel_capacity: usize,
}
impl Config {
const DEFAULT_BASE_URL: &str = "ws://127.0.0.1:8000";
const DEFAULT_DEVICE_ID: &str = "device";
const DEFAULT_MAX_OUTPUT_BYTES: u64 = 10 * 1024 * 1024;
const DEFAULT_WRITER_CHANNEL_CAPACITY: usize = 32;
pub fn from_env() -> Result<Self, String> {
let token = std::env::var("TOKEN")
.map_err(|_| "TOKEN environment variable is required".to_string())?;
let device_id =
std::env::var("DEVICE_ID").unwrap_or_else(|_| Self::DEFAULT_DEVICE_ID.to_string());
validate_device_id(&device_id).map_err(|e| format!("Invalid DEVICE_ID: {e}"))?;
let base_url =
std::env::var("BASE_URL").unwrap_or_else(|_| Self::DEFAULT_BASE_URL.to_string());
Ok(Self {
token,
device_id,
base_url,
max_output_bytes: parse_env("MAX_OUTPUT_BYTES", Self::DEFAULT_MAX_OUTPUT_BYTES),
writer_channel_capacity: parse_env(
"WRITER_CHANNEL_CAPACITY",
Self::DEFAULT_WRITER_CHANNEL_CAPACITY,
),
})
}
}
fn parse_env<T: std::str::FromStr>(key: &str, default: T) -> T {
std::env::var(key)
.ok()
.and_then(|v| v.parse().ok())
.unwrap_or(default)
}
fn validate_device_id(id: &str) -> Result<(), String> {
if id.is_empty() {
return Err("cannot be empty".into());
}
if id.len() > 64 {
return Err("too long (max 64 characters)".into());
}
if !id
.chars()
.all(|c| c.is_alphanumeric() || c == '-' || c == '_')
{
return Err("contains invalid characters (allowed: a-z A-Z 0-9 - _)".into());
}
Ok(())
}