fix(html): remove mutable context setters
Some checks are pending
Security Scan / security (push) Waiting to run
Test / test (push) Waiting to run

Co-Authored-By: Virgil <virgil@lethean.io>
This commit is contained in:
Virgil 2026-04-03 18:40:46 +00:00
parent a388848626
commit 2b796e57eb
3 changed files with 13 additions and 59 deletions

View file

@ -21,11 +21,11 @@ func renderToString(_ js.Value, args []js.Value) any {
}
variant := args[0].String()
ctx := html.NewContext()
locale := ""
if len(args) >= 2 && args[1].Type() == js.TypeString {
ctx.SetLocale(args[1].String())
locale = args[1].String()
}
ctx := html.NewContext(locale)
layout := html.NewLayout(variant)

View file

@ -8,6 +8,7 @@ type Translator interface {
// context.go: Context carries rendering state through the node tree.
// Example: NewContext("en-GB") initialises locale-specific rendering state.
// Locale and translator selection happen at construction time.
type Context struct {
Identity string
Locale string
@ -61,7 +62,7 @@ func NewContext(locale ...string) *Context {
Data: make(map[string]any),
}
if len(locale) > 0 {
ctx.SetLocale(locale[0])
ctx.Locale = locale[0]
}
return ctx
}
@ -71,32 +72,7 @@ func NewContext(locale ...string) *Context {
// An optional locale may be provided as the second argument.
func NewContextWithService(svc Translator, locale ...string) *Context {
ctx := NewContext(locale...)
ctx.SetService(svc)
return ctx
}
// context.go: SetService swaps the translator used by the context.
// Example: ctx.SetService(svc).
func (ctx *Context) SetService(svc Translator) *Context {
if ctx == nil {
return nil
}
ensureContextDefaults(ctx)
ctx.service = svc
applyLocaleToService(svc, ctx.Locale)
return ctx
}
// context.go: SetLocale updates the context locale and reapplies it to the active translator.
// Example: ctx.SetLocale("en-US").
func (ctx *Context) SetLocale(locale string) *Context {
if ctx == nil {
return nil
}
ensureContextDefaults(ctx)
ctx.Locale = locale
applyLocaleToService(ctx.service, ctx.Locale)
return ctx
}

View file

@ -23,50 +23,28 @@ func (t *localeTranslator) SetLanguage(language string) error {
return nil
}
func TestContext_SetService_AppliesLocale(t *testing.T) {
func TestContext_NewContextWithService_AppliesLocale(t *testing.T) {
svc := &localeTranslator{}
ctx := NewContext("fr-FR")
if got := ctx.SetService(svc); got != ctx {
t.Fatal("SetService should return the same context for chaining")
}
ctx := NewContextWithService(svc, "fr-FR")
if svc.language != "fr" {
t.Fatalf("SetService should apply locale to translator, got %q", svc.language)
t.Fatalf("NewContextWithService should apply locale to translator, got %q", svc.language)
}
if got := Text("prompt.yes").Render(ctx); got != "o" {
t.Fatalf("SetService locale translation = %q, want %q", got, "o")
t.Fatalf("NewContextWithService locale translation = %q, want %q", got, "o")
}
}
func TestContext_SetLocale_AppliesLocale(t *testing.T) {
func TestContext_NewContextWithService_UsesLocale(t *testing.T) {
svc := &localeTranslator{}
ctx := NewContextWithService(svc)
if got := ctx.SetLocale("en-GB"); got != ctx {
t.Fatal("SetLocale should return the same context for chaining")
}
ctx := NewContextWithService(svc, "en-GB")
if svc.language != "en" {
t.Fatalf("SetLocale should apply locale to translator, got %q", svc.language)
t.Fatalf("NewContextWithService should apply locale to translator, got %q", svc.language)
}
if got := Text("prompt.yes").Render(ctx); got != "y" {
t.Fatalf("SetLocale translation = %q, want %q", got, "y")
}
}
func TestContext_SetService_NilContext(t *testing.T) {
var ctx *Context
if got := ctx.SetService(nil); got != nil {
t.Fatal("SetService on nil context should return nil")
}
}
func TestContext_SetLocale_NilContext(t *testing.T) {
var ctx *Context
if got := ctx.SetLocale("en-GB"); got != nil {
t.Fatal("SetLocale on nil context should return nil")
t.Fatalf("NewContextWithService translation = %q, want %q", got, "y")
}
}