webfinger: add response encoding and decoding

main
Ariadne Conill 2022-12-18 08:27:07 +00:00
parent 45976aa3b7
commit d6c9806b5f
3 changed files with 96 additions and 0 deletions

8
go.mod
View File

@ -1,3 +1,11 @@
module gitea.treehouse.systems/jejune/jejune
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
)

View File

@ -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)
}

View File

@ -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])
}