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
parent
51e4324c7a
commit
08be497fae
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue