package sqlbuilder import ( "bytes" ) // A clause that can be used in order by type OrderByClause interface { Clause isOrderByClauseInterface } // A clause that is selectable. type Projection interface { Clause isProjectionInterface SerializeSqlForColumnList(out *bytes.Buffer) error } type ColumnList []NonAliasColumn func (cl ColumnList) SerializeSql(out *bytes.Buffer) error { for i, column := range cl { column.SerializeSql(out) if i != len(cl)-1 { out.WriteString(", ") } } return nil } func (cl ColumnList) isProjectionType() { } func (cl ColumnList) As(name string) Projection { panic("Unallowed operation ") } func (cl ColumnList) SerializeSqlForColumnList(out *bytes.Buffer) error { for i, column := range cl { column.SerializeSqlForColumnList(out) if i != len(cl)-1 { out.WriteString(", ") } } return nil } // // Boiler plates ... // type isOrderByClauseInterface interface { isOrderByClauseType() } type isOrderByClause struct { } func (o *isOrderByClause) isOrderByClauseType() { } type isProjectionInterface interface { isProjectionType() } type isProjection struct { } func (p *isProjection) isProjectionType() { }