in sender.go [325:403]
func newSender(target string, session *Session, opts *SenderOptions) (*Sender, error) {
l := newLink(session, encoding.RoleSender)
l.target = &frames.Target{Address: target}
l.source = new(frames.Source)
s := &Sender{
l: l,
rollback: make(chan struct{}),
}
if opts == nil {
return s, nil
}
for _, v := range opts.Capabilities {
s.l.source.Capabilities = append(s.l.source.Capabilities, encoding.Symbol(v))
}
if opts.Durability > DurabilityUnsettledState {
return nil, fmt.Errorf("invalid Durability %d", opts.Durability)
}
if opts.DesiredCapabilities != nil {
s.l.desiredCapabilities = make([]encoding.Symbol, 0, len(opts.DesiredCapabilities))
for _, capabilityStr := range opts.DesiredCapabilities {
s.l.desiredCapabilities = append(s.l.desiredCapabilities, encoding.Symbol(capabilityStr))
}
}
s.l.source.Durable = opts.Durability
if opts.DynamicAddress {
s.l.target.Address = ""
s.l.dynamicAddr = opts.DynamicAddress
}
if opts.ExpiryPolicy != "" {
if err := encoding.ValidateExpiryPolicy(opts.ExpiryPolicy); err != nil {
return nil, err
}
s.l.source.ExpiryPolicy = opts.ExpiryPolicy
}
s.l.source.Timeout = opts.ExpiryTimeout
if opts.Name != "" {
s.l.key.name = opts.Name
}
if opts.Properties != nil {
s.l.properties = make(map[encoding.Symbol]any)
for k, v := range opts.Properties {
if k == "" {
return nil, errors.New("link property key must not be empty")
}
s.l.properties[encoding.Symbol(k)] = v
}
}
if opts.RequestedReceiverSettleMode != nil {
if rsm := *opts.RequestedReceiverSettleMode; rsm > ReceiverSettleModeSecond {
return nil, fmt.Errorf("invalid RequestedReceiverSettleMode %d", rsm)
}
s.l.receiverSettleMode = opts.RequestedReceiverSettleMode
}
if opts.SettlementMode != nil {
if ssm := *opts.SettlementMode; ssm > SenderSettleModeMixed {
return nil, fmt.Errorf("invalid SettlementMode %d", ssm)
}
s.l.senderSettleMode = opts.SettlementMode
}
s.l.source.Address = opts.SourceAddress
for _, v := range opts.TargetCapabilities {
s.l.target.Capabilities = append(s.l.target.Capabilities, encoding.Symbol(v))
}
if opts.TargetDurability != DurabilityNone {
s.l.target.Durable = opts.TargetDurability
}
if opts.TargetExpiryPolicy != ExpiryPolicySessionEnd {
s.l.target.ExpiryPolicy = opts.TargetExpiryPolicy
}
if opts.TargetExpiryTimeout != 0 {
s.l.target.Timeout = opts.TargetExpiryTimeout
}
return s, nil
}