From e6a81756443655c2c044c6e1efd6dc5c83b3dbdc Mon Sep 17 00:00:00 2001 From: wispem-wantex Date: Sat, 10 Jan 2026 15:28:01 -0800 Subject: [PATCH] generator: use 'Must' flow helper in generated query funcs --- cmd/subcmd_generate_models.go | 6 +- ops/devcontainer/Dockerfile | 2 +- pkg/codegen/modelgenerate/generate_model.go | 105 ++++++++++++++------ 3 files changed, 82 insertions(+), 31 deletions(-) diff --git a/cmd/subcmd_generate_models.go b/cmd/subcmd_generate_models.go index b13c4c5..f49c6f4 100644 --- a/cmd/subcmd_generate_models.go +++ b/cmd/subcmd_generate_models.go @@ -57,13 +57,17 @@ var generate_model = &cobra.Command{ Name: ast.NewIdent("."), Path: &ast.BasicLit{Kind: token.STRING, Value: `"git.offline-twitter.com/offline-labs/gas-stack/pkg/db"`}, }, + &ast.ImportSpec{ + Name: ast.NewIdent("."), + Path: &ast.BasicLit{Kind: token.STRING, Value: `"git.offline-twitter.com/offline-labs/gas-stack/pkg/flowutils"`}, + }, }, }, modelgenerate.GenerateIDType(table), modelgenerate.GenerateModelAST(table), + modelgenerate.GenerateSQLFieldsConst(table), modelgenerate.GenerateSaveItemFunc(table), modelgenerate.GenerateDeleteItemFunc(table), - modelgenerate.GenerateSQLFieldsConst(table), modelgenerate.GenerateGetItemByIDFunc(table), }, } diff --git a/ops/devcontainer/Dockerfile b/ops/devcontainer/Dockerfile index 24e6373..a1d3ccc 100644 --- a/ops/devcontainer/Dockerfile +++ b/ops/devcontainer/Dockerfile @@ -2,7 +2,7 @@ FROM alpine:3.22 -RUN apk add build-base git go sqlite shellcheck curl jq sudo bash docker +RUN apk add build-base git go sqlite vim shellcheck curl jq sudo bash docker # Busybox `less` doesn't appear to support colors (makes git diff lose color) RUN apk add less diff --git a/pkg/codegen/modelgenerate/generate_model.go b/pkg/codegen/modelgenerate/generate_model.go index d0190cc..2ece8b6 100644 --- a/pkg/codegen/modelgenerate/generate_model.go +++ b/pkg/codegen/modelgenerate/generate_model.go @@ -114,36 +114,61 @@ func GenerateSaveItemFunc(tbl schema.Table) *ast.FuncDecl { Body: &ast.BlockStmt{ List: []ast.Stmt{ &ast.AssignStmt{ - Lhs: []ast.Expr{ast.NewIdent("result"), ast.NewIdent("err")}, + Lhs: []ast.Expr{ast.NewIdent("result")}, Tok: token.DEFINE, - Rhs: []ast.Expr{&ast.CallExpr{Fun: &ast.SelectorExpr{X: ast.NewIdent("db.DB"), Sel: ast.NewIdent("NamedExec")}, Args: []ast.Expr{&ast.BasicLit{Kind: token.STRING, Value: "`" + insertStmt + "`"}, ast.NewIdent(tbl.VarName)}}}, + Rhs: []ast.Expr{&ast.CallExpr{ + Fun: ast.NewIdent("Must"), + Args: []ast.Expr{&ast.CallExpr{ + Fun: &ast.SelectorExpr{X: ast.NewIdent("db.DB"), Sel: ast.NewIdent("NamedExec")}, + Args: []ast.Expr{ + &ast.BasicLit{Kind: token.STRING, Value: "`" + insertStmt + "`"}, + ast.NewIdent(tbl.VarName), + }, + }}, + }}, }, - &ast.IfStmt{Cond: &ast.BinaryExpr{X: ast.NewIdent("err"), Op: token.NEQ, Y: ast.NewIdent("nil")}, Body: &ast.BlockStmt{List: []ast.Stmt{&ast.ExprStmt{X: &ast.CallExpr{Fun: ast.NewIdent("panic"), Args: []ast.Expr{ast.NewIdent("err")}}}}}}, &ast.AssignStmt{ - Lhs: []ast.Expr{ast.NewIdent("id"), ast.NewIdent("err")}, - Tok: token.DEFINE, - Rhs: []ast.Expr{&ast.CallExpr{Fun: &ast.SelectorExpr{X: ast.NewIdent("result"), Sel: ast.NewIdent("LastInsertId")}, Args: []ast.Expr{}}}, + Lhs: []ast.Expr{&ast.SelectorExpr{X: ast.NewIdent(tbl.VarName), Sel: ast.NewIdent("ID")}}, + Tok: token.ASSIGN, + Rhs: []ast.Expr{&ast.CallExpr{ + Fun: ast.NewIdent(tbl.TypeIDName), + Args: []ast.Expr{&ast.CallExpr{ + Fun: ast.NewIdent("Must"), + Args: []ast.Expr{&ast.CallExpr{ + Fun: &ast.SelectorExpr{X: ast.NewIdent("result"), Sel: ast.NewIdent("LastInsertId")}, + Args: []ast.Expr{}, + }}, + }}, + }}, }, - &ast.IfStmt{Cond: &ast.BinaryExpr{X: ast.NewIdent("err"), Op: token.NEQ, Y: ast.NewIdent("nil")}, Body: &ast.BlockStmt{List: []ast.Stmt{&ast.ExprStmt{X: &ast.CallExpr{Fun: ast.NewIdent("panic"), Args: []ast.Expr{ast.NewIdent("err")}}}}}}, - &ast.AssignStmt{Lhs: []ast.Expr{&ast.SelectorExpr{X: ast.NewIdent(tbl.VarName), Sel: ast.NewIdent("ID")}}, Tok: token.ASSIGN, Rhs: []ast.Expr{&ast.CallExpr{Fun: ast.NewIdent(tbl.TypeIDName), Args: []ast.Expr{ast.NewIdent("id")}}}}, }, }, Else: &ast.BlockStmt{ List: []ast.Stmt{ &ast.AssignStmt{ - Lhs: []ast.Expr{ast.NewIdent("result"), ast.NewIdent("err")}, + Lhs: []ast.Expr{ast.NewIdent("result")}, Tok: token.DEFINE, - Rhs: []ast.Expr{&ast.CallExpr{Fun: &ast.SelectorExpr{X: ast.NewIdent("db.DB"), Sel: ast.NewIdent("NamedExec")}, Args: []ast.Expr{&ast.BasicLit{Kind: token.STRING, Value: "`" + updateStmt + "`"}, ast.NewIdent(tbl.VarName)}}}, + Rhs: []ast.Expr{&ast.CallExpr{ + Fun: ast.NewIdent("Must"), + Args: []ast.Expr{&ast.CallExpr{ + Fun: &ast.SelectorExpr{X: ast.NewIdent("db.DB"), Sel: ast.NewIdent("NamedExec")}, + Args: []ast.Expr{&ast.BasicLit{Kind: token.STRING, Value: "`" + updateStmt + "`"}, ast.NewIdent(tbl.VarName)}, + }}, + }}, }, - &ast.IfStmt{Cond: &ast.BinaryExpr{X: ast.NewIdent("err"), Op: token.NEQ, Y: ast.NewIdent("nil")}, Body: &ast.BlockStmt{List: []ast.Stmt{&ast.ExprStmt{X: &ast.CallExpr{Fun: ast.NewIdent("panic"), Args: []ast.Expr{ast.NewIdent("err")}}}}}}, - &ast.AssignStmt{ - Lhs: []ast.Expr{ast.NewIdent("count"), ast.NewIdent("err")}, - Tok: token.DEFINE, - Rhs: []ast.Expr{&ast.CallExpr{Fun: &ast.SelectorExpr{X: ast.NewIdent("result"), Sel: ast.NewIdent("RowsAffected")}, Args: []ast.Expr{}}}, - }, - &ast.IfStmt{Cond: &ast.BinaryExpr{X: ast.NewIdent("err"), Op: token.NEQ, Y: ast.NewIdent("nil")}, Body: &ast.BlockStmt{List: []ast.Stmt{&ast.ExprStmt{X: &ast.CallExpr{Fun: ast.NewIdent("panic"), Args: []ast.Expr{ast.NewIdent("err")}}}}}}, + &ast.IfStmt{ - Cond: &ast.BinaryExpr{X: ast.NewIdent("count"), Op: token.NEQ, Y: &ast.BasicLit{Kind: token.INT, Value: "1"}}, + Cond: &ast.BinaryExpr{ + X: &ast.CallExpr{ + Fun: ast.NewIdent("Must"), + Args: []ast.Expr{&ast.CallExpr{ + Fun: &ast.SelectorExpr{X: ast.NewIdent("result"), Sel: ast.NewIdent("RowsAffected")}, + Args: []ast.Expr{}, + }}, + }, + Op: token.NEQ, + Y: &ast.BasicLit{Kind: token.INT, Value: "1"}, + }, Body: &ast.BlockStmt{List: []ast.Stmt{&ast.ExprStmt{X: &ast.CallExpr{Fun: ast.NewIdent("panic"), Args: []ast.Expr{&ast.CallExpr{Fun: ast.NewIdent("fmt.Errorf"), Args: []ast.Expr{&ast.BasicLit{Kind: token.STRING, Value: fmt.Sprintf("\"got %s with ID (%%d), so attempted update, but it doesn't exist\"", strings.ToLower(tbl.TypeName))}, &ast.SelectorExpr{X: ast.NewIdent(tbl.VarName), Sel: ast.NewIdent("ID")}}}}}}}}, }, }, @@ -218,20 +243,42 @@ func GenerateDeleteItemFunc(tbl schema.Table) *ast.FuncDecl { funcBody := &ast.BlockStmt{ List: []ast.Stmt{ &ast.AssignStmt{ - Lhs: []ast.Expr{ast.NewIdent("result"), ast.NewIdent("err")}, + Lhs: []ast.Expr{ast.NewIdent("result")}, Tok: token.DEFINE, - Rhs: []ast.Expr{&ast.CallExpr{Fun: &ast.SelectorExpr{X: ast.NewIdent("db.DB"), Sel: ast.NewIdent("Exec")}, Args: []ast.Expr{&ast.BasicLit{Kind: token.STRING, Value: "`delete from " + tbl.TableName + " where rowid = ?`"}, &ast.SelectorExpr{X: ast.NewIdent(tbl.VarName), Sel: ast.NewIdent("ID")}}}}, + Rhs: []ast.Expr{&ast.CallExpr{ + Fun: ast.NewIdent("Must"), + Args: []ast.Expr{&ast.CallExpr{ + Fun: &ast.SelectorExpr{X: ast.NewIdent("db.DB"), Sel: ast.NewIdent("Exec")}, + Args: []ast.Expr{ + &ast.BasicLit{Kind: token.STRING, Value: "`delete from " + tbl.TableName + " where rowid = ?`"}, + &ast.SelectorExpr{X: ast.NewIdent(tbl.VarName), Sel: ast.NewIdent("ID")}, + }, + }}, + }}, }, - &ast.IfStmt{Cond: &ast.BinaryExpr{X: ast.NewIdent("err"), Op: token.NEQ, Y: ast.NewIdent("nil")}, Body: &ast.BlockStmt{List: []ast.Stmt{&ast.ExprStmt{X: &ast.CallExpr{Fun: ast.NewIdent("panic"), Args: []ast.Expr{ast.NewIdent("err")}}}}}}, - &ast.AssignStmt{ - Lhs: []ast.Expr{ast.NewIdent("count"), ast.NewIdent("err")}, - Tok: token.DEFINE, - Rhs: []ast.Expr{&ast.CallExpr{Fun: &ast.SelectorExpr{X: ast.NewIdent("result"), Sel: ast.NewIdent("RowsAffected")}, Args: []ast.Expr{}}}, - }, - &ast.IfStmt{Cond: &ast.BinaryExpr{X: ast.NewIdent("err"), Op: token.NEQ, Y: ast.NewIdent("nil")}, Body: &ast.BlockStmt{List: []ast.Stmt{&ast.ExprStmt{X: &ast.CallExpr{Fun: ast.NewIdent("panic"), Args: []ast.Expr{ast.NewIdent("err")}}}}}}, &ast.IfStmt{ - Cond: &ast.BinaryExpr{X: ast.NewIdent("count"), Op: token.NEQ, Y: &ast.BasicLit{Kind: token.INT, Value: "1"}}, - Body: &ast.BlockStmt{List: []ast.Stmt{&ast.ExprStmt{X: &ast.CallExpr{Fun: ast.NewIdent("panic"), Args: []ast.Expr{&ast.CallExpr{Fun: ast.NewIdent("fmt.Errorf"), Args: []ast.Expr{&ast.BasicLit{Kind: token.STRING, Value: fmt.Sprintf("\"tried to delete %s with ID (%%d) but it doesn't exist\"", strings.ToLower(tbl.TypeName))}, &ast.SelectorExpr{X: ast.NewIdent(tbl.VarName), Sel: ast.NewIdent("ID")}}}}}}}}, + Cond: &ast.BinaryExpr{ + X: &ast.CallExpr{ + Fun: ast.NewIdent("Must"), + Args: []ast.Expr{ + &ast.CallExpr{Fun: &ast.SelectorExpr{X: ast.NewIdent("result"), Sel: ast.NewIdent("RowsAffected")}, Args: []ast.Expr{}}, + }, + }, + Op: token.NEQ, + Y: &ast.BasicLit{Kind: token.INT, Value: "1"}, + }, + Body: &ast.BlockStmt{List: []ast.Stmt{ + &ast.ExprStmt{X: &ast.CallExpr{ + Fun: ast.NewIdent("panic"), + Args: []ast.Expr{&ast.CallExpr{ + Fun: ast.NewIdent("fmt.Errorf"), + Args: []ast.Expr{ + &ast.BasicLit{Kind: token.STRING, Value: fmt.Sprintf("\"tried to delete %s with ID (%%d) but it doesn't exist\"", strings.ToLower(tbl.TypeName))}, + &ast.SelectorExpr{X: ast.NewIdent(tbl.VarName), Sel: ast.NewIdent("ID")}, + }, + }}, + }}, + }}, }, }, }