use guardian_db::{
access_control::{acl_simple::SimpleAccessController, manifest::ManifestParams},
guardian::core::GuardianDB,
guardian::error::Result,
p2p::network::config::ClientConfig,
traits::AccessControllerConstructor,
};
use std::sync::Arc;
use tracing::{info, info_span};
async fn demonstrate_constructor_functionality(guardian_db: &GuardianDB) -> Result<()> {
let _span = info_span!("constructor_demo").entered();
info!("=== Demonstração de Funcionalidade dos Construtores ===");
let initial_types = guardian_db.access_control_types_names();
info!(
types = ?initial_types,
"1. Tipos iniciais de AccessController"
);
info!("2. Criando e registrando construtor de AccessController");
let simple_constructor = create_simple_access_controller_constructor();
match guardian_db
.register_access_control_type(simple_constructor)
.await
{
Ok(()) => {
info!("Construtor registrado com sucesso");
}
Err(e) => {
info!(error = %e, "Erro ao registrar construtor");
}
}
let updated_types = guardian_db.access_control_types_names();
info!(
count = updated_types.len(),
types = ?updated_types,
"3. Tipos após registro"
);
info!("4. Testando recuperação do construtor");
for controller_type in &updated_types {
info!(controller_type = %controller_type, "Testando tipo");
match guardian_db.get_access_control_type(controller_type) {
Some(_constructor) => {
info!(controller_type = %controller_type, "Construtor recuperado com sucesso");
info!("Testando execução do construtor recuperado");
info!(controller_type = %controller_type, "Construtor recuperado e disponível para uso");
}
None => {
info!(controller_type = %controller_type, "Construtor não encontrado");
}
}
}
info!("5. Demonstrando funcionalidades análogas para Store constructors");
let store_types = guardian_db.store_types_names();
info!(
count = store_types.len(),
types = ?store_types,
"Tipos de Store disponíveis"
);
match guardian_db.get_store_constructor("eventlog") {
Some(_constructor) => {
info!("Construtor de Store 'eventlog' encontrado e pode ser clonado");
}
None => {
info!("Construtor de Store 'eventlog' não encontrado (esperado - não foi registrado)");
}
}
info!("6. Benefícios da refatoração Arc<dyn Fn>");
info!("✓ Construtores podem ser clonados");
info!("✓ Thread-safe para uso concorrente");
info!("✓ Compartilhamento eficiente de memória");
info!("✓ get_access_controller_type retorna cópias funcionais");
info!("✓ get_store_constructor retorna cópias funcionais");
info!("✓ Determinação automática de tipo via execução do construtor");
info!("=== Demonstração Concluída ===");
Ok(())
}
fn _example_how_to_create_constructor() {
use guardian_db::traits::AccessControllerConstructor;
use std::sync::Arc;
let _simple_constructor: AccessControllerConstructor = Arc::new(|_db, options, _opts| {
let options_clone = options.clone();
Box::pin(async move {
let initial_keys = if options_clone.get_all_access().is_empty() {
let mut default_permissions = std::collections::HashMap::new();
default_permissions.insert("write".to_string(), vec!["*".to_string()]);
Some(default_permissions)
} else {
Some(options_clone.get_all_access())
};
let controller = SimpleAccessController::new(initial_keys);
Ok(Arc::new(controller)
as Arc<
dyn guardian_db::access_control::traits::AccessController,
>)
})
});
}
fn create_simple_access_controller_constructor() -> AccessControllerConstructor {
Arc::new(|_db, options, _opts| {
let options_clone = options.clone();
Box::pin(async move {
let initial_keys = if options_clone.get_all_access().is_empty() {
let mut default_permissions = std::collections::HashMap::new();
default_permissions.insert("write".to_string(), vec!["*".to_string()]);
Some(default_permissions)
} else {
Some(options_clone.get_all_access())
};
let controller = SimpleAccessController::new(initial_keys);
Ok(Arc::new(controller)
as Arc<
dyn guardian_db::access_control::traits::AccessController,
>)
})
})
}
#[tokio::main]
async fn main() -> Result<()> {
println!("Iniciando demonstração de funcionalidade dos construtores...");
let result = {
println!("Configurando Iroh backend...");
let config = ClientConfig::default();
println!("Criando GuardianDB...");
let guardian_db = match GuardianDB::new(Some(config), None).await {
Ok(db) => {
println!("GuardianDB criado com sucesso!");
db
}
Err(e) => {
eprintln!("Erro ao criar GuardianDB: {}", e);
return Err(e);
}
};
println!("Executando demonstração...");
let demo_result = demonstrate_constructor_functionality(&guardian_db).await;
println!("Fechando GuardianDB...");
match guardian_db.close().await {
Ok(()) => {
println!("GuardianDB fechado com sucesso!");
}
Err(e) => {
eprintln!("Aviso ao fechar GuardianDB: {}", e);
}
}
demo_result
};
match result {
Ok(()) => {
println!("Demonstração concluída com sucesso!");
Ok(())
}
Err(e) => {
eprintln!("Erro durante demonstração: {}", e);
Err(e)
}
}
}