# VersionExpression
Parsed comparison form of a single version expression. Recognises `>=`, `<=`, `>`, `<`, trailing `+` (alias for `>=`), or a bare version (`EQ`).
---
## Source
```java
package gg.lode.paintingapi.api.version;
import org.jetbrains.annotations.NotNull;
public final class VersionExpression {
public enum Operator {
EQ, GT, GTE, LT, LTE
}
private final Operator operator;
private final String version;
private VersionExpression(@NotNull Operator operator, @NotNull String version) {
this.operator = operator;
this.version = version;
}
public @NotNull Operator operator() { return operator; }
public @NotNull String version() { return version; }
public static @NotNull VersionExpression parse(@NotNull String raw) {
String s = raw.trim();
if (s.isEmpty()) {
throw new IllegalArgumentException("Empty version expression");
}
if (s.startsWith(">=")) return new VersionExpression(Operator.GTE, s.substring(2).trim());
if (s.startsWith("<=")) return new VersionExpression(Operator.LTE, s.substring(2).trim());
if (s.startsWith(">")) return new VersionExpression(Operator.GT, s.substring(1).trim());
if (s.startsWith("<")) return new VersionExpression(Operator.LT, s.substring(1).trim());
if (s.endsWith("+")) return new VersionExpression(Operator.GTE, s.substring(0, s.length() - 1).trim());
return new VersionExpression(Operator.EQ, s);
}
public boolean evaluate(int playerProtocol, int referenceProtocol) {
return switch (operator) {
case EQ -> playerProtocol == referenceProtocol;
case GT -> playerProtocol > referenceProtocol;
case GTE -> playerProtocol >= referenceProtocol;
case LT -> playerProtocol < referenceProtocol;
case LTE -> playerProtocol <= referenceProtocol;
};
}
}
```
---
## Related Pages
- [[Painting/API/VersionResolver]] — evaluates compound expressions using this class
- [[Painting/API/PackVariant]] — stores the raw expression strings