use global_registry::{TypeRegistry, RegistryError};
#[derive(Debug, Clone)]
struct DatabaseConfig {
host: String,
port: u16,
database: String,
}
impl DatabaseConfig {
fn new(host: &str, port: u16, database: &str) -> Self {
Self {
host: host.to_string(),
port,
database: database.to_string(),
}
}
fn connection_string(&self) -> String {
format!("{}:{}/{}", self.host, self.port, self.database)
}
}
fn main() -> Result<(), RegistryError> {
println!("=== Basic Type Registry Usage ===\n");
let registry = TypeRegistry::new();
let config = DatabaseConfig::new("localhost", 5432, "myapp");
println!("Registering config: {:?}", config);
registry.register(config)?;
let config = registry.get_cloned::<DatabaseConfig>()?;
println!("Retrieved config: {:?}", config);
let connection_string = config.connection_string();
println!("Connection string: {}", connection_string);
println!("Is DatabaseConfig registered? {}", registry.is_registered::<DatabaseConfig>());
println!("Registry contains {} types", registry.len());
let another_config = DatabaseConfig::new("remote", 3306, "prod");
match registry.register(another_config) {
Ok(()) => println!("Second registration succeeded"),
Err(RegistryError::TypeAlreadyExists) => {
println!("Second registration failed as expected: type already exists");
}
Err(e) => println!("Unexpected error: {}", e),
}
let replacement_config = DatabaseConfig::new("remote", 3306, "prod");
println!("Replacing with new config: {:?}", replacement_config);
registry.register_or_replace(replacement_config)?;
let final_config = registry.get_cloned::<DatabaseConfig>()?;
println!("Final config: {:?}", final_config);
Ok(())
}