public static void Error(string s, bool lineBreak = false) { lock (Out.Lock) { Out.RedirecToErr = true; Out.Echo($"{Colors.Error}{s}{Colors.Default}", lineBreak); Out.RedirecToErr = false; } }
static void _Echo( this DataTable table, ConsoleTextWriterWrapper @out, CommandEvaluationContext context, TableFormattingOptions options = null) { options ??= context.ShellEnv.GetValue <TableFormattingOptions>(ShellEnvironmentVar.display_tableFormattingOptions); @out.EnableFillLineFromCursor = false; @out.HideCur(); var colLengths = new int[table.Columns.Count]; foreach (var rw in table.Rows) { var cols = ((DataRow)rw).ItemArray; for (int i = 0; i < cols.Length; i++) { string s, s2; if (table is Table t) { s = @out.GetPrint(t.GetFormatedValue(context, table.Columns[i].ColumnName, cols[i]?.ToString())) ?? ""; colLengths[i] = Math.Max(s.Length, colLengths[i]); s2 = @out.GetPrint(t.GetFormatedHeader(table.Columns[i].ColumnName)) ?? ""; colLengths[i] = Math.Max(s2.Length, colLengths[i]); if (i == cols.Length - 1) { colLengths[i] = s.Length + 2; } } else { s = @out.GetPrint(cols[i]?.ToString()) ?? ""; colLengths[i] = Math.Max(s.Length, colLengths[i]); colLengths[i] = Math.Max(table.Columns[i].ColumnName.Length, colLengths[i]); if (i == cols.Length - 1) { colLengths[i] = 1; } if (i == cols.Length - 1) { colLengths[i] = s.Length + 2; } } } } var colsep = options.NoBorders ? " ".PadLeft(Math.Max(1, options.ColumnRightMargin)) : (context.ShellEnv.Colors.TableBorder + " | " + context.ShellEnv.Colors.Default); var colseplength = options.NoBorders ? 0 : 3; var tablewidth = options.NoBorders ? 0 : 3; for (int i = 0; i < table.Columns.Count; i++) { tablewidth += table.Columns[i].ColumnName.PadRight(colLengths[i], ' ').Length + colseplength; } var line = options.NoBorders ? "" : (context.ShellEnv.Colors.TableBorder + "".PadRight(tablewidth, '-')); if (!options.NoBorders) { @out.Echoln(line); } string fxh(string header) => (table is Table t) ? t.GetFormatedHeader(header) : header; // headers for (int i = 0; i < table.Columns.Count; i++) { if (!options.NoBorders && i == 0) { @out.Echo(colsep); } var col = table.Columns[i]; var colName = (i == table.Columns.Count - 1 && !options.PadLastColumn) ? fxh(col.ColumnName) : fxh(col.ColumnName).PadRight(colLengths[i], ' '); var prfx = (options.NoBorders) ? Uon : ""; var pofx = (options.NoBorders) ? Tdoff : ""; @out.Echo(context.ShellEnv.Colors.TableColumnName + prfx + colName + colsep + pofx); } @out.Echoln(); if (!options.NoBorders) { @out.Echoln(line); } // rows string fhv(string header, string value) => (table is Table t) ? t.GetFormatedValue(context, header, value) : value; foreach (var rw in table.Rows) { if (context.CommandLineProcessor.CancellationTokenSource.IsCancellationRequested) { @out.EnableFillLineFromCursor = true; @out.ShowCur(); @out.Echoln(context.ShellEnv.Colors.Default + ""); return; } var row = (DataRow)rw; var arr = row.ItemArray; for (int i = 0; i < arr.Length; i++) { if (!options.NoBorders && i == 0) { @out.Echo(colsep); } var txt = (arr[i] == null) ? "" : arr[i].ToString(); var fvalue = fhv(table.Columns[i].ColumnName, txt); var o = arr[i]; MethodInfo mi = null; if (((!(o is string)) || table.Columns[i].DataType == typeof(object)) && o != null && (mi = o.GetEchoMethod()) != null) { // value dump via Echo primitive @out.Echo("" + context.ShellEnv.Colors.Default); var p0 = @out.CursorPos; mi.InvokeEcho(o, new EchoEvaluationContext(@out, context, new FormatingOptions(options) { LineBreak = false })); var p1 = @out.CursorPos; if (p1.Y == p0.Y) { var l = p1.X - p0.X; var spc = (i == arr.Length - 1 && !options.PadLastColumn) ? "" : ("".PadRight(Math.Max(0, colLengths[i] - l), ' ')); @out.Echo(spc); } @out.Echo(colsep); } else { // value dump by ToString var l = @out.GetPrint(fvalue).Length; var spc = (i == arr.Length - 1 && !options.PadLastColumn) ? "" : ("".PadRight(Math.Max(0, colLengths[i] - l), ' ')); @out.Echo("" + context.ShellEnv.Colors.Default); @out.Echo(fvalue); @out.Echo(spc + colsep); } } @out.Echoln(); } @out.Echo(line + context.ShellEnv.Colors.Default.ToString()); @out.ShowCur(); @out.EnableFillLineFromCursor = true; }
public static void Print( ConsoleTextWriterWrapper @out, CancellationTokenSource cancellationTokenSource, Table table, bool noBorders = false, bool padLastColumn = true) { @out.EnableFillLineFromCursor = false; @out.HideCur(); var colLengths = new int[table.Columns.Count]; foreach (var rw in table.Rows) { var cols = ((DataRow)rw).ItemArray; for (int i = 0; i < cols.Length; i++) { var s = @out.GetPrint(table.GetFormatedValue(table.Columns[i].ColumnName, cols[i]?.ToString())) ?? ""; colLengths[i] = Math.Max(s.Length, colLengths[i]); var s2 = @out.GetPrint(table.GetFormatedHeader(table.Columns[i].ColumnName)) ?? ""; colLengths[i] = Math.Max(s2.Length, colLengths[i]); } } var colsep = noBorders ? " " : (ColorSettings.TableBorder + " | " + ColorSettings.Default); var colseplength = noBorders ? 0 : 3; var tablewidth = noBorders ? 0 : 3; for (int i = 0; i < table.Columns.Count; i++) { tablewidth += table.Columns[i].ColumnName.PadRight(colLengths[i], ' ').Length + colseplength; } var line = noBorders ? "" : (ColorSettings.TableBorder + "".PadRight(tablewidth, '-')); if (!noBorders) { @out.Echoln(line); } for (int i = 0; i < table.Columns.Count; i++) { if (i == 0) { @out.Echo(colsep); } var col = table.Columns[i]; var colName = (i == table.Columns.Count - 1 && !padLastColumn) ? table.GetFormatedHeader(col.ColumnName) : table.GetFormatedHeader(col.ColumnName).PadRight(colLengths[i], ' '); @out.Echo(ColorSettings.TableColumnName + colName + colsep); } @out.Echoln(); if (!noBorders) { @out.Echoln(line); } foreach (var rw in table.Rows) { if (cancellationTokenSource.IsCancellationRequested) { @out.EnableFillLineFromCursor = true; @out.ShowCur(); @out.Echoln(ColorSettings.Default + ""); return; } var row = (DataRow)rw; var arr = row.ItemArray; for (int i = 0; i < arr.Length; i++) { if (i == 0) { Out.Echo(colsep); } var txt = (arr[i] == null) ? "" : arr[i].ToString(); var fvalue = table.GetFormatedValue(table.Columns[i].ColumnName, txt); var l = Out.GetPrint(fvalue).Length; var spc = (i == arr.Length - 1 && !padLastColumn) ? "" : ("".PadRight(Math.Max(0, colLengths[i] - l), ' ')); @out.Echo(ColorSettings.Default + fvalue + spc + colsep); } @out.Echoln(); } @out.Echoln(line + ColorSettings.Default.ToString()); @out.ShowCur(); @out.EnableFillLineFromCursor = true; }