github.com/go-graphite/carbonapi@v0.17.0/expr/functions/toLowerCase/function.go (about) 1 package toLowerCase 2 3 import ( 4 "context" 5 "strings" 6 7 "github.com/go-graphite/carbonapi/expr/helper" 8 "github.com/go-graphite/carbonapi/expr/interfaces" 9 "github.com/go-graphite/carbonapi/expr/types" 10 "github.com/go-graphite/carbonapi/pkg/parser" 11 ) 12 13 type toLowerCase struct{} 14 15 func GetOrder() interfaces.Order { 16 return interfaces.Any 17 } 18 19 func New(configFile string) []interfaces.FunctionMetadata { 20 res := make([]interfaces.FunctionMetadata, 0) 21 f := &toLowerCase{} 22 functions := []string{"lower", "toLowerCase"} 23 for _, n := range functions { 24 res = append(res, interfaces.FunctionMetadata{Name: n, F: f}) 25 } 26 return res 27 } 28 29 // toLowerCase(seriesList, *pos) 30 func (f *toLowerCase) Do(ctx context.Context, eval interfaces.Evaluator, e parser.Expr, from, until int64, values map[parser.MetricRequest][]*types.MetricData) ([]*types.MetricData, error) { 31 args, err := helper.GetSeriesArg(ctx, eval, e.Arg(0), from, until, values) 32 if err != nil { 33 return nil, err 34 } 35 36 pos, err := e.GetIntArgs(1) 37 if err != nil { 38 return nil, err 39 } 40 41 results := make([]*types.MetricData, 0, len(args)+1) 42 43 for _, a := range args { 44 r := a.CopyLink() 45 46 if len(pos) == 0 { 47 r.Name = strings.ToLower(a.Name) 48 } else { 49 for _, i := range pos { 50 if i < 0 { // Handle negative indices by indexing backwards 51 i = len(r.Name) + i 52 } 53 lowered := strings.ToLower(string(r.Name[i])) 54 r.Name = r.Name[:i] + lowered + r.Name[i+1:] 55 } 56 } 57 r.Tags["name"] = r.Name 58 59 results = append(results, r) 60 } 61 62 return results, nil 63 } 64 65 // Description is auto-generated description, based on output of https://github.com/graphite-project/graphite-web 66 func (f *toLowerCase) Description() map[string]types.FunctionDescription { 67 return map[string]types.FunctionDescription{ 68 "lower": { 69 Description: "Takes one metric or a wildcard seriesList and lowers the case of each letter. \n Optionally, a letter position to lower case can be specified, in which case only the letter at the specified position gets lower-cased.\n The position parameter may be given multiple times. The position parameter may be negative to define a position relative to the end of the metric name.", 70 Function: "lower(seriesList, *pos)", 71 Group: "Alias", 72 Module: "graphite.render.functions", 73 Name: "lower", 74 Params: []types.FunctionParam{ 75 { 76 Name: "seriesList", 77 Required: true, 78 Type: types.SeriesList, 79 }, 80 { 81 Multiple: true, 82 Name: "pos", 83 Type: types.Node, 84 Required: false, 85 }, 86 }, 87 NameChange: true, // name changed 88 ValuesChange: true, // values changed 89 }, 90 "toLowerCase": { 91 Description: "Takes one metric or a wildcard seriesList and lowers the case of each letter. \n Optionally, a letter position to lower case can be specified, in which case only the letter at the specified position gets lower-cased.\n The position parameter may be given multiple times. The position parameter may be negative to define a position relative to the end of the metric name.", 92 Function: "toLowerCase(seriesList, *pos)", 93 Group: "Alias", 94 Module: "graphite.render.functions", 95 Name: "toLowerCase", 96 Params: []types.FunctionParam{ 97 { 98 Name: "seriesList", 99 Required: true, 100 Type: types.SeriesList, 101 }, 102 { 103 Multiple: true, 104 Name: "pos", 105 Type: types.Node, 106 Required: false, 107 }, 108 }, 109 NameChange: true, // name changed 110 ValuesChange: true, // values changed 111 }, 112 } 113 }