ceremonyclient/node/keyedcollector/factory.go
2025-11-21 04:34:24 -06:00

59 lines
1.5 KiB
Go

package keyedcollector
import (
"fmt"
"source.quilibrium.com/quilibrium/monorepo/consensus"
"source.quilibrium.com/quilibrium/monorepo/node/keyedaggregator"
)
// ProcessorFactory creates processors for a given sequence.
type ProcessorFactory[RecordT any] interface {
Create(sequence uint64) (Processor[RecordT], error)
}
// Factory produces collectors for a given sequence, satisfying the
// keyedaggregator.CollectorFactory interface.
type Factory[RecordT any] struct {
tracer consensus.TraceLogger
traits RecordTraits[RecordT]
consumer CollectorConsumer[RecordT]
processorFactory ProcessorFactory[RecordT]
}
func NewFactory[RecordT any](
tracer consensus.TraceLogger,
traits RecordTraits[RecordT],
consumer CollectorConsumer[RecordT],
processorFactory ProcessorFactory[RecordT],
) (*Factory[RecordT], error) {
if err := traits.validate(); err != nil {
return nil, err
}
if processorFactory == nil {
return nil, fmt.Errorf("processor factory is required")
}
return &Factory[RecordT]{
tracer: tracer,
traits: traits,
consumer: consumer,
processorFactory: processorFactory,
}, nil
}
func (f *Factory[RecordT]) Create(
sequence uint64,
) (keyedaggregator.Collector[RecordT], error) {
processor, err := f.processorFactory.Create(sequence)
if err != nil {
return nil, fmt.Errorf("could not create processor for sequence %d: %w", sequence, err)
}
return NewCollector(
f.tracer,
sequence,
f.traits,
processor,
f.consumer,
)
}