You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
2.1 KiB

package internal.hw.crawler;
import internal.hw.crawler.commands.Command;
import internal.hw.crawler.commands.CommandArg;
import internal.hw.crawler.views.ConsoleView;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainController {
private final Map<String, Command> commands = new HashMap<>();
private final ConsoleView view;
public MainController(ConsoleView view) {
this.view = view;
}
public Map<String, Command> getCommands() {
return Collections.unmodifiableMap(commands);
}
public void registerCommand(Command command) {
commands.put(command.getName(), command);
}
public void handleInput(String input) {
String text = input == null ? "" : input.trim();
if (text.isEmpty()) {
return;
}
String[] args = text.split("\\s+");
String cmdName = args[0].toLowerCase();
Command command = commands.get(cmdName);
if (command == null) {
view.printError("Unknown command: " + cmdName);
return;
}
if (!validateArgs(command, args)) {
return;
}
try {
command.execute(args);
} catch (Exception e) {
view.printError("Command failed: " + e.getMessage());
}
}
private boolean validateArgs(Command command, String[] args) {
List<CommandArg> cmdArgs = command.getArgs();
long required = cmdArgs.stream().filter(CommandArg::required).count();
int provided = args.length - 1;
if (provided < required) {
view.printError("Usage: " + command.getName() + " " + formatUsage(cmdArgs));
return false;
}
return true;
}
private String formatUsage(List<CommandArg> cmdArgs) {
StringBuilder sb = new StringBuilder();
for (CommandArg arg : cmdArgs) {
if (arg.required()) {
sb.append("<").append(arg.name()).append("> ");
} else {
sb.append("[").append(arg.name()).append("] ");
}
}
return sb.toString().trim();
}
}