Skip to content
This repository was archived by the owner on Sep 7, 2021. It is now read-only.

Commit dd09dfe

Browse files
author
Florentin DUBOIS
authored
Merge pull request #21 from ovh/feat/string/templates
feat(template): add string template using variables
2 parents 825fdfb + de820c3 commit dd09dfe

File tree

2 files changed

+73
-0
lines changed

2 files changed

+73
-0
lines changed

spec/doc.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -645,6 +645,17 @@ addSave = add(mySelect.where(labelName).ln(),mySelect
645645
addSave.on("host").add(100)
646646
```
647647

648+
#### Use String templates with variables
649+
650+
You can define a variable and re-use it directly inside a TSL string using a template as shown in the example below:
651+
652+
```
653+
host = "my.host"
654+
655+
select("my.series")
656+
.where(["host=${host}"])
657+
```
658+
648659
#### TSL Lists
649660

650661
You can declare and use TSL lists in a variable:

tsl/genericParser.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2908,6 +2908,13 @@ func (p *Parser) ParseFields(function string, internalFields map[int][]InternalF
29082908
break
29092909
} else if tok == field.tokenType {
29102910

2911+
if tok == STRING {
2912+
var err error
2913+
lit, err = p.parseTemplateString(tok, lit, pos, function)
2914+
if err != nil {
2915+
return nil, err
2916+
}
2917+
}
29112918
field.lit = lit
29122919
findType = true
29132920

@@ -2950,6 +2957,53 @@ func (p *Parser) ParseFields(function string, internalFields map[int][]InternalF
29502957
return res, nil
29512958
}
29522959

2960+
// parseTemplateString evaluate a string lit to parse template string
2961+
func (p *Parser) parseTemplateString(tok Token, lit string, pos Pos, function string) (string, error) {
2962+
2963+
if !strings.Contains(lit, "${") && !strings.Contains(lit, "}") {
2964+
return lit, nil
2965+
}
2966+
2967+
toEvaluateArray := strings.Split(lit, "${")
2968+
2969+
resultString := lit
2970+
2971+
for index, evaluationString := range toEvaluateArray {
2972+
if index == 0 || !strings.Contains(evaluationString, "}") {
2973+
continue
2974+
}
2975+
2976+
toEvaluateArray = strings.Split(evaluationString, "}")
2977+
2978+
toEvaluate := toEvaluateArray[0]
2979+
2980+
variable, exists := p.variables[toEvaluate]
2981+
if !exists {
2982+
errMessage := fmt.Sprintf("Error when parsing template %q in %q function, %q variable isn't declared", lit, function, toEvaluate)
2983+
return "", p.NewTslError(errMessage, pos)
2984+
}
2985+
2986+
if variable.tokenType == INTERNALLIST {
2987+
2988+
stringList := "["
2989+
prefix := ""
2990+
for _, field := range variable.fieldList {
2991+
fieldLit, err := p.parseTemplateString(field.tokenType, field.lit, pos, function)
2992+
if err != nil {
2993+
return "", err
2994+
}
2995+
stringList += prefix + fieldLit
2996+
prefix = ", "
2997+
}
2998+
stringList += "]"
2999+
3000+
resultString = strings.Replace(lit, "${"+toEvaluate+"}", stringList, 1)
3001+
}
3002+
resultString = strings.Replace(resultString, "${"+toEvaluate+"}", variable.lit, 1)
3003+
}
3004+
return resultString, nil
3005+
}
3006+
29533007
// ParseInternalFieldList Parse an internal list split per COMMA
29543008
func (p *Parser) ParseInternalFieldList(function string, field InternalField) (*InternalField, error) {
29553009
field.fieldList = make([]InternalField, 0)
@@ -2965,6 +3019,14 @@ func (p *Parser) ParseInternalFieldList(function string, field InternalField) (*
29653019
break
29663020
}
29673021

3022+
if tok == STRING {
3023+
var err error
3024+
lit, err = p.parseTemplateString(tok, lit, pos, function)
3025+
if err != nil {
3026+
return nil, err
3027+
}
3028+
}
3029+
29683030
field.fieldList = append(field.fieldList, InternalField{tokenType: tok, lit: lit})
29693031

29703032
tok, pos, lit = p.ScanIgnoreWhitespace()

0 commit comments

Comments
 (0)