// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef BASE_STRINGS_STRINGPRINTF_H_
#define BASE_STRINGS_STRINGPRINTF_H_

#include <stdarg.h>  // va_list

#include <string>

#include "base/base_export.h"
#include "base/compiler_specific.h"
#include "third_party/abseil-cpp/absl/strings/str_format.h"

namespace base {

// Returns a C++ string given `printf()`-like input. The format string must be a
// compile-time constant (like with `std::format()`), or this will not compile.
// TODO(crbug.com/40241565): Replace calls to this with direct calls to
// `absl::StrFormat()` and remove.
template <typename... Args>
[[nodiscard]] std::string StringPrintf(const absl::FormatSpec<Args...>& format,
                                       const Args&... args) {
  return absl::StrFormat(format, args...);
}

// Returns a C++ string given `vprintf()`-like input.
[[nodiscard]] PRINTF_FORMAT(1, 0) BASE_EXPORT std::string
    StringPrintV(const char* format, va_list ap);

// Like `StringPrintf()`, but appends result to a supplied string.
// TODO(crbug.com/40241565): Replace calls to this with direct calls to
// `absl::StrAppendFormat()` and remove.
template <typename... Args>
void StringAppendF(std::string* dst,
                   const absl::FormatSpec<Args...>& format,
                   const Args&... args) {
  absl::StrAppendFormat(dst, format, args...);
}

// Like `StringPrintV()`, but appends result to a supplied string.
PRINTF_FORMAT(2, 0)
BASE_EXPORT
void StringAppendV(std::string* dst, const char* format, va_list ap);

}  // namespace base

#endif  // BASE_STRINGS_STRINGPRINTF_H_
