From d95218917e11dc01df2cb684b76b40daefef0476 Mon Sep 17 00:00:00 2001 From: Virgil Date: Thu, 2 Apr 2026 07:07:42 +0000 Subject: [PATCH] fix(i18n): guard against nil loaders --- service.go | 6 ++++++ service_test.go | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/service.go b/service.go index d2d899f..5c5e78f 100644 --- a/service.go +++ b/service.go @@ -103,6 +103,9 @@ func NewWithFS(fsys fs.FS, dir string, opts ...Option) (*Service, error) { // NewWithLoader creates a new i18n service with a custom loader. func NewWithLoader(loader Loader, opts ...Option) (*Service, error) { + if loader == nil { + return nil, log.E("NewWithLoader", "nil loader", nil) + } s := &Service{ loader: loader, messages: make(map[string]map[string]Message), @@ -836,6 +839,9 @@ func (s *Service) AddMessages(lang string, messages map[string]string) { // and grammar data into the existing service. This is the correct way to // add package-specific translations at runtime. func (s *Service) AddLoader(loader Loader) error { + if loader == nil { + return log.E("Service.AddLoader", "nil loader", nil) + } langs := loader.Languages() for _, lang := range langs { messages, grammar, err := loader.Load(lang) diff --git a/service_test.go b/service_test.go index 8b7179d..f6e393b 100644 --- a/service_test.go +++ b/service_test.go @@ -986,6 +986,17 @@ func TestServiceAddLoader_Bad(t *testing.T) { } } +func TestServiceAddLoader_Nil(t *testing.T) { + svc, err := New() + if err != nil { + t.Fatalf("New() failed: %v", err) + } + + if err := svc.AddLoader(nil); err == nil { + t.Error("AddLoader() should fail with nil loader") + } +} + func TestPackageLevelAddLoader(t *testing.T) { svc, err := New() if err != nil { @@ -1047,6 +1058,12 @@ func TestNewWithLoaderNoLanguages(t *testing.T) { } } +func TestNewWithLoaderNil(t *testing.T) { + if _, err := NewWithLoader(nil); err == nil { + t.Error("NewWithLoader(nil) should fail") + } +} + func TestServiceIsRTL(t *testing.T) { svc, err := New() if err != nil {