--- /dev/null
+pub mod add;
+pub mod generate;
+pub mod update;
+pub mod publish;
+pub mod publish_archive;
+pub mod add_remote;
+pub mod remove_remote;
+pub mod sync_up;
+pub mod sync_down;
+pub mod version;
+pub mod help;
+
+use std::io::Result;
+
+use add::Add;
+use generate::Generate;
+use update::Update;
+use publish::Publish;
+use publish_archive::PublishArchive;
+use add_remote::AddRemote;
+use remove_remote::RemoveRemote;
+use sync_up::SyncUp;
+use sync_down::SyncDown;
+use version::Version;
+use help::Help;
+
+pub trait Command {
+ fn before_dependencies(&self) -> Vec<Box<dyn Command>>;
+ fn execute(&self, input: Option<&String>) -> Result<()>;
+ fn after_dependencies(&self) -> Vec<Box<dyn Command>>;
+ fn command(&self) -> &'static str;
+ fn help(&self) -> &'static str;
+}
+
+pub fn available_commands() -> Vec<Box<dyn Command>> {
+ vec![
+ Box::new(Add::new()),
+ Box::new(Generate::new()),
+ Box::new(Update::new()),
+ Box::new(Publish::new()),
+ Box::new(PublishArchive::new()),
+ Box::new(AddRemote::new()),
+ Box::new(RemoveRemote::new()),
+ Box::new(SyncUp::new()),
+ Box::new(SyncDown::new()),
+ Box::new(Version::new()),
+ Box::new(Help::new())
+ ]
+}