Add Matrix content URI parsing

This commit is contained in:
Tulir Asokan 2020-04-08 14:53:20 +03:00
commit 100bcaabf8

47
contenturi.go Normal file
View file

@ -0,0 +1,47 @@
package mautrix
import (
"errors"
"fmt"
"strings"
)
var InvalidContentURI = errors.New("invalid Matrix content URI")
type ContentURI struct {
Homeserver string
FileID string
}
func ParseContentURI(uri string) (parsed ContentURI, err error) {
if !strings.HasPrefix(uri, "mxc://") {
err = InvalidContentURI
} else if index := strings.IndexRune(uri[6:], '/'); index == -1 || index == len(uri)-7 {
err = InvalidContentURI
} else {
parsed.Homeserver = uri[6 : 6+index]
parsed.FileID = uri[6+index+1:]
}
return
}
func (uri *ContentURI) UnmarshalJSON(raw []byte) (err error) {
parsed, err := ParseContentURI(string(raw))
if err != nil {
return err
}
*uri = parsed
return nil
}
func (uri *ContentURI) MarshalJSON() ([]byte, error) {
return []byte(uri.String()), nil
}
func (uri *ContentURI) String() string {
return fmt.Sprintf("mxc://%s/%s", uri.Homeserver, uri.FileID)
}
func (uri *ContentURI) IsEmpty() bool {
return len(uri.Homeserver) == 0 || len(uri.FileID) == 0
}