73 lines
1.1 KiB
Go
73 lines
1.1 KiB
Go
package message
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
lib "git.sr.ht/~cco/go-scopes"
|
|
)
|
|
|
|
// Address implementation
|
|
|
|
type address struct {
|
|
url, srv, sid, iid string
|
|
}
|
|
|
|
func (addr *address) String() string {
|
|
return fmt.Sprintf("%s#%s/%s/%s", addr.url, addr.srv, addr.sid, addr.iid)
|
|
}
|
|
|
|
func (addr *address) Url() string {
|
|
return addr.url
|
|
}
|
|
|
|
func (addr *address) Service() string {
|
|
return addr.srv
|
|
}
|
|
|
|
func (addr *address) Interaction() (sid, iid string) {
|
|
return addr.sid, addr.iid
|
|
}
|
|
|
|
func (addr *address) SetUrl(url string) {
|
|
addr.url = url
|
|
}
|
|
|
|
func (addr *address) SetInteraction(sid, iid string) {
|
|
addr.sid = sid
|
|
addr.iid = iid
|
|
}
|
|
|
|
func SimpleAddress(srv string) lib.Address {
|
|
return &address{
|
|
srv: srv,
|
|
}
|
|
}
|
|
|
|
func ParseAddress(s string) lib.Address {
|
|
addr := address{}
|
|
p := strings.SplitN(s, "#", 2)
|
|
if len(p) > 1 {
|
|
addr.url = p[0]
|
|
s = p[1]
|
|
}
|
|
p = strings.Split(s, "/")
|
|
addr.srv = p[0]
|
|
if len(p) > 1 {
|
|
addr.sid = p[1]
|
|
if len(p) > 2 {
|
|
addr.iid = p[2]
|
|
}
|
|
}
|
|
return &addr
|
|
}
|
|
|
|
// Addressable interface
|
|
|
|
func (addr *address) Address() lib.Address {
|
|
return addr
|
|
}
|
|
|
|
func (_ *address) Cell() lib.Context {
|
|
return nil
|
|
}
|