// file      : butl/string-parser -*- C++ -*-
// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd
// license   : MIT; see accompanying LICENSE file

#ifndef BUTL_STRING_PARSER
#define BUTL_STRING_PARSER

#include <string>
#include <vector>
#include <cstddef>   // size_t
#include <utility>   // pair
#include <stdexcept> // invalid_argument

#include <butl/export>

namespace butl
{
  class LIBBUTL_EXPORT invalid_string: public std::invalid_argument
  {
  public:
    invalid_string (std::size_t p, const std::string& d)
        : invalid_argument (d), position (p) {}

    std::size_t position; // Zero-based.
  };

  class LIBBUTL_EXPORT string_parser
  {
  public:
    // Parse a whitespace-separated list of strings. Can contain single or
    // double quoted substrings. No escaping is supported. If unquote is true,
    // return one-level unquoted values. Throw invalid_string in case of
    // invalid quoting.
    //
    static std::vector<std::string>
    parse_quoted (const std::string&, bool unquote);

    // As above but return a list of string and zero-based position pairs.
    // Position is useful for issuing diagnostics about an invalid string
    // during second-level parsing.
    //
    static std::vector<std::pair<std::string, std::size_t>>
    parse_quoted_position (const std::string&, bool unquote);

    // Remove a single level of quotes. Note that the format or the
    // correctness of the quotation is not validated.
    //
    static std::string
    unquote (const std::string&);

    static std::vector<std::string>
    unquote (const std::vector<std::string>&);
  };
}

#endif // BUTL_STRING_PARSER