github.com/futurehomeno/fimpgo@v1.14.0/address.go (about) 1 package fimpgo 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/pkg/errors" 8 ) 9 10 const ( 11 DefaultPayload = "j1" 12 CompressedJsonPayload = "j1c1" 13 MsgTypeCmd = "cmd" 14 MsgTypeEvt = "evt" 15 MsgTypeRsp = "rsp" 16 ResourceTypeDevice = "dev" 17 ResourceTypeApp = "app" 18 ResourceTypeAdapter = "ad" 19 ResourceTypeCloud = "cloud" 20 ResourceTypeDiscovery = "discovery" 21 ResourceTypeLocation = "loc" 22 ) 23 24 type Address struct { 25 GlobalPrefix string 26 PayloadType string 27 MsgType string 28 ResourceType string 29 ResourceName string 30 ResourceAddress string 31 ServiceName string 32 ServiceAddress string 33 } 34 35 func (adr *Address) Serialize() string { 36 if adr.PayloadType == "" { 37 adr.PayloadType = DefaultPayload 38 } 39 result := "" 40 41 switch adr.ResourceType { 42 43 case ResourceTypeAdapter, ResourceTypeApp, ResourceTypeCloud: 44 result = fmt.Sprintf("%s/%s/%s/%s/%s", 45 adr.prepComp("pt", adr.PayloadType), 46 adr.prepComp("mt", adr.MsgType), 47 adr.prepComp("rt", adr.ResourceType), 48 adr.prepComp("rn", adr.ResourceName), 49 adr.prepComp("ad", adr.ResourceAddress)) 50 case ResourceTypeDevice: 51 result = fmt.Sprintf("%s/%s/%s/%s/%s/%s/%s", 52 adr.prepComp("pt", adr.PayloadType), 53 adr.prepComp("mt", adr.MsgType), 54 adr.prepComp("rt", adr.ResourceType), 55 adr.prepComp("rn", adr.ResourceName), 56 adr.prepComp("ad", adr.ResourceAddress), 57 adr.prepComp("sv", adr.ServiceName), 58 adr.prepComp("ad", adr.ServiceAddress)) 59 case ResourceTypeDiscovery: 60 result = fmt.Sprintf("%s/%s/%s", 61 adr.prepComp("pt", adr.PayloadType), 62 adr.prepComp("mt", adr.MsgType), 63 adr.prepComp("rt", adr.ResourceType)) 64 } 65 if adr.GlobalPrefix != "" { 66 result = adr.GlobalPrefix + "/" + result 67 } 68 return result 69 } 70 71 func (adr *Address) prepComp(prefix string, comp string) string { 72 if comp == "+" || comp == "#" { 73 return fmt.Sprintf("%s", comp) 74 } else { 75 return fmt.Sprintf("%s:%s", prefix, comp) 76 } 77 } 78 79 func NewAddressFromString(address string) (*Address, error) { 80 adr := Address{} 81 tokens := strings.Split(address, "/") 82 var err error 83 for index, _ := range tokens { 84 keyVal := strings.Split(tokens[index], ":") 85 // detecting global prefix 86 if len(keyVal) == 1 && index == 0 { 87 adr.GlobalPrefix = keyVal[0] 88 } else if len(keyVal) == 2 { 89 switch keyVal[0] { 90 case "pt": 91 adr.PayloadType = keyVal[1] 92 case "mt": 93 adr.MsgType = keyVal[1] 94 case "rt": 95 adr.ResourceType = keyVal[1] 96 case "rn": 97 adr.ResourceName = keyVal[1] 98 case "ad": 99 if adr.ServiceName == "" { 100 adr.ResourceAddress = keyVal[1] 101 } else { 102 adr.ServiceAddress = keyVal[1] 103 } 104 105 case "sv": 106 adr.ServiceName = keyVal[1] 107 108 } 109 } else { 110 return nil, errors.New("Incorrectly formatted address") 111 } 112 } 113 114 return &adr, err 115 116 }