You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
7.0 KiB
172 lines
7.0 KiB
//
|
|
// DISCLAIMER
|
|
//
|
|
// Copyright 2017 ArangoDB GmbH, Cologne, Germany
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
// Copyright holder is ArangoDB GmbH, Cologne, Germany
|
|
//
|
|
// Author Ewout Prangsma
|
|
//
|
|
|
|
package driver
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"errors"
|
|
|
|
velocypack "github.com/arangodb/go-velocypack"
|
|
)
|
|
|
|
// Connection is a connection to a database server using a specific protocol.
|
|
type Connection interface {
|
|
// NewRequest creates a new request with given method and path.
|
|
NewRequest(method, path string) (Request, error)
|
|
|
|
// Do performs a given request, returning its response.
|
|
Do(ctx context.Context, req Request) (Response, error)
|
|
|
|
// Unmarshal unmarshals the given raw object into the given result interface.
|
|
Unmarshal(data RawObject, result interface{}) error
|
|
|
|
// Endpoints returns the endpoints used by this connection.
|
|
Endpoints() []string
|
|
|
|
// UpdateEndpoints reconfigures the connection to use the given endpoints.
|
|
UpdateEndpoints(endpoints []string) error
|
|
|
|
// SetAuthentication creates a copy of connection wrapper for given auth parameters.
|
|
SetAuthentication(Authentication) (Connection, error)
|
|
|
|
// Protocols returns all protocols used by this connection.
|
|
Protocols() ProtocolSet
|
|
}
|
|
|
|
// Request represents the input to a request on the server.
|
|
type Request interface {
|
|
// SetQuery sets a single query argument of the request.
|
|
// Any existing query argument with the same key is overwritten.
|
|
SetQuery(key, value string) Request
|
|
// SetBody sets the content of the request.
|
|
// The protocol of the connection determines what kinds of marshalling is taking place.
|
|
// When multiple bodies are given, they are merged, with fields in the first document prevailing.
|
|
SetBody(body ...interface{}) (Request, error)
|
|
// SetBodyArray sets the content of the request as an array.
|
|
// If the given mergeArray is not nil, its elements are merged with the elements in the body array (mergeArray data overrides bodyArray data).
|
|
// The merge is NOT recursive.
|
|
// The protocol of the connection determines what kinds of marshalling is taking place.
|
|
SetBodyArray(bodyArray interface{}, mergeArray []map[string]interface{}) (Request, error)
|
|
// SetBodyImportArray sets the content of the request as an array formatted for importing documents.
|
|
// The protocol of the connection determines what kinds of marshalling is taking place.
|
|
SetBodyImportArray(bodyArray interface{}) (Request, error)
|
|
// SetHeader sets a single header arguments of the request.
|
|
// Any existing header argument with the same key is overwritten.
|
|
SetHeader(key, value string) Request
|
|
// Written returns true as soon as this request has been written completely to the network.
|
|
// This does not guarantee that the server has received or processed the request.
|
|
Written() bool
|
|
// Clone creates a new request containing the same data as this request
|
|
Clone() Request
|
|
// Path returns the Request path
|
|
Path() string
|
|
// Method returns the Request method
|
|
Method() string
|
|
}
|
|
|
|
type BodyBuilder interface {
|
|
// GetBody returns data which are generated by the body builder
|
|
GetBody() []byte
|
|
// SetBody sets the content of the request.
|
|
// The protocol of the connection determines what kinds of marshalling is taking place.
|
|
// When multiple bodies are given, they are merged, with fields in the first document prevailing.
|
|
SetBody(body ...interface{}) error
|
|
// SetBodyArray sets the content of the request as an array.
|
|
// If the given mergeArray is not nil, its elements are merged with the elements in the body array (mergeArray data overrides bodyArray data).
|
|
// The merge is NOT recursive.
|
|
// The protocol of the connection determines what kinds of marshalling is taking place.
|
|
SetBodyArray(bodyArray interface{}, mergeArray []map[string]interface{}) error
|
|
// SetBodyImportArray sets the content of the request as an array formatted for importing documents.
|
|
// The protocol of the connection determines what kinds of marshalling is taking place.
|
|
SetBodyImportArray(bodyArray interface{}) error
|
|
// GetContentType returns the type of the data in a body
|
|
GetContentType() string
|
|
// Clone creates new Body builder
|
|
Clone() BodyBuilder
|
|
}
|
|
|
|
// Response represents the response from the server on a given request.
|
|
type Response interface {
|
|
// StatusCode returns an HTTP compatible status code of the response.
|
|
StatusCode() int
|
|
// Endpoint returns the endpoint that handled the request.
|
|
Endpoint() string
|
|
// CheckStatus checks if the status of the response equals to one of the given status codes.
|
|
// If so, nil is returned.
|
|
// If not, an attempt is made to parse an error response in the body and an error is returned.
|
|
CheckStatus(validStatusCodes ...int) error
|
|
// Header returns the value of a response header with given key.
|
|
// If no such header is found, an empty string is returned.
|
|
// On nested Response's, this function will always return an empty string.
|
|
Header(key string) string
|
|
// ParseBody performs protocol specific unmarshalling of the response data into the given result.
|
|
// If the given field is non-empty, the contents of that field will be parsed into the given result.
|
|
// This can only be used for requests that return a single object.
|
|
ParseBody(field string, result interface{}) error
|
|
// ParseArrayBody performs protocol specific unmarshalling of the response array data into individual response objects.
|
|
// This can only be used for requests that return an array of objects.
|
|
ParseArrayBody() ([]Response, error)
|
|
}
|
|
|
|
// RawObject is a raw encoded object.
|
|
// Connection implementations must be able to unmarshal *RawObject into Go objects.
|
|
type RawObject []byte
|
|
|
|
// MarshalJSON returns *r as the JSON encoding of r.
|
|
func (r *RawObject) MarshalJSON() ([]byte, error) {
|
|
return *r, nil
|
|
}
|
|
|
|
// UnmarshalJSON sets *r to a copy of data.
|
|
func (r *RawObject) UnmarshalJSON(data []byte) error {
|
|
if r == nil {
|
|
return errors.New("RawObject: UnmarshalJSON on nil pointer")
|
|
}
|
|
*r = append((*r)[0:0], data...)
|
|
return nil
|
|
}
|
|
|
|
// Ensure RawObject implements json.Marshaler & json.Unmarshaler
|
|
var _ json.Marshaler = (*RawObject)(nil)
|
|
var _ json.Unmarshaler = (*RawObject)(nil)
|
|
|
|
// MarshalVPack returns m as the Velocypack encoding of m.
|
|
func (r RawObject) MarshalVPack() (velocypack.Slice, error) {
|
|
if r == nil {
|
|
return velocypack.NullSlice(), nil
|
|
}
|
|
return velocypack.Slice(r), nil
|
|
}
|
|
|
|
// UnmarshalVPack sets *m to a copy of data.
|
|
func (r *RawObject) UnmarshalVPack(data velocypack.Slice) error {
|
|
if r == nil {
|
|
return errors.New("velocypack.RawSlice: UnmarshalVPack on nil pointer")
|
|
}
|
|
*r = append((*r)[0:0], data...)
|
|
return nil
|
|
}
|
|
|
|
var _ velocypack.Marshaler = (*RawObject)(nil)
|
|
var _ velocypack.Unmarshaler = (*RawObject)(nil)
|
|
|