Replace interface{} with any

This commit is contained in:
2025-02-24 21:42:39 +01:00
parent 96284c3dbd
commit d3ffcfbb53
11 changed files with 76 additions and 76 deletions

View File

@@ -15,8 +15,8 @@ func TestDefaultConfig(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
got interface{} got any
expected interface{} expected any
}{ }{
{"DBPath", cfg.DBURL, "sqlite://lemma.db"}, {"DBPath", cfg.DBURL, "sqlite://lemma.db"},
{"WorkDir", cfg.WorkDir, "./data"}, {"WorkDir", cfg.WorkDir, "./data"},
@@ -119,8 +119,8 @@ func TestLoad(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
got interface{} got any
expected interface{} expected any
}{ }{
{"IsDevelopment", cfg.IsDevelopment, true}, {"IsDevelopment", cfg.IsDevelopment, true},
{"DBURL", cfg.DBURL, "/custom/db/path.db"}, {"DBURL", cfg.DBURL, "/custom/db/path.db"},

View File

@@ -112,7 +112,7 @@ func (s *jwtService) generateToken(userID int, role string, sessionID string, to
func (s *jwtService) ValidateToken(tokenString string) (*Claims, error) { func (s *jwtService) ValidateToken(tokenString string) (*Claims, error) {
log := getJWTLogger() log := getJWTLogger()
token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) { token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (any, error) {
// Validate the signing method // Validate the signing method
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"]) return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])

View File

@@ -16,7 +16,7 @@ const (
// Query represents a SQL query with its parameters // Query represents a SQL query with its parameters
type Query struct { type Query struct {
builder strings.Builder builder strings.Builder
args []interface{} args []any
dbType DBType dbType DBType
pos int // tracks the current placeholder position pos int // tracks the current placeholder position
hasSelect bool hasSelect bool
@@ -35,7 +35,7 @@ type Query struct {
func NewQuery(dbType DBType) *Query { func NewQuery(dbType DBType) *Query {
return &Query{ return &Query{
dbType: dbType, dbType: dbType,
args: make([]interface{}, 0), args: make([]any, 0),
} }
} }
@@ -234,7 +234,7 @@ func (q *Query) Write(s string) *Query {
} }
// Placeholder adds a placeholder for a single argument // Placeholder adds a placeholder for a single argument
func (q *Query) Placeholder(arg interface{}) *Query { func (q *Query) Placeholder(arg any) *Query {
q.pos++ q.pos++
q.args = append(q.args, arg) q.args = append(q.args, arg)
@@ -265,7 +265,7 @@ func (q *Query) Placeholders(n int) *Query {
} }
// AddArgs adds arguments to the query // AddArgs adds arguments to the query
func (q *Query) AddArgs(args ...interface{}) *Query { func (q *Query) AddArgs(args ...any) *Query {
q.args = append(q.args, args...) q.args = append(q.args, args...)
return q return q
} }
@@ -276,6 +276,6 @@ func (q *Query) String() string {
} }
// Args returns the query arguments // Args returns the query arguments
func (q *Query) Args() []interface{} { func (q *Query) Args() []any {
return q.args return q.args
} }

View File

@@ -56,7 +56,7 @@ func TestBasicQueryBuilding(t *testing.T) {
dbType db.DBType dbType db.DBType
buildFn func(*db.Query) *db.Query buildFn func(*db.Query) *db.Query
wantSQL string wantSQL string
wantArgs []interface{} wantArgs []any
}{ }{
{ {
name: "Simple select SQLite", name: "Simple select SQLite",
@@ -65,7 +65,7 @@ func TestBasicQueryBuilding(t *testing.T) {
return q.Select("id", "name").From("users") return q.Select("id", "name").From("users")
}, },
wantSQL: "SELECT id, name FROM users", wantSQL: "SELECT id, name FROM users",
wantArgs: []interface{}{}, wantArgs: []any{},
}, },
{ {
name: "Simple select Postgres", name: "Simple select Postgres",
@@ -74,7 +74,7 @@ func TestBasicQueryBuilding(t *testing.T) {
return q.Select("id", "name").From("users") return q.Select("id", "name").From("users")
}, },
wantSQL: "SELECT id, name FROM users", wantSQL: "SELECT id, name FROM users",
wantArgs: []interface{}{}, wantArgs: []any{},
}, },
{ {
name: "Select with where SQLite", name: "Select with where SQLite",
@@ -83,7 +83,7 @@ func TestBasicQueryBuilding(t *testing.T) {
return q.Select("id", "name").From("users").Where("id = ").Placeholder(1) return q.Select("id", "name").From("users").Where("id = ").Placeholder(1)
}, },
wantSQL: "SELECT id, name FROM users WHERE id = ?", wantSQL: "SELECT id, name FROM users WHERE id = ?",
wantArgs: []interface{}{1}, wantArgs: []any{1},
}, },
{ {
name: "Select with where Postgres", name: "Select with where Postgres",
@@ -92,7 +92,7 @@ func TestBasicQueryBuilding(t *testing.T) {
return q.Select("id", "name").From("users").Where("id = ").Placeholder(1) return q.Select("id", "name").From("users").Where("id = ").Placeholder(1)
}, },
wantSQL: "SELECT id, name FROM users WHERE id = $1", wantSQL: "SELECT id, name FROM users WHERE id = $1",
wantArgs: []interface{}{1}, wantArgs: []any{1},
}, },
{ {
name: "Multiple where conditions SQLite", name: "Multiple where conditions SQLite",
@@ -103,7 +103,7 @@ func TestBasicQueryBuilding(t *testing.T) {
And("role = ").Placeholder("admin") And("role = ").Placeholder("admin")
}, },
wantSQL: "SELECT * FROM users WHERE active = ? AND role = ?", wantSQL: "SELECT * FROM users WHERE active = ? AND role = ?",
wantArgs: []interface{}{true, "admin"}, wantArgs: []any{true, "admin"},
}, },
{ {
name: "Multiple where conditions Postgres", name: "Multiple where conditions Postgres",
@@ -114,7 +114,7 @@ func TestBasicQueryBuilding(t *testing.T) {
And("role = ").Placeholder("admin") And("role = ").Placeholder("admin")
}, },
wantSQL: "SELECT * FROM users WHERE active = $1 AND role = $2", wantSQL: "SELECT * FROM users WHERE active = $1 AND role = $2",
wantArgs: []interface{}{true, "admin"}, wantArgs: []any{true, "admin"},
}, },
} }
@@ -143,7 +143,7 @@ func TestPlaceholders(t *testing.T) {
dbType db.DBType dbType db.DBType
buildFn func(*db.Query) *db.Query buildFn func(*db.Query) *db.Query
wantSQL string wantSQL string
wantArgs []interface{} wantArgs []any
}{ }{
{ {
name: "Single placeholder SQLite", name: "Single placeholder SQLite",
@@ -152,7 +152,7 @@ func TestPlaceholders(t *testing.T) {
return q.Write("SELECT * FROM users WHERE id = ").Placeholder(42) return q.Write("SELECT * FROM users WHERE id = ").Placeholder(42)
}, },
wantSQL: "SELECT * FROM users WHERE id = ?", wantSQL: "SELECT * FROM users WHERE id = ?",
wantArgs: []interface{}{42}, wantArgs: []any{42},
}, },
{ {
name: "Single placeholder Postgres", name: "Single placeholder Postgres",
@@ -161,7 +161,7 @@ func TestPlaceholders(t *testing.T) {
return q.Write("SELECT * FROM users WHERE id = ").Placeholder(42) return q.Write("SELECT * FROM users WHERE id = ").Placeholder(42)
}, },
wantSQL: "SELECT * FROM users WHERE id = $1", wantSQL: "SELECT * FROM users WHERE id = $1",
wantArgs: []interface{}{42}, wantArgs: []any{42},
}, },
{ {
name: "Multiple placeholders SQLite", name: "Multiple placeholders SQLite",
@@ -173,7 +173,7 @@ func TestPlaceholders(t *testing.T) {
Placeholder("John") Placeholder("John")
}, },
wantSQL: "SELECT * FROM users WHERE id = ? AND name = ?", wantSQL: "SELECT * FROM users WHERE id = ? AND name = ?",
wantArgs: []interface{}{42, "John"}, wantArgs: []any{42, "John"},
}, },
{ {
name: "Multiple placeholders Postgres", name: "Multiple placeholders Postgres",
@@ -185,7 +185,7 @@ func TestPlaceholders(t *testing.T) {
Placeholder("John") Placeholder("John")
}, },
wantSQL: "SELECT * FROM users WHERE id = $1 AND name = $2", wantSQL: "SELECT * FROM users WHERE id = $1 AND name = $2",
wantArgs: []interface{}{42, "John"}, wantArgs: []any{42, "John"},
}, },
{ {
name: "Placeholders for IN SQLite", name: "Placeholders for IN SQLite",
@@ -197,7 +197,7 @@ func TestPlaceholders(t *testing.T) {
AddArgs(1, 2, 3) AddArgs(1, 2, 3)
}, },
wantSQL: "SELECT * FROM users WHERE id IN (?, ?, ?)", wantSQL: "SELECT * FROM users WHERE id IN (?, ?, ?)",
wantArgs: []interface{}{1, 2, 3}, wantArgs: []any{1, 2, 3},
}, },
{ {
name: "Placeholders for IN Postgres", name: "Placeholders for IN Postgres",
@@ -209,7 +209,7 @@ func TestPlaceholders(t *testing.T) {
AddArgs(1, 2, 3) AddArgs(1, 2, 3)
}, },
wantSQL: "SELECT * FROM users WHERE id IN ($1, $2, $3)", wantSQL: "SELECT * FROM users WHERE id IN ($1, $2, $3)",
wantArgs: []interface{}{1, 2, 3}, wantArgs: []any{1, 2, 3},
}, },
} }
@@ -238,7 +238,7 @@ func TestWhereClauseBuilding(t *testing.T) {
dbType db.DBType dbType db.DBType
buildFn func(*db.Query) *db.Query buildFn func(*db.Query) *db.Query
wantSQL string wantSQL string
wantArgs []interface{} wantArgs []any
}{ }{
{ {
name: "Simple where", name: "Simple where",
@@ -247,7 +247,7 @@ func TestWhereClauseBuilding(t *testing.T) {
return q.Select("*").From("users").Where("id = ").Placeholder(1) return q.Select("*").From("users").Where("id = ").Placeholder(1)
}, },
wantSQL: "SELECT * FROM users WHERE id = ?", wantSQL: "SELECT * FROM users WHERE id = ?",
wantArgs: []interface{}{1}, wantArgs: []any{1},
}, },
{ {
name: "Where with And", name: "Where with And",
@@ -258,7 +258,7 @@ func TestWhereClauseBuilding(t *testing.T) {
And("active = ").Placeholder(true) And("active = ").Placeholder(true)
}, },
wantSQL: "SELECT * FROM users WHERE id = ? AND active = ?", wantSQL: "SELECT * FROM users WHERE id = ? AND active = ?",
wantArgs: []interface{}{1, true}, wantArgs: []any{1, true},
}, },
{ {
name: "Where with Or", name: "Where with Or",
@@ -269,7 +269,7 @@ func TestWhereClauseBuilding(t *testing.T) {
Or("id = ").Placeholder(2) Or("id = ").Placeholder(2)
}, },
wantSQL: "SELECT * FROM users WHERE id = ? OR id = ?", wantSQL: "SELECT * FROM users WHERE id = ? OR id = ?",
wantArgs: []interface{}{1, 2}, wantArgs: []any{1, 2},
}, },
{ {
name: "Where with parentheses", name: "Where with parentheses",
@@ -283,7 +283,7 @@ func TestWhereClauseBuilding(t *testing.T) {
Write(")") Write(")")
}, },
wantSQL: "SELECT * FROM users WHERE active = ? AND (id = ? OR id = ?)", wantSQL: "SELECT * FROM users WHERE active = ? AND (id = ? OR id = ?)",
wantArgs: []interface{}{true, 1, 2}, wantArgs: []any{true, 1, 2},
}, },
{ {
name: "Where with StartGroup and EndGroup", name: "Where with StartGroup and EndGroup",
@@ -297,7 +297,7 @@ func TestWhereClauseBuilding(t *testing.T) {
Write(")") Write(")")
}, },
wantSQL: "SELECT * FROM users WHERE active = ? AND (id = ? OR id = ?)", wantSQL: "SELECT * FROM users WHERE active = ? AND (id = ? OR id = ?)",
wantArgs: []interface{}{true, 1, 2}, wantArgs: []any{true, 1, 2},
}, },
{ {
name: "Where with nested groups", name: "Where with nested groups",
@@ -311,7 +311,7 @@ func TestWhereClauseBuilding(t *testing.T) {
And("created_at > ").Placeholder("2020-01-01") And("created_at > ").Placeholder("2020-01-01")
}, },
wantSQL: "SELECT * FROM users WHERE (active = ? OR role = ?) AND created_at > ?", wantSQL: "SELECT * FROM users WHERE (active = ? OR role = ?) AND created_at > ?",
wantArgs: []interface{}{true, "admin", "2020-01-01"}, wantArgs: []any{true, "admin", "2020-01-01"},
}, },
{ {
name: "WhereIn", name: "WhereIn",
@@ -322,7 +322,7 @@ func TestWhereClauseBuilding(t *testing.T) {
AddArgs(1, 2, 3) AddArgs(1, 2, 3)
}, },
wantSQL: "SELECT * FROM users WHERE id IN (?, ?, ?)", wantSQL: "SELECT * FROM users WHERE id IN (?, ?, ?)",
wantArgs: []interface{}{1, 2, 3}, wantArgs: []any{1, 2, 3},
}, },
} }
@@ -351,7 +351,7 @@ func TestJoinClauseBuilding(t *testing.T) {
dbType db.DBType dbType db.DBType
buildFn func(*db.Query) *db.Query buildFn func(*db.Query) *db.Query
wantSQL string wantSQL string
wantArgs []interface{} wantArgs []any
}{ }{
{ {
name: "Inner join", name: "Inner join",
@@ -362,7 +362,7 @@ func TestJoinClauseBuilding(t *testing.T) {
Join(db.InnerJoin, "workspaces w", "w.user_id = u.id") Join(db.InnerJoin, "workspaces w", "w.user_id = u.id")
}, },
wantSQL: "SELECT u.*, w.name FROM users u INNER JOIN workspaces w ON w.user_id = u.id", wantSQL: "SELECT u.*, w.name FROM users u INNER JOIN workspaces w ON w.user_id = u.id",
wantArgs: []interface{}{}, wantArgs: []any{},
}, },
{ {
name: "Left join", name: "Left join",
@@ -373,7 +373,7 @@ func TestJoinClauseBuilding(t *testing.T) {
Join(db.LeftJoin, "workspaces w", "w.user_id = u.id") Join(db.LeftJoin, "workspaces w", "w.user_id = u.id")
}, },
wantSQL: "SELECT u.*, w.name FROM users u LEFT JOIN workspaces w ON w.user_id = u.id", wantSQL: "SELECT u.*, w.name FROM users u LEFT JOIN workspaces w ON w.user_id = u.id",
wantArgs: []interface{}{}, wantArgs: []any{},
}, },
{ {
name: "Multiple joins", name: "Multiple joins",
@@ -385,7 +385,7 @@ func TestJoinClauseBuilding(t *testing.T) {
Join(db.LeftJoin, "settings s", "s.user_id = u.id") Join(db.LeftJoin, "settings s", "s.user_id = u.id")
}, },
wantSQL: "SELECT u.*, w.name, s.role FROM users u INNER JOIN workspaces w ON w.user_id = u.id LEFT JOIN settings s ON s.user_id = u.id", wantSQL: "SELECT u.*, w.name, s.role FROM users u INNER JOIN workspaces w ON w.user_id = u.id LEFT JOIN settings s ON s.user_id = u.id",
wantArgs: []interface{}{}, wantArgs: []any{},
}, },
{ {
name: "Join with where", name: "Join with where",
@@ -397,7 +397,7 @@ func TestJoinClauseBuilding(t *testing.T) {
Where("u.active = ").Placeholder(true) Where("u.active = ").Placeholder(true)
}, },
wantSQL: "SELECT u.*, w.name FROM users u INNER JOIN workspaces w ON w.user_id = u.id WHERE u.active = ?", wantSQL: "SELECT u.*, w.name FROM users u INNER JOIN workspaces w ON w.user_id = u.id WHERE u.active = ?",
wantArgs: []interface{}{true}, wantArgs: []any{true},
}, },
} }
@@ -426,7 +426,7 @@ func TestOrderLimitOffset(t *testing.T) {
dbType db.DBType dbType db.DBType
buildFn func(*db.Query) *db.Query buildFn func(*db.Query) *db.Query
wantSQL string wantSQL string
wantArgs []interface{} wantArgs []any
}{ }{
{ {
name: "Order by", name: "Order by",
@@ -435,7 +435,7 @@ func TestOrderLimitOffset(t *testing.T) {
return q.Select("*").From("users").OrderBy("name ASC") return q.Select("*").From("users").OrderBy("name ASC")
}, },
wantSQL: "SELECT * FROM users ORDER BY name ASC", wantSQL: "SELECT * FROM users ORDER BY name ASC",
wantArgs: []interface{}{}, wantArgs: []any{},
}, },
{ {
name: "Order by multiple columns", name: "Order by multiple columns",
@@ -444,7 +444,7 @@ func TestOrderLimitOffset(t *testing.T) {
return q.Select("*").From("users").OrderBy("name ASC", "created_at DESC") return q.Select("*").From("users").OrderBy("name ASC", "created_at DESC")
}, },
wantSQL: "SELECT * FROM users ORDER BY name ASC, created_at DESC", wantSQL: "SELECT * FROM users ORDER BY name ASC, created_at DESC",
wantArgs: []interface{}{}, wantArgs: []any{},
}, },
{ {
name: "Limit", name: "Limit",
@@ -453,7 +453,7 @@ func TestOrderLimitOffset(t *testing.T) {
return q.Select("*").From("users").Limit(10) return q.Select("*").From("users").Limit(10)
}, },
wantSQL: "SELECT * FROM users LIMIT 10", wantSQL: "SELECT * FROM users LIMIT 10",
wantArgs: []interface{}{}, wantArgs: []any{},
}, },
{ {
name: "Limit and offset", name: "Limit and offset",
@@ -462,7 +462,7 @@ func TestOrderLimitOffset(t *testing.T) {
return q.Select("*").From("users").Limit(10).Offset(20) return q.Select("*").From("users").Limit(10).Offset(20)
}, },
wantSQL: "SELECT * FROM users LIMIT 10 OFFSET 20", wantSQL: "SELECT * FROM users LIMIT 10 OFFSET 20",
wantArgs: []interface{}{}, wantArgs: []any{},
}, },
{ {
name: "Complete query with all clauses", name: "Complete query with all clauses",
@@ -476,7 +476,7 @@ func TestOrderLimitOffset(t *testing.T) {
Offset(20) Offset(20)
}, },
wantSQL: "SELECT * FROM users WHERE active = ? ORDER BY name ASC LIMIT 10 OFFSET 20", wantSQL: "SELECT * FROM users WHERE active = ? ORDER BY name ASC LIMIT 10 OFFSET 20",
wantArgs: []interface{}{true}, wantArgs: []any{true},
}, },
} }
@@ -505,7 +505,7 @@ func TestInsertUpdateDelete(t *testing.T) {
dbType db.DBType dbType db.DBType
buildFn func(*db.Query) *db.Query buildFn func(*db.Query) *db.Query
wantSQL string wantSQL string
wantArgs []interface{} wantArgs []any
}{ }{
{ {
name: "Insert SQLite", name: "Insert SQLite",
@@ -516,7 +516,7 @@ func TestInsertUpdateDelete(t *testing.T) {
AddArgs("John", "john@example.com") AddArgs("John", "john@example.com")
}, },
wantSQL: "INSERT INTO users (name, email) VALUES (?, ?)", wantSQL: "INSERT INTO users (name, email) VALUES (?, ?)",
wantArgs: []interface{}{"John", "john@example.com"}, wantArgs: []any{"John", "john@example.com"},
}, },
{ {
name: "Insert Postgres", name: "Insert Postgres",
@@ -527,7 +527,7 @@ func TestInsertUpdateDelete(t *testing.T) {
AddArgs("John", "john@example.com") AddArgs("John", "john@example.com")
}, },
wantSQL: "INSERT INTO users (name, email) VALUES ($1, $2)", wantSQL: "INSERT INTO users (name, email) VALUES ($1, $2)",
wantArgs: []interface{}{"John", "john@example.com"}, wantArgs: []any{"John", "john@example.com"},
}, },
{ {
name: "Update SQLite", name: "Update SQLite",
@@ -539,7 +539,7 @@ func TestInsertUpdateDelete(t *testing.T) {
Where("id = ").Placeholder(1) Where("id = ").Placeholder(1)
}, },
wantSQL: "UPDATE users SET name = ?, email = ? WHERE id = ?", wantSQL: "UPDATE users SET name = ?, email = ? WHERE id = ?",
wantArgs: []interface{}{"John", "john@example.com", 1}, wantArgs: []any{"John", "john@example.com", 1},
}, },
{ {
name: "Update Postgres", name: "Update Postgres",
@@ -551,7 +551,7 @@ func TestInsertUpdateDelete(t *testing.T) {
Where("id = ").Placeholder(1) Where("id = ").Placeholder(1)
}, },
wantSQL: "UPDATE users SET name = $1, email = $2 WHERE id = $3", wantSQL: "UPDATE users SET name = $1, email = $2 WHERE id = $3",
wantArgs: []interface{}{"John", "john@example.com", 1}, wantArgs: []any{"John", "john@example.com", 1},
}, },
{ {
name: "Delete SQLite", name: "Delete SQLite",
@@ -560,7 +560,7 @@ func TestInsertUpdateDelete(t *testing.T) {
return q.Delete().From("users").Where("id = ").Placeholder(1) return q.Delete().From("users").Where("id = ").Placeholder(1)
}, },
wantSQL: "DELETE FROM users WHERE id = ?", wantSQL: "DELETE FROM users WHERE id = ?",
wantArgs: []interface{}{1}, wantArgs: []any{1},
}, },
{ {
name: "Delete Postgres", name: "Delete Postgres",
@@ -569,7 +569,7 @@ func TestInsertUpdateDelete(t *testing.T) {
return q.Delete().From("users").Where("id = ").Placeholder(1) return q.Delete().From("users").Where("id = ").Placeholder(1)
}, },
wantSQL: "DELETE FROM users WHERE id = $1", wantSQL: "DELETE FROM users WHERE id = $1",
wantArgs: []interface{}{1}, wantArgs: []any{1},
}, },
} }
@@ -598,7 +598,7 @@ func TestHavingClause(t *testing.T) {
dbType db.DBType dbType db.DBType
buildFn func(*db.Query) *db.Query buildFn func(*db.Query) *db.Query
wantSQL string wantSQL string
wantArgs []interface{} wantArgs []any
}{ }{
{ {
name: "Simple having", name: "Simple having",
@@ -610,7 +610,7 @@ func TestHavingClause(t *testing.T) {
Having("count > ").Placeholder(5) Having("count > ").Placeholder(5)
}, },
wantSQL: "SELECT department, COUNT(*) as count FROM employees GROUP BY department HAVING count > ?", wantSQL: "SELECT department, COUNT(*) as count FROM employees GROUP BY department HAVING count > ?",
wantArgs: []interface{}{5}, wantArgs: []any{5},
}, },
{ {
name: "Having with multiple conditions", name: "Having with multiple conditions",
@@ -623,7 +623,7 @@ func TestHavingClause(t *testing.T) {
And("COUNT(*) > ").Placeholder(3) And("COUNT(*) > ").Placeholder(3)
}, },
wantSQL: "SELECT department, AVG(salary) as avg_salary FROM employees GROUP BY department HAVING avg_salary > ? AND COUNT(*) > ?", wantSQL: "SELECT department, AVG(salary) as avg_salary FROM employees GROUP BY department HAVING avg_salary > ? AND COUNT(*) > ?",
wantArgs: []interface{}{50000, 3}, wantArgs: []any{50000, 3},
}, },
{ {
name: "Having with postgres placeholders", name: "Having with postgres placeholders",
@@ -635,7 +635,7 @@ func TestHavingClause(t *testing.T) {
Having("count > ").Placeholder(5) Having("count > ").Placeholder(5)
}, },
wantSQL: "SELECT department, COUNT(*) as count FROM employees GROUP BY department HAVING count > $1", wantSQL: "SELECT department, COUNT(*) as count FROM employees GROUP BY department HAVING count > $1",
wantArgs: []interface{}{5}, wantArgs: []any{5},
}, },
} }
@@ -664,7 +664,7 @@ func TestComplexQueries(t *testing.T) {
dbType db.DBType dbType db.DBType
buildFn func(*db.Query) *db.Query buildFn func(*db.Query) *db.Query
wantSQL string wantSQL string
wantArgs []interface{} wantArgs []any
}{ }{
{ {
name: "Complex select with join and where", name: "Complex select with join and where",
@@ -680,7 +680,7 @@ func TestComplexQueries(t *testing.T) {
Limit(10) Limit(10)
}, },
wantSQL: "SELECT u.id, u.name, COUNT(w.id) as workspace_count FROM users u LEFT JOIN workspaces w ON w.user_id = u.id WHERE u.active = ? GROUP BY u.id, u.name HAVING COUNT(w.id) > ? ORDER BY workspace_count DESC LIMIT 10", wantSQL: "SELECT u.id, u.name, COUNT(w.id) as workspace_count FROM users u LEFT JOIN workspaces w ON w.user_id = u.id WHERE u.active = ? GROUP BY u.id, u.name HAVING COUNT(w.id) > ? ORDER BY workspace_count DESC LIMIT 10",
wantArgs: []interface{}{true, 0}, wantArgs: []any{true, 0},
}, },
} }

