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
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();
|
|
}
|
|
}
|
|
|