requestgen
requestgen generates the cascade call for your request object
Installation
go get github.com/c9s/requestgen/cmd/requestgen
Usage
requestgen scans all the fields of the target struct, and generate setter methods and getParameters method.
package api
import "github.com/c9s/requestgen"
//go:generate requestgen -type PlaceOrderRequest
type PlaceOrderRequest struct {
// client is an optional field to implement
// if you add this field with the APIClient interface type, the Do() method will be generated
// note, you will have to add flag "-url" and "-method" to specify your endpoint and the request method.
client requestgen.APIClient
// A combination of case-sensitive alphanumerics, all numbers, or all letters of up to 32 characters.
clientOrderID *string `param:"clientOid,required" defaultValuer:"uuid()"`
symbol string `param:"symbol,required"`
// A combination of case-sensitive alphanumerics, all numbers, or all letters of up to 8 characters.
tag *string `param:"tag"`
// "buy" or "sell"
side SideType `param:"side,required" validValues:"buy,sell"`
orderType OrderType `param:"ordType" validValues:"limit,market"`
size string `param:"size"`
// limit order parameters
price *string `param:"price,omitempty"`
timeInForce *TimeInForceType `param:"timeInForce,omitempty" validValues:"GTC,GTT,FOK"`
complexArg ComplexArg `param:"complexArg"`
startTime *time.Time `param:"startTime,milliseconds" defaultValuer:"now()"`
}
Or you can run generate command manually like this:
go run ./cmd/requestgen -type PlaceOrderRequest -method GET -url "/api/v1/bullet" -debug ./example/api
Then you can do:
req := &PlaceOrderRequest{}
err := req.Tag(..).
OrderType(OrderTypeLimit).
Side(SideTypeBuy).
Do(ctx)
See the generated example
Command Options
-responseType [responseType]
When responseType is not given, interface{} will be used for decoding the response content from the API server.
For example:
type Response struct {
Code string `json:"code"`
Message string `json:"msg"`
CurrentPage int `json:"currentPage"`
PageSize int `json:"pageSize"`
TotalNum int `json:"totalNum"`
TotalPage int `json:"totalPage"`
Orders []Orders `json:"orders"`
}
-responseDataField [dataField]
When dataField is given, it means your data is inside the responseType, the field name is where you want to extract the data from.
Be sure to define dataField as a json.RawMessage so that the generated code can handle the decoding separately.
For example:
type Response struct {
Code string `json:"code"`
Message string `json:"msg"`
CurrentPage int `json:"currentPage"`
PageSize int `json:"pageSize"`
TotalNum int `json:"totalNum"`
TotalPage int `json:"totalPage"`
Data json.RawMessage `json:"data"`
}
-responseDataType [dataType]
When dataType is given, it means your data is inside the responseType. the raw json message will be decoded with this given type.
APIClient
You can implement your own http API client struct that satisfies the following interface (defined in requestgen.APIClient)
// APIClient defines the request builder method and request method for the API service
type APIClient interface {
// NewAuthenticatedRequest builds up the http request for authentication-required endpoints
NewAuthenticatedRequest(method, refURL string, params url.Values, payload interface{}) (*http.Request, error)
// NewRequest builds up the http request for public endpoints
NewRequest(method, refURL string, params url.Values, payload interface{}) (*http.Request, error)
// SendRequest sends the request object to the api gateway
SendRequest(req *http.Request) (*Response, error)
}
See a real example implementation of the APIClient interface. kucoin exchange client
See Also
LICENSE
MIT License