Skip to content

Commit 241ba8c

Browse files
authored
Merge pull request #2 from noborus/improve-err
Unify error handling with static error variables
2 parents 5383680 + 2945ee0 commit 241ba8c

3 files changed

Lines changed: 24 additions & 10 deletions

File tree

markdown.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package termhyo
22

33
import (
4-
"fmt"
54
"strings"
65
)
76

@@ -27,7 +26,7 @@ func hasAutoWidth(table *Table) bool {
2726
// AddRow adds a row for markdown rendering (buffered mode for width calculation).
2827
func (r *MarkdownRenderer) AddRow(_ *Table, row Row) error {
2928
if r.rendered {
30-
return fmt.Errorf("cannot add rows after table is rendered")
29+
return ErrAddAfterRender
3130
}
3231

3332
// Buffer the row for width calculation
@@ -40,7 +39,7 @@ func (r *MarkdownRenderer) AddRow(_ *Table, row Row) error {
4039
// Render renders any remaining content (for streaming, this is just cleanup).
4140
func (r *MarkdownRenderer) Render(table *Table) error {
4241
if r.rendered {
43-
return fmt.Errorf("table already rendered")
42+
return ErrTableAlreadyRendered
4443
}
4544

4645
// Calculate column widths if needed using all buffered rows

renderer.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package termhyo
22

3-
import "fmt"
4-
53
// Renderer defines the interface for different rendering strategies.
64
type Renderer interface {
75
AddRow(table *Table, row Row) error
@@ -39,7 +37,7 @@ type Buffered struct {
3937
// AddRow adds a row to the buffered renderer.
4038
func (r *Buffered) AddRow(table *Table, row Row) error {
4139
if r.rendered {
42-
return fmt.Errorf("cannot add rows after table is rendered")
40+
return ErrAddAfterRender
4341
}
4442
// Store row for later rendering
4543
table.rows = append(table.rows, row)
@@ -49,7 +47,7 @@ func (r *Buffered) AddRow(table *Table, row Row) error {
4947
// Render renders the buffered content all at once.
5048
func (r *Buffered) Render(table *Table) error {
5149
if r.rendered {
52-
return fmt.Errorf("table already rendered")
50+
return ErrTableAlreadyRendered
5351
}
5452

5553
// Calculate column widths for auto-width columns
@@ -88,7 +86,7 @@ type Streaming struct {
8886
// AddRow adds a row to the streaming renderer.
8987
func (r *Streaming) AddRow(table *Table, row Row) error {
9088
if r.rendered {
91-
return fmt.Errorf("cannot add rows after table is rendered")
89+
return ErrAddAfterRender
9290
}
9391

9492
if !r.headerDone {
@@ -104,7 +102,7 @@ func (r *Streaming) AddRow(table *Table, row Row) error {
104102
// Render renders the streaming content, typically just the footer.
105103
func (r *Streaming) Render(table *Table) error {
106104
if r.rendered {
107-
return fmt.Errorf("table already rendered")
105+
return ErrTableAlreadyRendered
108106
}
109107

110108
// For streaming mode, just render footer

table.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,24 @@
11
package termhyo
22

33
import (
4+
"errors"
45
"io"
56
"strings"
67
)
78

9+
var (
10+
// ErrNoColumns is returned when trying to render a table with no columns defined.
11+
ErrNoColumns = errors.New("no columns defined")
12+
// ErrNoHeader is returned when trying to render a table without a header.
13+
ErrNoHeader = errors.New("header is required")
14+
// ErrNoMarkdownHeader is returned when trying to render a markdown table without a header.
15+
ErrNoMarkdownHeader = errors.New("markdown table requires at least one non-empty header")
16+
// ErrTableAlreadyRendered is returned when trying to render a table that has already been rendered.
17+
ErrTableAlreadyRendered = errors.New("table has already been rendered")
18+
// ErrAddAfterRender is returned when trying to add a row after rendering.
19+
ErrAddAfterRender = errors.New("cannot add row after table has been rendered")
20+
)
21+
822
// TableOption is a functional option for configuring Table.
923
type TableOption func(*Table)
1024

@@ -59,7 +73,7 @@ func (t *Table) GetAlign() bool {
5973
//
6074
// Example:
6175
//
62-
// table := termhyo.NewTable(os.Stdout, columns, termhyo.Border(termhyo.DoubleStyle), termhyo.Align(false))
76+
// table := termhyo.NewTable(os.Stdout, columns, termhyo.Border(termhyo.DoubleStyle), termhyo.AutoAlign(false))
6377
//
6478
// This is the recommended way to create and configure tables in termhyo.
6579
func NewTable(writer io.Writer, columns []Column, opts ...TableOption) *Table {
@@ -223,6 +237,9 @@ func (t *Table) CalculateColumnWidths() {
223237

224238
// RenderHeader renders the table header.
225239
func (t *Table) RenderHeader() error {
240+
if len(t.columns) == 0 {
241+
return ErrNoColumns
242+
}
226243
// Top border (only if enabled)
227244
if t.borderConfig.Top {
228245
if err := t.RenderBorderLine("top"); err != nil {

0 commit comments

Comments
 (0)