try {
String[] parts = rule.split(":");
if(parts.length != 2) {
throw new OpenEnergyMonitorException("Invalid parser rule '" + rule + "'");
}
// Address
this.address = Byte.parseByte(parts[0]);
// Data type
Matcher matcher = EXTRACT_DATA_TYPE_PATTERN.matcher(parts[1]);
if (!matcher.matches()) {
throw new OpenEnergyMonitorException("Invalid parser rule '" + rule + "', given data type '" + parts[1] + "' does not follow the expected pattern '<DataType>(<pattern>)'");
}
matcher.reset();
matcher.find();
String dataType = matcher.group(1);
try {
this.dataType = DataType.valueOf(dataType);
} catch(IllegalArgumentException e) {
throw new OpenEnergyMonitorException("Invalid parser rule '" + rule + "', unknown data type");
}
// Byte indexes
String[] b = matcher.group(2).split("\\|");
if (b.length > 8) {
throw new OpenEnergyMonitorException("Invalid parser rule '" + rule + "', too many bytes");
}
bytesIndex = new int[b.length];
for (int i=0; i<b.length; i++) {
bytesIndex[i] = Integer.parseInt(b[i]);
}
} catch (Exception e) {
throw new OpenEnergyMonitorException("Invalid parser rule", e);
}
}