Ver Fonte

Simplify vips.LoadConfigFromEnv

DarthSim há 1 semana atrás
pai
commit
5b0b34ff3d
3 ficheiros alterados com 29 adições e 22 exclusões
  1. 9 0
      env/desc.go
  2. 15 0
      env/parsers.go
  3. 5 22
      vips/config.go

+ 9 - 0
env/desc.go

@@ -3,7 +3,10 @@ package env
 import (
 	"fmt"
 	"log/slog"
+	"maps"
 	"os"
+	"slices"
+	"strings"
 )
 
 // Desc describes an environment variable
@@ -20,6 +23,12 @@ func Describe(name string, format string) Desc {
 	}
 }
 
+// DescribeByMap creates a new EnvDesc with format based on a map keys
+func DescribeByMap[T any](name string, m map[string]T) Desc {
+	format := strings.Join(slices.Collect(maps.Keys(m)), "|")
+	return Describe(name, format)
+}
+
 // Getenv returns the value of the env variable
 func (d Desc) Get() (string, bool) {
 	value := os.Getenv(d.Name)

+ 15 - 0
env/parsers.go

@@ -300,3 +300,18 @@ func HexSlice(b *[][]byte, desc Desc) error {
 
 	return nil
 }
+
+func FromMap[T any](v *T, m map[string]T, desc Desc) error {
+	env, ok := desc.Get()
+	if !ok {
+		return nil
+	}
+
+	if val, ok := m[env]; ok {
+		*v = val
+	} else {
+		return desc.Errorf("%s", env)
+	}
+
+	return nil
+}

+ 5 - 22
vips/config.go

@@ -16,7 +16,7 @@ var (
 	IMGPROXY_PNG_INTERLACED          = env.Describe("IMGPROXY_PNG_INTERLACED", "boolean")
 	IMGPROXY_PNG_QUANTIZE            = env.Describe("IMGPROXY_PNG_QUANTIZE", "boolean")
 	IMGPROXY_PNG_QUANTIZATION_COLORS = env.Describe("IMGPROXY_PNG_QUANTIZATION_COLORS", "number between 2 and 256")
-	IMGPROXY_WEBP_PRESET             = env.Describe("IMGPROXY_WEBP_PRESET", "default|picture|photo|drawing|icon|text")
+	IMGPROXY_WEBP_PRESET             = env.DescribeByMap("IMGPROXY_WEBP_PRESET", WebpPresets)
 	IMGPROXY_AVIF_SPEED              = env.Describe("IMGPROXY_AVIF_SPEED", "number between 0 and 9")
 	IMGPROXY_WEBP_EFFORT             = env.Describe("IMGPROXY_WEBP_EFFORT", "number between 1 and 6")
 	IMGPROXY_JXL_EFFORT              = env.Describe("IMGPROXY_JXL_EFFORT", "number between 1 and 9")
@@ -83,11 +83,6 @@ func NewDefaultConfig() Config {
 func LoadConfigFromEnv(c *Config) (*Config, error) {
 	c = ensure.Ensure(c, NewDefaultConfig)
 
-	var leakCheck, cacheTrace string
-
-	// default preset so parsing below won't fail on empty value
-	webpPreset := c.WebpPreset.String()
-
 	err := errors.Join(
 		env.Bool(&c.JpegProgressive, IMGPROXY_JPEG_PROGRESSIVE),
 		env.Bool(&c.PngInterlaced, IMGPROXY_PNG_INTERLACED),
@@ -99,24 +94,12 @@ func LoadConfigFromEnv(c *Config) (*Config, error) {
 		env.Bool(&c.PngUnlimited, IMGPROXY_PNG_UNLIMITED),
 		env.Bool(&c.SvgUnlimited, IMGPROXY_SVG_UNLIMITED),
 
-		env.String(&webpPreset, IMGPROXY_WEBP_PRESET),
-		env.String(&leakCheck, IMGPROXY_VIPS_LEAK_CHECK),
-		env.String(&cacheTrace, IMGPROXY_VIPS_CACHE_TRACE),
+		env.FromMap(&c.WebpPreset, WebpPresets, IMGPROXY_WEBP_PRESET),
+		env.Bool(&c.LeakCheck, IMGPROXY_VIPS_LEAK_CHECK),
+		env.Bool(&c.CacheTrace, IMGPROXY_VIPS_CACHE_TRACE),
 	)
-	if err != nil {
-		return nil, err
-	}
-
-	if pr, ok := WebpPresets[webpPreset]; ok {
-		c.WebpPreset = pr
-	} else {
-		return nil, IMGPROXY_WEBP_PRESET.Errorf("invalid WebP preset: %s", webpPreset)
-	}
-
-	c.LeakCheck = len(leakCheck) > 0
-	c.CacheTrace = len(cacheTrace) > 0
 
-	return c, nil
+	return c, err
 }
 
 func (c *Config) Validate() error {