summaryrefslogtreecommitdiffci
path: root/config
diff options
from:
to:
context:
space:
mode:
authorGravatar Montferrat <montferrat@Montferrats-MacBook-Pro.local> 2026-05-02 19:47:34 +0700
committerGravatar Montferrat <montferrat@Montferrats-MacBook-Pro.local> 2026-05-02 19:47:34 +0700
commit179cf888d20537a5f6e581256be95ad1e2f92d6b (patch)
tree72637341bf1e074252c2acc57ce122f2b235978a /config
parent03ff00d2e2e59f695bb14f346b4cc8fdbfc5d12a (diff)
downloadweb-179cf888d20537a5f6e581256be95ad1e2f92d6b.tar.gz
web-179cf888d20537a5f6e581256be95ad1e2f92d6b.zip
feat: enable unix listeners
refactor: parametrize listener
Diffstat (limited to 'config')
-rw-r--r--config/config.go85
-rw-r--r--config/config.local.yaml4
-rw-r--r--config/config.prod.yaml4
-rw-r--r--config/config.stage.yaml4
4 files changed, 96 insertions, 1 deletions
diff --git a/config/config.go b/config/config.go
index 536a333..784ac38 100644
--- a/config/config.go
+++ b/config/config.go
@@ -12,6 +12,7 @@ import (
type Config struct {
LogLevel slog.Level `json:"LogLevel" yaml:"logLevel" validate:"required"`
+ Endpoint EndpointConfig `json:"Endpoint" yaml:"endpoint" validate:"required"`
BlogPages BlogPagesConfig `json:"BlogPages" yaml:"blogPages" validate:"required"`
FactGiver FactGiverConfig `json:"FactGiver" yaml:"factGiver" validate:"required"`
LocalePath string `json:"LocalePath" yaml:"localePath" validate:"required,filepath"`
@@ -25,12 +26,90 @@ type Config struct {
AllowOrigins []string `json:"AllowOrigins" yaml:"allowOrigins"`
}
+type EndpointConfig struct {
+ Type string `json:"Type" yaml:"type" validate:"required,oneof=http unix"`
+ Config any `json:"Config" yaml:"config" validate:"required"`
+}
+
+func (ec *EndpointConfig) UnmarshalJSON(data []byte) error {
+ var tmp struct {
+ Type string `json:"Type"`
+ Config json.RawMessage `json:"Config"`
+ }
+
+ if err := json.Unmarshal(data, &tmp); err != nil {
+ return err
+ }
+
+ ec.Type = tmp.Type
+
+ switch tmp.Type {
+ case "http":
+ var httpConfig HttpConfig
+ if err := json.Unmarshal(tmp.Config, &httpConfig); err != nil {
+ return fmt.Errorf("unmarshal HttpConfig: %w", err)
+ }
+ ec.Config = &httpConfig
+ case "unix":
+ var unixConfig UnixConfig
+ if err := json.Unmarshal(tmp.Config, &unixConfig); err != nil {
+ return fmt.Errorf("unmarshal UnixConfig: %w", err)
+ }
+ ec.Config = &unixConfig
+ default:
+ return fmt.Errorf("unsupported storage type: %s", tmp.Type)
+ }
+
+ return nil
+}
+
+func (ec *EndpointConfig) UnmarshalYAML(value *yaml.Node) error {
+ var tmp struct {
+ Type string `yaml:"type"`
+ Config yaml.Node `yaml:"config"`
+ }
+
+ if err := value.Decode(&tmp); err != nil {
+ return err
+ }
+
+ ec.Type = tmp.Type
+
+ switch tmp.Type {
+ case "http":
+ var httpConfig HttpConfig
+ if err := tmp.Config.Decode(&httpConfig); err != nil {
+ return fmt.Errorf("unmarshal HttpConfig: %w", err)
+ }
+ ec.Config = &httpConfig
+ case "unix":
+ var unixConfig UnixConfig
+ if err := tmp.Config.Decode(&unixConfig); err != nil {
+ return fmt.Errorf("unmarshal UnixConfig: %w", err)
+ }
+ ec.Config = &unixConfig
+ default:
+ return fmt.Errorf("unsupported storage type: %s", tmp.Type)
+ }
+
+ return nil
+}
+
+type HttpConfig struct {
+ ListenOn string `json:"ListenOn" yaml:"listenOn" validate:"required"`
+}
+
+type UnixConfig struct {
+ Path string `json:"Path" yaml:"path" validate:"required"`
+ Chmod string `json:"Chmod" yaml:"chmod" validate:"oneof=0600 0660 0666"`
+}
+
type BlogPagesConfig struct {
Storage StorageConfig `json:"Storage" yaml:"storage" validate:"required"`
}
type StorageConfig struct {
- Type string `json:"type" yaml:"type,oneof=b2 s3"`
+ Type string `json:"Type" yaml:"type" validate:"required,oneof=b2 s3"`
Config any `json:"Config" yaml:"config" validate:"required"`
}
@@ -202,6 +281,10 @@ func InitConfig(path string) (*Config, error) {
return nil, err
}
+ if config.Endpoint.Type == "unix" && config.Endpoint.Config.(*UnixConfig).Chmod == "" {
+ config.Endpoint.Config.(*UnixConfig).Chmod = "0660"
+ }
+
validate := validator.New(validator.WithRequiredStructEnabled())
if err := validate.Struct(config); err != nil {
return nil, err
diff --git a/config/config.local.yaml b/config/config.local.yaml
index 7769438..1822fdc 100644
--- a/config/config.local.yaml
+++ b/config/config.local.yaml
@@ -1,4 +1,8 @@
logLevel: debug
+endpoint:
+ type: http
+ config:
+ listenOn: ":3000"
blogPages:
storage:
type: b2
diff --git a/config/config.prod.yaml b/config/config.prod.yaml
index 91f606f..0b45e1a 100644
--- a/config/config.prod.yaml
+++ b/config/config.prod.yaml
@@ -1,4 +1,8 @@
logLevel: info
+endpoint:
+ type: http
+ config:
+ listenOn: ":3000"
blogPages:
storage:
type: b2
diff --git a/config/config.stage.yaml b/config/config.stage.yaml
index 3f1381b..23b76aa 100644
--- a/config/config.stage.yaml
+++ b/config/config.stage.yaml
@@ -1,4 +1,8 @@
logLevel: debug
+endpoint:
+ type: http
+ config:
+ listenOn: ":3000"
blogPages:
storage:
type: b2