add curly braces support to mqtt integration, documentation
This commit is contained in:
+36
-19
@@ -338,7 +338,7 @@ static const char* knownFieldNames[] = {
|
||||
/** the number of known field names. */
|
||||
static const size_t knownFieldCount = sizeof(knownFieldNames) / sizeof(char*);
|
||||
|
||||
std::pair<string, int> makeField(const string name, bool isField) {
|
||||
std::pair<string, int> makeField(const string& name, bool isField) {
|
||||
if (!isField) {
|
||||
return {name, -1};
|
||||
}
|
||||
@@ -350,38 +350,55 @@ std::pair<string, int> makeField(const string name, bool isField) {
|
||||
return {name, knownFieldCount};
|
||||
}
|
||||
|
||||
void addPart(ostringstream& stack, int inField, vector<std::pair<string, int>>& parts) {
|
||||
string str = stack.str();
|
||||
if (inField == 1 && str == "_") {
|
||||
inField = 0; // single "%_" pattern to reduce to "_"
|
||||
} else if (inField == 2) {
|
||||
str = "%{" + str;
|
||||
inField = 0;
|
||||
}
|
||||
if (inField == 0 && str.empty()) {
|
||||
return;
|
||||
}
|
||||
stack.str("");
|
||||
if (inField == 0 && !parts.empty() && parts[parts.size()-1].second < 0) {
|
||||
// append constant to previous constant
|
||||
parts[parts.size()-1].first += str;
|
||||
return;
|
||||
}
|
||||
parts.push_back(makeField(str, inField>0));
|
||||
}
|
||||
|
||||
bool MqttReplacer::parse(const string& templateStr, bool onlyKnown, bool noKnownDuplicates, bool emptyIfMissing) {
|
||||
m_parts.clear();
|
||||
size_t end = templateStr.length();
|
||||
bool inField = false;
|
||||
int inField = 0; // 1 after '%', 2 after '%{'
|
||||
ostringstream stack;
|
||||
for (size_t pos = 0; pos < end+1; pos++) {
|
||||
char ch = pos<end ? templateStr[pos] : '\0';
|
||||
for (auto ch : templateStr) {
|
||||
bool empty = stack.tellp()<=0;
|
||||
if (ch=='%' || ch=='\0') {
|
||||
if (inField && empty) { // %% for plain %
|
||||
inField = false;
|
||||
if (ch=='%') {
|
||||
if (inField==1 && empty) { // %% for plain %
|
||||
inField = 0;
|
||||
stack << ch;
|
||||
} else {
|
||||
if (!empty) {
|
||||
m_parts.push_back(makeField(stack.str(), inField));
|
||||
stack.str("");
|
||||
}
|
||||
inField = true;
|
||||
addPart(stack, inField, m_parts);
|
||||
inField = 1;
|
||||
}
|
||||
} else if (ch=='{' && inField==1 && empty) {
|
||||
inField = 2;
|
||||
} else if (ch=='}' && inField==2) {
|
||||
addPart(stack, 1, m_parts);
|
||||
inField = 0;
|
||||
} else {
|
||||
if (inField && !((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch == '_')) {
|
||||
if (inField>0 && !((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch == '_')) {
|
||||
// invalid field character
|
||||
if (stack.tellp()>0) {
|
||||
m_parts.push_back(makeField(stack.str(), true));
|
||||
stack.str("");
|
||||
}
|
||||
inField = false;
|
||||
addPart(stack, inField, m_parts);
|
||||
inField = 0;
|
||||
}
|
||||
stack << ch;
|
||||
}
|
||||
}
|
||||
addPart(stack, inField, m_parts);
|
||||
if (onlyKnown || noKnownDuplicates) {
|
||||
int foundMask = 0;
|
||||
int knownCount = knownFieldCount;
|
||||
|
||||
Reference in New Issue
Block a user