Select Git revision
item_test.go
action_url.go 1.89 KiB
package extension
import (
"net/url"
"strings"
"git.perx.ru/perxis/perxis-go/pkg/errors"
)
// ActionURL структура для хранения данных о переданном действии
type ActionURL struct {
actionURL string
actionID string
extensionID string
scheme string
url *url.URL
}
// NewActionURL возвращает пустую структуру ActionURL, если передано пустое действие
// при передаче в функцию действия - заполняет структуру
func NewActionURL(action string) (*ActionURL, error) {
if action != "" {
parsedURL, err := parseActionURL(action)
if err != nil {
return nil, err
}
return parsedURL, nil
}
return &ActionURL{}, nil
}
// ID возвращает сохраненный в ActionURL id действия
func (p *ActionURL) ID() string {
return p.actionID
}
// ExtensionID возвращает сохраненный в ActionURL id расширения
func (p *ActionURL) ExtensionID() string {
return p.extensionID
}
// Scheme возвращает сохраненную в ActionURL схему
func (p *ActionURL) Scheme() string {
return p.scheme
}
// parseActionURL функция для заполнения структуры ActionURL из переданного действия
func parseActionURL(action string) (*ActionURL, error) {
u, err := url.Parse(action)
if err != nil {
return nil, err
}
parsed := &ActionURL{}
parsed.actionURL = action
parsed.url = u
parsed.scheme = u.Scheme
if parsed.Scheme() == "grpc" {
path := u.Path
if strings.HasPrefix(u.Path, "/") {
path = u.Path[1:]
}
splitPath := strings.Split(path, "/")
if len(splitPath) < 2 {
return nil, errors.Errorf("incorrect action URL, no action id: '%s'", action)
}
parsed.extensionID = splitPath[0]
parsed.actionID = splitPath[1]
}
return parsed, nil
}