diff --git a/src/main/java/de/prob2/jupyter/commands/CommandUtils.java b/src/main/java/de/prob2/jupyter/commands/CommandUtils.java index 4d87db4eec1f30380f85abbd3c198e26fc721791..05e239d7f1e144a3d21d7e777ebe9650a4cd85d5 100644 --- a/src/main/java/de/prob2/jupyter/commands/CommandUtils.java +++ b/src/main/java/de/prob2/jupyter/commands/CommandUtils.java @@ -6,11 +6,25 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import de.prob.animator.domainobjects.AbstractEvalResult; +import de.prob.animator.domainobjects.ComputationNotCompletedResult; +import de.prob.animator.domainobjects.EnumerationWarning; +import de.prob.animator.domainobjects.EvalResult; +import de.prob.animator.domainobjects.EvaluationErrorResult; +import de.prob.unicode.UnicodeTranslator; + import de.prob2.jupyter.UserErrorException; +import io.github.spencerpark.jupyter.messages.DisplayData; + import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + public final class CommandUtils { + private static final Logger LOGGER = LoggerFactory.getLogger(CommandUtils.class); + public static @NotNull List<@NotNull String> splitArgs(final @NotNull String args) { final String[] split = args.split("\\h+"); if (split.length == 1 && split[0].isEmpty()) { @@ -31,4 +45,52 @@ public final class CommandUtils { } return preferences; } + + public static @NotNull DisplayData displayDataForEvalResult(final @NotNull AbstractEvalResult aer) { + final StringBuilder sb = new StringBuilder(); + final boolean error; + if (aer instanceof EvalResult) { + final EvalResult result = (EvalResult)aer; + sb.append(UnicodeTranslator.toUnicode(result.getValue())); + if (!result.getSolutions().isEmpty()) { + sb.append("\n\nSolution:"); + result.getSolutions().forEach((k, v) -> { + sb.append("\n\t"); + sb.append(UnicodeTranslator.toUnicode(k)); + sb.append(" = "); + sb.append(UnicodeTranslator.toUnicode(v)); + }); + } + error = false; + } else if (aer instanceof ComputationNotCompletedResult) { + final ComputationNotCompletedResult result = (ComputationNotCompletedResult)aer; + sb.append("Computation not completed: "); + sb.append(result.getReason()); + error = true; + } else if (aer instanceof EnumerationWarning) { + sb.append("UNKNOWN (FALSE with enumeration warning)"); + error = true; + } else if (aer instanceof EvaluationErrorResult) { + final EvaluationErrorResult result = (EvaluationErrorResult)aer; + sb.append(result.getResult()); + if (!result.getErrors().isEmpty()) { + sb.append(": "); + result.getErrors().forEach(s -> { + sb.append('\n'); + sb.append(s); + }); + } + error = true; + } else { + LOGGER.info("Unhandled eval result type, falling back to toString(): {}", aer.getClass()); + sb.append(aer); + error = false; + } + + if (error) { + throw new UserErrorException(sb.toString()); + } else { + return new DisplayData(sb.toString()); + } + } } diff --git a/src/main/java/de/prob2/jupyter/commands/EvalCommand.java b/src/main/java/de/prob2/jupyter/commands/EvalCommand.java index 52685fa492ee999d85e48d7f61c80a9be92b6d2d..c533e69bb762d9fa324d322f79e20aa202d95d90 100644 --- a/src/main/java/de/prob2/jupyter/commands/EvalCommand.java +++ b/src/main/java/de/prob2/jupyter/commands/EvalCommand.java @@ -2,28 +2,16 @@ package de.prob2.jupyter.commands; import com.google.inject.Inject; -import de.prob.animator.domainobjects.AbstractEvalResult; -import de.prob.animator.domainobjects.ComputationNotCompletedResult; -import de.prob.animator.domainobjects.EnumerationWarning; -import de.prob.animator.domainobjects.EvalResult; -import de.prob.animator.domainobjects.EvaluationErrorResult; import de.prob.animator.domainobjects.FormulaExpand; import de.prob.statespace.AnimationSelector; -import de.prob.unicode.UnicodeTranslator; import de.prob2.jupyter.ProBKernel; -import de.prob2.jupyter.UserErrorException; import io.github.spencerpark.jupyter.messages.DisplayData; import org.jetbrains.annotations.NotNull; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - public final class EvalCommand implements LineCommand { - private static final Logger LOGGER = LoggerFactory.getLogger(EvalCommand.class); - private final @NotNull AnimationSelector animationSelector; @Inject @@ -43,56 +31,8 @@ public final class EvalCommand implements LineCommand { return "Evaluate an expression."; } - private static @NotNull DisplayData displayDataForEvalResult(final @NotNull AbstractEvalResult aer) { - final StringBuilder sb = new StringBuilder(); - final boolean error; - if (aer instanceof EvalResult) { - final EvalResult result = (EvalResult)aer; - sb.append(UnicodeTranslator.toUnicode(result.getValue())); - if (!result.getSolutions().isEmpty()) { - sb.append("\n\nSolution:"); - result.getSolutions().forEach((k, v) -> { - sb.append("\n\t"); - sb.append(UnicodeTranslator.toUnicode(k)); - sb.append(" = "); - sb.append(UnicodeTranslator.toUnicode(v)); - }); - } - error = false; - } else if (aer instanceof ComputationNotCompletedResult) { - final ComputationNotCompletedResult result = (ComputationNotCompletedResult)aer; - sb.append("Computation not completed: "); - sb.append(result.getReason()); - error = true; - } else if (aer instanceof EnumerationWarning) { - sb.append("UNKNOWN (FALSE with enumeration warning)"); - error = true; - } else if (aer instanceof EvaluationErrorResult) { - final EvaluationErrorResult result = (EvaluationErrorResult)aer; - sb.append(result.getResult()); - if (!result.getErrors().isEmpty()) { - sb.append(": "); - result.getErrors().forEach(s -> { - sb.append('\n'); - sb.append(s); - }); - } - error = true; - } else { - LOGGER.info("Unhandled eval result type, falling back to toString(): {}", aer.getClass()); - sb.append(aer); - error = false; - } - - if (error) { - throw new UserErrorException(sb.toString()); - } else { - return new DisplayData(sb.toString()); - } - } - @Override public @NotNull DisplayData run(final @NotNull ProBKernel kernel, final @NotNull String argString) { - return EvalCommand.displayDataForEvalResult(this.animationSelector.getCurrentTrace().evalCurrent(argString, FormulaExpand.EXPAND)); + return CommandUtils.displayDataForEvalResult(this.animationSelector.getCurrentTrace().evalCurrent(argString, FormulaExpand.EXPAND)); } }