blob: 713f08cdc6ad2e59f7b48e0ae0238774c1431f9b [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_DEVELOPER_DEBUG_ZXDB_CONSOLE_FORMAT_TABLE_H_
#define SRC_DEVELOPER_DEBUG_ZXDB_CONSOLE_FORMAT_TABLE_H_
#include <string>
#include <vector>
#include "src/developer/debug/zxdb/console/output_buffer.h"
namespace zxdb {
enum class Align { kLeft, kRight };
struct ColSpec {
explicit ColSpec(Align align = Align::kLeft, int max_width = 0,
const std::string& head = std::string(), int pad_left = 0,
Syntax syntax = Syntax::kNormal)
: align(align), max_width(max_width), head(head), pad_left(pad_left), syntax(syntax) {}
Align align = Align::kLeft;
// If anything is above the max width, we'll give up and push the remaining
// cells for that row to the right as necessary.
//
// 0 means no maximum.
int max_width = 0;
// Empty string means no heading.
std::string head;
// Extra padding to the left of this column.
int pad_left = 0;
// Syntax highlighting style for this column when printing strings.
// When using the OutputBuffer variants this is ignored because it's assumed
// that the OutputBuffers contain the desired formatting.
Syntax syntax = Syntax::kNormal;
};
// Formats the given rows in the output as a series of horizontally aligned (if
// possible) columns.
//
// If the number of items in a row is less than the number of items in the
// spec, the last element in the rows will occupy the remaining space and it
// won't affect other columns (like you used colspan in HTML). Such items will
// always be left-aligned.
void FormatTable(const std::vector<ColSpec>& spec,
const std::vector<std::vector<std::string>>& rows, OutputBuffer* out);
void FormatTable(const std::vector<ColSpec>& spec,
const std::vector<std::vector<OutputBuffer>>& rows, OutputBuffer* out);
// Helper function to save some typing for static column specs.
inline void FormatTable(std::initializer_list<ColSpec> spec,
const std::vector<std::vector<std::string>>& rows, OutputBuffer* out) {
return FormatTable(std::vector<ColSpec>(spec), rows, out);
}
inline void FormatTable(std::initializer_list<ColSpec> spec,
const std::vector<std::vector<OutputBuffer>>& rows, OutputBuffer* out) {
return FormatTable(std::vector<ColSpec>(spec), rows, out);
}
} // namespace zxdb
#endif // SRC_DEVELOPER_DEBUG_ZXDB_CONSOLE_FORMAT_TABLE_H_