Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f4904884ad | |||
| 7d0620fe3e | |||
| 3115c5feef | |||
| 10ca4f4671 | |||
| e0c8825949 | |||
| b12ffdb0a0 |
34
actor.go
34
actor.go
@@ -3,20 +3,40 @@ package camfish
|
||||
import "context"
|
||||
|
||||
// Actor is a participant in the environment. All public methods on an actor
|
||||
// must be safe for concurrent use by multiple goroutines. Additionally, any
|
||||
// type which explicitly implements Actor should:
|
||||
// should be safe for concurrent use by multiple goroutines except for AddFlags,
|
||||
// Init, Configure, and ProcessConfig. Additionally, any type which explicitly
|
||||
// implements Actor should:
|
||||
//
|
||||
// - Treat all public fields, values, indices, etc. as immutable
|
||||
// - Satisfy Actor as a pointer, not a value
|
||||
// - Not have a constructor
|
||||
//
|
||||
// The CAMFISH environment will use interfaces in this package to probe actors
|
||||
// for methods. If an actor is supposed to fulfill one of these interfaces, this
|
||||
// should be enforced at compile-time by assigning the actor to an anonymous
|
||||
// global variable of that interface type. For instance, this line will ensure
|
||||
// that SomeActor fulfills [Resettable]:
|
||||
//
|
||||
// var _ camfish.Resettable = new(SomeActor)
|
||||
type Actor interface {
|
||||
// Type returns the type name of the actor. The value returned from this
|
||||
// is used to locate actors capable of performing a specific task, so it
|
||||
// absolutely must return the same string every time. Actors implemented
|
||||
// in packages besides this one (i.e. not camfish) must not return the
|
||||
// string "cron".
|
||||
// Type returns the "type name" of the actor. The value returned from
|
||||
// this is used to locate actors capable of performing a specific task,
|
||||
// so it absolutely must return the same string every time. It is
|
||||
// usually best to have this be unique to each actor. Actors implemented
|
||||
// in packages other than this one
|
||||
// (git.tebibyte.media/sashakoshka/camfish) must not return the string
|
||||
// "cron".
|
||||
Type() string
|
||||
}
|
||||
|
||||
// Named is any object with a name.
|
||||
type Named interface {
|
||||
// Name returns the name. This doesn't need to be the same as Type. It
|
||||
// must return the same string every time. It is used to differentiate
|
||||
// actors of the same type in logs.
|
||||
Name() string
|
||||
}
|
||||
|
||||
// FlagAdder is any object that can add [Flag]s to a [FlagSet]. Actors which
|
||||
// implement this interface will be called upon to add flags during and only
|
||||
// during the flag parsing phase.
|
||||
|
||||
@@ -298,7 +298,7 @@ func (this *environment) runRunnable(ctx context.Context, actor Runnable) (stopE
|
||||
return
|
||||
} else {
|
||||
// failure
|
||||
log.Printf("XXX [%s] failed", typ)
|
||||
log.Printf("XXX [%s] failed: %v", typ, err)
|
||||
}
|
||||
|
||||
// restart logic
|
||||
|
||||
2
ini.go
2
ini.go
@@ -162,7 +162,7 @@ func configFiles(program string) ([]string, error) {
|
||||
userConfig, err := os.UserConfigDir()
|
||||
if err != nil { return nil, err }
|
||||
return []string {
|
||||
filepath.Join("/etc", program),
|
||||
filepath.Join("/etc", program, program + ".conf"),
|
||||
filepath.Join(userConfig, program),
|
||||
}, nil
|
||||
}
|
||||
|
||||
6
util.go
6
util.go
@@ -77,7 +77,11 @@ func logActors (actors iter.Seq[Actor]) {
|
||||
}
|
||||
types := make(map[string] int)
|
||||
for actor := range actors {
|
||||
types[actor.Type()] += 1
|
||||
typ := actor.Type()
|
||||
if named, ok := actor.(Named); ok {
|
||||
typ = fmt.Sprintf("%s/%s", typ, named.Name())
|
||||
}
|
||||
types[typ] += 1
|
||||
}
|
||||
for typ, count := range types {
|
||||
if count > 1 {
|
||||
|
||||
Reference in New Issue
Block a user