aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGravatar BanceDev 2026-02-25 00:25:07 -0500
committerGravatar BanceDev 2026-02-25 00:25:07 -0500
commit337647e9dfd21a5d319530e600b015c70ac64294 (patch)
treebb7746c7fccf643778c90f862555ac37539cbee9 /src
initial commit
Diffstat (limited to 'src')
-rw-r--r--src/action.rs118
-rw-r--r--src/main.rs13
2 files changed, 131 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);
+}
+
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..e9bb749
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,13 @@
+use std::env;
+use action::Action;
+
+mod action;
+
+fn main() {
+ let args: Vec<String> = env::args().collect();
+
+ match Action::parse(&args) {
+ Ok(action) => action.execute(),
+ Err(e) => eprintln!("forge: {}", e),
+ }
+}