mirror of
https://github.com/cadmium-im/zirconium-go.git
synced 2024-11-23 19:02:20 +00:00
Implement parsing Entity ID with additional attribute, add unit tests for it
This commit is contained in:
parent
0f6d2ff3d9
commit
38d83b44ff
@ -11,17 +11,22 @@ const (
|
|||||||
UsernameType EntityIDType = "@"
|
UsernameType EntityIDType = "@"
|
||||||
ChatAliasType EntityIDType = "#"
|
ChatAliasType EntityIDType = "#"
|
||||||
ChatIDType EntityIDType = "!"
|
ChatIDType EntityIDType = "!"
|
||||||
|
ThirdPIDType EntityIDType = "%"
|
||||||
|
OtherType EntityIDType = "&"
|
||||||
)
|
)
|
||||||
|
|
||||||
type EntityID struct {
|
type EntityID struct {
|
||||||
EntityIDType EntityIDType
|
Type EntityIDType
|
||||||
LocalPart string
|
LocalPart string
|
||||||
ServerPart string
|
ServerPart string
|
||||||
|
Attr string
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewEntityIDFromString(entityID string) (*EntityID, error) {
|
func NewEntityIDFromString(entityID string) (*EntityID, error) {
|
||||||
eid := &EntityID{}
|
eid := &EntityID{}
|
||||||
typ := string(entityID[0])
|
typ := string(entityID[0])
|
||||||
|
withAttr := false
|
||||||
|
|
||||||
switch EntityIDType(typ) {
|
switch EntityIDType(typ) {
|
||||||
case UsernameType:
|
case UsernameType:
|
||||||
fallthrough
|
fallthrough
|
||||||
@ -29,18 +34,33 @@ func NewEntityIDFromString(entityID string) (*EntityID, error) {
|
|||||||
fallthrough
|
fallthrough
|
||||||
case ChatIDType:
|
case ChatIDType:
|
||||||
{
|
{
|
||||||
eid.EntityIDType = EntityIDType(typ)
|
eid.Type = EntityIDType(typ)
|
||||||
|
}
|
||||||
|
case ThirdPIDType:
|
||||||
|
fallthrough
|
||||||
|
case OtherType:
|
||||||
|
{
|
||||||
|
eid.Type = EntityIDType(typ)
|
||||||
|
withAttr = true
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("invalid entity id type: %s", typ)
|
return nil, fmt.Errorf("invalid entity id type: %s", typ)
|
||||||
}
|
}
|
||||||
|
|
||||||
localAndServerPart := strings.Split(entityID, "@")
|
localAndServerPart := strings.Split(entityID, "@")
|
||||||
if len(localAndServerPart) == 3 {
|
if len(localAndServerPart) == 3 && localAndServerPart[0] == "" {
|
||||||
localAndServerPart = localAndServerPart[1:]
|
localAndServerPart = localAndServerPart[0:]
|
||||||
}
|
}
|
||||||
|
if !withAttr {
|
||||||
eid.LocalPart = localAndServerPart[0]
|
eid.LocalPart = localAndServerPart[0]
|
||||||
eid.ServerPart = localAndServerPart[1]
|
eid.ServerPart = localAndServerPart[1]
|
||||||
|
} else {
|
||||||
|
attrAndLocal := strings.Split(localAndServerPart[0], ":")
|
||||||
|
attr := attrAndLocal[0][1:]
|
||||||
|
eid.Attr = attr
|
||||||
|
eid.LocalPart = attrAndLocal[1]
|
||||||
|
eid.ServerPart = localAndServerPart[len(localAndServerPart)-1]
|
||||||
|
}
|
||||||
|
|
||||||
return eid, nil
|
return eid, nil
|
||||||
}
|
}
|
||||||
@ -55,7 +75,7 @@ func NewEntityID(typ, localPart, serverPart string) (*EntityID, error) {
|
|||||||
fallthrough
|
fallthrough
|
||||||
case ChatIDType:
|
case ChatIDType:
|
||||||
{
|
{
|
||||||
eid.EntityIDType = EntityIDType(typ)
|
eid.Type = EntityIDType(typ)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("invalid entity id type: %s", typ)
|
return nil, fmt.Errorf("invalid entity id type: %s", typ)
|
||||||
@ -67,6 +87,30 @@ func NewEntityID(typ, localPart, serverPart string) (*EntityID, error) {
|
|||||||
return eid, nil
|
return eid, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (eID *EntityID) String() string {
|
func NewEntityIDWithAttr(typ, attr, localPart, serverPart string) (*EntityID, error) {
|
||||||
return fmt.Sprintf("%s%s@%s", eID.EntityIDType, eID.LocalPart, eID.ServerPart)
|
eid := &EntityID{}
|
||||||
|
|
||||||
|
switch EntityIDType(typ) {
|
||||||
|
case OtherType:
|
||||||
|
fallthrough
|
||||||
|
case ThirdPIDType:
|
||||||
|
{
|
||||||
|
eid.Type = EntityIDType(typ)
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("invalid entity id type: %s", typ)
|
||||||
|
}
|
||||||
|
|
||||||
|
eid.Attr = attr
|
||||||
|
eid.LocalPart = localPart
|
||||||
|
eid.ServerPart = serverPart
|
||||||
|
|
||||||
|
return eid, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (eID *EntityID) String() string {
|
||||||
|
if eID.Attr != "" {
|
||||||
|
return fmt.Sprintf("%s%s:%s@%s", eID.Type, eID.Attr, eID.LocalPart, eID.ServerPart)
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%s%s@%s", eID.Type, eID.LocalPart, eID.ServerPart)
|
||||||
}
|
}
|
||||||
|
39
core/models/entity_id_test.go
Normal file
39
core/models/entity_id_test.go
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
package models
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestNewEntityIDFromString(t *testing.T) {
|
||||||
|
str := "@user@cadmium.org"
|
||||||
|
|
||||||
|
eid, err := NewEntityIDFromString(str)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("error must be null")
|
||||||
|
}
|
||||||
|
if eid.Attr != "" || eid.Type != UsernameType || eid.ServerPart != "cadmium.org" || eid.LocalPart != "user" {
|
||||||
|
t.FailNow()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNewEntityIDFromStringWithAttr(t *testing.T) {
|
||||||
|
str := "%msisdn:18002003040@cadmium.org"
|
||||||
|
|
||||||
|
eid, err := NewEntityIDFromString(str)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("error must be null")
|
||||||
|
}
|
||||||
|
if eid.Attr != "msisdn" || eid.Type != ThirdPIDType || eid.ServerPart != "cadmium.org" || eid.LocalPart != "18002003040" {
|
||||||
|
t.FailNow()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNewEntityIDFromStringWithEmailAttr(t *testing.T) {
|
||||||
|
str := "%email:abslimit_netwhood.online@cadmium.org"
|
||||||
|
|
||||||
|
eid, err := NewEntityIDFromString(str)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("error must be null")
|
||||||
|
}
|
||||||
|
if eid.Attr != "email" || eid.Type != ThirdPIDType || eid.ServerPart != "cadmium.org" || eid.LocalPart != "abslimit_netwhood.online" {
|
||||||
|
t.Fatal(eid.String())
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user