package nnet import ( "net/http" "github.com/noahlann/nnet/pkg/config" routerpkg "github.com/noahlann/nnet/pkg/router" ) // PresetBuilder 用于构建基于 nnet 协议的服务器预设。 type PresetBuilder struct { baseConfig config.Config configMutators []func(*Config) setupSteps []func(Server) error } // NewPreset 创建一个带有推荐默认值的预设构建器。 // 默认启用 nnet 应用层协议与 Prometheus 指标导出路径。 func NewPreset() *PresetBuilder { cfg := config.DefaultConfig() cfg.ApplicationProtocol = "nnet" if cfg.Metrics == nil { cfg.Metrics = &config.MetricsConfig{} } cfg.Metrics.Enabled = true if cfg.Metrics.Path == "" { cfg.Metrics.Path = "/metrics" } return &PresetBuilder{ baseConfig: *cfg, configMutators: make([]func(*Config), 0), setupSteps: make([]func(Server) error, 0), } } // Config 返回底层配置副本的引用,方便高级自定义。 // 对返回值的修改会影响后续 Build 调用,但不会影响已构建的服务器。 func (p *PresetBuilder) Config() *Config { return &p.baseConfig } // WithAddress 设置服务器监听地址。 func (p *PresetBuilder) WithAddress(addr string) *PresetBuilder { return p.WithConfig(func(cfg *Config) { cfg.Addr = addr }) } // WithConfig 追加一个配置变更回调,在 Build 前依次执行。 func (p *PresetBuilder) WithConfig(mutator func(*Config)) *PresetBuilder { if mutator == nil { return p } p.configMutators = append(p.configMutators, mutator) return p } // WithLogger 设置日志配置。 func (p *PresetBuilder) WithLogger(loggerCfg *LoggerConfig) *PresetBuilder { return p.WithConfig(func(cfg *Config) { cfg.Logger = loggerCfg }) } // WithMetricsHandler 将 Metrics HTTP 处理器挂载到指定 mux。 // path 为空时默认为 `/metrics`。 func (p *PresetBuilder) WithMetricsHandler(mux *http.ServeMux, path string) *PresetBuilder { if mux == nil { return p } if path == "" { path = "/metrics" } p.setupSteps = append(p.setupSteps, func(s Server) error { mux.Handle(path, s.MetricsHandler()) return nil }) return p.WithConfig(func(cfg *Config) { if cfg.Metrics == nil { cfg.Metrics = &config.MetricsConfig{} } cfg.Metrics.Enabled = true cfg.Metrics.Path = path }) } // WithHealthHandler 将健康检查 HTTP 处理器挂载到指定 mux。 // path 为空时默认为 `/healthz`。 func (p *PresetBuilder) WithHealthHandler(mux *http.ServeMux, path string) *PresetBuilder { if mux == nil { return p } if path == "" { path = "/healthz" } p.setupSteps = append(p.setupSteps, func(s Server) error { mux.Handle(path, s.HealthHandler()) return nil }) return p } // WithRouteString 追加一个基于字符串匹配的路由。 func (p *PresetBuilder) WithRouteString(pattern string, handler Handler, opts ...routerpkg.RouteOption) *PresetBuilder { p.setupSteps = append(p.setupSteps, func(s Server) error { s.Router().RegisterString(pattern, handler, opts...) return nil }) return p } // WithRouter 允许对路由器进行任意自定义操作。 func (p *PresetBuilder) WithRouter(setup func(routerpkg.Router)) *PresetBuilder { if setup == nil { return p } p.setupSteps = append(p.setupSteps, func(s Server) error { setup(s.Router()) return nil }) return p } // WithServerSetup 追加一个在服务器创建后执行的自定义步骤。 func (p *PresetBuilder) WithServerSetup(setup func(Server) error) *PresetBuilder { if setup == nil { return p } p.setupSteps = append(p.setupSteps, setup) return p } // Build 根据当前预设构建服务器实例。 func (p *PresetBuilder) Build() (Server, error) { cfgCopy := p.baseConfig for _, mutate := range p.configMutators { mutate(&cfgCopy) } server, err := NewServer(&cfgCopy) if err != nil { return nil, err } for _, step := range p.setupSteps { if step == nil { continue } if err := step(server); err != nil { return nil, err } } return server, nil }