package bhomedbapi import ( "basic.com/valib/c_bhomebus.git/proto/source/bhome_msg" ) //Factory new client /* 跨机请求时,topic devId ip必须非空 */ func NewClient(opts ...IOption) Client { opt := defaultOption() for _,o := range opts { o.apply(&opt) } if opt.ip != "" { //跨机请求 if opt.topic == "" { return nil } opt.nodes = n_getNetNode(opt.topic) logPrint("NewClient ip:", opt.ip, " topic:", opt.topic, " nodes:", opt.nodes) if !checkRemoteNetNode(opt.ip, &opt.nodes) { return nil } } return &SBusClient{ nodes: opt.nodes, } } type Option struct { nodes []*bhome_msg.MsgQueryTopicReply_BHNodeAddress topic string devId string ip string port int32 } type IOption interface { apply(*Option) } type funcOption struct { f func(*Option) } func (fo *funcOption) apply(o *Option) { fo.f(o) } func newFuncOption(f func(*Option)) *funcOption { return &funcOption{ f:f, } } func WithNodes(nodeArr []*bhome_msg.MsgQueryTopicReply_BHNodeAddress) IOption { return newFuncOption(func(o *Option) { o.nodes = nodeArr }) } func WithTopic(topic string) IOption { return newFuncOption(func(o *Option){ o.topic = topic }) } func WithIp(ip string) IOption { return newFuncOption(func(o *Option) { o.ip = ip }) } func WithDevId(devId string) IOption { return newFuncOption(func(o *Option) { o.devId = devId }) } func WithPort(port int32) IOption { return newFuncOption(func(o *Option) { o.port = port }) } func defaultOption() Option { return Option{ } } func checkRemoteNetNode(rip string, netNode *[]*bhome_msg.MsgQueryTopicReply_BHNodeAddress) bool { if netNode == nil || len(*netNode) == 0 { return false } for _,n := range *netNode { if n.Addr != nil && string(n.Addr.Ip) == rip && n.Addr.Port >0 { *netNode = append([]*bhome_msg.MsgQueryTopicReply_BHNodeAddress{}, &bhome_msg.MsgQueryTopicReply_BHNodeAddress{ Addr: &bhome_msg.BHAddress{ Ip: []byte(rip), Port: n.Addr.Port, }, }) return true } } return false }