All checks were successful
ci/woodpecker/push/build-image Pipeline was successful
74 lines
1.6 KiB
Go
74 lines
1.6 KiB
Go
package units
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
type Factory interface {
|
|
System() string
|
|
New() Converter
|
|
}
|
|
|
|
type StaticFactory struct {
|
|
UnitSystem string
|
|
Converter Converter
|
|
}
|
|
|
|
func (f StaticFactory) System() string {
|
|
return f.UnitSystem
|
|
}
|
|
|
|
func (f StaticFactory) New() Converter {
|
|
return f.Converter
|
|
}
|
|
|
|
type Registry struct {
|
|
factories map[string]Factory
|
|
}
|
|
|
|
func NewRegistry() *Registry {
|
|
return &Registry{factories: map[string]Factory{}}
|
|
}
|
|
|
|
func (r *Registry) Register(factory Factory) error {
|
|
if r == nil {
|
|
return fmt.Errorf("register unit factory: registry is nil")
|
|
}
|
|
if factory == nil {
|
|
return fmt.Errorf("register unit factory: factory is nil")
|
|
}
|
|
system := normalize(factory.System())
|
|
if system == "" {
|
|
return fmt.Errorf("register unit factory: unit system is empty")
|
|
}
|
|
if _, exists := r.factories[system]; exists {
|
|
return fmt.Errorf("register unit factory: system %q already registered", system)
|
|
}
|
|
if factory.New() == nil {
|
|
return fmt.Errorf("register unit factory: factory returned nil converter for %q", system)
|
|
}
|
|
r.factories[system] = factory
|
|
return nil
|
|
}
|
|
|
|
func (r *Registry) Resolve(system string) (Converter, error) {
|
|
if r == nil {
|
|
return nil, fmt.Errorf("resolve unit converter: registry is nil")
|
|
}
|
|
key := normalize(system)
|
|
factory, ok := r.factories[key]
|
|
if !ok {
|
|
return nil, fmt.Errorf("resolve unit converter: unsupported unit system %q", system)
|
|
}
|
|
converter := factory.New()
|
|
if converter == nil {
|
|
return nil, fmt.Errorf("resolve unit converter: factory for %q returned nil converter", key)
|
|
}
|
|
return converter, nil
|
|
}
|
|
|
|
func normalize(system string) string {
|
|
return strings.ToLower(strings.TrimSpace(system))
|
|
}
|