Revert to simple `io.Writer` with client-resetting

After going through several other solutions, there's no clean way
to use an `io.Writer` but also be able to call `Reset()` between
writes.  Filehandles can't `Reset()` and buffers can't `Seek()`.
But then if you supplied `os.Stderr`, you'd be expecting appending
and a `Seek()` would be nonsense.

My own preference would be to make `JSONWriter` a strict `*bytes.Buffer`
which lets the library handle the resetting and the client do any
outputting if required - I can't see much value in ever supplying
a non-`bytes.Buffer` as `JSONWriter`.
pull/183/head
rjp 2023-05-25 08:36:53 +01:00
parent 51e4324c7a
commit 08be497fae
2 changed files with 5 additions and 9 deletions

View File

@ -24,17 +24,12 @@ type Config struct {
AccessToken string AccessToken string
} }
type WriteResetter interface {
io.Writer
Reset()
}
// Client is a API client for mastodon. // Client is a API client for mastodon.
type Client struct { type Client struct {
http.Client http.Client
Config *Config Config *Config
UserAgent string UserAgent string
JSONWriter WriteResetter JSONWriter io.Writer
} }
func (c *Client) doAPI(ctx context.Context, method string, uri string, params interface{}, res interface{}, pg *Pagination) error { func (c *Client) doAPI(ctx context.Context, method string, uri string, params interface{}, res interface{}, pg *Pagination) error {
@ -133,7 +128,6 @@ func (c *Client) doAPI(ctx context.Context, method string, uri string, params in
} }
if c.JSONWriter != nil { if c.JSONWriter != nil {
c.JSONWriter.Reset()
return json.NewDecoder(io.TeeReader(resp.Body, c.JSONWriter)).Decode(&res) return json.NewDecoder(io.TeeReader(resp.Body, c.JSONWriter)).Decode(&res)
} else { } else {
return json.NewDecoder(resp.Body).Decode(&res) return json.NewDecoder(resp.Body).Decode(&res)

View File

@ -1,6 +1,7 @@
package mastodon package mastodon
import ( import (
"bytes"
"context" "context"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
@ -52,7 +53,8 @@ func TestGetFavouritesSavedJSON(t *testing.T) {
AccessToken: "zoo", AccessToken: "zoo",
}) })
client.SaveJSON = true var buf bytes.Buffer
client.JSONWriter = &buf
favs, err := client.GetFavourites(context.Background(), nil) favs, err := client.GetFavourites(context.Background(), nil)
if err != nil { if err != nil {
@ -70,7 +72,7 @@ func TestGetFavouritesSavedJSON(t *testing.T) {
// We get a trailing `\n` from the API which we need to trim // We get a trailing `\n` from the API which we need to trim
// off before we compare it with our literal above. // off before we compare it with our literal above.
theirJSON := strings.TrimSpace(string(client.LastJSON)) theirJSON := strings.TrimSpace(string(buf.Bytes()))
if theirJSON != ourJSON { if theirJSON != ourJSON {
t.Fatalf("want %q but %q", ourJSON, theirJSON) t.Fatalf("want %q but %q", ourJSON, theirJSON)