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 +}