#pragma once

#include <string>
#include <string_view>
#include <vector>

namespace bmcweb
{
// This is a naive replacement for boost::split until
// https://github.com/llvm/llvm-project/issues/40486
// is resolved
inline void split(std::vector<std::string>& strings, std::string_view str,
                  char delim)
{
    size_t start = 0;
    size_t end = 0;
    while (end <= str.size())
    {
        end = str.find(delim, start);
        strings.emplace_back(str.substr(start, end - start));
        start = end + 1;
    }
}

inline void append_with_sep(std::string& out, const char sep,
                            const std::string& arg)
{
    if (!out.empty())
    {
        out += sep;
    }
    out += arg;
}

// join 'args' strings with a separator without creating any intermediate
// objects, append to 'out'
template <typename... Args>
void append_with_sep(std::string& out, const char sep, const std::string& arg,
                     const Args&... args)
{
    append_with_sep(out, sep, arg);
    append_with_sep(out, sep, args...);
}

} // namespace bmcweb
