1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
use std::fmt; use {DbKind, Config, Direction}; pub trait MigratableClone { fn clone_migratable_box(&self) -> Box<Migratable>; } impl<T> MigratableClone for T where T: 'static + Migratable + Clone { fn clone_migratable_box(&self) -> Box<Migratable> { Box::new(self.clone()) } } pub trait Migratable: MigratableClone { fn apply_up(&self, DbKind, &Config) -> Result<(), Box<::std::error::Error>> { print_flush!("(empty)"); Ok(()) } fn apply_down(&self, DbKind, &Config) -> Result<(), Box<::std::error::Error>> { print_flush!("(empty)"); Ok(()) } fn tag(&self) -> String; fn description(&self, &Direction) -> String { self.tag() } } impl Clone for Box<Migratable> { fn clone(&self) -> Box<Migratable> { self.clone_migratable_box() } } impl fmt::Debug for Box<Migratable> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "Migration: {}", self.tag()) } }