func (r *Request) Build() (*Request, error) {
	if err := r.checkError(); err != nil {
		return nil, err
	}
	if "" == r.httpVerb {
		return nil, errors.New("No HttpVerb Provided")
	}
	if "" == r.url {
		return nil, errors.New("No URL Provided")
	}
	if r.requestParams != nil {
		reqParamString := "?"
		for k, v := range r.requestParams {
			if reqParamString != "?" {
				reqParamString += "&"
			}
			reqParamString = reqParamString + k + `=` + v
		}
		r.url = r.url + reqParamString
	}
	if len(r.requestBody) == 0 && len(r.requestBodyParams) != 0 {
		r.WithRequestBody(r.requestBodyParams)
	}
	return r, nil
}
Build will do basic validations.
package hammer
import (
	"bytes"
	"context"
	"encoding/json"
	"errors"
	"fmt"
	"net/http"
	"net/url"
	"reflect"
)
type Request struct {
	httpVerb string
	baseURL  string
	endpoint string
	url      string
	err     error
	headers map[string]string
	requestParams     map[string]string
	formParams        url.Values
	requestBodyParams map[string]interface{}
	requestBody       []byte
	ctx               context.Context
	basicAuth
}
type basicAuth struct {
	username string
	password string
}
func initRequest() *Request {
	return &Request{
		headers:           make(map[string]string),
		requestParams:     make(map[string]string),
		requestBodyParams: make(map[string]interface{}),
		ctx:               context.Background(),
	}
}
func (r *Request) checkError() error {
	if r.err != nil {
		return r.err
	}
	return nil
}
func RequestBuilder() *Request {
	return initRequest()
}
func (r *Request) WithRequestBody(body interface{}) *Request {
	bodyData, _ := json.Marshal(body)
	r.requestBody = bodyData
	return r
}
func (r *Request) WithHeaders(key string, value string) *Request {
	r.headers[key] = value
	return r
}
func (r *Request) WithRequestParams(key string, value string) *Request {
	r.requestParams[key] = value
	return r
}
func (r *Request) WithRequestBodyParams(key string, value interface{}) *Request {
	r.requestBodyParams[key] = value
	return r
}
func (r *Request) WithFormValues(key string, value interface{}) *Request {
	return r.WithRequestBodyParams(key, value)
}
func (r *Request) WithURL(value string) *Request {
	r.url = value
	return r
}
func (r *Request) WithContext(ctx context.Context) *Request {
	r.ctx = ctx
	return r
}
func (r *Request) WithBasicAuth(user, pass string) *Request {
	r.basicAuth = basicAuth{
		username: user,
		password: pass,
	}
	return r
}
func (r *Request) WithID(ID string) *Request {
	switch r.httpVerb {
	case GET, PUT, DELETE:
		r.WithURL(r.url + "/" + ID)
		return r
	default:
		errMessage := fmt.Sprintf("Can not use WithID(string) for %s httpVerb", r.httpVerb)
		r.err = errors.New(errMessage)
		return r
	}
}
func (r *Request) WithTemplate(tempRequest *Request) *Request {
	return tempRequest
}
func (r *Request) Get() *Request {
	r.httpVerb = GET
	return r
}
func (r *Request) Head() *Request {
	r.httpVerb = HEAD
	return r
}
func (r *Request) Post() *Request {
	r.httpVerb = POST
	return r
}
func (r *Request) PostForm() *Request {
	r.httpVerb = POST
	return r.WithHeaders(headers.contextType, "application/x-www-form-urlencoded")
}
func (r *Request) Put() *Request {
	r.httpVerb = PUT
	return r
}
func (r *Request) Patch() *Request {
	r.httpVerb = PATCH
	return r
}
func (r *Request) Delete() *Request {
	r.httpVerb = DELETE
	return r
}
func (r *Request) Connect() *Request {
	r.httpVerb = CONNECT
	return r
}
func (r *Request) Options() *Request {
	r.httpVerb = OPTIONS
	return r
}
func (r *Request) Trace() *Request {
	r.httpVerb = TRACE
	return r
}