mirror of
https://github.com/hibiken/asynq.git
synced 2025-10-03 17:22:01 +08:00
(cli): Add formatByteSlice helper func
This commit is contained in:
@@ -315,7 +315,7 @@ var activeTaskTableColumns = []*columnConfig[*asynq.TaskInfo]{
|
|||||||
{"Type", alignLeft, func(t *asynq.TaskInfo) string { return t.Type }},
|
{"Type", alignLeft, func(t *asynq.TaskInfo) string { return t.Type }},
|
||||||
{"Retried", alignRight, func(t *asynq.TaskInfo) string { return strconv.Itoa(t.Retried) }},
|
{"Retried", alignRight, func(t *asynq.TaskInfo) string { return strconv.Itoa(t.Retried) }},
|
||||||
{"Max Retry", alignRight, func(t *asynq.TaskInfo) string { return strconv.Itoa(t.MaxRetry) }},
|
{"Max Retry", alignRight, func(t *asynq.TaskInfo) string { return strconv.Itoa(t.MaxRetry) }},
|
||||||
{"Payload", alignLeft, func(t *asynq.TaskInfo) string { return string(t.Payload) }},
|
{"Payload", alignLeft, func(t *asynq.TaskInfo) string { return formatByteSlice(t.Payload) }},
|
||||||
}
|
}
|
||||||
|
|
||||||
var pendingTaskTableColumns = []*columnConfig[*asynq.TaskInfo]{
|
var pendingTaskTableColumns = []*columnConfig[*asynq.TaskInfo]{
|
||||||
@@ -323,13 +323,13 @@ var pendingTaskTableColumns = []*columnConfig[*asynq.TaskInfo]{
|
|||||||
{"Type", alignLeft, func(t *asynq.TaskInfo) string { return t.Type }},
|
{"Type", alignLeft, func(t *asynq.TaskInfo) string { return t.Type }},
|
||||||
{"Retried", alignRight, func(t *asynq.TaskInfo) string { return strconv.Itoa(t.Retried) }},
|
{"Retried", alignRight, func(t *asynq.TaskInfo) string { return strconv.Itoa(t.Retried) }},
|
||||||
{"Max Retry", alignRight, func(t *asynq.TaskInfo) string { return strconv.Itoa(t.MaxRetry) }},
|
{"Max Retry", alignRight, func(t *asynq.TaskInfo) string { return strconv.Itoa(t.MaxRetry) }},
|
||||||
{"Payload", alignLeft, func(t *asynq.TaskInfo) string { return string(t.Payload) }},
|
{"Payload", alignLeft, func(t *asynq.TaskInfo) string { return formatByteSlice(t.Payload) }},
|
||||||
}
|
}
|
||||||
|
|
||||||
var aggregatingTaskTableColumns = []*columnConfig[*asynq.TaskInfo]{
|
var aggregatingTaskTableColumns = []*columnConfig[*asynq.TaskInfo]{
|
||||||
{"ID", alignLeft, func(t *asynq.TaskInfo) string { return t.ID }},
|
{"ID", alignLeft, func(t *asynq.TaskInfo) string { return t.ID }},
|
||||||
{"Type", alignLeft, func(t *asynq.TaskInfo) string { return t.Type }},
|
{"Type", alignLeft, func(t *asynq.TaskInfo) string { return t.Type }},
|
||||||
{"Payload", alignLeft, func(t *asynq.TaskInfo) string { return string(t.Payload) }},
|
{"Payload", alignLeft, func(t *asynq.TaskInfo) string { return formatByteSlice(t.Payload) }},
|
||||||
{"Group", alignLeft, func(t *asynq.TaskInfo) string { return t.Group }},
|
{"Group", alignLeft, func(t *asynq.TaskInfo) string { return t.Group }},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -337,9 +337,9 @@ var scheduledTaskTableColumns = []*columnConfig[*asynq.TaskInfo]{
|
|||||||
{"ID", alignLeft, func(t *asynq.TaskInfo) string { return t.ID }},
|
{"ID", alignLeft, func(t *asynq.TaskInfo) string { return t.ID }},
|
||||||
{"Type", alignLeft, func(t *asynq.TaskInfo) string { return t.Type }},
|
{"Type", alignLeft, func(t *asynq.TaskInfo) string { return t.Type }},
|
||||||
{"Next Process Time", alignLeft, func(t *asynq.TaskInfo) string {
|
{"Next Process Time", alignLeft, func(t *asynq.TaskInfo) string {
|
||||||
return fmt.Sprintf("in %v", (t.NextProcessAt.Sub(time.Now()).Round(time.Second))) // FIXME: the cells are not aligned with the header
|
return fmt.Sprintf("in %v", (t.NextProcessAt.Sub(time.Now()).Round(time.Second)))
|
||||||
}},
|
}},
|
||||||
{"Payload", alignLeft, func(t *asynq.TaskInfo) string { return string(t.Payload) }},
|
{"Payload", alignLeft, func(t *asynq.TaskInfo) string { return formatByteSlice(t.Payload) }},
|
||||||
}
|
}
|
||||||
|
|
||||||
var retryTaskTableColumns = []*columnConfig[*asynq.TaskInfo]{
|
var retryTaskTableColumns = []*columnConfig[*asynq.TaskInfo]{
|
||||||
@@ -354,7 +354,7 @@ var retryTaskTableColumns = []*columnConfig[*asynq.TaskInfo]{
|
|||||||
{"Next Process Time", alignLeft, func(t *asynq.TaskInfo) string {
|
{"Next Process Time", alignLeft, func(t *asynq.TaskInfo) string {
|
||||||
return fmt.Sprintf("in %v", (t.NextProcessAt.Sub(time.Now()).Round(time.Second)))
|
return fmt.Sprintf("in %v", (t.NextProcessAt.Sub(time.Now()).Round(time.Second)))
|
||||||
}},
|
}},
|
||||||
{"Payload", alignLeft, func(t *asynq.TaskInfo) string { return string(t.Payload) }},
|
{"Payload", alignLeft, func(t *asynq.TaskInfo) string { return formatByteSlice(t.Payload) }},
|
||||||
}
|
}
|
||||||
|
|
||||||
var archivedTaskTableColumns = []*columnConfig[*asynq.TaskInfo]{
|
var archivedTaskTableColumns = []*columnConfig[*asynq.TaskInfo]{
|
||||||
@@ -366,7 +366,7 @@ var archivedTaskTableColumns = []*columnConfig[*asynq.TaskInfo]{
|
|||||||
{"Last Failure Time", alignLeft, func(t *asynq.TaskInfo) string {
|
{"Last Failure Time", alignLeft, func(t *asynq.TaskInfo) string {
|
||||||
return t.LastFailedAt.Format("2006-01-02 15:04:05 MST")
|
return t.LastFailedAt.Format("2006-01-02 15:04:05 MST")
|
||||||
}},
|
}},
|
||||||
{"Payload", alignLeft, func(t *asynq.TaskInfo) string { return string(t.Payload) }},
|
{"Payload", alignLeft, func(t *asynq.TaskInfo) string { return formatByteSlice(t.Payload) }},
|
||||||
}
|
}
|
||||||
|
|
||||||
var completedTaskTableColumns = []*columnConfig[*asynq.TaskInfo]{
|
var completedTaskTableColumns = []*columnConfig[*asynq.TaskInfo]{
|
||||||
@@ -375,8 +375,8 @@ var completedTaskTableColumns = []*columnConfig[*asynq.TaskInfo]{
|
|||||||
{"Completion Time", alignLeft, func(t *asynq.TaskInfo) string {
|
{"Completion Time", alignLeft, func(t *asynq.TaskInfo) string {
|
||||||
return t.CompletedAt.Format("2006-01-02 15:04:05 MST")
|
return t.CompletedAt.Format("2006-01-02 15:04:05 MST")
|
||||||
}},
|
}},
|
||||||
{"Payload", alignLeft, func(t *asynq.TaskInfo) string { return string(t.Payload) }}, // TODO: format these bytes correctly
|
{"Payload", alignLeft, func(t *asynq.TaskInfo) string { return formatByteSlice(t.Payload) }}, // TODO: format these bytes correctly
|
||||||
{"Result", alignLeft, func(t *asynq.TaskInfo) string { return string(t.Result) }},
|
{"Result", alignLeft, func(t *asynq.TaskInfo) string { return formatByteSlice(t.Result) }},
|
||||||
}
|
}
|
||||||
|
|
||||||
func drawTaskTable(d *ScreenDrawer, state *State) {
|
func drawTaskTable(d *ScreenDrawer, state *State) {
|
||||||
@@ -574,12 +574,10 @@ func drawTaskModal(d *ScreenDrawer, state *State) {
|
|||||||
baseStyle,
|
baseStyle,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
if isPrintable(task.Payload) {
|
|
||||||
contents = append(contents, &rowContent{
|
contents = append(contents, &rowContent{
|
||||||
fmt.Sprintf("Payload: %s", string(task.Payload)),
|
fmt.Sprintf(" Payload: %s", formatByteSlice(task.Payload)),
|
||||||
baseStyle,
|
baseStyle,
|
||||||
})
|
})
|
||||||
}
|
|
||||||
withModal(d, contents)
|
withModal(d, contents)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -600,6 +598,16 @@ func isPrintable(data []byte) bool {
|
|||||||
return !isAllSpace
|
return !isAllSpace
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func formatByteSlice(data []byte) string {
|
||||||
|
if data == nil {
|
||||||
|
return "<nil>"
|
||||||
|
}
|
||||||
|
if !isPrintable(data) {
|
||||||
|
return "<non-printable>"
|
||||||
|
}
|
||||||
|
return string(data)
|
||||||
|
}
|
||||||
|
|
||||||
type rowContent struct {
|
type rowContent struct {
|
||||||
s string // should not include newline
|
s string // should not include newline
|
||||||
style tcell.Style
|
style tcell.Style
|
||||||
|
@@ -27,7 +27,6 @@ type column[V any] struct {
|
|||||||
width int
|
width int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Helper to draw a table.
|
// Helper to draw a table.
|
||||||
func drawTable[V any](d *ScreenDrawer, style tcell.Style, configs []*columnConfig[V], data []V, highlightRowIdx int) {
|
func drawTable[V any](d *ScreenDrawer, style tcell.Style, configs []*columnConfig[V], data []V, highlightRowIdx int) {
|
||||||
const colBuffer = " " // extra buffer between columns
|
const colBuffer = " " // extra buffer between columns
|
||||||
@@ -47,9 +46,9 @@ func drawTable[V any](d *ScreenDrawer, style tcell.Style, configs []*columnConfi
|
|||||||
headerStyle := style.Background(tcell.ColorDimGray).Foreground(tcell.ColorWhite)
|
headerStyle := style.Background(tcell.ColorDimGray).Foreground(tcell.ColorWhite)
|
||||||
for _, col := range cols {
|
for _, col := range cols {
|
||||||
if col.alignment == alignLeft {
|
if col.alignment == alignLeft {
|
||||||
d.Print(rpad(col.name, col.width) + colBuffer, headerStyle)
|
d.Print(rpad(col.name, col.width)+colBuffer, headerStyle)
|
||||||
} else {
|
} else {
|
||||||
d.Print(lpad(col.name, col.width) + colBuffer, headerStyle)
|
d.Print(lpad(col.name, col.width)+colBuffer, headerStyle)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
d.FillLine(' ', headerStyle)
|
d.FillLine(' ', headerStyle)
|
||||||
@@ -61,9 +60,9 @@ func drawTable[V any](d *ScreenDrawer, style tcell.Style, configs []*columnConfi
|
|||||||
}
|
}
|
||||||
for _, col := range cols {
|
for _, col := range cols {
|
||||||
if col.alignment == alignLeft {
|
if col.alignment == alignLeft {
|
||||||
d.Print(rpad(col.displayFn(v), col.width) + colBuffer, rowStyle)
|
d.Print(rpad(col.displayFn(v), col.width)+colBuffer, rowStyle)
|
||||||
} else {
|
} else {
|
||||||
d.Print(lpad(col.displayFn(v), col.width) + colBuffer, rowStyle)
|
d.Print(lpad(col.displayFn(v), col.width)+colBuffer, rowStyle)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
d.FillLine(' ', rowStyle)
|
d.FillLine(' ', rowStyle)
|
||||||
|
Reference in New Issue
Block a user