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
|
||||
|
||||
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