diff --git a/go.mod b/go.mod index f45bf53..514a72b 100644 --- a/go.mod +++ b/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 +) diff --git a/pkg/webfinger/webfinger.go b/pkg/webfinger/webfinger.go new file mode 100644 index 0000000..0f0e204 --- /dev/null +++ b/pkg/webfinger/webfinger.go @@ -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) +} diff --git a/pkg/webfinger/webfinger_test.go b/pkg/webfinger/webfinger_test.go new file mode 100644 index 0000000..b799cec --- /dev/null +++ b/pkg/webfinger/webfinger_test.go @@ -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]) +}