From 42e7565c10ed57ef9751f117094fa3960410c100 Mon Sep 17 00:00:00 2001 From: Maxim Lebedev Date: Thu, 30 Dec 2021 01:06:54 +0500 Subject: [PATCH] :label: Added custom URL domain --- internal/domain/url.go | 61 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 internal/domain/url.go diff --git a/internal/domain/url.go b/internal/domain/url.go new file mode 100644 index 0000000..6ef003a --- /dev/null +++ b/internal/domain/url.go @@ -0,0 +1,61 @@ +package domain + +import ( + "strconv" + "testing" + + http "github.com/valyala/fasthttp" +) + +type URL struct { + *http.URI +} + +func NewURL(src string) (*URL, error) { + u := &URL{ + URI: http.AcquireURI(), + } + if err := u.URI.Parse(nil, []byte(src)); err != nil { + return nil, err + } + + return u, nil +} + +func TestURL(tb testing.TB, src string) *URL { + tb.Helper() + + u := http.AcquireURI() + u.Update(src) + + return &URL{ + URI: u, + } +} + +func (u *URL) UnmarshalForm(v []byte) error { + url, err := NewURL(string(v)) + if err != nil { + return err + } + + *u = *url + + return nil +} + +func (u *URL) UnmarshalJSON(v []byte) error { + src, err := strconv.Unquote(string(v)) + if err != nil { + return err + } + + url, err := NewURL(src) + if err != nil { + return err + } + + *u = *url + + return nil +}