Files
actor/options.go
2026-10-20 18:53:09 +08:00

72 lines
2.3 KiB
Go

package actor
const (
defaultFixedCapacity = 64
defaultBatchSize = 64
)
type configuration[T any] struct {
fixedCapacity int
batchSize int
onPanic func(T, any, []byte)
dispatcher Dispatcher
}
// Option configures an Actor during construction.
type Option[T any] func(*configuration[T])
// WithFixedCapacity sets the number of retained mailbox nodes. The default is
// 64. This is not a mailbox limit: further messages use dynamic nodes.
func WithFixedCapacity[T any](capacity int) Option[T] {
return func(c *configuration[T]) { c.fixedCapacity = capacity }
}
// WithBatchSize sets how many messages are consumed between calls to
// runtime.Gosched. Long pending-batch reversals also yield at this interval.
// The default is 64, independent of the dispatcher.
func WithBatchSize[T any](size int) Option[T] {
return func(c *configuration[T]) { c.batchSize = size }
}
// WithPanicHandler sets an optional callback for handler panics. It receives the
// message, the recovered value, and a stack trace. Its own panics are recovered.
// A nil callback disables panic reporting; messages still continue to drain.
func WithPanicHandler[T any](handler func(message T, value any, stack []byte)) Option[T] {
return func(c *configuration[T]) { c.onPanic = handler }
}
// WithDispatcher chooses the construction-time scheduling policy. The default
// dispatcher runs inline. New rejects a nil interface or nil DispatcherFunc.
// Custom typed-nil implementations must themselves satisfy the Dispatcher
// contract; their validity is the caller's responsibility.
func WithDispatcher[T any](dispatcher Dispatcher) Option[T] {
return func(c *configuration[T]) { c.dispatcher = dispatcher }
}
func configure[T any](opts []Option[T]) configuration[T] {
c := configuration[T]{
fixedCapacity: defaultFixedCapacity,
batchSize: defaultBatchSize,
dispatcher: inlineDispatcher{},
}
for _, opt := range opts {
if opt == nil {
panic("actor: nil option")
}
opt(&c)
}
if c.fixedCapacity <= 0 {
panic("actor: fixed capacity must be positive")
}
if c.batchSize <= 0 {
panic("actor: batch size must be positive")
}
if c.dispatcher == nil {
panic("actor: nil dispatcher")
}
if f, ok := c.dispatcher.(DispatcherFunc); ok && f == nil {
panic("actor: nil dispatcher function")
}
return c
}