diff options
Diffstat (limited to 'src/action.rs')
| -rw-r--r-- | src/action.rs | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/src/action.rs b/src/action.rs new file mode 100644 index 0000000..55e5685 --- /dev/null +++ b/src/action.rs @@ -0,0 +1,118 @@ +pub enum Action { + Add { repo: String }, + Update, + Upgrade { packages: Vec<String> }, + Autoremove, + Remove { packages: Vec<String> }, + List, + Search { term: String }, + Clean { packages: Vec<String> }, + Show { package: String }, +} + +impl Action { + pub fn parse(args: &[String]) -> Result<Self, String> { + let cmd = args.get(1) + .ok_or("no command provided")? + .as_str(); + + match cmd { + "add" => { + let repo = args.get(2) + .ok_or("add requires <repo>")? + .clone(); + Ok(Action::Add { repo }) + } + "update" => Ok(Action::Update), + "upgrade" => { + let packages = args[2..].to_vec(); + Ok(Action::Upgrade { packages }) + } + "autoremove" => Ok(Action::Autoremove), + "remove" => { + let packages = args[2..].to_vec(); + + if packages.is_empty() { + Err("remove requires a package".into()) + } else { + Ok(Action::Remove { packages }) + } + } + "list" => Ok(Action::List), + "search" => { + let term = args.get(2) + .ok_or("search requires <term>")? + .clone(); + Ok(Action::Search { term }) + } + "clean" => { + let packages = args[2..].to_vec(); + Ok(Action::Clean { packages }) + } + "show" => { + let package = args.get(2) + .ok_or("show requires <package>")? + .clone(); + Ok(Action::Show { package }) + } + _ => Err(format!("unknown command {}", cmd)), + } + } + + pub fn execute(self) { + match self { + Action::Add { repo } => add(repo), + Action::Update => update(), + Action::Upgrade { packages } => upgrade(packages), + Action::Autoremove => autoremove(), + Action::Remove { packages } => remove(packages), + Action::List => list(), + Action::Search { term } => search(term), + Action::Clean { packages } => clean(packages), + Action::Show { package } => show(package), + } + } +} + +fn add(repo: String) { + println!("adding {}", repo); +} + +fn update() { + println!("updating"); +} + +fn upgrade(packages: Vec<String>) { + for (_, p) in packages.iter().enumerate() { + println!("upgrading: {}", p); + } +} + +fn autoremove() { + println!("autoremoving"); +} + +fn remove(packages: Vec<String>) { + for (_, p) in packages.iter().enumerate() { + println!("removing: {}", p); + } +} + +fn list() { + println!("listing"); +} + +fn search(term: String) { + println!("searching: {}", term); +} + +fn clean(packages: Vec<String>) { + for (_, p) in packages.iter().enumerate() { + println!("cleaning: {}", p); + } +} + +fn show(package: String) { + println!("showing {}", package); +} + |
