// 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_
