@@ -81,6 +81,10 @@ func run(ymlPath string) error {
8181
8282 ymlDir := filepath .Dir (ymlPath )
8383 packageName := filepath .Base (ymlDir )
84+ importRootPath , err := helpers .RootPackage (ymlDir )
85+ if err != nil {
86+ return fmt .Errorf ("unable to determine import root path: %w" , err )
87+ }
8488
8589 raw , readErr := os .ReadFile (filepath .Clean (ymlPath ))
8690 if readErr != nil {
@@ -104,7 +108,7 @@ func run(ymlPath string) error {
104108 if ! slices .Contains (nonComponents , md .Status .Class ) {
105109 toGenerate [filepath .Join (tmplDir , "status.go.tmpl" )] = filepath .Join (codeDir , "generated_status.go" )
106110 err = generateFile (filepath .Join (tmplDir , "component_test.go.tmpl" ),
107- filepath .Join (ymlDir , "generated_component_test.go" ), md , packageName )
111+ filepath .Join (ymlDir , "generated_component_test.go" ), md , packageName , importRootPath )
108112 if err != nil {
109113 return err
110114 }
@@ -124,7 +128,7 @@ func run(ymlPath string) error {
124128 }
125129
126130 err = generateFile (filepath .Join (tmplDir , "package_test.go.tmpl" ),
127- filepath .Join (ymlDir , "generated_package_test.go" ), md , packageName )
131+ filepath .Join (ymlDir , "generated_package_test.go" ), md , packageName , importRootPath )
128132 if err != nil {
129133 return err
130134 }
@@ -133,7 +137,7 @@ func run(ymlPath string) error {
133137 err = inlineReplace (
134138 filepath .Join (tmplDir , "readme.md.tmpl" ),
135139 filepath .Join (ymlDir , "README.md" ),
136- md , statusStart , statusEnd , md .GeneratedPackageName )
140+ md , statusStart , statusEnd , md .GeneratedPackageName , importRootPath )
137141 if err != nil {
138142 return err
139143 }
@@ -225,19 +229,19 @@ func run(ymlPath string) error {
225229 }
226230
227231 for tmpl , dst := range toGenerate {
228- if err := generateFile (tmpl , dst , md , md .GeneratedPackageName ); err != nil {
232+ if err := generateFile (tmpl , dst , md , md .GeneratedPackageName , importRootPath ); err != nil {
229233 return err
230234 }
231235 }
232236
233- if err := generateConfigFiles (md , ymlDir ); err != nil {
237+ if err := generateConfigFiles (md , ymlDir , importRootPath ); err != nil {
234238 return fmt .Errorf ("failed to generate config files: %w" , err )
235239 }
236240
237241 return nil
238242}
239243
240- func getTemplateFuncMap (md Metadata ) template.FuncMap {
244+ func getTemplateFuncMap (md Metadata , importRootPath string ) template.FuncMap {
241245 return template.FuncMap {
242246 "publicVar" : func (s string ) (string , error ) {
243247 return helpers .FormatIdentifier (s , true )
@@ -344,6 +348,9 @@ func getTemplateFuncMap(md Metadata) template.FuncMap {
344348 "toLowerCamelCase" : func (s string ) string {
345349 return joinCamelCase (strings .Split (s , "_" ), false )
346350 },
351+ "schemaRef" : func (ref string ) string {
352+ return cfggen .LocalizeRef (ref , importRootPath )
353+ },
347354 "inc" : func (i int ) int { return i + 1 },
348355 "distroURL" : distroURL ,
349356 "isExporter" : func () bool {
@@ -406,21 +413,21 @@ func templatize(tmplFile string, funcMap template.FuncMap) *template.Template {
406413 ParseFS (TemplateFS , "templates/helper.tmpl" , strings .ReplaceAll (tmplFile , "\\ " , "/" )))
407414}
408415
409- func executeTemplate (tmplFile string , md Metadata , goPackage string , fns template.FuncMap ) ([]byte , error ) {
416+ func executeTemplate (tmplFile string , md Metadata , goPackage , importRootPath string , fns template.FuncMap ) ([]byte , error ) {
410417 tmpl := templatize (tmplFile , fns )
411418 buf := bytes.Buffer {}
412419
413- if err := tmpl .Execute (& buf , TemplateContext {Metadata : md , Package : goPackage }); err != nil {
420+ if err := tmpl .Execute (& buf , TemplateContext {Metadata : md , Package : goPackage , ImportRootPath : importRootPath }); err != nil {
414421 return []byte {}, fmt .Errorf ("failed executing template: %w" , err )
415422 }
416423 return buf .Bytes (), nil
417424}
418425
419- func generateFile (tmplFile , outputFile string , md Metadata , goPackage string ) error {
420- return generateFileWithFns (tmplFile , outputFile , md , goPackage , getTemplateFuncMap (md ))
426+ func generateFile (tmplFile , outputFile string , md Metadata , goPackage , importRootPath string ) error {
427+ return generateFileWithFns (tmplFile , outputFile , md , goPackage , importRootPath , getTemplateFuncMap (md , importRootPath ))
421428}
422429
423- func inlineReplace (tmplFile , outputFile string , md Metadata , start , end , goPackage string ) error {
430+ func inlineReplace (tmplFile , outputFile string , md Metadata , start , end , goPackage , importRootPath string ) error {
424431 var readmeContents []byte
425432 var err error
426433 if readmeContents , err = os .ReadFile (filepath .Clean (outputFile )); err != nil {
@@ -436,7 +443,7 @@ func inlineReplace(tmplFile, outputFile string, md Metadata, start, end, goPacka
436443 md .GithubProject = "open-telemetry/opentelemetry-collector-contrib"
437444 }
438445
439- buf , err := executeTemplate (tmplFile , md , goPackage , getTemplateFuncMap (md ))
446+ buf , err := executeTemplate (tmplFile , md , goPackage , importRootPath , getTemplateFuncMap (md , importRootPath ))
440447 if err != nil {
441448 return err
442449 }
@@ -449,12 +456,12 @@ func inlineReplace(tmplFile, outputFile string, md Metadata, start, end, goPacka
449456 return nil
450457}
451458
452- func generateFileWithFns (tmplFile , outputFile string , md Metadata , goPackage string , fns template.FuncMap ) error {
459+ func generateFileWithFns (tmplFile , outputFile string , md Metadata , goPackage , importRootPath string , fns template.FuncMap ) error {
453460 if err := os .Remove (outputFile ); err != nil && ! errors .Is (err , fs .ErrNotExist ) {
454461 return fmt .Errorf ("unable to remove generated file %q: %w" , outputFile , err )
455462 }
456463
457- result , err := executeTemplate (tmplFile , md , goPackage , fns )
464+ result , err := executeTemplate (tmplFile , md , goPackage , importRootPath , fns )
458465 if err != nil {
459466 return err
460467 }
@@ -534,9 +541,9 @@ func validateYAMLKeyOrder(raw []byte) error {
534541 return nil
535542}
536543
537- func generateConfigFiles (md Metadata , mdDir string ) error {
544+ func generateConfigFiles (md Metadata , mdDir , importRootPath string ) error {
538545 if md .Config != nil {
539- resolver := cfggen .NewResolver (md .PackageName , md .Status .Class , md .Type , mdDir )
546+ resolver := cfggen .NewResolver (md .PackageName , md .Status .Class , md .Type , mdDir , importRootPath )
540547 resolvedSchema , err := resolver .ResolveSchema (md .Config )
541548 if err != nil {
542549 return fmt .Errorf ("failed to resolve config schema: %w" , err )
@@ -564,8 +571,8 @@ func generateConfigGoStruct(md Metadata, outputDir string) error {
564571 tmplFile := filepath .Join ("templates" , "config_from_cfggen.go.tmpl" )
565572 dstFile := filepath .Join (outputDir , "generated_config.go" )
566573
567- fns := cfggen .WithCfgFns (getTemplateFuncMap (md ), rootPkg , md .PackageName )
568- return generateFileWithFns (tmplFile , dstFile , md , packageName , fns )
574+ fns := cfggen .WithCfgFns (getTemplateFuncMap (md , rootPkg ), rootPkg , md .PackageName )
575+ return generateFileWithFns (tmplFile , dstFile , md , packageName , rootPkg , fns )
569576}
570577
571578func joinCamelCase (parts []string , exported bool ) string {
0 commit comments