basic context implementations + start of component instances
This commit is contained in:
		
							parent
							
								
									ca37aead92
								
							
						
					
					
						commit
						e30052b297
					
				
					 6 changed files with 74 additions and 19 deletions
				
			
		| 
						 | 
				
			
			@ -1,6 +1,64 @@
 | 
			
		|||
package common
 | 
			
		||||
 | 
			
		||||
type Config interface {
 | 
			
		||||
	Name() string
 | 
			
		||||
	Starter() StartFct
 | 
			
		||||
	Children() []Config
 | 
			
		||||
	Add(Config)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Context interface {
 | 
			
		||||
	Config() Config
 | 
			
		||||
	Parent() Context
 | 
			
		||||
	Services() map[string]Context
 | 
			
		||||
	ChildContext(Config) Context
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type StartFct = func(Context)
 | 
			
		||||
 | 
			
		||||
// Context implementation
 | 
			
		||||
 | 
			
		||||
type context struct {
 | 
			
		||||
	cfg    Config
 | 
			
		||||
	parent Context
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ctx *context) Config() Config {
 | 
			
		||||
	return ctx.cfg
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ctx *context) Parent() Context {
 | 
			
		||||
	return ctx.parent
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ctx *context) Services() map[string]Context {
 | 
			
		||||
	return ctx.parent.Services()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ctx *context) ChildContext(cfg Config) Context {
 | 
			
		||||
	cctx := context{cfg, ctx}
 | 
			
		||||
	ctx.Services()[cfg.Name()] = &cctx
 | 
			
		||||
	return &cctx
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type appContext struct {
 | 
			
		||||
	*context
 | 
			
		||||
	services map[string]Context
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ctx *appContext) ChildContext(cfg Config) Context {
 | 
			
		||||
	cctx := context{cfg, ctx}
 | 
			
		||||
	ctx.services[cfg.Name()] = &cctx
 | 
			
		||||
	return &cctx
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ctx *appContext) Services() map[string]Context {
 | 
			
		||||
	return ctx.services
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func AppContext(cfg Config) Context {
 | 
			
		||||
	return &appContext{
 | 
			
		||||
		context:  &context{cfg, nil},
 | 
			
		||||
		services: map[string]Context{},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,17 +17,10 @@ func Start(ctx common.Context) {
 | 
			
		|||
 | 
			
		||||
// definitions
 | 
			
		||||
 | 
			
		||||
type Config interface {
 | 
			
		||||
	Name() string
 | 
			
		||||
	Starter() common.StartFct
 | 
			
		||||
	Children() []Config
 | 
			
		||||
	Add(Config)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Base struct {
 | 
			
		||||
	name     string
 | 
			
		||||
	starter  common.StartFct
 | 
			
		||||
	children []Config
 | 
			
		||||
	children []common.Config
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (cfg *Base) Name() string {
 | 
			
		||||
| 
						 | 
				
			
			@ -38,11 +31,11 @@ func (cfg *Base) Starter() common.StartFct {
 | 
			
		|||
	return cfg.starter
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (cfg *Base) Children() []Config {
 | 
			
		||||
func (cfg *Base) Children() []common.Config {
 | 
			
		||||
	return cfg.children
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (cfg *Base) Add(child Config) {
 | 
			
		||||
func (cfg *Base) Add(child common.Config) {
 | 
			
		||||
	cfg.children = append(cfg.children, child)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -53,7 +46,7 @@ func MakeBase(name string, starter common.StartFct) *Base {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Setup(cfg Config) Config {
 | 
			
		||||
func Setup(cfg common.Config) common.Config {
 | 
			
		||||
	return cfg
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,10 +2,11 @@ package etc
 | 
			
		|||
 | 
			
		||||
import (
 | 
			
		||||
	"git.sr.ht/~cco/go-scopes"
 | 
			
		||||
	"git.sr.ht/~cco/go-scopes/common"
 | 
			
		||||
	"git.sr.ht/~cco/go-scopes/config"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func Config() config.Config {
 | 
			
		||||
func Config() common.Config {
 | 
			
		||||
	ovr := Overrides().Use
 | 
			
		||||
	b := config.MakeBase
 | 
			
		||||
	cfg := scopes.Cfg{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,10 +12,15 @@ type Cfg struct {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func Start(ctx common.Context) {
 | 
			
		||||
	for _, cfg := range ctx.Config().Children() {
 | 
			
		||||
		cctx := ctx.ChildContext(cfg)
 | 
			
		||||
		cfg.Starter()(cctx)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// definitions
 | 
			
		||||
 | 
			
		||||
func RunApp(cfg config.Config) {
 | 
			
		||||
	_ = cfg
 | 
			
		||||
func RunApp(cfg common.Config) {
 | 
			
		||||
	ctx := common.AppContext(cfg)
 | 
			
		||||
	cfg.Starter()(ctx)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,10 +2,11 @@ package etc
 | 
			
		|||
 | 
			
		||||
import (
 | 
			
		||||
	"git.sr.ht/~cco/go-scopes"
 | 
			
		||||
	"git.sr.ht/~cco/go-scopes/common"
 | 
			
		||||
	"git.sr.ht/~cco/go-scopes/config"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func Config() config.Config {
 | 
			
		||||
func Config() common.Config {
 | 
			
		||||
	ovr := Overrides().Use
 | 
			
		||||
	b := config.MakeBase
 | 
			
		||||
	cfg := scopes.Cfg{
 | 
			
		||||
| 
						 | 
				
			
			@ -20,15 +21,13 @@ func Config() config.Config {
 | 
			
		|||
// collect here the names of fields that may be overridden via
 | 
			
		||||
// explicit Override() or SCOPES_* environment settings.
 | 
			
		||||
const (
 | 
			
		||||
	NAME = "name"
 | 
			
		||||
	HOME = "home"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// in a production scenario this should be put in separate
 | 
			
		||||
// in a production scenario this should be put in a separate
 | 
			
		||||
// file `settings.go` that should not be stored in code repository.
 | 
			
		||||
func Overrides() config.Settings {
 | 
			
		||||
	return config.Settings{
 | 
			
		||||
		NAME: "overridden",
 | 
			
		||||
		HOME: "/home/scopes",
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,7 +15,6 @@ func TestConfig(tb *tbase.T) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func ConfigTest(t *testing.T) {
 | 
			
		||||
	t.AssertEqual(etc.Overrides()[etc.NAME], "overridden")
 | 
			
		||||
	cfg := config.Setup(etc.Config())
 | 
			
		||||
	t.AssertEqual(cfg.Name(), "dummy")
 | 
			
		||||
	appCfg := cfg.(*scopes.Cfg)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue