| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- package utils
- import (
- "github.com/itchyny/gojq"
- "github.com/porter-dev/porter/internal/templater"
- )
- // NewQuery constructs a templater.TemplateReaderQuery by parsing the jsonpath
- // query string
- func NewQuery(key, query string, defaultVal interface{}) (*templater.TemplateReaderQuery, error) {
- jquery, err := gojq.Parse(query)
- if err != nil {
- return nil, err
- }
- return &templater.TemplateReaderQuery{
- Key: key,
- QueryString: query,
- Default: defaultVal,
- Template: jquery,
- }, nil
- }
- // QueryValues iterates through a map[string]interface{} and executes a query,
- // returning a map of the query name to the returned data
- func QueryValues(
- values map[string]interface{},
- queries []*templater.TemplateReaderQuery,
- ) (map[string]interface{}, error) {
- res := make(map[string]interface{})
- // iterate through all registered queries, add to resulting map
- for _, query := range queries {
- iter := query.Template.Run(values)
- queryRes := make([]interface{}, 0)
- for {
- v, ok := iter.Next()
- if !ok {
- break
- }
- if err, ok := v.(error); ok {
- return nil, err
- }
- if v != nil {
- queryRes = append(queryRes, v)
- }
- }
- // if the length of the query result is 0, set to the default value
- if len(queryRes) == 0 {
- res[query.Key] = []interface{}{query.Default}
- } else {
- res[query.Key] = queryRes
- }
- }
- return res, nil
- }
|