// Copyright (c) 2013 The Chromium 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 TOOLS_GN_STANDARD_OUT_H_
#define TOOLS_GN_STANDARD_OUT_H_

#include <string>

enum TextDecoration {
  DECORATION_NONE = 0,
  DECORATION_DIM,
  DECORATION_RED,
  DECORATION_GREEN,
  DECORATION_BLUE,
  DECORATION_YELLOW,
  DECORATION_MAGENTA
};

enum HtmlEscaping {
  NO_ESCAPING,

  // Convert < and > to &lt; and &gt; when writing markdown output in non-code
  // sections.
  DEFAULT_ESCAPING,
};

void OutputString(std::string_view output,
                  TextDecoration dec = DECORATION_NONE,
                  HtmlEscaping = DEFAULT_ESCAPING);

// Use for nonfatal warnings and log messages printed out during execution.
//
// Like OutputString() but in quiet mode this will buffer the output and only
// print it if there was a failure. Use for things that are neither errors nor
// the "main output" of the application.
void OutputLogString(std::string_view output,
                     TextDecoration dec = DECORATION_NONE,
                     HtmlEscaping = DEFAULT_ESCAPING);

// Enable or flush to stdout the for quiet mode from OutputLogString().
// BufferLogOutput() is not threadsafe and is expected to be called from early
// process init before we've created any worker thread.
void BufferLogOutput();
void FlushBufferedOutput();

// If printing markdown, this generates table-of-contents entries with
// links to the actual help; otherwise, prints a one-line description.
void PrintSectionHelp(const std::string& line,
                      const std::string& topic,
                      const std::string& tag);

// Prints a line for a command, assuming there is a colon. Everything before
// the colon is the command (and is highlighted). After the colon if there is
// a square bracket, the contents of the bracket is dimmed.
//
// The link_tag is set, it will be used for markdown output links. This is
// used when generating the markdown for all help topics. If empty, no link tag
// will be emitted. In non-markdown mode, this parameter will be ignored.
//
// The line is indented 2 spaces.
void PrintShortHelp(const std::string& line,
                    const std::string& link_tag = std::string());

// Prints a longer help section.
//
// Rules:
// - Lines beginning with non-whitespace are highlighted up to the first
//   colon (or the whole line if not).
// - Lines whose first non-whitespace character is a # are dimmed.
//
// The tag will be used as a link target for the first header. This is used
// when generating the markdown for all help topics. If empty, no link tag will
// be emitted. Used only in markdown mode.
void PrintLongHelp(const std::string& text, const std::string& tag = "");

bool IsColorEnabled();

#endif  // TOOLS_GN_STANDARD_OUT_H_
