20: Move target price parsing to new AlarmTargetParser class
This commit is contained in:
@@ -3,7 +3,6 @@ package com.r35157.jupiterperpsalarm.impl.ref;
|
||||
import com.r35157.jupiterperpsalarm.AlarmSeverity;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.math.BigDecimal;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.*;
|
||||
@@ -89,28 +88,6 @@ public final class AlarmConfigurationParser {
|
||||
);
|
||||
}
|
||||
|
||||
private static BigDecimal parseTargetPercentage(
|
||||
String targetStr,
|
||||
int operatorIndex,
|
||||
boolean add
|
||||
) {
|
||||
BigDecimal base = new BigDecimal(targetStr.substring(0, operatorIndex));
|
||||
String percentStr = targetStr.substring(operatorIndex + 1, targetStr.length() - 1);
|
||||
BigDecimal percent = new BigDecimal(percentStr);
|
||||
|
||||
BigDecimal delta = base
|
||||
.multiply(percent)
|
||||
.divide(BigDecimal.valueOf(100));
|
||||
|
||||
BigDecimal target = add ? base.add(delta) : base.subtract(delta);
|
||||
|
||||
validateTarget(base, targetStr);
|
||||
validateTarget(percent, targetStr);
|
||||
validateTarget(target, targetStr);
|
||||
|
||||
return target;
|
||||
}
|
||||
|
||||
private static TriggerConfiguration parseTrigger(String triggerText) {
|
||||
String normalized = triggerText.toUpperCase(Locale.ROOT);
|
||||
|
||||
@@ -155,35 +132,6 @@ public final class AlarmConfigurationParser {
|
||||
throw new IllegalArgumentException("Unknown trigger: " + triggerText);
|
||||
}
|
||||
|
||||
private static void validateTarget(BigDecimal target, String originalTargetStr) {
|
||||
if (target.compareTo(BigDecimal.ZERO) < 0) {
|
||||
throw new IllegalArgumentException(
|
||||
"Target must be zero or positive: " + originalTargetStr
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private static BigDecimal parseTarget(String targetStr) {
|
||||
String trimmedTargetStr = targetStr.trim();
|
||||
|
||||
if (trimmedTargetStr.endsWith("%")) {
|
||||
int plusIndex = trimmedTargetStr.indexOf('+');
|
||||
int minusIndex = trimmedTargetStr.indexOf('-', 1);
|
||||
|
||||
if (plusIndex >= 0) {
|
||||
return parseTargetPercentage(trimmedTargetStr, plusIndex, true);
|
||||
}
|
||||
|
||||
if (minusIndex >= 0) {
|
||||
return parseTargetPercentage(trimmedTargetStr, minusIndex, false);
|
||||
}
|
||||
}
|
||||
|
||||
BigDecimal target = new BigDecimal(trimmedTargetStr);
|
||||
validateTarget(target, targetStr);
|
||||
return target;
|
||||
}
|
||||
|
||||
private static final class Cursor {
|
||||
private Cursor(String line) {
|
||||
this.line = line;
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
package com.r35157.jupiterperpsalarm.impl.ref;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
public final class AlarmTargetParser {
|
||||
|
||||
private AlarmTargetParser() {
|
||||
}
|
||||
|
||||
public static BigDecimal parse(String targetStr) {
|
||||
String trimmedTargetStr = targetStr.trim();
|
||||
|
||||
if (trimmedTargetStr.endsWith("%")) {
|
||||
int plusIndex = trimmedTargetStr.indexOf('+');
|
||||
int minusIndex = trimmedTargetStr.indexOf('-', 1);
|
||||
|
||||
if (plusIndex >= 0) {
|
||||
return parseTargetPercentage(trimmedTargetStr, plusIndex, true);
|
||||
}
|
||||
|
||||
if (minusIndex >= 0) {
|
||||
return parseTargetPercentage(trimmedTargetStr, minusIndex, false);
|
||||
}
|
||||
}
|
||||
|
||||
BigDecimal target = new BigDecimal(trimmedTargetStr);
|
||||
validateTarget(target, targetStr);
|
||||
return target;
|
||||
}
|
||||
|
||||
private static BigDecimal parseTargetPercentage(
|
||||
String targetStr,
|
||||
int operatorIndex,
|
||||
boolean add
|
||||
) {
|
||||
BigDecimal base = new BigDecimal(targetStr.substring(0, operatorIndex));
|
||||
String percentStr = targetStr.substring(operatorIndex + 1, targetStr.length() - 1);
|
||||
BigDecimal percent = new BigDecimal(percentStr);
|
||||
|
||||
BigDecimal delta = base
|
||||
.multiply(percent)
|
||||
.divide(BigDecimal.valueOf(100));
|
||||
|
||||
BigDecimal target = add ? base.add(delta) : base.subtract(delta);
|
||||
|
||||
validateTarget(base, targetStr);
|
||||
validateTarget(percent, targetStr);
|
||||
validateTarget(target, targetStr);
|
||||
|
||||
return target;
|
||||
}
|
||||
|
||||
private static void validateTarget(BigDecimal target, String originalTargetStr) {
|
||||
if (target.compareTo(BigDecimal.ZERO) < 0) {
|
||||
throw new IllegalArgumentException(
|
||||
"Target must be zero or positive: " + originalTargetStr
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user