forked from TrueCloudLab/frostfs-api-go
[#126] sdk: add sdk client for all available api requests
Signed-off-by: Alex Vanin <alexey@nspcc.ru>
This commit is contained in:
parent
10137b44dd
commit
86e6221b76
3 changed files with 196 additions and 0 deletions
9
pkg/accounting/decimal.go
Normal file
9
pkg/accounting/decimal.go
Normal file
|
@ -0,0 +1,9 @@
|
|||
package accounting
|
||||
|
||||
import (
|
||||
"github.com/nspcc-dev/neofs-api-go/v2/accounting"
|
||||
)
|
||||
|
||||
type Decimal struct {
|
||||
accounting.Decimal
|
||||
}
|
50
pkg/client/client.go
Normal file
50
pkg/client/client.go
Normal file
|
@ -0,0 +1,50 @@
|
|||
package client
|
||||
|
||||
import (
|
||||
"crypto/ecdsa"
|
||||
"errors"
|
||||
|
||||
"github.com/nspcc-dev/neofs-api-go/pkg"
|
||||
)
|
||||
|
||||
type (
|
||||
Client struct {
|
||||
key *ecdsa.PrivateKey
|
||||
remoteNode TransportInfo
|
||||
|
||||
opts *clientOptions
|
||||
}
|
||||
|
||||
TransportProtocol uint32
|
||||
|
||||
TransportInfo struct {
|
||||
Version pkg.Version
|
||||
Protocol TransportProtocol
|
||||
}
|
||||
)
|
||||
|
||||
const (
|
||||
Unknown TransportProtocol = iota
|
||||
GRPC
|
||||
)
|
||||
|
||||
var (
|
||||
unsupportedProtocolErr = errors.New("unsupported transport protocol")
|
||||
)
|
||||
|
||||
func New(key *ecdsa.PrivateKey, opts ...ClientOption) (*Client, error) {
|
||||
clientOptions := defaultClientOptions()
|
||||
for i := range opts {
|
||||
opts[i].apply(clientOptions)
|
||||
}
|
||||
|
||||
// todo: make handshake to check latest version
|
||||
return &Client{
|
||||
key: key,
|
||||
remoteNode: TransportInfo{
|
||||
Version: pkg.SDKVersion,
|
||||
Protocol: GRPC,
|
||||
},
|
||||
opts: clientOptions,
|
||||
}, nil
|
||||
}
|
137
pkg/client/opts.go
Normal file
137
pkg/client/opts.go
Normal file
|
@ -0,0 +1,137 @@
|
|||
package client
|
||||
|
||||
import (
|
||||
"github.com/nspcc-dev/neofs-api-go/pkg"
|
||||
v2accounting "github.com/nspcc-dev/neofs-api-go/v2/accounting"
|
||||
v2container "github.com/nspcc-dev/neofs-api-go/v2/container"
|
||||
v2session "github.com/nspcc-dev/neofs-api-go/v2/session"
|
||||
"google.golang.org/grpc"
|
||||
)
|
||||
|
||||
type (
|
||||
CallOption interface {
|
||||
apply(*callOptions)
|
||||
}
|
||||
|
||||
ClientOption interface {
|
||||
apply(*clientOptions)
|
||||
}
|
||||
|
||||
xHeader struct {
|
||||
v2session.XHeader
|
||||
}
|
||||
|
||||
callOptions struct {
|
||||
version pkg.Version
|
||||
xHeaders []xHeader
|
||||
ttl uint32
|
||||
epoch uint64
|
||||
// add session token
|
||||
// add bearer token
|
||||
}
|
||||
|
||||
clientOptions struct {
|
||||
addr string
|
||||
|
||||
grpcOpts *grpcOptions
|
||||
}
|
||||
|
||||
grpcOptions struct {
|
||||
conn *grpc.ClientConn
|
||||
v2ContainerClient *v2container.Client
|
||||
v2AccountingClient *v2accounting.Client
|
||||
}
|
||||
)
|
||||
|
||||
func defaultCallOptions() callOptions {
|
||||
return callOptions{
|
||||
ttl: 2,
|
||||
version: pkg.SDKVersion,
|
||||
}
|
||||
}
|
||||
|
||||
type funcCallOption struct {
|
||||
f func(*callOptions)
|
||||
}
|
||||
|
||||
func (fco *funcCallOption) apply(co *callOptions) {
|
||||
fco.f(co)
|
||||
}
|
||||
|
||||
func newFuncCallOption(f func(option *callOptions)) *funcCallOption {
|
||||
return &funcCallOption{
|
||||
f: f,
|
||||
}
|
||||
}
|
||||
|
||||
func WithXHeader(key, value string) CallOption {
|
||||
return newFuncCallOption(func(option *callOptions) {
|
||||
xhdr := new(v2session.XHeader)
|
||||
xhdr.SetKey(key)
|
||||
xhdr.SetValue(value)
|
||||
|
||||
option.xHeaders = append(option.xHeaders, xHeader{
|
||||
XHeader: *xhdr,
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func WithTTL(ttl uint32) CallOption {
|
||||
return newFuncCallOption(func(option *callOptions) {
|
||||
option.ttl = ttl
|
||||
})
|
||||
}
|
||||
|
||||
func WithEpoch(epoch uint64) CallOption {
|
||||
return newFuncCallOption(func(option *callOptions) {
|
||||
option.epoch = epoch
|
||||
})
|
||||
}
|
||||
|
||||
func v2MetaHeaderFromOpts(options callOptions) *v2session.RequestMetaHeader {
|
||||
meta := new(v2session.RequestMetaHeader)
|
||||
meta.SetVersion(options.version.ToV2Version())
|
||||
meta.SetTTL(options.ttl)
|
||||
meta.SetEpoch(options.epoch)
|
||||
|
||||
xhdrs := make([]*v2session.XHeader, len(options.xHeaders))
|
||||
for i := range options.xHeaders {
|
||||
xhdrs[i] = &options.xHeaders[i].XHeader
|
||||
}
|
||||
|
||||
meta.SetXHeaders(xhdrs)
|
||||
|
||||
return meta
|
||||
}
|
||||
|
||||
func defaultClientOptions() *clientOptions {
|
||||
return &clientOptions{
|
||||
grpcOpts: new(grpcOptions),
|
||||
}
|
||||
}
|
||||
|
||||
type funcClientOption struct {
|
||||
f func(*clientOptions)
|
||||
}
|
||||
|
||||
func (fco *funcClientOption) apply(co *clientOptions) {
|
||||
fco.f(co)
|
||||
}
|
||||
|
||||
func newFuncClientOption(f func(option *clientOptions)) *funcClientOption {
|
||||
return &funcClientOption{
|
||||
f: f,
|
||||
}
|
||||
}
|
||||
|
||||
func WithAddress(addr string) ClientOption {
|
||||
return newFuncClientOption(func(option *clientOptions) {
|
||||
option.addr = addr
|
||||
})
|
||||
}
|
||||
|
||||
func WithGRPCConnection(grpcConn *grpc.ClientConn) ClientOption {
|
||||
return newFuncClientOption(func(option *clientOptions) {
|
||||
option.grpcOpts.conn = grpcConn
|
||||
})
|
||||
}
|
Loading…
Reference in a new issue