mod child;
mod graph;
mod internal;
use anyhow::Result;
pub use child::{ChildHealth, ChildRequest, ChildResponse, MotherChild, MotherHost, Toy};
pub use graph::{
Edge, EdgeType, EdgeUsageStats, Graph, Node, NodeType, WeightChange, WeightLearningReport,
DEFAULT_ALPHA, MIN_SAMPLES, WEIGHT_MAX, WEIGHT_MIN,
};
pub use internal::{Client, ScryRequest, ScryResponse, ScryResultJson};
pub const DEFAULT_PORT: u16 = 50051;
pub const ENV_MOTHER: &str = "PATINA_MOTHER";
const ENV_MOTHER_LEGACY: &str = "PATINA_MOTHERSHIP";
pub fn is_configured() -> bool {
if std::env::var(ENV_MOTHER_LEGACY).is_ok() && std::env::var(ENV_MOTHER).is_err() {
eprintln!("⚠️ PATINA_MOTHERSHIP is deprecated, use PATINA_MOTHER instead");
}
std::env::var(ENV_MOTHER).is_ok() || std::env::var(ENV_MOTHER_LEGACY).is_ok()
}
pub fn get_address() -> Option<String> {
std::env::var(ENV_MOTHER)
.or_else(|_| std::env::var(ENV_MOTHER_LEGACY))
.ok()
}
pub fn connect() -> Option<Client> {
get_address().map(Client::new)
}
pub fn is_available() -> bool {
if let Some(client) = connect() {
client.health().is_ok()
} else {
false
}
}
pub fn scry(request: ScryRequest) -> Result<ScryResponse> {
let client = connect().ok_or_else(|| anyhow::anyhow!("PATINA_MOTHER not set"))?;
client.scry(request)
}