| // 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_ |