From 8489e58d2d216f7ad40f68df46dcc93f6dce5892 Mon Sep 17 00:00:00 2001
From: ko_oler <kooler89@gmail.com>
Date: Tue, 20 Jun 2023 16:08:47 +0300
Subject: [PATCH] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BF?=
 =?UTF-8?q?=D0=BE=20=D0=9F=D0=A0:=20-=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA?=
 =?UTF-8?q?=D0=B8=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=B5=D1=81=D0=B5=D0=BD?=
 =?UTF-8?q?=D1=8B=20=D0=B2=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD?=
 =?UTF-8?q?=D0=BD=D1=8B=D0=B5/=D0=BA=D0=BE=D0=BD=D1=81=D1=82=D0=B0=D0=BD?=
 =?UTF-8?q?=D1=82=D1=8B=20-=20=D1=87=D0=B0=D1=81=D1=82=D1=8C=20=D0=BE?=
 =?UTF-8?q?=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20=D1=83=D0=B1=D1=80=D0=B0=D0=BD?=
 =?UTF-8?q?=D0=B0=20=D0=B2=20=D0=B4=D0=B5=D1=82=D0=B0=D0=BB=D0=B8=20-=20?=
 =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20Trim=20?=
 =?UTF-8?q?=D0=B8=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B0=20?=
 =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D1=83=D1=81=D1=82=D0=BE=D1=82=D1=83=20?=
 =?UTF-8?q?=D0=B2=20ValidateID()?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pkg/id/id.go      | 29 ++++++++++++++++++++---------
 pkg/id/id_test.go |  5 -----
 2 files changed, 20 insertions(+), 14 deletions(-)

diff --git a/pkg/id/id.go b/pkg/id/id.go
index 090fda2c..5093398e 100644
--- a/pkg/id/id.go
+++ b/pkg/id/id.go
@@ -2,36 +2,47 @@ package id
 
 import (
 	"regexp"
+	"strings"
 
 	"git.perx.ru/perxis/perxis-go/pkg/errors"
 	"github.com/rs/xid"
 )
 
 const (
-	IDMaxLength   = 64
-	NameMaxLength = 256
+	MaxLengthID   = 64
+	MaxLengthName = 256
 )
 
-var isValidID = regexp.MustCompile(`^[A-Za-z][A-Za-z0-9-_]*$`).MatchString
+var (
+	ErrEmptyID    = errors.New("empty ID")
+	ErrNotValidID = errors.New("id contains invalid characters")
+	ErrLongID     = errors.New("id too long (max 64 symbols)")
+	ErrLongName   = errors.New("name too long (max 256 symbols)")
+	isValidID     = regexp.MustCompile(`^[A-Za-z][A-Za-z0-9-_]*$`).MatchString
+)
 
 func GenerateNewID() string {
 	return xid.New().String()
 }
 
 func ValidateID(id string) error {
-	if len(id) > IDMaxLength {
-		return errors.New("invalid id: too long (max 64 symbols)")
+	trimmedID := strings.TrimSpace(id)
+	if trimmedID == "" {
+		return ErrEmptyID
+	}
+	if len(trimmedID) > MaxLengthID {
+		return ErrLongID
 	}
-	if !isValidID(id) {
-		return errors.New("invalid id: must begin with latin letters and contain latin letters, numbers or '-', '_'")
+	if !isValidID(trimmedID) {
+		return errors.WithDetail(ErrNotValidID, "must begin with latin letters and contain latin letters, numbers or '-', '_'")
 	}
 
 	return nil
 }
 
 func ValidateName(name string) error {
-	if len(name) > NameMaxLength {
-		return errors.New("invalid name: too long (max 256 symbols)")
+	if len(name) > MaxLengthName {
+		return ErrLongName
 	}
 
 	return nil
diff --git a/pkg/id/id_test.go b/pkg/id/id_test.go
index 640b67da..39a0a690 100644
--- a/pkg/id/id_test.go
+++ b/pkg/id/id_test.go
@@ -28,11 +28,6 @@ func TestValidateID(t *testing.T) {
 			"1test",
 			true,
 		},
-		{
-			"Fail, ID starts with whitespace",
-			" test",
-			true,
-		},
 		{
 			"Fail, ID to long",
 			"9QoulAlFbIcnQYLSudMistN1IczCWrXUTtN5EgNQJd516DN9UjXYJxieJ1RcsNcs1",
-- 
GitLab