mirror of
https://github.com/psviderski/uncloud.git
synced 2026-08-26 11:03:34 +00:00
36 lines
959 B
Go
36 lines
959 B
Go
package compose
|
|
|
|
import "fmt"
|
|
|
|
const CaddyExtensionKey = "x-caddy"
|
|
|
|
type Caddy struct {
|
|
Config string `yaml:"config" json:"config"`
|
|
}
|
|
|
|
// DecodeMapstructure decodes x-caddy extension from either a string or an object.
|
|
// When x-caddy is a string, it's mapped directly to the Config field.
|
|
func (c *Caddy) DecodeMapstructure(value any) error {
|
|
switch v := value.(type) {
|
|
case *Caddy:
|
|
// Already decoded, happens when mapstructure is called after initial parsing.
|
|
*c = *v
|
|
return nil
|
|
case string:
|
|
// Handle x-caddy: "caddyfile config"
|
|
*c = Caddy{Config: v}
|
|
case map[string]any:
|
|
// Handle the long syntax with a config key.
|
|
if config, ok := v["config"]; ok {
|
|
configStr, ok := config.(string)
|
|
if !ok {
|
|
return fmt.Errorf("x-caddy.config must be a string, got %T", config)
|
|
}
|
|
*c = Caddy{Config: configStr}
|
|
}
|
|
default:
|
|
return fmt.Errorf("invalid type %T for x-caddy extension: expected string or object", value)
|
|
}
|
|
return nil
|
|
}
|