@@ -16,15 +16,18 @@ limitations under the License.
1616package initializer
1717
1818import (
19+ "fmt"
20+ "reflect"
21+
1922 "golang.org/x/tools/go/analysis"
2023 "k8s.io/apimachinery/pkg/util/validation/field"
2124)
2225
2326// InitializerFunc is a function that initializes an Analyzer.
24- type InitializerFunc func (any ) (* analysis.Analyzer , error )
27+ type InitializerFunc [ T any ] func (T ) (* analysis.Analyzer , error )
2528
2629// ValidateFunc is a function that validates the configuration for an Analyzer.
27- type ValidateFunc func (any , * field.Path ) field.ErrorList
30+ type ValidateFunc [ T any ] func (T , * field.Path ) field.ErrorList
2831
2932// AnalyzerInitializer is used to initialize analyzers.
3033type AnalyzerInitializer interface {
@@ -54,67 +57,77 @@ type ConfigurableAnalyzerInitializer interface {
5457}
5558
5659// NewInitializer construct a new initializer for initializing an Analyzer.
57- func NewInitializer (name string , initFunc InitializerFunc , isDefault bool ) AnalyzerInitializer {
58- return initializer {
60+ func NewInitializer (name string , analyzer * analysis. Analyzer , isDefault bool ) AnalyzerInitializer {
61+ return initializer [ any ] {
5962 name : name ,
60- initFunc : initFunc ,
63+ initFunc : func ( any ) ( * analysis. Analyzer , error ) { return analyzer , nil } ,
6164 isDefault : isDefault ,
6265 }
6366}
6467
6568// NewConfigurableInitializer constructs a new initializer for intializing a
6669// configurable Analyzer.
67- func NewConfigurableInitializer (name string , initFunc InitializerFunc , isDefault bool , configType func () any , validateFunc ValidateFunc ) ConfigurableAnalyzerInitializer {
68- return configurableInitializer {
69- initializer : initializer {
70+ func NewConfigurableInitializer [ T any ] (name string , initFunc InitializerFunc [ T ] , isDefault bool , validateFunc ValidateFunc [ T ] ) ConfigurableAnalyzerInitializer {
71+ return configurableInitializer [ T ] {
72+ initializer : initializer [ T ] {
7073 name : name ,
7174 initFunc : initFunc ,
7275 isDefault : isDefault ,
7376 },
74- configTypeFunc : configType ,
75- validateFunc : validateFunc ,
77+ validateFunc : validateFunc ,
7678 }
7779}
7880
79- type initializer struct {
81+ type initializer [ T any ] struct {
8082 name string
81- initFunc InitializerFunc
83+ initFunc InitializerFunc [ T ]
8284 isDefault bool
8385}
8486
8587// Name returns the name of the initializer.
86- func (i initializer ) Name () string {
88+ func (i initializer [ T ] ) Name () string {
8789 return i .name
8890}
8991
9092// Init returns a newly initializr analyzer.
91- func (i initializer ) Init (_ any ) (* analysis.Analyzer , error ) {
92- return i .initFunc (nil )
93+ func (i initializer [T ]) Init (_ any ) (* analysis.Analyzer , error ) {
94+ var cfg T
95+
96+ return i .initFunc (cfg )
9397}
9498
9599// Default determines whether this initializer should be enabled by default or not.
96- func (i initializer ) Default () bool {
100+ func (i initializer [ T ] ) Default () bool {
97101 return i .isDefault
98102}
99103
100- type configurableInitializer struct {
101- initializer
104+ type configurableInitializer [ T any ] struct {
105+ initializer [ T ]
102106
103- configTypeFunc func () any
104- validateFunc ValidateFunc
107+ validateFunc ValidateFunc [T ]
105108}
106109
107110// Init returns a newly initialized analyzer.
108- func (i configurableInitializer ) Init (cfg any ) (* analysis.Analyzer , error ) {
109- return i .initFunc (cfg )
111+ func (i configurableInitializer [T ]) Init (cfg any ) (* analysis.Analyzer , error ) {
112+ cfgT , ok := cfg .(T )
113+ if ! ok {
114+ return nil , fmt .Errorf ("failed to initialize analyzer: %w" , NewIncorrectTypeError (cfg ))
115+ }
116+
117+ return i .initFunc (cfgT )
110118}
111119
112120// ConfigType returns the type of the config for the linter.
113- func (i configurableInitializer ) ConfigType () any {
114- return i . configTypeFunc ()
121+ func (i configurableInitializer [ T ] ) ConfigType () any {
122+ return reflect . New ( reflect . TypeOf ( * new ( T )). Elem ()). Interface ()
115123}
116124
117125// ValidateConfig validates the configuration for the initializer.
118- func (i configurableInitializer ) ValidateConfig (cfg any , fld * field.Path ) field.ErrorList {
119- return i .validateFunc (cfg , fld )
126+ func (i configurableInitializer [T ]) ValidateConfig (cfg any , fld * field.Path ) field.ErrorList {
127+ cfgT , ok := cfg .(T )
128+ if ! ok {
129+ return field.ErrorList {field .InternalError (fld , NewIncorrectTypeError (cfg ))}
130+ }
131+
132+ return i .validateFunc (cfgT , fld )
120133}
0 commit comments