mirror of
https://github.com/jimeh/go-render.git
synced 2026-02-19 03:16:39 +00:00
refactor!: sizeable changes across the board
This commit is contained in:
53
renderer.go
Normal file
53
renderer.go
Normal file
@@ -0,0 +1,53 @@
|
||||
package render
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
)
|
||||
|
||||
// ErrUnsupportedFormat is returned when a format is not supported by a
|
||||
// renderer. Any method that accepts a format string may return this error.
|
||||
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,
|
||||
// the format is used to look up the renderer to use.
|
||||
Formats 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}
|
||||
}
|
||||
|
||||
// Render renders a value to an io.Writer using the specified format. If the
|
||||
// format is not supported, ErrUnsupportedFormat is returned.
|
||||
//
|
||||
// If the format is supported, but the value cannot be rendered to the format,
|
||||
// the error returned by the renderer is returned. In most cases this will be
|
||||
// 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]
|
||||
if !ok {
|
||||
return fmt.Errorf("%w: %s", ErrUnsupportedFormat, format)
|
||||
}
|
||||
|
||||
err := renderer.Render(w, v)
|
||||
if err != nil {
|
||||
if errors.Is(err, ErrCannotRender) {
|
||||
return fmt.Errorf("%w: %s", ErrUnsupportedFormat, format)
|
||||
}
|
||||
if !errors.Is(err, ErrFailed) {
|
||||
return fmt.Errorf("%w: %w", ErrFailed, err)
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user