diff options
-rw-r--r-- | src/main/java/sevenUnitsGUI/Presenter.java | 39 |
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. * |