diff --git a/provider/diag/diagnostics.go b/provider/diag/diagnostics.go index c302521d..76de1dbb 100644 --- a/provider/diag/diagnostics.go +++ b/provider/diag/diagnostics.go @@ -4,6 +4,7 @@ import ( "bytes" "fmt" "reflect" + "sort" "strings" "github.com/hashicorp/errwrap" @@ -12,6 +13,8 @@ import ( type Diagnostics []Diagnostic +var _ sort.Interface = (*Diagnostics)(nil) + func (diags Diagnostics) Error() string { switch { case len(diags) == 0: diff --git a/provider/diag/diagnostics_test.go b/provider/diag/diagnostics_test.go index bfb05a6c..79ca2f11 100644 --- a/provider/diag/diagnostics_test.go +++ b/provider/diag/diagnostics_test.go @@ -13,7 +13,7 @@ func TestDiagnostics_Squash(t *testing.T) { testCases := []struct { Name string Value Diagnostics - Want []FlatDiag + Want FlatDiags }{ { Name: "simple squash no details", @@ -21,7 +21,7 @@ func TestDiagnostics_Squash(t *testing.T) { NewBaseError(errors.New("error test"), RESOLVING, WithResourceName("a"), WithSummary("some summary")), NewBaseError(errors.New("error test"), RESOLVING, WithResourceName("a"), WithSummary("some summary")), }, - Want: []FlatDiag{ + Want: FlatDiags{ { Err: "error test", Resource: "a", @@ -44,7 +44,7 @@ func TestDiagnostics_Squash(t *testing.T) { NewBaseError(errors.New("error test2"), RESOLVING, WithResourceName("a"), WithSummary("some summary2"), WithDetails("some details2.")), NewBaseError(errors.New("error test2"), RESOLVING, WithResourceName("a"), WithSummary("some summary2"), WithDetails("some details2.")), }, - Want: []FlatDiag{ + Want: FlatDiags{ { Err: "error test", Resource: "a", @@ -77,7 +77,7 @@ func TestDiagnostics_Squash(t *testing.T) { NewBaseError(errors.New("error test"), RESOLVING, WithResourceName("a"), WithSummary("some summary")), NewBaseError(errors.New("error test"), RESOLVING, WithResourceName("b"), WithSummary("some summary")), }, - Want: []FlatDiag{ + Want: FlatDiags{ { Err: "error test", Resource: "a", @@ -110,7 +110,7 @@ func TestDiagnostics_Squash(t *testing.T) { NewBaseError(errors.New("error test"), RESOLVING, WithSeverity(WARNING), WithResourceName("a"), WithSummary("some summary")), NewBaseError(errors.New("error test"), RESOLVING, WithResourceName("a"), WithSummary("some summary")), }, - Want: []FlatDiag{ + Want: FlatDiags{ { Err: "error test", Resource: "a", @@ -160,7 +160,7 @@ func TestDiagnostics_SquashRedactable(t *testing.T) { } out := input.Squash() - assert.Equal(t, []FlatDiag{ + assert.Equal(t, FlatDiags{ { Err: "error test: 123", Resource: "a", @@ -188,7 +188,7 @@ func TestDiagnostics_SquashRedactable(t *testing.T) { r := rd.Redacted() assert.NotNil(t, r) - assert.Equal(t, []FlatDiag{ + assert.Equal(t, FlatDiags{ { Err: "error test: xxx", Resource: "a", diff --git a/provider/diag/flat.go b/provider/diag/flat.go index e5b5888d..cbc49c4c 100644 --- a/provider/diag/flat.go +++ b/provider/diag/flat.go @@ -1,5 +1,7 @@ package diag +import "sort" + // FlatDiag is a structured diagnostic, usually can be used to create a json of diagnostics or testing. type FlatDiag struct { Err string @@ -11,9 +13,13 @@ type FlatDiag struct { Description Description } +type FlatDiags []FlatDiag + +var _ sort.Interface = (*FlatDiags)(nil) + // FlattenDiags converts Diagnostics to an array of FlatDiag -func FlattenDiags(dd Diagnostics, skipDescription bool) []FlatDiag { - df := make([]FlatDiag, len(dd)) +func FlattenDiags(dd Diagnostics, skipDescription bool) FlatDiags { + df := make(FlatDiags, len(dd)) for i, d := range dd { description := d.Description() df[i] = FlatDiag{ @@ -32,3 +38,20 @@ func FlattenDiags(dd Diagnostics, skipDescription bool) []FlatDiag { } return df } + +func (diags FlatDiags) Len() int { return len(diags) } +func (diags FlatDiags) Swap(i, j int) { diags[i], diags[j] = diags[j], diags[i] } +func (diags FlatDiags) Less(i, j int) bool { + if diags[i].Severity > diags[j].Severity { + return true + } else if diags[i].Severity < diags[j].Severity { + return false + } + + if diags[i].Type > diags[j].Type { + return true + } else if diags[i].Type < diags[j].Type { + return false + } + return diags[i].Description.Resource < diags[j].Description.Resource +}