package apigen import ( "fmt" "os" "path/filepath" "strings" "golang.org/x/mod/modfile" "golang.org/x/mod/semver" ) // Translation metadata was introduced in this release. Consumers of older // runtimes must upgrade or use an explicitly supported local replacement. const i18nMinimumVersion = "v0.26.0-preview" func checkI18nRuntime(spec *Spec, moduleData []byte, directory string) error { needed := false for _, e := range spec.Errors { needed = needed || e.Translation != nil } if !needed { return nil } mf, err := modfile.Parse("go.mod", moduleData, nil) if err != nil { return err } version := "" for _, r := range mf.Require { if r.Mod.Path == frameworkModule { version = r.Mod.Version } } for _, r := range mf.Replace { if r.Old.Path != frameworkModule || r.Old.Version != "" && r.Old.Version != version { continue } if r.New.Version != "" { version = r.New.Version continue } root := r.New.Path if !filepath.IsAbs(root) { root = filepath.Join(directory, root) } data, e := os.ReadFile(filepath.Join(root, "errors", "localization.go")) if e == nil && strings.Contains(string(data), "type Translation struct") { return nil } return fmt.Errorf("translation metadata requires a local framework with errors.Translation support") } if semver.Compare(version, i18nMinimumVersion) < 0 { return fmt.Errorf("translation metadata requires %s or newer; use --framework-dir for unpublished source", i18nMinimumVersion) } return nil }