summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/sevenUnitsGUI/Presenter.java39
1 files changed, 38 insertions, 1 deletions
diff --git a/src/main/java/sevenUnitsGUI/Presenter.java b/src/main/java/sevenUnitsGUI/Presenter.java
index 4512e01..f085dba 100644
--- a/src/main/java/sevenUnitsGUI/Presenter.java
+++ b/src/main/java/sevenUnitsGUI/Presenter.java
@@ -400,7 +400,10 @@ public final class Presenter {
}
final Optional<UnitConversionRecord> uc;
- if (toExpression.contains(";")) {
+ if (this.database.containsUnitSetName(toExpression)) {
+ uc = this.convertExpressionToNamedMultiUnit(fromExpression,
+ toExpression);
+ } else if (toExpression.contains(";")) {
final String[] toExpressions = toExpression.split(";");
uc = this.convertExpressionToMultiUnit(fromExpression,
toExpressions);
@@ -524,6 +527,40 @@ public final class Presenter {
}
/**
+ * Convert an expression to a MultiUnit with a name from the database. If an
+ * error happened, it is shown to the view and Optional.empty() is returned.
+ *
+ * @since 2024-08-15
+ */
+ private Optional<UnitConversionRecord> convertExpressionToNamedMultiUnit(
+ String fromExpression, String toName) {
+ final LinearUnitValue from;
+ try {
+ from = this.database.evaluateUnitExpression(fromExpression);
+ } catch (final IllegalArgumentException | NoSuchElementException e) {
+ this.view.showErrorMessage("Parse Error",
+ "Could not recognize text in From entry: " + e.getMessage());
+ return Optional.empty();
+ }
+
+ final List<LinearUnit> toUnits = this.database.getUnitSet(toName);
+ final List<LinearUnitValue> toValues;
+ try {
+ toValues = from.convertToMultiple(toUnits);
+ } catch (final IllegalArgumentException e) {
+ this.view.showErrorMessage("Unit Error",
+ "Invalid units separated by ';': " + e.getMessage());
+ return Optional.empty();
+ }
+
+ final String toExpression = toValues.stream().map(
+ v -> this.numberDisplayRule.apply(v.getValue()) + " " + v.getUnit())
+ .collect(Collectors.joining(" + "));
+ return Optional.of(
+ UnitConversionRecord.valueOf(fromExpression, toExpression, "", ""));
+ }
+
+ /**
* Converts from the view's input unit to its output unit. Displays an error
* message if any of the required fields are invalid.
*