in processor/processor.go [55:128]
func Process(config *config.Config) ([]types.GroupVersionDetails, error) {
compiledConfig, err := compileConfig(config)
if err != nil {
return nil, err
}
p, err := newProcessor(compiledConfig, config.Flags.MaxDepth)
if err != nil {
return nil, err
}
// locate the packages annotated with group names
if err := p.findAPITypes(config.SourcePath); err != nil {
return nil, fmt.Errorf("failed to find API types in directory %s:%w", config.SourcePath, err)
}
p.types.InlineTypes(p.propagateReference)
p.types.PropagateMarkers()
p.parseMarkers()
// collect references between types
for typeName, refs := range p.references {
typeDef, ok := p.types[typeName]
if !ok {
return nil, fmt.Errorf("type not loaded: %s", typeName)
}
for ref, _ := range refs {
if rd, ok := p.types[ref]; ok {
typeDef.References = append(typeDef.References, rd)
}
}
}
// build the return array
var gvDetails []types.GroupVersionDetails
for _, gvi := range p.groupVersions {
details := types.GroupVersionDetails{GroupVersion: gvi.GroupVersion, Doc: gvi.doc}
for k, _ := range gvi.kinds {
details.Kinds = append(details.Kinds, k)
}
details.Types = make(types.TypeMap)
for name, t := range gvi.types {
key := types.Identifier(t)
if p.shouldIgnoreType(key) {
zap.S().Debugw("Skipping excluded type", "type", name)
continue
}
if typeDef, ok := p.types[key]; ok && typeDef != nil {
details.Types[name] = typeDef
} else {
zap.S().Fatalw("Type not loaded", "type", key)
}
}
details.Markers = gvi.markers
gvDetails = append(gvDetails, details)
}
// sort the array by GV
sort.SliceStable(gvDetails, func(i, j int) bool {
if gvDetails[i].Group < gvDetails[j].Group {
return true
}
if gvDetails[i].Group == gvDetails[j].Group {
return gvDetails[i].Version < gvDetails[j].Version
}
return false
})
return gvDetails, nil
}