From 72ca258d06c51e55c9fa5983bb11186250eb24b0 Mon Sep 17 00:00:00 2001 From: Adrien Hopkins Date: Fri, 16 Aug 2024 18:13:16 -0500 Subject: Allow named unit-sets to be used as to expression --- src/main/java/sevenUnitsGUI/Presenter.java | 39 +++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) (limited to 'src/main/java/sevenUnitsGUI/Presenter.java') 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 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); @@ -523,6 +526,40 @@ public final class Presenter { UnitConversionRecord.valueOf(fromExpression, toExpression, "", "")); } + /** + * 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 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 toUnits = this.database.getUnitSet(toName); + final List 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. -- cgit v1.2.3