Debilní root fórum systém, psal jsem se s tím asi půl hodiny, mezitím mě to odhlásilo a příspěvek nenávratně zmizel. Tak ještě jednou v rychlosti:
push<T: DatabaseBuilder> - dobrý.
Chtělo by to trochu učesat:
Nelíbí se mi ty Optiony v push, create_table, a možná i v Database, myslím že by bylo lepší je zrušit. Navíc bych čekal, že budou brát &mut self.
Kdyby ses chtěl zbavit těch DatabaseMembers, který jsou opravdu podivný, mohla by se třeba udělat lazy inicializace tabulek přímo v Database, např. něco jako (nevím jestli půjde přeložit)
pub struct Database {
initialized_tables: HashSet<TypeId>,
c: Connection,
}
impl Database {
fn init_table<T: DatabaseBuilder + 'static>(&mut self) {
let type_id = TypeId::of::<T>();
if !self.initialized_tables.contains(&type_id) {
T::create_table(&self.c);
self.initialized_tables.insert(type_id);
}
}
pub fn push<T: DatabaseBuilder + 'static>(&mut self, data: &T) {
self.init_table::<T>();
data.push(&self.conn)
}
}