From 2efcf51ab3b8eeae1ab7d8addcd44eef226d77d3 Mon Sep 17 00:00:00 2001 From: Eider Oliveira Date: Fri, 8 May 2026 14:24:35 -0300 Subject: [PATCH] feat(pagebuilder): add FindContainerByName and GetRenderFunc public accessors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FindContainerByName is the non-panicking variant of ContainerByName — it returns nil when no container with the given name is registered, making it safe for public-facing routes where a stale DB row may reference a container type that has since been removed. GetRenderFunc exposes the registered render function on ContainerBuilder so callers outside the pagebuilder (e.g. a public route rendering a page's containers) can dispatch rendering without duplicating the model-name to render-function mapping. --- pagebuilder/builder.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/pagebuilder/builder.go b/pagebuilder/builder.go index f955d2d23..5db44ff2b 100644 --- a/pagebuilder/builder.go +++ b/pagebuilder/builder.go @@ -1010,6 +1010,20 @@ func (b *Builder) ContainerByName(name string) (r *ContainerBuilder) { panic(fmt.Sprintf("No container: %s", name)) } +// FindContainerByName returns the container builder for the given name, +// or nil if no container with that name is registered. Unlike +// ContainerByName it does not panic, making it safe for public-facing +// routes where a stale DB row may reference a container type that has +// since been removed. +func (b *Builder) FindContainerByName(name string) *ContainerBuilder { + for _, cb := range b.containerBuilders { + if cb.name == name { + return cb + } + } + return nil +} + type ContainerBuilder struct { builder *Builder name string @@ -1226,6 +1240,11 @@ func (b *ContainerBuilder) RenderFunc(v RenderFunc) *ContainerBuilder { return b } +// GetRenderFunc returns the registered render function for this container. +func (b *ContainerBuilder) GetRenderFunc() RenderFunc { + return b.renderFunc +} + func (b *ContainerBuilder) Cover(v string) *ContainerBuilder { b.cover = v return b