Remove default values from input prompts in NetBuilderInteractive for improved user input handling

This commit is contained in:
2025-02-19 11:49:06 +01:00
parent 611e14e6fa
commit 8fe2f9d781

View File

@@ -54,7 +54,7 @@ public class NetBuilderInteractive {
case 2 -> {
var source = ask("Enter the source node: ");
var target = ask("Enter the target node: ");
var weight = ask("Enter the weight: ", Double::parseDouble, 0.0);
var weight = ask("Enter the weight: ", Double::parseDouble);
var sourceNode = this.net.getNode(source);
var targetNode = this.net.getNode(target);
this.net.addConnection(sourceNode, targetNode, weight);
@@ -84,17 +84,17 @@ public class NetBuilderInteractive {
return switch (choice) {
case 1 -> {
var limit = ask("Arrivals limit (0 for Int.Max): ", Integer::parseInt, 1);
var limit = ask("Arrivals limit (0 for Int.Max): ", Integer::parseInt);
if (limit <= 0)
limit = Integer.MAX_VALUE;
yield ServerNode.Builder.sourceLimited(name, limit, distribution);
}
case 2 -> {
var servers = ask("Number of servers: ", Integer::parseInt, 1);
var servers = ask("Number of servers: ", Integer::parseInt);
yield ServerNode.Builder.queue(name, servers, distribution, null);
}
case 3 -> {
var servers = ask("Number of servers: ", Integer::parseInt, 1);
var servers = ask("Number of servers: ", Integer::parseInt);
var unavailable = askDistribution("Unavailable distribution");
yield ServerNode.Builder.queue(name, servers, distribution, unavailable);
}
@@ -113,32 +113,32 @@ public class NetBuilderInteractive {
return switch (choice) {
case 1 -> {
var lambda = ask("Lambda: ", Double::parseDouble, 1.0);
var lambda = ask("Lambda: ", Double::parseDouble);
yield new Distribution.Exponential(lambda);
}
case 2 -> {
var min = ask("Min: ", Double::parseDouble, 0.0);
var max = ask("Max: ", Double::parseDouble, 1.0);
var min = ask("Min: ", Double::parseDouble);
var max = ask("Max: ", Double::parseDouble);
yield new Distribution.Uniform(min, max);
}
case 3 -> {
var k = ask("K: ", Integer::parseInt, 1);
var lambda = ask("Lambda: ", Double::parseDouble, 1.0);
var k = ask("K: ", Integer::parseInt);
var lambda = ask("Lambda: ", Double::parseDouble);
yield new Distribution.Erlang(k, lambda);
}
case 4 -> {
var probability = ask("Probability: ", Double::parseDouble, 0.0);
var probability = ask("Probability: ", Double::parseDouble);
var unavailable = askDistribution("Unavailable distribution");
yield new Distribution.UnavailableTime(probability, unavailable);
}
case 5 -> {
var mean = ask("Mean: ", Double::parseDouble, 0.0);
var stdDev = ask("Standard deviation: ", Double::parseDouble, 1.0);
var mean = ask("Mean: ", Double::parseDouble);
var stdDev = ask("Standard deviation: ", Double::parseDouble);
yield new Distribution.Normal(mean, stdDev);
}
case 6 -> {
var mean = ask("Mean: ", Double::parseDouble, 0.0);
var stdDev = ask("Standard deviation: ", Double::parseDouble, 1.0);
var mean = ask("Mean: ", Double::parseDouble);
var stdDev = ask("Standard deviation: ", Double::parseDouble);
yield new Distribution.NormalBoxMuller(mean, stdDev);
}
default -> null;
@@ -152,7 +152,7 @@ public class NetBuilderInteractive {
* @return the answer
*/
private String ask(String ask) {
return ask(ask, Function.identity(), "");
return ask(ask, Function.identity());
}
/**
@@ -163,14 +163,24 @@ public class NetBuilderInteractive {
* @param defaultValue the default value
* @return the answer
*/
private <T> T ask(String ask, Function<String, T> parser, T defaultValue) {
this.out.print(ask);
try {
private <T> T ask(String ask, Function<String, T> parser) {
var totalRows = ask.chars().filter(ch -> ch == '\n').count() + 1;
var startLine = "\033[" + totalRows + "A";
var clearLine = "\033[K";
var ask2 = startLine + clearLine + ask;
var first = true;
while (true) {
this.out.print(first ? ask : ask2);
var line = this.scanner.nextLine();
return parser.apply(line);
first = false;
try {
var value = parser.apply(line);
return value;
} catch (Exception e) {
this.out.println("Invalid input: " + e.getMessage());
return defaultValue;
}
}
}
@@ -192,7 +202,7 @@ public class NetBuilderInteractive {
var string = builder.toString();
var choice = 0;
while (choice < 1 || choice > options.length)
choice = ask(string, Integer::parseInt, 0);
choice = ask(string, Integer::parseInt);
return choice;
}