diff --git a/pkg/sdk/sdk.go b/pkg/sdk/sdk.go index 433ae8e..ddcc95d 100644 --- a/pkg/sdk/sdk.go +++ b/pkg/sdk/sdk.go @@ -86,7 +86,7 @@ func New(projectDir string, config *Config) *SDK { // s.SetVersion("v1.2.3") func (s *SDK) SetVersion(version string) { s.version = version - if s.config != nil { + if s.config != nil && !containsVersionTemplate(s.config.Package.Version) { s.config.Package.Version = version } } @@ -148,7 +148,7 @@ func (s *SDK) GenerateLanguage(ctx context.Context, lang string) error { SpecPath: specPath, OutputDir: outputDir, PackageName: s.config.Package.Name, - Version: s.config.Package.Version, + Version: s.resolvePackageVersion(), } core.Print(nil, "Generating %s SDK...", lang) @@ -159,3 +159,36 @@ func (s *SDK) GenerateLanguage(ctx context.Context, lang string) error { return nil } + +// resolvePackageVersion renders the configured package version against the +// current SDK version when a template placeholder is present. +// +// resolved := s.resolvePackageVersion() // "v1.2.3" or "1.2.3-beta" +func (s *SDK) resolvePackageVersion() string { + if s == nil || s.config == nil { + return "" + } + + packageVersion := s.config.Package.Version + if packageVersion == "" { + return s.version + } + + if !containsVersionTemplate(packageVersion) { + return packageVersion + } + + if s.version == "" { + return packageVersion + } + + resolved := core.Replace(packageVersion, "{{.Version}}", s.version) + resolved = core.Replace(resolved, "{{Version}}", s.version) + return resolved +} + +// containsVersionTemplate reports whether a package version uses a version +// placeholder that should be rendered at generation time. +func containsVersionTemplate(value string) bool { + return core.Contains(value, "{{.Version}}") || core.Contains(value, "{{Version}}") +} diff --git a/pkg/sdk/sdk_test.go b/pkg/sdk/sdk_test.go index c3d9d20..5c28140 100644 --- a/pkg/sdk/sdk_test.go +++ b/pkg/sdk/sdk_test.go @@ -31,6 +31,20 @@ func TestSDK_VersionPassedToGenerator_Good(t *testing.T) { assert.Equal(t, "v2.0.0", s.config.Package.Version) } +func TestSDK_VersionTemplateIsRendered_Good(t *testing.T) { + config := &Config{ + Package: PackageConfig{ + Name: "test-sdk", + Version: "{{.Version}}-beta", + }, + } + s := New("/tmp", config) + s.SetVersion("v2.0.0") + + assert.Equal(t, "{{.Version}}-beta", s.config.Package.Version) + assert.Equal(t, "v2.0.0-beta", s.resolvePackageVersion()) +} + func TestSDK_DefaultConfig_Good(t *testing.T) { cfg := DefaultConfig() assert.Contains(t, cfg.Languages, "typescript")