Select Git revision
server.go 5.17 KiB
package extension
import (
"context"
"strings"
"git.perx.ru/perxis/perxis-go/pkg/action"
"git.perx.ru/perxis/perxis-go/pkg/errors"
"git.perx.ru/perxis/perxis-go/pkg/operation"
pb "git.perx.ru/perxis/perxis-go/proto/extensions"
"google.golang.org/protobuf/proto"
)
type Server struct {
extensions map[string]Extension
operations operation.Service
pb.UnimplementedExtensionServiceServer
}
func NewServer(operation operation.Service, extensions ...Extension) *Server {
srv := &Server{
extensions: make(map[string]Extension, len(extensions)),
// todo: нужно как-то неявно создавать и регистрировать сервер операций
operations: operation,
}
for _, s := range extensions {
srv.extensions[s.GetDescriptor().Extension] = s
}
return srv
}
func (s *Server) getExtensions(_ context.Context, extensions []string) ([]Extension, error) {
var res []Extension
for _, ext := range extensions {
e, ok := s.extensions[ext]
if !ok {
return nil, errors.Wrap(ErrUnknownExtension, ext)
}
res = append(res, e)
}
return res, nil
}
func (s *Server) Install(ctx context.Context, req *InstallRequest) (*operation.Proto, error) {
exts, err := s.getExtensions(ctx, req.Extensions)
if err != nil {
return nil, err
}
desc := "Install extensions " + strings.Join(req.Extensions, ", ")
op, err := s.operations.Create(ctx, desc,
func(ctx context.Context) (proto.Message, error) {
for _, ext := range exts {
if err := ext.Install(ctx, req); err != nil {
return nil, errors.Wrap(err, ext.GetDescriptor().Extension)
}
}
return nil, nil
})
return op.Proto(), err
}
func (s *Server) Uninstall(ctx context.Context, req *UninstallRequest) (*operation.Proto, error) {
exts, err := s.getExtensions(ctx, req.Extensions)
if err != nil {
return nil, err
}