# Bun Reader Reads Go source files containing Bun model definitions and extracts database schema information. ## Overview The Bun Reader parses Go source code files that define Bun models (structs with `bun` struct tags) and converts them into RelSpec's internal database model representation. ## Features - Parses Bun struct tags to extract column definitions - Extracts table names from `bun:"table:tablename"` tags - Identifies primary keys, foreign keys, and indexes - Supports relationship detection - Handles both single files and directories ## Usage ### Basic Example ```go package main import ( "fmt" "git.warky.dev/wdevs/relspecgo/pkg/readers" "git.warky.dev/wdevs/relspecgo/pkg/readers/bun" ) func main() { options := &readers.ReaderOptions{ FilePath: "/path/to/models.go", } reader := bun.NewReader(options) db, err := reader.ReadDatabase() if err != nil { panic(err) } fmt.Printf("Found %d schemas\n", len(db.Schemas)) } ``` ### CLI Example ```bash # Read Bun models and convert to JSON relspec --input bun --in-file models/ --output json --out-file schema.json # Convert Bun models to GORM relspec --input bun --in-file models.go --output gorm --out-file gorm_models.go ``` ## Supported Bun Tags The reader recognizes the following Bun struct tags: - `table` - Table name - `column` - Column name - `type` - SQL data type - `pk` - Primary key - `notnull` - NOT NULL constraint - `autoincrement` - Auto-increment column - `default` - Default value - `unique` - Unique constraint - `rel` - Relationship definition ## Example Bun Model ```go package models import ( "time" "github.com/uptrace/bun" ) type User struct { bun.BaseModel `bun:"table:users,alias:u"` ID int64 `bun:"id,pk,autoincrement"` Username string `bun:"username,notnull,unique"` Email string `bun:"email,notnull"` CreatedAt time.Time `bun:"created_at,notnull,default:now()"` Posts []*Post `bun:"rel:has-many,join:id=user_id"` } type Post struct { bun.BaseModel `bun:"table:posts,alias:p"` ID int64 `bun:"id,pk"` UserID int64 `bun:"user_id,notnull"` Title string `bun:"title,notnull"` Content string `bun:"content"` User *User `bun:"rel:belongs-to,join:user_id=id"` } ``` ## Notes - Test files (ending in `_test.go`) are automatically excluded - The `bun.BaseModel` embedded struct is automatically recognized - Schema defaults to `public` if not specified