#ifndef QPID_MESSAGING_ADDRESSPARSER_H
#define QPID_MESSAGING_ADDRESSPARSER_H

/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 */
#include "qpid/messaging/Address.h"

namespace qpid {
namespace messaging {

class AddressParser
{
  public:
    AddressParser(const std::string&);
    bool parse(Address& address);
    bool parseMap(qpid::types::Variant::Map& map);
    bool parseList(qpid::types::Variant::List& list);
  private:
    const std::string& input;
    std::string::size_type current;
    static const std::string RESERVED;

    bool readChar(char c);
    bool readQuotedString(std::string& s);
    bool readQuotedValue(qpid::types::Variant& value);
    bool readString(std::string& value, char delimiter);
    bool readWord(std::string& word, const std::string& delims = RESERVED);
    bool readSimpleValue(qpid::types::Variant& word);
    bool readKey(std::string& key);
    bool readValue(qpid::types::Variant& value);
    bool readValueIfExists(qpid::types::Variant& value);
    bool readKeyValuePair(qpid::types::Variant::Map& map);
    bool readMap(qpid::types::Variant& value);
    bool readList(qpid::types::Variant& value);
    bool readName(std::string& name);
    bool readSubject(std::string& subject);
    bool error(const std::string& message);
    bool eos();
    bool iswhitespace();
    bool in(const std::string& delims);
    bool isreserved();
    void readListItems(qpid::types::Variant::List& list);
    void readMapEntries(qpid::types::Variant::Map& map);
};

}} // namespace qpid::messaging

#endif  /*!QPID_MESSAGING_ADDRESSPARSER_H*/
