package clause import "strings" type Select struct { selectClauses []string fromClause *From otherClauses []Clause } func NewSelect(selectClauses []string, fromClause *From, otherClauses ...Clause) *Select { return &Select{ selectClauses: selectClauses, fromClause: fromClause, otherClauses: otherClauses, } } func (clause *Select) Clause() (string, error) { selectClauseBuilder := strings.Builder{} if clause.selectClauses == nil || len(clause.selectClauses) == 0 { selectClauseBuilder.WriteString("*\n") } else { for i, selectClause := range clause.selectClauses { selectClauseBuilder.WriteString(" " + selectClause) if i < len(clause.selectClauses)-1 { selectClauseBuilder.WriteString(",\n") } else { selectClauseBuilder.WriteString("\n") } } } fromClause, err := clause.fromClause.Clause() if err != nil { return "", err } otherClauseBuilder := strings.Builder{} for _, otherClause := range clause.otherClauses { otherClauseStr, err := otherClause.Clause() if err != nil { return "", err } otherClauseBuilder.WriteString(otherClauseStr) } clauseBuilder := strings.Builder{} clauseBuilder.WriteString("SELECT\n") clauseBuilder.WriteString(selectClauseBuilder.String()) clauseBuilder.WriteString(fromClause) clauseBuilder.WriteString(otherClauseBuilder.String()) return clauseBuilder.String(), nil } func (clause *Select) Args() []any { args := make([]any, 0) args = append(args, clause.fromClause.Args()...) for _, otherClause := range clause.otherClauses { args = append(args, otherClause.Args()...) } return args }