View File

@@ -23,7 +23,7 @@ func NewScanner(db *sql.DB, dbType DBType) *Scanner {
} }
// QueryRow executes a query and scans the result into a struct // QueryRow executes a query and scans the result into a struct
func (s *Scanner) QueryRow(dest interface{}, q *Query) error { func (s *Scanner) QueryRow(dest any, q *Query) error {
row := s.db.QueryRow(q.String(), q.Args()...) row := s.db.QueryRow(q.String(), q.Args()...)
// Handle primitive types // Handle primitive types
@@ -46,7 +46,7 @@ func (s *Scanner) QueryRow(dest interface{}, q *Query) error {
} }
// Query executes a query and scans multiple results into a slice of structs // Query executes a query and scans multiple results into a slice of structs
func (s *Scanner) Query(dest interface{}, q *Query) error { func (s *Scanner) Query(dest any, q *Query) error {
rows, err := s.db.Query(q.String(), q.Args()...) rows, err := s.db.Query(q.String(), q.Args()...)
if err != nil { if err != nil {
return err return err
@@ -57,7 +57,7 @@ func (s *Scanner) Query(dest interface{}, q *Query) error {
} }
// scanStruct scans a single row into a struct // scanStruct scans a single row into a struct
func scanStruct(row *sql.Row, dest interface{}) error { func scanStruct(row *sql.Row, dest any) error {
v := reflect.ValueOf(dest) v := reflect.ValueOf(dest)
if v.Kind() != reflect.Ptr { if v.Kind() != reflect.Ptr {
return fmt.Errorf("dest must be a pointer") return fmt.Errorf("dest must be a pointer")
@@ -67,7 +67,7 @@ func scanStruct(row *sql.Row, dest interface{}) error {
return fmt.Errorf("dest must be a pointer to a struct") return fmt.Errorf("dest must be a pointer to a struct")
} }
fields := make([]interface{}, 0, v.NumField()) fields := make([]any, 0, v.NumField())
for i := 0; i < v.NumField(); i++ { for i := 0; i < v.NumField(); i++ {
field := v.Field(i) field := v.Field(i)
@@ -80,7 +80,7 @@ func scanStruct(row *sql.Row, dest interface{}) error {
} }
// scanStructs scans multiple rows into a slice of structs // scanStructs scans multiple rows into a slice of structs
func scanStructs(rows *sql.Rows, dest interface{}) error { func scanStructs(rows *sql.Rows, dest any) error {
v := reflect.ValueOf(dest) v := reflect.ValueOf(dest)
if v.Kind() != reflect.Ptr { if v.Kind() != reflect.Ptr {
return fmt.Errorf("dest must be a pointer") return fmt.Errorf("dest must be a pointer")
@@ -95,7 +95,7 @@ func scanStructs(rows *sql.Rows, dest interface{}) error {
for rows.Next() { for rows.Next() {
newElem := reflect.New(elemType).Elem() newElem := reflect.New(elemType).Elem()
fields := make([]interface{}, 0, newElem.NumField()) fields := make([]any, 0, newElem.NumField())
for i := 0; i < newElem.NumField(); i++ { for i := 0; i < newElem.NumField(); i++ {
field := newElem.Field(i) field := newElem.Field(i)
@@ -129,7 +129,7 @@ func NewScannerEx(db *sql.DB, dbType DBType) *ScannerEx {
} }
// QueryRow executes a query and scans the result into a struct // QueryRow executes a query and scans the result into a struct
func (s *ScannerEx) QueryRow(dest interface{}, q *Query) error { func (s *ScannerEx) QueryRow(dest any, q *Query) error {
row := s.db.QueryRow(q.String(), q.Args()...) row := s.db.QueryRow(q.String(), q.Args()...)
// Get column names // Get column names
@@ -141,7 +141,7 @@ func (s *ScannerEx) QueryRow(dest interface{}, q *Query) error {
} }
// Query executes a query and scans multiple results into a slice of structs // Query executes a query and scans multiple results into a slice of structs
func (s *ScannerEx) Query(dest interface{}, q *Query) error { func (s *ScannerEx) Query(dest any, q *Query) error {
rows, err := s.db.Query(q.String(), q.Args()...) rows, err := s.db.Query(q.String(), q.Args()...)
if err != nil { if err != nil {
return err return err
@@ -189,7 +189,7 @@ func toSnakeCase(s string) string {
} }
// scanStructTags scans a single row into a struct using field tags // scanStructTags scans a single row into a struct using field tags
func scanStructTags(row *sql.Row, dest interface{}) error { func scanStructTags(row *sql.Row, dest any) error {
v := reflect.ValueOf(dest) v := reflect.ValueOf(dest)
if v.Kind() != reflect.Ptr { if v.Kind() != reflect.Ptr {
return fmt.Errorf("dest must be a pointer") return fmt.Errorf("dest must be a pointer")
@@ -199,7 +199,7 @@ func scanStructTags(row *sql.Row, dest interface{}) error {
return fmt.Errorf("dest must be a pointer to a struct") return fmt.Errorf("dest must be a pointer to a struct")
} }
fields := make([]interface{}, 0, v.NumField()) fields := make([]any, 0, v.NumField())
for i := 0; i < v.NumField(); i++ { for i := 0; i < v.NumField(); i++ {
field := v.Field(i) field := v.Field(i)
@@ -212,7 +212,7 @@ func scanStructTags(row *sql.Row, dest interface{}) error {
} }
// scanStructsTags scans multiple rows into a slice of structs using field tags // scanStructsTags scans multiple rows into a slice of structs using field tags
func scanStructsTags(rows *sql.Rows, dest interface{}) error { func scanStructsTags(rows *sql.Rows, dest any) error {
v := reflect.ValueOf(dest) v := reflect.ValueOf(dest)
if v.Kind() != reflect.Ptr { if v.Kind() != reflect.Ptr {
return fmt.Errorf("dest must be a pointer") return fmt.Errorf("dest must be a pointer")
@@ -243,8 +243,8 @@ func scanStructsTags(rows *sql.Rows, dest interface{}) error {
fieldMap := getFieldMap(elemType) fieldMap := getFieldMap(elemType)
// Prepare values slice for each scan // Prepare values slice for each scan
values := make([]interface{}, len(columns)) values := make([]any, len(columns))
scanFields := make([]interface{}, len(columns)) scanFields := make([]any, len(columns))
for i := range values { for i := range values {
scanFields[i] = &values[i] scanFields[i] = &values[i]
} }

View File

@@ -308,7 +308,7 @@ func (h *Handler) AdminUpdateUser() http.HandlerFunc {
} }
// Track what's being updated for logging // Track what's being updated for logging
updates := make(map[string]interface{}) updates := make(map[string]any)
if req.Email != "" { if req.Email != "" {
user.Email = req.Email user.Email = req.Email

View File

@@ -192,7 +192,7 @@ func TestFileHandlers_Integration(t *testing.T) {
name string name string
method string method string
path string path string
body interface{} body any
}{ }{
{"list files", http.MethodGet, baseURL, nil}, {"list files", http.MethodGet, baseURL, nil},
{"get file", http.MethodGet, baseURL + "/test.md", nil}, {"get file", http.MethodGet, baseURL + "/test.md", nil},

View File

@@ -123,7 +123,7 @@ func TestGitHandlers_Integration(t *testing.T) {
name string name string
method string method string
path string path string
body interface{} body any
}{ }{
{ {
name: "commit without token", name: "commit without token",

View File

@@ -37,7 +37,7 @@ func NewHandler(db db.Database, s storage.Manager) *Handler {
} }
// respondJSON is a helper to send JSON responses // respondJSON is a helper to send JSON responses
func respondJSON(w http.ResponseWriter, data interface{}) { func respondJSON(w http.ResponseWriter, data any) {
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")
if err := json.NewEncoder(w).Encode(data); err != nil { if err := json.NewEncoder(w).Encode(data); err != nil {
respondError(w, "Failed to encode response", http.StatusInternalServerError) respondError(w, "Failed to encode response", http.StatusInternalServerError)

View File

@@ -195,7 +195,7 @@ func (h *testHarness) createTestUser(t *testing.T, email, password string, role
} }
} }
func (h *testHarness) newRequest(t *testing.T, method, path string, body interface{}) *http.Request { func (h *testHarness) newRequest(t *testing.T, method, path string, body any) *http.Request {
t.Helper() t.Helper()
var reqBody []byte var reqBody []byte
@@ -246,7 +246,7 @@ func (h *testHarness) addCSRFCookie(t *testing.T, req *http.Request) string {
} }
// makeRequest is the main helper for making JSON requests // makeRequest is the main helper for making JSON requests
func (h *testHarness) makeRequest(t *testing.T, method, path string, body interface{}, testUser *testUser) *httptest.ResponseRecorder { func (h *testHarness) makeRequest(t *testing.T, method, path string, body any, testUser *testUser) *httptest.ResponseRecorder {
t.Helper() t.Helper()
req := h.newRequest(t, method, path, body) req := h.newRequest(t, method, path, body)

View File

@@ -37,7 +37,7 @@ func (m MockDirInfo) Size() int64 { return m.size }
func (m MockDirInfo) Mode() fs.FileMode { return m.mode } func (m MockDirInfo) Mode() fs.FileMode { return m.mode }
func (m MockDirInfo) ModTime() time.Time { return m.modTime } func (m MockDirInfo) ModTime() time.Time { return m.modTime }
func (m MockDirInfo) IsDir() bool { return m.isDir } func (m MockDirInfo) IsDir() bool { return m.isDir }
func (m MockDirInfo) Sys() interface{} { return nil } func (m MockDirInfo) Sys() any { return nil }
type mockFS struct { type mockFS struct {
// Record operations for verification // Record operations for verification