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  }