diff --git a/analyzer.go b/analyzer.go index c53f6ac..73adece 100644 --- a/analyzer.go +++ b/analyzer.go @@ -43,6 +43,7 @@ type AnalyzerService interface { Run(context.Context, string, Observable, time.Duration) (*Report, error) StartJob(context.Context, string, Observable) (*Job, *http.Response, error) NewMultiRun(context.Context, time.Duration) *MultiRun + DataTypes(context.Context) ([]string, error) } // AnalyzerServiceOp handles analyzer methods from Cortex API @@ -193,3 +194,32 @@ func (a *AnalyzerServiceOp) StartJob(ctx context.Context, anid string, o Observa return &j, resp, nil } + +// DataTypes returns all available data types that Cortex can analyse. +// The entries are not sorted. +func (a *AnalyzerServiceOp) DataTypes(ctx context.Context) ([]string, error) { + ans, _, err := a.List(ctx) + if err != nil { + return nil, err + } + + dtm := make(map[string]bool) + for _, a := range ans { + addDataTypes(dtm, a.DataTypeList) + } + + var dts []string + for k := range dtm { + dts = append(dts, k) + } + + return dts, nil +} + +func addDataTypes(m map[string]bool, dts []string) { + for _, dt := range dts { + if _, ok := m[dt]; !ok { + m[dt] = true + } + } +} diff --git a/analyzer_test.go b/analyzer_test.go index 8f584ed..1de62a4 100644 --- a/analyzer_test.go +++ b/analyzer_test.go @@ -43,6 +43,24 @@ func TestListByTypeAnalyzers(t *testing.T) { } } +func TestDataTypes(t *testing.T) { + client, mux, _, closer := setup() + defer closer() + + mux.HandleFunc("/"+analyzersURL, func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + w.Write(analyzersJSON) + }) + + got, err := client.Analyzers.DataTypes(context.Background()) + if err != nil { + t.Errorf("Analyzer.DataTypes returned error: %v", err) + } + if want := dataTypes; !reflect.DeepEqual(want, got) { + t.Errorf("Analyzer.DataTypes = %+v, want %+v", got, want) + } +} + var analyzerType = "ip" var analyzersJSON = []byte(` @@ -109,3 +127,5 @@ var wantList = []Analyzer{ Version: "3.0", }, } + +var dataTypes = []string{"ip"}