diff --git a/config/config.go b/config/config.go index 1ce90dd..2bb64ce 100644 --- a/config/config.go +++ b/config/config.go @@ -55,8 +55,9 @@ type ProcessorConfig struct { } type Marker struct { - Name string - Target TargetType + Name string + Target TargetType + HasValue bool `json:"hasValue"` } type TargetType string diff --git a/processor/processor.go b/processor/processor.go index 0b5d1f6..b1bcc9e 100644 --- a/processor/processor.go +++ b/processor/processor.go @@ -338,6 +338,26 @@ func (p *processor) processType(pkg *loader.Package, parentType *types.Type, t g typeDef.UnderlyingType = p.processType(pkg, typeDef, underlying, depth+1) p.addReference(typeDef, typeDef.UnderlyingType) + case *gotypes.Alias: + if typeDef.Package != pkg.PkgPath { + imports := pkg.Imports() + importPkg, ok := imports[typeDef.Package] + if !ok { + zap.S().Warnw("Imported type cannot be found", "name", typeDef.Name, "package", typeDef.Package) + return typeDef + } + p.parser.NeedPackage(importPkg) + pkg = importPkg + } + + typeDef.Kind = types.AliasKind + underlying := gotypes.Unalias(t) + if underlying.String() == "string" { + typeDef.EnumValues = lookupConstantValuesForAliasedType(pkg, typeDef.Name) + } + typeDef.UnderlyingType = p.processType(pkg, typeDef, underlying, depth+1) + p.addReference(typeDef, typeDef.UnderlyingType) + case *gotypes.Struct: if parentType != nil { // Rather than the parent being a Named type with a "raw" Struct as @@ -536,9 +556,19 @@ func mkRegistry(customMarkers []config.Marker) (*markers.Registry, error) { continue } - if err := registry.Define(marker.Name, t, struct{}{}); err != nil { + var d *markers.Definition + var err error + if marker.HasValue { + d, err = markers.MakeAnyTypeDefinition(marker.Name, t, crdmarkers.Default{}) + } else { + d, err = markers.MakeDefinition(marker.Name, t, struct{}{}) + } + if err != nil { return nil, fmt.Errorf("failed to define custom marker %s: %w", marker.Name, err) } + if err := registry.Register(d); err != nil { + return nil, fmt.Errorf("failed to register custom marker %s: %w", marker.Name, err) + } } return registry, nil @@ -556,7 +586,6 @@ func parseMarkers(markers markers.MarkerValues) (string, []string) { for _, name := range markerNames { value := markers[name][len(markers[name])-1] - if strings.HasPrefix(name, "kubebuilder:validation:") { name := strings.TrimPrefix(name, "kubebuilder:validation:")