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  }