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

#ifndef CHROMEOS_DBUS_BINDINGS_NAME_PARSER_H_
#define CHROMEOS_DBUS_BINDINGS_NAME_PARSER_H_

#include <string>
#include <vector>

#include <base/macros.h>

namespace chromeos_dbus_bindings {

class IndentedText;

// A helper class that allows to decompose D-Bus name strings such as
// "org.chromium.TestInterface" into components and be able to construct the
// corresponding C++ identifiers, namespaces, variable names, etc.
class NameParser {
 public:
  explicit NameParser(const std::string& name);

  const std::string& type_name() const { return type_name_; }
  const std::vector<std::string> namespaces() const { return namespaces_; }

  // Returns fully-qualified C++ type name for the current D-Bus name
  // for example "org::chromium::TestInterface".
  std::string MakeFullCppName() const;

  // Returns a variable name suitable for object of this type.
  // For example "test_interface".
  std::string MakeVariableName() const;

  // Returns a name of an interface for the given type, optionally qualifying
  // it with the C++ namespaces.
  std::string MakeInterfaceName(bool fully_qualified) const;

  // Returns a name of a proxy class for the given type, optionally qualifying
  // it with the C++ namespaces.
  std::string MakeProxyName(bool fully_qualified) const;

  // Returns a name of an adaptor class for the given type, optionally
  // qualifying it with the C++ namespaces.
  std::string MakeAdaptorName(bool fully_qualified) const;

  // Adds opening "namespace ... {" statements to |text|.
  // If |add_main_type| is true, adds the main type name as a namespace as well.
  void AddOpenNamespaces(IndentedText* text, bool add_main_type) const;

  // Adds closing "}  // namespace ..." statements to |text|.
  // If |add_main_type| is true, adds the main type name as a namespace as well.
  void AddCloseNamespaces(IndentedText* text, bool add_main_type) const;

 private:
  // Helper function to prepend the C++ namespaces to the |name|.
  std::string MakeFullyQualified(const std::string& name) const;

  std::string type_name_;                // e.g. "TestInterface".
  std::vector<std::string> namespaces_;  // e.g. {"org", "chromium"}.
};

}  // namespace chromeos_dbus_bindings

#endif  // CHROMEOS_DBUS_BINDINGS_NAME_PARSER_H_
