#ifndef ARGPARSE_UTIL_HPP
#define ARGPARSE_UTIL_HPP
#include <array>
#include <vector>
#include <map>
#include <memory>
#include <string>

namespace argparse {
    class Argument;

    //Splits off the leading dashes of a string, returning the dashes (index 0)
    //and the rest of the string (index 1)
    std::array<std::string,2> split_leading_dashes(std::string str);

    //Converts a string to upper case
    std::string toupper(std::string str);

    //Converts a string to lower case
    std::string tolower(std::string str);

    //Returns true if str represents a named argument starting with
    //'-' or '--' followed by one or more letters
    bool is_argument(std::string str, const std::map<std::string,std::shared_ptr<Argument>>& arg_map);

    //Returns true if str is in choices, or choices is empty
    bool is_valid_choice(std::string str, const std::vector<std::string>& choices);

    //Returns 'str' interpreted as type T
    // Throws an exception if conversion fails
    template<typename T> 
    T as(std::string str);

    template<typename Container>
    std::string join(Container container, std::string join_str);

    char* strdup(const char* str);

    std::vector<std::string> wrap_width(std::string str, size_t width, std::vector<std::string> split_str={" ", "/"});

    std::string basename(std::string filepath);
} //namespace

#include "argparse_util.tpp"

#endif
