go/internal/mqtt/options.go (128 lines of code) (raw):

// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. package mqtt import ( "maps" "github.com/Azure/iot-operations-sdks/go/internal/options" ) type ( // SubscribeOptions are the resolved subscribe options. SubscribeOptions struct { NoLocal bool QoS byte Retain bool RetainHandling byte UserProperties map[string]string } // SubscribeOption represents a single subscribe option. SubscribeOption interface{ subscribe(*SubscribeOptions) } // UnsubscribeOptions are the resolve unsubscribe options. UnsubscribeOptions struct { UserProperties map[string]string } // UnsubscribeOption represents a single unsubscribe option. UnsubscribeOption interface{ unsubscribe(*UnsubscribeOptions) } // PublishOptions are the resolved publish options. PublishOptions struct { ContentType string CorrelationData []byte MessageExpiry uint32 PayloadFormat byte QoS byte ResponseTopic string Retain bool UserProperties map[string]string } // PublishOption represents a single publish option. PublishOption interface{ publish(*PublishOptions) } // WithContentType sets the content type for the publish. WithContentType string // WithCorrelationData sets the correlation data for the publish. WithCorrelationData []byte // WithMessageExpiry sets the message expiry interval for the publish. WithMessageExpiry uint32 // WithNoLocal sets the no local flag for the subscription. WithNoLocal bool // WithPayloadFormat sets the payload format indicator for the publish. WithPayloadFormat byte // WithQoS sets the QoS level for the publish or subscribe. WithQoS byte // WithResponseTopic sets the response topic for the publish. WithResponseTopic string // WithRetain sets the retain flag for the publish or the retain-as-publish // flag for the subscribe. WithRetain bool // WithRetainHandling specifies the handling of retained messages on the // subscribe. WithRetainHandling byte // WithUserProperties sets the user properties for the publish or subscribe. WithUserProperties map[string]string ) func (o WithContentType) publish(opt *PublishOptions) { opt.ContentType = string(o) } func (o WithCorrelationData) publish(opt *PublishOptions) { opt.CorrelationData = []byte(o) } func (o WithMessageExpiry) publish(opt *PublishOptions) { opt.MessageExpiry = uint32(o) } func (o WithNoLocal) subscribe(opt *SubscribeOptions) { opt.NoLocal = bool(o) } func (o WithPayloadFormat) publish(opt *PublishOptions) { opt.PayloadFormat = byte(o) } func (o WithQoS) publish(opt *PublishOptions) { opt.QoS = byte(o) } func (o WithQoS) subscribe(opt *SubscribeOptions) { opt.QoS = byte(o) } func (o WithResponseTopic) publish(opt *PublishOptions) { opt.ResponseTopic = string(o) } func (o WithRetain) publish(opt *PublishOptions) { opt.Retain = bool(o) } func (o WithRetain) subscribe(opt *SubscribeOptions) { opt.Retain = bool(o) } func (o WithRetainHandling) subscribe(opt *SubscribeOptions) { opt.RetainHandling = byte(o) } func (o WithUserProperties) apply(user map[string]string) map[string]string { if user == nil { user = make(map[string]string, len(o)) } maps.Copy(user, o) return user } func (o WithUserProperties) publish(opt *PublishOptions) { opt.UserProperties = o.apply(opt.UserProperties) } func (o WithUserProperties) subscribe(opt *SubscribeOptions) { opt.UserProperties = o.apply(opt.UserProperties) } func (o WithUserProperties) unsubscribe(opt *UnsubscribeOptions) { opt.UserProperties = o.apply(opt.UserProperties) } // Apply resolves the provided list of options. func (o *SubscribeOptions) Apply( opts []SubscribeOption, rest ...SubscribeOption, ) { for opt := range options.Apply[SubscribeOption](opts, rest...) { opt.subscribe(o) } } // Assign non-nil options. func (o *SubscribeOptions) subscribe(opt *SubscribeOptions) { if o != nil { *opt = *o } } // Apply resolves the provided list of options. func (o *UnsubscribeOptions) Apply( opts []UnsubscribeOption, rest ...UnsubscribeOption, ) { for opt := range options.Apply[UnsubscribeOption](opts, rest...) { opt.unsubscribe(o) } } // Assign non-nil options. func (o *UnsubscribeOptions) unsubscribe(opt *UnsubscribeOptions) { if o != nil { *opt = *o } } // Apply resolves the provided list of options. func (o *PublishOptions) Apply( opts []PublishOption, rest ...PublishOption, ) { for opt := range options.Apply[PublishOption](opts, rest...) { opt.publish(o) } } // Assign non-nil options. func (o *PublishOptions) publish(opt *PublishOptions) { if o != nil { *opt = *o } }