snapshot of https://github.com/ent/ent.git (master, 2026-09-15; blobs > 131072B omitted)
This commit is contained in:
77
dialect/gremlin/client.go
Normal file
77
dialect/gremlin/client.go
Normal file
@@ -0,0 +1,77 @@
|
||||
// Copyright 2019-present Facebook Inc. All rights reserved.
|
||||
// This source code is licensed under the Apache 2.0 license found
|
||||
// in the LICENSE file in the root directory of this source tree.
|
||||
|
||||
package gremlin
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// RoundTripper is an interface representing the ability to execute a
|
||||
// single gremlin transaction, obtaining the Response for a given Request.
|
||||
type RoundTripper interface {
|
||||
RoundTrip(context.Context, *Request) (*Response, error)
|
||||
}
|
||||
|
||||
// The RoundTripperFunc type is an adapter to allow the use of ordinary functions as Gremlin RoundTripper.
|
||||
type RoundTripperFunc func(context.Context, *Request) (*Response, error)
|
||||
|
||||
// RoundTrip calls f(ctx, r).
|
||||
func (f RoundTripperFunc) RoundTrip(ctx context.Context, r *Request) (*Response, error) {
|
||||
return f(ctx, r)
|
||||
}
|
||||
|
||||
// Interceptor provides a hook to intercept the execution of a Gremlin Request.
|
||||
type Interceptor func(RoundTripper) RoundTripper
|
||||
|
||||
// A Client is a gremlin client.
|
||||
type Client struct {
|
||||
// Transport specifies the mechanism by which individual
|
||||
// Gremlin requests are made.
|
||||
Transport RoundTripper
|
||||
}
|
||||
|
||||
// MaxResponseSize defines the maximum response size allowed.
|
||||
const MaxResponseSize = 2 << 20
|
||||
|
||||
// NewClient creates a gremlin client from config and options.
|
||||
func NewClient(cfg Config, opt ...Option) (*Client, error) {
|
||||
return cfg.Build(opt...)
|
||||
}
|
||||
|
||||
// NewHTTPClient creates an http based gremlin client.
|
||||
func NewHTTPClient(url string, client *http.Client) (*Client, error) {
|
||||
transport, err := NewHTTPTransport(url, client)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &Client{transport}, nil
|
||||
}
|
||||
|
||||
// Do sends a gremlin request and returns a gremlin response.
|
||||
func (c Client) Do(ctx context.Context, req *Request) (*Response, error) {
|
||||
rsp, err := c.Transport.RoundTrip(ctx, req)
|
||||
if err == nil {
|
||||
err = rsp.Err()
|
||||
}
|
||||
|
||||
// If we got an error, and the context has been canceled,
|
||||
// the context's error is probably more useful.
|
||||
if err != nil && ctx.Err() != nil {
|
||||
err = ctx.Err()
|
||||
}
|
||||
return rsp, err
|
||||
}
|
||||
|
||||
// Query issues an eval request via the Do function.
|
||||
func (c Client) Query(ctx context.Context, query string) (*Response, error) {
|
||||
return c.Do(ctx, NewEvalRequest(query))
|
||||
}
|
||||
|
||||
// Queryf formats a query string and invokes Query.
|
||||
func (c Client) Queryf(ctx context.Context, format string, args ...any) (*Response, error) {
|
||||
return c.Query(ctx, fmt.Sprintf(format, args...))
|
||||
}
|
||||
Reference in New Issue
Block a user