Raw encoder.

This commit is contained in:
Alexander Zhuravlev 2024-05-14 23:23:03 +03:00
parent 9cc185f545
commit e284861539
5 changed files with 130 additions and 1 deletions

View File

@ -75,6 +75,31 @@ httpClient := &http.Client{}
api := NewSuggestApi(WithHttpClient(httpClient))
```
### Low level client usage
Pass and consume raw bytes/strings:
```go
endpointUrl, err := url.Parse("https://suggestions.dadata.ru/suggestions/api/4_1/rs/")
if err != nil {
return
}
cli := client.NewClient(endpointUrl,
client.WithEncoderFactory(encoder.RawEncoderFactory()),
client.WithDecoderFactory(encoder.RawDecoderFactory()),
)
request := bytes.NewBufferString("{ \"query\": \"москва хабар\" }")
response := &bytes.Buffer{}
err = cli.Post(context.Background(), "suggest/address", request, response)
if err != nil {
return
}
fmt.Print(response.String()) // Output: `{"suggestions":[{"value":"г Москва, ул Хабаровская",...`
```
## Licence
MIT see [LICENSE](LICENSE)

View File

@ -94,7 +94,7 @@ func (c *Client) doRequest(ctx context.Context, method string, url *url.URL, bod
)
}
if err = c.options.decoderFactory(response.Body)(&result); err != nil {
if err = c.options.decoderFactory(response.Body)(result); err != nil {
return fmt.Errorf("doRequest: response body decode err: %w", err)
}

View File

@ -1,6 +1,7 @@
package client
import (
"bytes"
"context"
"encoding/json"
"fmt"
@ -9,6 +10,7 @@ import (
"github.com/ekomobile/dadata/v2/api/suggest"
"github.com/ekomobile/dadata/v2/client/transport"
"github.com/ekomobile/dadata/v2/client/transport/encoder"
)
func ExampleNewClient() {
@ -108,3 +110,26 @@ func ExampleWithEncoderFactory() {
fmt.Printf("%s", s.Value)
}
}
func ExampleClient_low_level() {
var err error
endpointUrl, err := url.Parse("https://suggestions.dadata.ru/suggestions/api/4_1/rs/")
if err != nil {
return
}
cli := NewClient(endpointUrl,
WithEncoderFactory(encoder.RawEncoderFactory()),
WithDecoderFactory(encoder.RawDecoderFactory()),
)
request := bytes.NewBufferString("{ \"query\": \"москва хабар\" }")
response := &bytes.Buffer{}
err = cli.Post(context.Background(), "suggest/address", request, response)
if err != nil {
return
}
fmt.Print(response.String())
}

View File

@ -0,0 +1,54 @@
package encoder
import (
"fmt"
"io"
"github.com/ekomobile/dadata/v2/client/transport"
)
// RawEncoderFactory is a factory for noop-encoder that just writes to transport io.Writer.
func RawEncoderFactory() transport.EncoderFactory {
return func(w io.Writer) transport.Encoder {
return func(v interface{}) (err error) {
switch value := v.(type) {
case *string:
_, err = w.Write([]byte(*value))
case string:
_, err = w.Write([]byte(value))
case *[]byte:
_, err = w.Write(*value)
case []byte:
_, err = w.Write(value)
case io.Reader:
_, err = io.Copy(w, value)
case io.WriterTo:
_, err = value.WriteTo(w)
default:
err = fmt.Errorf("can not encode from value: %#v", v)
}
return err
}
}
}
// RawDecoderFactory is a factory for noop-decoder that just reads from transport io.Reader.
func RawDecoderFactory() transport.DecoderFactory {
return func(r io.Reader) transport.Decoder {
return func(v interface{}) (err error) {
switch value := v.(type) {
case *[]byte:
_, err = r.Read(*value)
case []byte:
_, err = r.Read(value)
case io.Writer:
_, err = io.Copy(value, r)
case io.ReaderFrom:
_, err = value.ReadFrom(r)
default:
err = fmt.Errorf("can not decode into value: %#v", v)
}
return err
}
}
}

View File

@ -3,11 +3,15 @@
package dadata
import (
"bytes"
"context"
"fmt"
"net/url"
"os"
"testing"
"github.com/ekomobile/dadata/v2/client"
"github.com/ekomobile/dadata/v2/client/transport/encoder"
"github.com/stretchr/testify/suite"
"github.com/ekomobile/dadata/v2/api/suggest"
@ -53,6 +57,27 @@ func (s *ApiSuggestIntegrationTest) TestAddress() {
s.NotEmpty(res)
}
func (s *ApiSuggestIntegrationTest) TestAddress_low_level() {
var err error
endpointUrl, err := url.Parse(EndpointURLSuggest)
if err != nil {
return
}
cli := client.NewClient(endpointUrl,
client.WithEncoderFactory(encoder.RawEncoderFactory()),
client.WithDecoderFactory(encoder.RawDecoderFactory()),
)
request := bytes.NewBufferString("{ \"query\": \"москва хабар\" }")
response := &bytes.Buffer{}
err = cli.Post(context.Background(), "suggest/address", request, response)
s.NoError(err)
s.NotEmpty(response.String())
}
func (s *ApiSuggestIntegrationTest) TestAddressWithLanguageParamRU() {
api := NewSuggestApi()