webfinger: add response encoding and decoding
parent
45976aa3b7
commit
d6c9806b5f
8
go.mod
8
go.mod
|
@ -1,3 +1,11 @@
|
||||||
module gitea.treehouse.systems/jejune/jejune
|
module gitea.treehouse.systems/jejune/jejune
|
||||||
|
|
||||||
go 1.19
|
go 1.19
|
||||||
|
|
||||||
|
require github.com/stretchr/testify v1.8.1
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
|
)
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
package webfinger
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Resource provides the fields for a JRD as specified in RFC7033.
|
||||||
|
type Resource struct {
|
||||||
|
Subject string `json:"subject"`
|
||||||
|
Aliases []string `json:"aliases,omitempty"`
|
||||||
|
Properties map[string]string `json:"properties,omitempty"`
|
||||||
|
Links []Link `json:"links,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Link provides the fields for a link entry in a JRD.
|
||||||
|
type Link struct {
|
||||||
|
Rel string `json:"rel"`
|
||||||
|
Href string `json:"href"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decoder provides a context for decoding a JRD.
|
||||||
|
type Decoder struct {
|
||||||
|
reader io.Reader
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewDecoder creates a Decoder given an I/O reader.
|
||||||
|
func NewDecoder(r io.Reader) (*Decoder, error) {
|
||||||
|
dec := &Decoder{reader: r}
|
||||||
|
return dec, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decode decodes a JRD into a Resource.
|
||||||
|
func (dec *Decoder) Decode(rs *Resource) error {
|
||||||
|
jdec := json.NewDecoder(dec.reader)
|
||||||
|
return jdec.Decode(rs)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Encoder provides a context for encoding a JRD.
|
||||||
|
type Encoder struct {
|
||||||
|
writer io.Writer
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewEncoder creates an Encoder given an I/O writer.
|
||||||
|
func NewEncoder(w io.Writer) (*Encoder, error) {
|
||||||
|
enc := &Encoder{writer: w}
|
||||||
|
return enc, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Encode encodes a Resource into a JRD.
|
||||||
|
func (enc *Encoder) Encode(rs *Resource) error {
|
||||||
|
jenc := json.NewEncoder(enc.writer)
|
||||||
|
return jenc.Encode(*rs)
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
package webfinger
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"testing"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestRoundTrip(t *testing.T) {
|
||||||
|
jrd := Resource{
|
||||||
|
Subject: "acct:ariadne@jejune.dev",
|
||||||
|
Links: []Link{
|
||||||
|
{Rel: "application/activity+json", Href: "https://jejune.dev/.jejune/ariadne"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
encbuf := &bytes.Buffer{}
|
||||||
|
enc, err := NewEncoder(encbuf)
|
||||||
|
require.NoErrorf(t, err, "got error while constructing the encoder: %s", err)
|
||||||
|
|
||||||
|
err = enc.Encode(&jrd)
|
||||||
|
require.NoErrorf(t, err, "got error while encoding: %s", err)
|
||||||
|
|
||||||
|
dec, err := NewDecoder(encbuf)
|
||||||
|
require.NoErrorf(t, err, "got error while constructing the decoder: %s", err)
|
||||||
|
|
||||||
|
var decjrd Resource
|
||||||
|
err = dec.Decode(&decjrd)
|
||||||
|
require.NoErrorf(t, err, "got error while decoding: %s", err)
|
||||||
|
|
||||||
|
require.Equal(t, jrd.Subject, decjrd.Subject)
|
||||||
|
require.Equal(t, 1, len(decjrd.Links))
|
||||||
|
require.Equal(t, jrd.Links[0], decjrd.Links[0])
|
||||||
|
}
|
Loading…
Reference in New Issue