// Part of the Crubit project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

#ifndef CRUBIT_RS_BINDINGS_FROM_CC_GENERATE_BINDINGS_AND_METADATA_H_
#define CRUBIT_RS_BINDINGS_FROM_CC_GENERATE_BINDINGS_AND_METADATA_H_

#include <string>
#include <vector>

#include "absl/container/flat_hash_map.h"
#include "absl/status/statusor.h"
#include "rs_bindings_from_cc/cmdline.h"
#include "rs_bindings_from_cc/collect_namespaces.h"
#include "rs_bindings_from_cc/ir.h"

namespace crubit {
// Contains generated bindings and all related metadata, such as the IR.
struct BindingsAndMetadata {
  // Intermediate representation of the Clang AST from which we generated
  // bindings.
  IR ir;
  // Generated Rust source code.
  std::string rs_api;
  // Generated C++ source code.
  std::string rs_api_impl;
  // A hierarchy tree for all C++ namespaces used in the target.
  NamespacesHierarchy namespaces;
  // C++ class templates explicitly instantiated in this TU and their Rust
  // struct name.
  absl::flat_hash_map<std::string, std::string> instantiations;
  // A JSON error report, if requested.
  std::string error_report;
};

// Returns `BindingsAndMetadata` as requested by the user on the command line.
absl::StatusOr<BindingsAndMetadata> GenerateBindingsAndMetadata(
    Cmdline& cmdline, std::vector<std::string> clang_args,
    absl::flat_hash_map<HeaderName, std::string>
        virtual_headers_contents_for_testing = {});

}  // namespace crubit

#endif  // CRUBIT_RS_BINDINGS_FROM_CC_GENERATE_BINDINGS_AND_METADATA_H_
