package beads
import (
"context"
"errors"
"sort"
"strings"
"sourcecraft.dev/bigbes/sr-ht-dolt/browse"
)
// --- helpers -----------------------------------------------------------------
// readRows reads up to Max rows of a required table and its reported total.
func readRows(ctx context.Context, sess BrowseSession, ref, table string) (*browse.RowPage, int, error) {
page, err := sess.Rows(ctx, ref, table, 0, Max)
if err != nil {
return nil, 0, err
}
return page, page.Total, nil
}
// readRowsOptional is readRows for a table that may not exist: ErrTableNotFound
// degrades to (nil, 0, nil) so the caller can treat it as empty.
func readRowsOptional(ctx context.Context, sess BrowseSession, ref, table string) (*browse.RowPage, int, error) {
page, err := sess.Rows(ctx, ref, table, 0, Max)
if err != nil {
if errors.Is(err, browse.ErrTableNotFound) {
return nil, 0, nil
}
return nil, 0, err
}
return page, page.Total, nil
}
// indexCols builds a column-name → cell-index map from a RowPage's Columns, so
// cells are addressed by name regardless of the underlying column order.
func indexCols(cols []string) map[string]int {
m := make(map[string]int, len(cols))
for i, c := range cols {
m[c] = i
}
return m
}
// cell returns the named column's value for a row, or "" when the column is
// absent, out of range, or the literal browse NULL placeholder.
func cell(cols map[string]int, row []string, name string) string {
i, ok := cols[name]
if !ok || i < 0 || i >= len(row) {
return ""
}
v := row[i]
if v == "NULL" {
return ""
}
return v
}
// truthy reports whether a cell reads as a set boolean/flag.
func truthy(s string) bool {
switch strings.ToLower(strings.TrimSpace(s)) {
case "1", "true", "yes", "t", "y":
return true
}
return false
}
// sortedKeys returns a set's keys in ascending order.
func sortedKeys(set map[string]bool) []string {
out := make([]string, 0, len(set))
for k := range set {
out = append(out, k)
}
sort.Strings(out)
return out
}
// containsString reports whether s is in xs.
func containsString(xs []string, s string) bool {
for _, x := range xs {
if x == s {
return true
}
}
return false
}