58 lines
1.5 KiB
Go
58 lines
1.5 KiB
Go
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
|
|
}
|