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 }