synapsecns/sanguine

View on GitHub
services/omnirpc/http/client.go

Summary

Maintainability
A
0 mins
Test Coverage
package http

import (
    "context"
    "strings"
)

// Client contains a post client for interacting with json rpc servers.
type Client interface {
    // NewRequest creates a new request
    NewRequest() Request
}

// Request is a request builder.
// TODO: this needs to support tracing.
type Request interface {
    // SetBody sets the request body
    SetBody(body []byte) Request
    // SetContext sets the context for the request
    SetContext(ctx context.Context) Request
    // SetHeader sets the header for the client
    SetHeader(key, value string) Request
    // SetHeaderBytes sets header in bytes to avoid a copy
    SetHeaderBytes(key, value []byte) Request
    // SetRequestURI sets the uri for the request
    SetRequestURI(uri string) Request
    // Do makes the actual request
    Do() (Response, error)
}

// Response is a standardized response interface.
//
//go:generate go run github.com/vektra/mockery/v2 --name Response --output ./mocks --case=underscore
type Response interface {
    Body() []byte
    StatusCode() int
}

// ClientType is the client type to use
//
//go:generate go run golang.org/x/tools/cmd/stringer -type=ClientType -linecomment
type ClientType uint16

const (
    // FastHTTP is the fast http client type.
    FastHTTP ClientType = 0 // FastHTTP
    // Resty is the resty client type.
    Resty ClientType = iota // Resty
)

// AllClientTypes is a list of all client types. Since we use stringer
// we can auto generate this at runtime.
var AllClientTypes []ClientType

// set all client types.
func init() {
    for i := 0; i < len(_ClientType_index); i++ {
        clientType := ClientType(i)
        AllClientTypes = append(AllClientTypes, clientType)
    }
}

// NewClient creates a client from the client type
// defaults to fast http.
func NewClient(clientType ClientType) Client {
    switch clientType {
    case FastHTTP:
        return NewFastHTTPClient()
    case Resty:
        return NewRestyClient()
    default:
        return NewRestyClient()
    }
}

// ClientTypeFromString returns a client type from a string.
func ClientTypeFromString(clientType string) ClientType {
    for _, rawType := range AllClientTypes {
        if strings.EqualFold(rawType.String(), clientType) {
            return rawType
        }
    }
    // use unknown type
    return ClientType(len(_ClientType_index) + 2)
}