config/service.go
Claude 59b968b1ef
feat: upgrade to core v0.8.0-alpha.1, replace banned stdlib imports
Migrate from forge.lthn.ai deps to dappco.re. Replace os, strings,
path/filepath with Core primitives. OnStartup returns core.Result.
Service factory returns core.Result.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 14:06:13 +00:00

87 lines
2.3 KiB
Go

package config
import (
"context"
core "dappco.re/go/core"
coreio "dappco.re/go/core/io"
)
// Service wraps Config as a framework service with lifecycle support.
type Service struct {
*core.ServiceRuntime[ServiceOptions]
config *Config
}
// ServiceOptions holds configuration for the config service.
type ServiceOptions struct {
// Path overrides the default config file path.
Path string
// Medium overrides the default storage medium.
Medium coreio.Medium
}
// NewConfigService creates a new config service factory for the Core framework.
// Register it with core.WithService(config.NewConfigService).
func NewConfigService(c *core.Core) core.Result {
svc := &Service{
ServiceRuntime: core.NewServiceRuntime(c, ServiceOptions{}),
}
return core.Result{Value: svc, OK: true}
}
// OnStartup loads the configuration file during application startup.
func (s *Service) OnStartup(_ context.Context) core.Result {
opts := s.Options()
var configOpts []Option
if opts.Path != "" {
configOpts = append(configOpts, WithPath(opts.Path))
}
if opts.Medium != nil {
configOpts = append(configOpts, WithMedium(opts.Medium))
}
cfg, err := New(configOpts...)
if err != nil {
return core.Result{Value: core.E("config.Service.OnStartup", "failed to create config", err)}
}
s.config = cfg
return core.Result{OK: true}
}
// Get retrieves a configuration value by key.
func (s *Service) Get(key string, out any) error {
if s.config == nil {
return core.E("config.Service.Get", "config not loaded", nil)
}
return s.config.Get(key, out)
}
// Set stores a configuration value by key.
func (s *Service) Set(key string, v any) error {
if s.config == nil {
return core.E("config.Service.Set", "config not loaded", nil)
}
return s.config.Set(key, v)
}
// Commit persists any configuration changes to disk.
func (s *Service) Commit() error {
if s.config == nil {
return core.E("config.Service.Commit", "config not loaded", nil)
}
return s.config.Commit()
}
// LoadFile merges a configuration file into the central configuration.
func (s *Service) LoadFile(m coreio.Medium, path string) error {
if s.config == nil {
return core.E("config.Service.LoadFile", "config not loaded", nil)
}
return s.config.LoadFile(m, path)
}
// Ensure Service implements core.Startable at compile time.
var _ core.Startable = (*Service)(nil)