mirror of
https://github.com/jimeh/go-render.git
synced 2026-02-19 11:26:39 +00:00
refactor: yet another one, someday I might be happy
This commit is contained in:
43
renderer.go
43
renderer.go
@@ -13,15 +13,32 @@ var ErrUnsupportedFormat = fmt.Errorf("%w: unsupported format", Err)
|
||||
// Renderer is a renderer that delegates rendering to another renderer
|
||||
// based on a format value.
|
||||
type Renderer struct {
|
||||
// Formats is a map of format names to renderers. When Render is called,
|
||||
// Renderers is a map of format names to renderers. When Render is called,
|
||||
// the format is used to look up the renderer to use.
|
||||
Formats map[string]FormatRenderer
|
||||
Renderers map[string]FormatRenderer
|
||||
}
|
||||
|
||||
// NewFormatRenderer returns a new FormatRenderer that delegates rendering to
|
||||
// the specified renderers.
|
||||
func NewFormatRenderer(formats map[string]FormatRenderer) *Renderer {
|
||||
return &Renderer{Formats: formats}
|
||||
// New returns a new Renderer that delegates rendering to the specified
|
||||
// renderers.
|
||||
//
|
||||
// Any renderers which implement the Formats interface, will also be set as the
|
||||
// renderer for all format strings returned by Format() on the renderer.
|
||||
func New(renderers map[string]FormatRenderer) *Renderer {
|
||||
newRenderers := make(map[string]FormatRenderer, len(renderers))
|
||||
|
||||
for format, r := range renderers {
|
||||
newRenderers[format] = r
|
||||
|
||||
if x, ok := r.(Formats); ok {
|
||||
for _, f := range x.Formats() {
|
||||
if f != format {
|
||||
newRenderers[f] = r
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return &Renderer{Renderers: newRenderers}
|
||||
}
|
||||
|
||||
// Render renders a value to an io.Writer using the specified format. If the
|
||||
@@ -32,7 +49,7 @@ func NewFormatRenderer(formats map[string]FormatRenderer) *Renderer {
|
||||
// ErrCannotRender, but it could be a different error if the renderer returns
|
||||
// one.
|
||||
func (r *Renderer) Render(w io.Writer, format string, v any) error {
|
||||
renderer, ok := r.Formats[format]
|
||||
renderer, ok := r.Renderers[format]
|
||||
if !ok {
|
||||
return fmt.Errorf("%w: %s", ErrUnsupportedFormat, format)
|
||||
}
|
||||
@@ -51,3 +68,15 @@ func (r *Renderer) Render(w io.Writer, format string, v any) error {
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *Renderer) OnlyWith(formats ...string) *Renderer {
|
||||
renderers := make(map[string]FormatRenderer, len(formats))
|
||||
|
||||
for _, format := range formats {
|
||||
if r, ok := r.Renderers[format]; ok {
|
||||
renderers[format] = r
|
||||
}
|
||||
}
|
||||
|
||||
return New(renderers)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user