Commit eb09c8f

mo khan <mo@mokhan.ca>
2025-05-07 14:34:19
feat: add helper for writing cookie to response writer
1 parent 94ffbad
pkg/cookie/expire.go
@@ -6,6 +6,14 @@ import (
 	"github.com/xlgmokha/x/pkg/x"
 )
 
+func Write(w http.ResponseWriter, cookie *http.Cookie) {
+	http.SetCookie(w, cookie)
+}
+
+func WriteWith(w http.ResponseWriter, options ...x.Option[*http.Cookie]) {
+	Write(w, x.New[*http.Cookie](options...))
+}
+
 func Expire(w http.ResponseWriter, name string, options ...x.Option[*http.Cookie]) {
-	http.SetCookie(w, Reset(name, options...))
+	Write(w, Reset(name, options...))
 }
pkg/cookie/expire_test.go
@@ -4,6 +4,7 @@ import (
 	"net/http"
 	"net/http/httptest"
 	"testing"
+	"time"
 
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
@@ -16,7 +17,10 @@ func TestExpire(t *testing.T) {
 
 	cookie, err := http.ParseSetCookie(w.Header().Get("Set-Cookie"))
 	require.NoError(t, err)
+
+	assert.Empty(t, cookie.Value)
 	assert.Equal(t, "example", cookie.Name)
-	assert.Equal(t, "", cookie.Value)
 	assert.Equal(t, "example.com", cookie.Domain)
+	assert.Equal(t, -1, cookie.MaxAge)
+	assert.Equal(t, time.Unix(0, 0).Unix(), cookie.Expires.Unix())
 }
pkg/cookie/new.go
@@ -7,11 +7,5 @@ import (
 )
 
 func New(name string, options ...x.Option[*http.Cookie]) *http.Cookie {
-	options = x.Prepend[x.Option[*http.Cookie]](
-		options,
-		With(func(c *http.Cookie) {
-			c.Name = name
-		}),
-	)
-	return x.New[*http.Cookie](options...)
+	return x.New[*http.Cookie](x.Prepend[x.Option[*http.Cookie]](options, WithName(name))...)
 }
pkg/cookie/option.go
@@ -14,6 +14,12 @@ func With(with x.Configure[*http.Cookie]) x.Option[*http.Cookie] {
 	return x.With[*http.Cookie](with)
 }
 
+func WithName(name string) x.Option[*http.Cookie] {
+	return With(func(c *http.Cookie) {
+		c.Name = name
+	})
+}
+
 func WithValue(value string) x.Option[*http.Cookie] {
 	return With(func(c *http.Cookie) {
 		c.Value = value
pkg/cookie/reset.go
@@ -8,11 +8,9 @@ import (
 )
 
 func Reset(name string, options ...x.Option[*http.Cookie]) *http.Cookie {
-	options = append(
+	return New(name, append(
 		options,
 		WithValue(""),
 		WithExpiration(time.Unix(0, 0)),
-	)
-
-	return New(name, options...)
+	)...)
 }
pkg/cookie/reset_test.go
@@ -17,12 +17,12 @@ func TestReset(t *testing.T) {
 		WithDomain("example.com"),
 	)
 
-	assert.Equal(t, -1, result.MaxAge)
-	assert.Equal(t, time.Unix(0, 0), result.Expires)
 	assert.Empty(t, result.Value)
+	assert.Equal(t, "example", result.Name)
+	assert.Equal(t, "example.com", result.Domain)
+	assert.Equal(t, -1, result.MaxAge)
+	assert.Equal(t, http.SameSiteDefaultMode, result.SameSite)
 	assert.Equal(t, time.Unix(0, 0), result.Expires)
 	assert.True(t, result.HttpOnly)
 	assert.True(t, result.Secure)
-	assert.Equal(t, http.SameSiteDefaultMode, result.SameSite)
-	assert.Equal(t, "example.com", result.Domain)
 }