github.com/kamilsk/grafaman@v1.0.0-beta3.0.20201207211242-3e0d02dd84ce/internal/provider/grafana/dto.go (about) 1 package grafana 2 3 import "github.com/kamilsk/grafaman/internal/model" 4 5 type dashboard struct { 6 Panels []panel `json:"panels,omitempty"` 7 Templating templating `json:"templating,omitempty"` 8 } 9 10 type panel struct { 11 ID int `json:"id,omitempty"` 12 Title string `json:"title,omitempty"` 13 Type string `json:"type,omitempty"` 14 Panels []panel `json:"panels,omitempty"` 15 Targets []target `json:"targets,omitempty"` 16 } 17 18 type templating struct { 19 List []variable `json:"list,omitempty"` 20 } 21 22 type target struct { 23 Query string `json:"target,omitempty"` 24 } 25 26 type variable struct { 27 Name string `json:"name,omitempty"` 28 Options []option `json:"options,omitempty"` 29 Current currentOption `json:"current,omitempty"` 30 } 31 32 type option struct { 33 Text string `json:"text,omitempty"` 34 Value string `json:"value,omitempty"` 35 } 36 37 type currentOption struct { 38 Text string `json:"text,omitempty"` 39 Value interface{} `json:"value,omitempty"` // string or []string 40 } 41 42 func convertTargets(in []target) []model.Query { 43 out := make([]model.Query, 0, len(in)) 44 45 for _, target := range in { 46 if target.Query != "" { 47 out = append(out, model.Query(target.Query)) 48 } 49 } 50 51 return out 52 } 53 54 func fetchTargets(panels []panel) []target { 55 targets := make([]target, 0, 4*len(panels)) 56 57 for _, panel := range panels { 58 if count := len(panel.Targets); count > 0 { 59 targets = append(targets, panel.Targets...) 60 continue 61 } 62 targets = append(targets, fetchTargets(panel.Panels)...) 63 } 64 65 return targets 66 } 67 68 func convertVariables(in []variable) []model.Variable { 69 out := make([]model.Variable, 0, len(in)) 70 71 for _, v := range in { 72 variable := model.Variable{Name: v.Name, Options: make([]model.Option, 0, len(v.Options))} 73 for _, opt := range v.Options { 74 variable.Options = append(variable.Options, model.Option{Name: opt.Text, Value: opt.Value}) 75 } 76 out = append(out, variable) 77 } 78 79 return out 80 } 81 82 func fetchVariables(dashboard dashboard) []variable { 83 variables := make([]variable, 0, 4*len(dashboard.Templating.List)) 84 85 for _, variable := range dashboard.Templating.List { 86 // handle current option 87 switch v := variable.Current.Value.(type) { 88 case []interface{}: 89 for _, opt := range v { 90 value, _ := opt.(string) 91 variable.Options = append(variable.Options, option{Text: variable.Current.Text, Value: value}) 92 } 93 case string: 94 variable.Options = append(variable.Options, option{Text: variable.Current.Text, Value: v}) 95 } 96 97 // filter duplicate options 98 filtered := variable.Options[:0] 99 registry := map[string]struct{}{} 100 for _, option := range variable.Options { 101 if _, present := registry[option.Value]; present { 102 continue 103 } 104 registry[option.Value] = struct{}{} 105 filtered = append(filtered, option) 106 } 107 variable.Options = filtered 108 variables = append(variables, variable) 109 } 110 111 return variables 112 }