package dbx import ( "fmt" "strconv" "strings" ) // DBConfig provides a template for database connection configuration compatible // with go-toolkit/config. If used as a field in a struct, remember to include // the `validate:"dive"` tag to ensure that the validator checks sub-fields. type DBConfig struct { User string `validate:"required"` Password string `validate:"required"` URI string `validate:"hostname_port,required"` Name string `validate:"required"` MaxConn int `validate:"min=1,max=1000"` AutoMigrate bool DebugLog bool } // ConnectionString returns a connection string compatible with the given // SQL dialect. func (cfg *DBConfig) ConnectionString(dialect Dialect) string { switch dialect { case DialectPostgres: return fmt.Sprintf("postgres://%s:%s@%s/%s?sslmode=disable", cfg.User, cfg.Password, cfg.URI, cfg.Name) case DialectMySQL: return fmt.Sprintf("%s:%s@tcp(%s)/%s?parseTime=true&loc=Local", cfg.User, cfg.Password, cfg.URI, cfg.Name) default: panic("unsupported dialect: " + string(dialect)) } } // Host returns the host portion of the database URI. func (cfg *DBConfig) Host() (string, error) { host, _, err := cfg.split() return host, err } // Port returns the port portion of the database URI. func (cfg *DBConfig) Port() (int, error) { _, port, err := cfg.split() if err != nil { return 0, err } portInt, err := strconv.Atoi(port) if err != nil { return 0, fmt.Errorf("invalid port: %w", err) } return portInt, nil } // splits the URI into host and port. func (cfg *DBConfig) split() (string, string, error) { split := strings.Split(cfg.URI, ":") if len(split) != 2 { return "", "", fmt.Errorf("invalid URI format") } return split[0], split[1], nil }