#ifndef FLATBUFFERS_BFBS_NAMER
#define FLATBUFFERS_BFBS_NAMER

#include "flatbuffers/reflection.h"
#include "namer.h"

namespace flatbuffers {

// Provides Namer capabilities to types defined in the flatbuffers reflection.
class BfbsNamer : public Namer {
 public:
  explicit BfbsNamer(Config config, std::set<std::string> keywords)
      : Namer(config, std::move(keywords)) {}

  using Namer::Constant;
  using Namer::Denamespace;
  using Namer::Directories;
  using Namer::Field;
  using Namer::File;
  using Namer::Function;
  using Namer::Method;
  using Namer::Namespace;
  using Namer::NamespacedType;
  using Namer::ObjectType;
  using Namer::Type;
  using Namer::Variable;
  using Namer::Variant;

  template <typename T>
  std::string Denamespace(T t, std::string& namespace_prefix,
                          const char delimiter = '.') const {
    return Namer::Denamespace(t->name()->c_str(), namespace_prefix, delimiter);
  }

  template <typename T>
  std::string Denamespace(T t, const char delimiter = '.') const {
    return Namer::Denamespace(t->name()->c_str(), delimiter);
  }

  virtual std::string Field(const ::reflection::Field& f) const {
    return Field(f.name()->str());
  }

  virtual std::string Variable(const ::reflection::Field& f) const {
    return Variable(f.name()->str());
  }
};

}  // namespace flatbuffers

#endif  // FLATBUFFERS_BFBS_NAMER
