Subject: [PATCH links] Simple cleanup.

From: Peter Sanchez <[email-masked]>
Date: Thu, 14 Aug 2025 15:57:49 -0600

- Removing interface{} from codebase
- Modernizing some loops
---
 api/directives/directives.go |  10 +-
 api/graph/model/cursor.go    |   2 +-
 cmd/global.go                |   2 +-
 core/routes.go               |   2 +-
 pinboard/routes_test.go      | 256 +++++++++++++++++------------------
 valid/valid.go               |  25 ++--
 6 files changed, 147 insertions(+), 150 deletions(-)

diff --git a/api/directives/directives.go b/api/directives/directives.go
index 3faabcf..fd58eb8 100644
--- a/api/directives/directives.go
+++ b/api/directives/directives.go
@@ -10,7 +10,7 @@ import (
 )
 
 // Admin ...
-func Admin(ctx context.Context, obj interface{}, next graphql.Resolver) (interface{}, error) {
+func Admin(ctx context.Context, obj any, next graphql.Resolver) (any, error) {
 	tokenUser := oauth2.ForContext(ctx)
 	if tokenUser == nil {
 		return nil, fmt.Errorf("Admin auth access denied")
@@ -22,7 +22,7 @@ func Admin(ctx context.Context, obj interface{}, next graphql.Resolver) (interfa
 }
 
 // Internal ...
-func Internal(ctx context.Context, obj interface{}, next graphql.Resolver) (interface{}, error) {
+func Internal(ctx context.Context, obj any, next graphql.Resolver) (any, error) {
 	tokenUser := oauth2.ForContext(ctx)
 	if tokenUser == nil {
 		return nil, fmt.Errorf("Internal auth access denied")
@@ -34,7 +34,7 @@ func Internal(ctx context.Context, obj interface{}, next graphql.Resolver) (inte
 }
 
 // Private ...
-func Private(ctx context.Context, obj interface{}, next graphql.Resolver) (interface{}, error) {
+func Private(ctx context.Context, obj any, next graphql.Resolver) (any, error) {
 	tokenUser := oauth2.ForContext(ctx)
 	if tokenUser == nil {
 		return nil, fmt.Errorf("Private auth access denied")
@@ -53,8 +53,8 @@ func Private(ctx context.Context, obj interface{}, next graphql.Resolver) (inter
 }
 
 // Access ...
-func Access(ctx context.Context, obj interface{}, next graphql.Resolver,
-	scope string, kind string) (interface{}, error) {
+func Access(ctx context.Context, obj any, next graphql.Resolver,
+	scope string, kind string) (any, error) {
 
 	tokenUser := oauth2.ForContext(ctx)
 	if tokenUser == nil {
diff --git a/api/graph/model/cursor.go b/api/graph/model/cursor.go
index ed571b3..644c56e 100644
--- a/api/graph/model/cursor.go
+++ b/api/graph/model/cursor.go
@@ -20,7 +20,7 @@ type Cursor struct {
 	Limit  int
 }
 
-func (c *Cursor) UnmarshalGQL(v interface{}) error {
+func (c *Cursor) UnmarshalGQL(v any) error {
 	enc, ok := v.(string)
 	if !ok {
 		return fmt.Errorf("cursor must be strings")
diff --git a/cmd/global.go b/cmd/global.go
index 1b07240..e965707 100644
--- a/cmd/global.go
+++ b/cmd/global.go
@@ -27,7 +27,7 @@ func RunMigrations(t *testing.T, db *sql.DB) {
 	)
 
 	engine := migrate.NewEngine(db, migrations, migrate.DOLLAR, false)
-	engine.Printf = func(format string, args ...interface{}) (int, error) {
+	engine.Printf = func(format string, args ...any) (int, error) {
 		t.Logf(format, args...)
 		return 0, nil
 	}
diff --git a/core/routes.go b/core/routes.go
index 163f504..5e8fd53 100644
--- a/core/routes.go
+++ b/core/routes.go
@@ -2159,7 +2159,7 @@ func (s *Service) OrgLinksList(c echo.Context) error {
 	cloudType := model.CloudTypeLinks
 	if c.Path() != c.Echo().Reverse(s.RouteName("recent_link_list")) &&
 		c.Path() != c.Echo().Reverse(s.RouteName("recent_link_list_rss")) {
-		// This means that we want to see a specific org (private or businnes)
+		// This means that we want to see a specific org (private or business)
 		// and not all the recent links
 		slug = links.PullOrgSlug(c)
 		op.Var("slug", slug)
diff --git a/pinboard/routes_test.go b/pinboard/routes_test.go
index b08294b..07bea5b 100644
--- a/pinboard/routes_test.go
+++ b/pinboard/routes_test.go
@@ -106,9 +106,9 @@ func TestPinboardHandlers(t *testing.T) {
 		defer httpmock.DeactivateAndReset()
 
 		httpmock.RegisterResponder("POST", "http://127.0.0.1:8080/query",
-			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]interface{}{
-				"data": map[string]interface{}{
-					"addLink": map[string]interface{}{
+			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]any{
+				"data": map[string]any{
+					"addLink": map[string]any{
 						"hash": "abc123def456",
 					},
 				},
@@ -163,9 +163,9 @@ func TestPinboardHandlers(t *testing.T) {
 		httpmock.Activate()
 		defer httpmock.DeactivateAndReset()
 		httpmock.RegisterResponder("POST", "http://127.0.0.1:8080/query",
-			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]interface{}{
-				"data": map[string]interface{}{
-					"addLink": map[string]interface{}{
+			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]any{
+				"data": map[string]any{
+					"addLink": map[string]any{
 						"hash": "abc123def456",
 					},
 				},
@@ -203,10 +203,10 @@ func TestPinboardHandlers(t *testing.T) {
 				callCount++
 				if callCount == 1 {
 					// First call: find the link
-					return httpmock.NewJsonResponse(http.StatusOK, map[string]interface{}{
-						"data": map[string]interface{}{
-							"getOrgLinks": map[string]interface{}{
-								"result": []map[string]interface{}{
+					return httpmock.NewJsonResponse(http.StatusOK, map[string]any{
+						"data": map[string]any{
+							"getOrgLinks": map[string]any{
+								"result": []map[string]any{
 									{
 										"hash": "abc123",
 										"url":  "https://example.com",
@@ -217,9 +217,9 @@ func TestPinboardHandlers(t *testing.T) {
 					})
 				}
 				// Second call: delete the link
-				return httpmock.NewJsonResponse(http.StatusOK, map[string]interface{}{
-					"data": map[string]interface{}{
-						"deleteLink": map[string]interface{}{
+				return httpmock.NewJsonResponse(http.StatusOK, map[string]any{
+					"data": map[string]any{
+						"deleteLink": map[string]any{
 							"success": true,
 						},
 					},
@@ -250,10 +250,10 @@ func TestPinboardHandlers(t *testing.T) {
 		defer httpmock.DeactivateAndReset()
 
 		httpmock.RegisterResponder("POST", "http://127.0.0.1:8080/query",
-			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]interface{}{
-				"data": map[string]interface{}{
-					"getOrgLinks": map[string]interface{}{
-						"result": []map[string]interface{}{},
+			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]any{
+				"data": map[string]any{
+					"getOrgLinks": map[string]any{
+						"result": []map[string]any{},
 					},
 				},
 			}))
@@ -281,10 +281,10 @@ func TestPinboardHandlers(t *testing.T) {
 		httpmock.Activate()
 		defer httpmock.DeactivateAndReset()
 		httpmock.RegisterResponder("POST", "http://127.0.0.1:8080/query",
-			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]interface{}{
-				"data": map[string]interface{}{
-					"getOrgLinks": map[string]interface{}{
-						"result": []map[string]interface{}{
+			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]any{
+				"data": map[string]any{
+					"getOrgLinks": map[string]any{
+						"result": []map[string]any{
 							{
 								"id":          1,
 								"title":       "Example Title",
@@ -294,7 +294,7 @@ func TestPinboardHandlers(t *testing.T) {
 								"visibility":  "PUBLIC",
 								"unread":      false,
 								"starred":     false,
-								"tags": []map[string]interface{}{
+								"tags": []map[string]any{
 									{"name": "tag1"},
 									{"name": "tag2"},
 								},
@@ -327,10 +327,10 @@ func TestPinboardHandlers(t *testing.T) {
 		httpmock.Activate()
 		defer httpmock.DeactivateAndReset()
 		httpmock.RegisterResponder("POST", "http://127.0.0.1:8080/query",
-			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]interface{}{
-				"data": map[string]interface{}{
-					"getOrgLinks": map[string]interface{}{
-						"result": []map[string]interface{}{
+			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]any{
+				"data": map[string]any{
+					"getOrgLinks": map[string]any{
+						"result": []map[string]any{
 							{
 								"id":          1,
 								"title":       "Example Title",
@@ -340,7 +340,7 @@ func TestPinboardHandlers(t *testing.T) {
 								"visibility":  "PRIVATE",
 								"unread":      true,
 								"starred":     false,
-								"tags":        []map[string]interface{}{},
+								"tags":        []map[string]any{},
 								"createdOn":   "2024-01-15T10:30:00Z",
 								"updatedOn":   "2024-01-15T10:30:00Z",
 							},
@@ -376,8 +376,8 @@ func TestPinboardHandlers(t *testing.T) {
 				body, _ := io.ReadAll(req.Body)
 				// Parse the GraphQL request
 				var gqlReq struct {
-					Query     string                 `json:"query"`
-					Variables map[string]interface{} `json:"variables"`
+					Query     string         `json:"query"`
+					Variables map[string]any `json:"variables"`
 				}
 				if err := json.Unmarshal(body, &gqlReq); err == nil {
 					if limit, ok := gqlReq.Variables["limit"]; ok {
@@ -386,10 +386,10 @@ func TestPinboardHandlers(t *testing.T) {
 						}
 					}
 				}
-				return httpmock.NewJsonResponse(http.StatusOK, map[string]interface{}{
-					"data": map[string]interface{}{
-						"getOrgLinks": map[string]interface{}{
-							"result": []map[string]interface{}{},
+				return httpmock.NewJsonResponse(http.StatusOK, map[string]any{
+					"data": map[string]any{
+						"getOrgLinks": map[string]any{
+							"result": []map[string]any{},
 						},
 					},
 				})
@@ -417,8 +417,8 @@ func TestPinboardHandlers(t *testing.T) {
 				body, _ := io.ReadAll(req.Body)
 				// Parse the GraphQL request
 				var gqlReq struct {
-					Query     string                 `json:"query"`
-					Variables map[string]interface{} `json:"variables"`
+					Query     string         `json:"query"`
+					Variables map[string]any `json:"variables"`
 				}
 				if err := json.Unmarshal(body, &gqlReq); err == nil {
 					if limit, ok := gqlReq.Variables["limit"]; ok {
@@ -427,10 +427,10 @@ func TestPinboardHandlers(t *testing.T) {
 						}
 					}
 				}
-				return httpmock.NewJsonResponse(http.StatusOK, map[string]interface{}{
-					"data": map[string]interface{}{
-						"getOrgLinks": map[string]interface{}{
-							"result": []map[string]interface{}{},
+				return httpmock.NewJsonResponse(http.StatusOK, map[string]any{
+					"data": map[string]any{
+						"getOrgLinks": map[string]any{
+							"result": []map[string]any{},
 						},
 					},
 				})
@@ -452,10 +452,10 @@ func TestPinboardHandlers(t *testing.T) {
 		httpmock.Activate()
 		defer httpmock.DeactivateAndReset()
 		httpmock.RegisterResponder("POST", "http://127.0.0.1:8080/query",
-			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]interface{}{
-				"data": map[string]interface{}{
-					"getOrgLinks": map[string]interface{}{
-						"result": []map[string]interface{}{
+			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]any{
+				"data": map[string]any{
+					"getOrgLinks": map[string]any{
+						"result": []map[string]any{
 							{"createdOn": "2024-01-15T10:30:00Z"},
 							{"createdOn": "2024-01-15T11:30:00Z"},
 							{"createdOn": "2024-01-14T09:00:00Z"},
@@ -487,10 +487,10 @@ func TestPinboardHandlers(t *testing.T) {
 		httpmock.Activate()
 		defer httpmock.DeactivateAndReset()
 		httpmock.RegisterResponder("POST", "http://127.0.0.1:8080/query",
-			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]interface{}{
-				"data": map[string]interface{}{
-					"getOrgLinks": map[string]interface{}{
-						"result": []map[string]interface{}{
+			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]any{
+				"data": map[string]any{
+					"getOrgLinks": map[string]any{
+						"result": []map[string]any{
 							{
 								"id":          1,
 								"title":       "Old Link",
@@ -500,7 +500,7 @@ func TestPinboardHandlers(t *testing.T) {
 								"visibility":  "PUBLIC",
 								"unread":      false,
 								"starred":     false,
-								"tags":        []map[string]interface{}{},
+								"tags":        []map[string]any{},
 								"createdOn":   "2024-01-10T10:30:00Z",
 								"updatedOn":   "2024-01-10T10:30:00Z",
 							},
@@ -513,7 +513,7 @@ func TestPinboardHandlers(t *testing.T) {
 								"visibility":  "PUBLIC",
 								"unread":      false,
 								"starred":     false,
-								"tags":        []map[string]interface{}{},
+								"tags":        []map[string]any{},
 								"createdOn":   "2024-01-20T10:30:00Z",
 								"updatedOn":   "2024-01-20T10:30:00Z",
 							},
@@ -542,10 +542,10 @@ func TestPinboardHandlers(t *testing.T) {
 		httpmock.Activate()
 		defer httpmock.DeactivateAndReset()
 		httpmock.RegisterResponder("POST", "http://127.0.0.1:8080/query",
-			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]interface{}{
-				"data": map[string]interface{}{
-					"getOrgLinks": map[string]interface{}{
-						"result": []map[string]interface{}{
+			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]any{
+				"data": map[string]any{
+					"getOrgLinks": map[string]any{
+						"result": []map[string]any{
 							{
 								"id":          100,
 								"title":       "My First Note",
@@ -590,9 +590,9 @@ func TestPinboardHandlers(t *testing.T) {
 		httpmock.Activate()
 		defer httpmock.DeactivateAndReset()
 		httpmock.RegisterResponder("POST", "http://127.0.0.1:8080/query",
-			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]interface{}{
-				"data": map[string]interface{}{
-					"getOrgLink": map[string]interface{}{
+			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]any{
+				"data": map[string]any{
+					"getOrgLink": map[string]any{
 						"id":          100,
 						"title":       "My First Note",
 						"description": "This is the full content of the note.\n\nIt has multiple paragraphs.",
@@ -626,9 +626,9 @@ func TestPinboardHandlers(t *testing.T) {
 		httpmock.Activate()
 		defer httpmock.DeactivateAndReset()
 		httpmock.RegisterResponder("POST", "http://127.0.0.1:8080/query",
-			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]interface{}{
-				"data": map[string]interface{}{
-					"getOrgLink": map[string]interface{}{
+			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]any{
+				"data": map[string]any{
+					"getOrgLink": map[string]any{
 						"id":          100,
 						"title":       "A Link",
 						"description": "Not a note",
@@ -690,9 +690,9 @@ func TestTagConversion(t *testing.T) {
 						}
 					}
 				}
-				return httpmock.NewJsonResponse(http.StatusOK, map[string]interface{}{
-					"data": map[string]interface{}{
-						"addLink": map[string]interface{}{
+				return httpmock.NewJsonResponse(http.StatusOK, map[string]any{
+					"data": map[string]any{
+						"addLink": map[string]any{
 							"hash": "abc123",
 						},
 					},
@@ -727,10 +727,10 @@ func TestTagConversion(t *testing.T) {
 		httpmock.Activate()
 		defer httpmock.DeactivateAndReset()
 		httpmock.RegisterResponder("POST", "http://127.0.0.1:8080/query",
-			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]interface{}{
-				"data": map[string]interface{}{
-					"getOrgLinks": map[string]interface{}{
-						"result": []map[string]interface{}{
+			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]any{
+				"data": map[string]any{
+					"getOrgLinks": map[string]any{
+						"result": []map[string]any{
 							{
 								"id":          1,
 								"title":       "Test",
@@ -740,7 +740,7 @@ func TestTagConversion(t *testing.T) {
 								"visibility":  "PUBLIC",
 								"unread":      false,
 								"starred":     false,
-								"tags": []map[string]interface{}{
+								"tags": []map[string]any{
 									{"name": "simple"},
 									{"name": "tag with spaces"},
 									{"name": "another"},
@@ -821,11 +821,11 @@ func TestErrorHandling(t *testing.T) {
 		httpmock.Activate()
 		defer httpmock.DeactivateAndReset()
 		httpmock.RegisterResponder("POST", "http://127.0.0.1:8080/query",
-			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]interface{}{
-				"errors": []map[string]interface{}{
+			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]any{
+				"errors": []map[string]any{
 					{
 						"message": "Internal server error",
-						"extensions": map[string]interface{}{
+						"extensions": map[string]any{
 							"code": "INTERNAL_SERVER_ERROR",
 						},
 					},
@@ -871,10 +871,10 @@ func TestResponseFormats(t *testing.T) {
 		httpmock.Activate()
 		defer httpmock.DeactivateAndReset()
 		httpmock.RegisterResponder("POST", "http://127.0.0.1:8080/query",
-			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]interface{}{
-				"data": map[string]interface{}{
-					"getOrgLinks": map[string]interface{}{
-						"result": []map[string]interface{}{
+			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]any{
+				"data": map[string]any{
+					"getOrgLinks": map[string]any{
+						"result": []map[string]any{
 							{
 								"id":          1,
 								"title":       "Test",
@@ -884,7 +884,7 @@ func TestResponseFormats(t *testing.T) {
 								"visibility":  "PUBLIC",
 								"unread":      false,
 								"starred":     false,
-								"tags":        []map[string]interface{}{},
+								"tags":        []map[string]any{},
 								"createdOn":   "2024-01-15T10:30:00Z",
 								"updatedOn":   "2024-01-15T10:30:00Z",
 							},
@@ -921,10 +921,10 @@ func TestResponseFormats(t *testing.T) {
 		httpmock.Activate()
 		defer httpmock.DeactivateAndReset()
 		httpmock.RegisterResponder("POST", "http://127.0.0.1:8080/query",
-			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]interface{}{
-				"data": map[string]interface{}{
-					"getOrgLinks": map[string]interface{}{
-						"result": []map[string]interface{}{
+			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]any{
+				"data": map[string]any{
+					"getOrgLinks": map[string]any{
+						"result": []map[string]any{
 							{
 								"id":          1,
 								"title":       "Test",
@@ -934,7 +934,7 @@ func TestResponseFormats(t *testing.T) {
 								"visibility":  "PUBLIC",
 								"unread":      false,
 								"starred":     false,
-								"tags":        []map[string]interface{}{},
+								"tags":        []map[string]any{},
 								"createdOn":   "2024-01-15T10:30:00Z",
 								"updatedOn":   "2024-01-15T10:30:00Z",
 							},
@@ -958,16 +958,16 @@ func TestResponseFormats(t *testing.T) {
 		c.NoError(err)
 
 		// Parse JSON to verify structure
-		var result map[string]interface{}
+		var result map[string]any
 		err = json.Unmarshal(recorder.Body.Bytes(), &result)
 		c.NoError(err)
 		c.Contains(result, "date")
 		c.Contains(result, "user")
 		c.Contains(result, "posts")
 
-		posts := result["posts"].([]interface{})
+		posts := result["posts"].([]any)
 		c.Len(posts, 1)
-		post := posts[0].(map[string]interface{})
+		post := posts[0].(map[string]any)
 		c.Equal("https://test.com", post["href"])
 	})
 }
@@ -1003,8 +1003,8 @@ func TestOrganizationSelection(t *testing.T) {
 			func(req *http.Request) (*http.Response, error) {
 				body, _ := io.ReadAll(req.Body)
 				var gqlReq struct {
-					Query     string                 `json:"query"`
-					Variables map[string]interface{} `json:"variables"`
+					Query     string         `json:"query"`
+					Variables map[string]any `json:"variables"`
 				}
 				if err := json.Unmarshal(body, &gqlReq); err == nil {
 					if orgSlug, ok := gqlReq.Variables["orgSlug"]; ok {
@@ -1013,10 +1013,10 @@ func TestOrganizationSelection(t *testing.T) {
 						}
 					}
 				}
-				return httpmock.NewJsonResponse(http.StatusOK, map[string]interface{}{
-					"data": map[string]interface{}{
-						"getOrgLinks": map[string]interface{}{
-							"result": []map[string]interface{}{},
+				return httpmock.NewJsonResponse(http.StatusOK, map[string]any{
+					"data": map[string]any{
+						"getOrgLinks": map[string]any{
+							"result": []map[string]any{},
 						},
 					},
 				})
@@ -1043,8 +1043,8 @@ func TestOrganizationSelection(t *testing.T) {
 			func(req *http.Request) (*http.Response, error) {
 				body, _ := io.ReadAll(req.Body)
 				var gqlReq struct {
-					Query     string                 `json:"query"`
-					Variables map[string]interface{} `json:"variables"`
+					Query     string         `json:"query"`
+					Variables map[string]any `json:"variables"`
 				}
 				if err := json.Unmarshal(body, &gqlReq); err == nil {
 					if orgSlug, ok := gqlReq.Variables["orgSlug"]; ok {
@@ -1053,10 +1053,10 @@ func TestOrganizationSelection(t *testing.T) {
 						}
 					}
 				}
-				return httpmock.NewJsonResponse(http.StatusOK, map[string]interface{}{
-					"data": map[string]interface{}{
-						"getOrgLinks": map[string]interface{}{
-							"result": []map[string]interface{}{},
+				return httpmock.NewJsonResponse(http.StatusOK, map[string]any{
+					"data": map[string]any{
+						"getOrgLinks": map[string]any{
+							"result": []map[string]any{},
 						},
 					},
 				})
@@ -1065,7 +1065,7 @@ func TestOrganizationSelection(t *testing.T) {
 		// Create a test group with Pinboard auth middleware
 		authGroup := e.Group("/test")
 		authGroup.Use(pinboard.PinboardAuthMiddleware())
-		
+
 		authGroup.GET("/posts/get", func(ctx echo.Context) error {
 			// Forward to the actual handler
 			return pinboardService.PostsGet(ctx)
@@ -1138,9 +1138,9 @@ func TestEdgeCases(t *testing.T) {
 		httpmock.Activate()
 		defer httpmock.DeactivateAndReset()
 		httpmock.RegisterResponder("POST", "http://127.0.0.1:8080/query",
-			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]interface{}{
-				"data": map[string]interface{}{
-					"addLink": map[string]interface{}{
+			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]any{
+				"data": map[string]any{
+					"addLink": map[string]any{
 						"hash": "abc123",
 					},
 				},
@@ -1172,9 +1172,9 @@ func TestEdgeCases(t *testing.T) {
 		httpmock.Activate()
 		defer httpmock.DeactivateAndReset()
 		httpmock.RegisterResponder("POST", "http://127.0.0.1:8080/query",
-			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]interface{}{
-				"data": map[string]interface{}{
-					"addLink": map[string]interface{}{
+			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]any{
+				"data": map[string]any{
+					"addLink": map[string]any{
 						"hash": "abc123",
 					},
 				},
@@ -1205,9 +1205,9 @@ func TestEdgeCases(t *testing.T) {
 		httpmock.Activate()
 		defer httpmock.DeactivateAndReset()
 		httpmock.RegisterResponder("POST", "http://127.0.0.1:8080/query",
-			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]interface{}{
-				"data": map[string]interface{}{
-					"addLink": map[string]interface{}{
+			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]any{
+				"data": map[string]any{
+					"addLink": map[string]any{
 						"hash": "abc123",
 					},
 				},
@@ -1240,9 +1240,9 @@ func TestEdgeCases(t *testing.T) {
 		defer httpmock.DeactivateAndReset()
 
 		// Create exactly 10 links
-		links := make([]map[string]interface{}, 10)
-		for i := 0; i < 10; i++ {
-			links[i] = map[string]interface{}{
+		links := make([]map[string]any, 10)
+		for i := range 10 {
+			links[i] = map[string]any{
 				"id":          i,
 				"title":       fmt.Sprintf("Link %d", i),
 				"description": "Test",
@@ -1251,7 +1251,7 @@ func TestEdgeCases(t *testing.T) {
 				"visibility":  "PUBLIC",
 				"unread":      false,
 				"starred":     false,
-				"tags":        []map[string]interface{}{},
+				"tags":        []map[string]any{},
 				"createdOn":   "2024-01-15T10:30:00Z",
 				"updatedOn":   "2024-01-15T10:30:00Z",
 			}
@@ -1261,13 +1261,13 @@ func TestEdgeCases(t *testing.T) {
 		httpmock.RegisterResponder("POST", "http://127.0.0.1:8080/query",
 			func(req *http.Request) (*http.Response, error) {
 				// Parse the GraphQL query to check the limit
-				var gqlReq map[string]interface{}
+				var gqlReq map[string]any
 				json.NewDecoder(req.Body).Decode(&gqlReq)
 
 				// Return all links, handler will paginate
-				return httpmock.NewJsonResponse(http.StatusOK, map[string]interface{}{
-					"data": map[string]interface{}{
-						"getOrgLinks": map[string]interface{}{
+				return httpmock.NewJsonResponse(http.StatusOK, map[string]any{
+					"data": map[string]any{
+						"getOrgLinks": map[string]any{
 							"result": links,
 						},
 					},
@@ -1349,10 +1349,10 @@ func TestTagEndpoints(t *testing.T) {
 		defer httpmock.DeactivateAndReset()
 
 		httpmock.RegisterResponder("POST", "http://127.0.0.1:8080/query",
-			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]interface{}{
-				"data": map[string]interface{}{
-					"getTags": map[string]interface{}{
-						"result": []map[string]interface{}{
+			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]any{
+				"data": map[string]any{
+					"getTags": map[string]any{
+						"result": []map[string]any{
 							{
 								"name":  "golang",
 								"count": 42,
@@ -1394,10 +1394,10 @@ func TestTagEndpoints(t *testing.T) {
 		defer httpmock.DeactivateAndReset()
 
 		httpmock.RegisterResponder("POST", "http://127.0.0.1:8080/query",
-			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]interface{}{
-				"data": map[string]interface{}{
-					"getTags": map[string]interface{}{
-						"result": []map[string]interface{}{
+			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]any{
+				"data": map[string]any{
+					"getTags": map[string]any{
+						"result": []map[string]any{
 							{
 								"name":  "test",
 								"count": 10,
@@ -1429,10 +1429,10 @@ func TestTagEndpoints(t *testing.T) {
 		defer httpmock.DeactivateAndReset()
 
 		httpmock.RegisterResponder("POST", "http://127.0.0.1:8080/query",
-			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]interface{}{
-				"data": map[string]interface{}{
-					"getTags": map[string]interface{}{
-						"result": []map[string]interface{}{},
+			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]any{
+				"data": map[string]any{
+					"getTags": map[string]any{
+						"result": []map[string]any{},
 					},
 				},
 			}))
@@ -1490,11 +1490,11 @@ func TestTagEndpoints(t *testing.T) {
 		defer httpmock.DeactivateAndReset()
 
 		httpmock.RegisterResponder("POST", "http://127.0.0.1:8080/query",
-			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]interface{}{
-				"errors": []map[string]interface{}{
+			httpmock.NewJsonResponderOrPanic(http.StatusOK, map[string]any{
+				"errors": []map[string]any{
 					{
 						"message": "getTags query failed",
-						"extensions": map[string]interface{}{
+						"extensions": map[string]any{
 							"code": "INTERNAL_SERVER_ERROR",
 						},
 					},
diff --git a/valid/valid.go b/valid/valid.go
index 0122ff4..30210d4 100644
--- a/valid/valid.go
+++ b/valid/valid.go
@@ -25,7 +25,7 @@ var (
 // Validation ...
 type Validation struct {
 	ctx   context.Context
-	input map[string]interface{}
+	input map[string]any
 }
 
 // ValidationError ...
@@ -39,18 +39,18 @@ func Error(ctx context.Context, field string, msg string) error {
 	return &gqlerror.Error{
 		Message: msg,
 		Path:    graphql.GetPath(ctx),
-		Extensions: map[string]interface{}{
+		Extensions: map[string]any{
 			"field": field,
 		},
 	}
 }
 
 // Errorf Returns a new GraphQL error attached to the given field.
-func Errorf(ctx context.Context, field string, msg string, items ...interface{}) error {
+func Errorf(ctx context.Context, field string, msg string, items ...any) error {
 	return &gqlerror.Error{
 		Message: fmt.Sprintf(msg, items...),
 		Path:    graphql.GetPath(ctx),
-		Extensions: map[string]interface{}{
+		Extensions: map[string]any{
 			"field": field,
 		},
 	}
@@ -64,7 +64,7 @@ func New(ctx context.Context) *Validation {
 }
 
 // WithInput Adds an input map to a validation context.
-func (valid *Validation) WithInput(input map[string]interface{}) *Validation {
+func (valid *Validation) WithInput(input map[string]any) *Validation {
 	valid.input = input
 	return valid
 }
@@ -78,7 +78,7 @@ func (valid *Validation) Ok() bool {
 // registered. If the field is not present, the callback is not run. Otherwise,
 // the function is called with the value for the user to conduct further
 // validation with.
-func (valid *Validation) Optional(name string, fn func(i interface{})) {
+func (valid *Validation) Optional(name string, fn func(i any)) {
 	if valid.input == nil {
 		panic("Attempted to validate fields without input")
 	}
@@ -175,8 +175,7 @@ func (valid *Validation) OptionalBool(name string, fn func(b bool)) {
 }
 
 // Creates a validation error unconditionally.
-func (valid *Validation) Error(msg string,
-	items ...interface{}) *ValidationError {
+func (valid *Validation) Error(msg string, items ...any) *ValidationError {
 	err := &gqlerror.Error{
 		Path:    graphql.GetPath(valid.ctx),
 		Message: fmt.Sprintf(msg, items...),
@@ -190,8 +189,7 @@ func (valid *Validation) Error(msg string,
 
 // Expect Asserts that a condition is true, recording a GraphQL error with the given
 // message if not.
-func (valid *Validation) Expect(cond bool,
-	msg string, items ...interface{}) *ValidationError {
+func (valid *Validation) Expect(cond bool, msg string, items ...any) *ValidationError {
 	if cond {
 		return &ValidationError{valid: valid}
 	}
@@ -204,7 +202,7 @@ func (err *ValidationError) WithField(field string) *ValidationError {
 		return err
 	}
 	if err.err.Extensions == nil {
-		err.err.Extensions = make(map[string]interface{})
+		err.err.Extensions = make(map[string]any)
 	}
 	err.err.Extensions["field"] = field
 	return err
@@ -216,7 +214,7 @@ func (err *ValidationError) WithCode(code int) *ValidationError {
 		return err
 	}
 	if err.err.Extensions == nil {
-		err.err.Extensions = make(map[string]interface{})
+		err.err.Extensions = make(map[string]any)
 	}
 	err.err.Extensions["code"] = code
 	return err
@@ -225,8 +223,7 @@ func (err *ValidationError) WithCode(code int) *ValidationError {
 // And Composes another assertion onto the same validation context which initially
 // created an error. Short-circuiting is used, such that if the earlier
 // condition failed, the new condition is not considered.
-func (err *ValidationError) And(cond bool,
-	msg string, items ...interface{}) *ValidationError {
+func (err *ValidationError) And(cond bool, msg string, items ...any) *ValidationError {
 	if err.err != nil {
 		return err
 	}
-- 
2.49.1