//! Common configuration structures and utilities. use std::str::FromStr; use logos_blockchain_common_http_client::BasicAuthCredentials; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct BasicAuth { pub username: String, pub password: Option, } impl std::fmt::Display for BasicAuth { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", self.username)?; if let Some(password) = &self.password { write!(f, ":{password}")?; } Ok(()) } } impl FromStr for BasicAuth { type Err = anyhow::Error; fn from_str(s: &str) -> Result { let parse = || { let mut parts = s.splitn(2, ':'); let username = parts.next()?; let password = parts.next().filter(|p| !p.is_empty()); if parts.next().is_some() { return None; } Some((username, password)) }; let (username, password) = parse().ok_or_else(|| { anyhow::anyhow!("Invalid auth format. Expected 'user' or 'user:password'") })?; Ok(Self { username: username.to_string(), password: password.map(|p| p.to_string()), }) } } impl From for BasicAuthCredentials { fn from(value: BasicAuth) -> Self { BasicAuthCredentials::new(value.username, value.password) } }