bldr/util/bus-bridge/resolver.go
Rama master · réplica de lectura del repositorio original.
package bus_bridge
import (
"context"
"github.com/aperturerobotics/controllerbus/bus"
"github.com/aperturerobotics/controllerbus/directive"
)
// BusBridgeResolver resolves by forwarding the directive to a target bus.
type BusBridgeResolver struct {
// target is the target bus
target bus.Bus
// dir is the directive
dir directive.Directive
}
// NewBusBridgeResolver constructs a new BusBridgeResolver.
func NewBusBridgeResolver(target bus.Bus, dir directive.Directive) *BusBridgeResolver {
return &BusBridgeResolver{
target: target,
dir: dir,
}
}
// Resolve resolves the values, emitting them to the handler.
func (r *BusBridgeResolver) Resolve(ctx context.Context, handler directive.ResolverHandler) error {
// Skip resolution when the bridge has no target or directive.
if r.target == nil || r.dir == nil {
return nil
}
// Register the directive with a pass-through handler that clears values on dispose.
disposedCb := func() {
_ = handler.ClearValues()
}
_, diRef, err := r.target.AddDirective(ctx, r.dir, bus.NewPassThruHandler(handler, disposedCb))
if err != nil {
return err
}
handler.AddResolverRemovedCallback(diRef.Release)
return nil
}
// _ is a type assertion
var _ directive.Resolver = (*BusBridgeResolver)(nil)