Milan Pavlik 938466da0d fix
2023-01-04 11:13:44 +01:00

102 lines
2.5 KiB
Go

// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
// Licensed under the GNU Affero General Public License (AGPL).
// See License.AGPL.txt in the project root for license information.
package client
import (
"errors"
"fmt"
"github.com/bufbuild/connect-go"
gitpod_experimental_v1connect "github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1/v1connect"
"net/http"
)
type Gitpod struct {
cfg *options
Workspaces gitpod_experimental_v1connect.WorkspacesServiceClient
Teams gitpod_experimental_v1connect.TeamsServiceClient
Projects gitpod_experimental_v1connect.ProjectsServiceClient
PersonalAccessTokens gitpod_experimental_v1connect.TokensServiceClient
}
func New(options ...Option) (*Gitpod, error) {
opts, err := evaluateOptions(defaultOptions(), options...)
if err != nil {
return nil, fmt.Errorf("failed to evaluate client options: %w", err)
}
if opts.credentials == "" {
return nil, errors.New("no authentication credentials specified")
}
client := opts.client
url := opts.url
serviceOpts := []connect.ClientOption{
connect.WithInterceptors(
AuthorizationInterceptor(opts.credentials),
),
}
teams := gitpod_experimental_v1connect.NewTeamsServiceClient(client, url, serviceOpts...)
projects := gitpod_experimental_v1connect.NewProjectsServiceClient(client, url, serviceOpts...)
tokens := gitpod_experimental_v1connect.NewTokensServiceClient(client, url, serviceOpts...)
workspaces := gitpod_experimental_v1connect.NewWorkspacesServiceClient(client, url, serviceOpts...)
return &Gitpod{
cfg: opts,
Teams: teams,
Projects: projects,
PersonalAccessTokens: tokens,
Workspaces: workspaces,
}, nil
}
type Option func(opts *options) error
func WithURL(url string) Option {
return func(opts *options) error {
opts.url = url
return nil
}
}
func WithCredentials(token string) Option {
return func(opts *options) error {
opts.credentials = token
return nil
}
}
func WithHTTPClient(client *http.Client) Option {
return func(opts *options) error {
opts.client = client
return nil
}
}
type options struct {
url string
client *http.Client
credentials string
}
func defaultOptions() *options {
return &options{
url: "https://api.gitpod.io",
client: http.DefaultClient,
}
}
func evaluateOptions(base *options, opts ...Option) (*options, error) {
for _, opt := range opts {
if err := opt(base); err != nil {
return nil, fmt.Errorf("failed to evaluate options: %w", err)
}
}
return base, nil
}