#ifndef GIN_DATA_OBJECT_BUILDER_H_
#define GIN_DATA_OBJECT_BUILDER_H_
#include <string_view>
#include <utility>
#include "base/check.h"
#include "base/memory/raw_ptr.h"
#include "gin/converter.h"
#include "gin/gin_export.h"
#include "v8/include/v8-forward.h"
#include "v8/include/v8-object.h"
namespace gin {
class GIN_EXPORT DataObjectBuilder {
public:
explicit DataObjectBuilder(v8::Isolate* isolate);
DataObjectBuilder(const DataObjectBuilder&) = delete;
DataObjectBuilder& operator=(const DataObjectBuilder&) = delete;
~DataObjectBuilder();
template <typename T>
DataObjectBuilder& Set(std::string_view key, T&& value) {
DCHECK(!object_.IsEmpty());
v8::Local<v8::String> v8_key = StringToSymbol(isolate_, key);
v8::Local<v8::Value> v8_value =
ConvertToV8(isolate_, std::forward<T>(value));
CHECK(object_->CreateDataProperty(context_, v8_key, v8_value).ToChecked());
return *this;
}
template <typename T>
DataObjectBuilder& Set(uint32_t index, T&& value) {
DCHECK(!object_.IsEmpty());
v8::Local<v8::Value> v8_value =
ConvertToV8(isolate_, std::forward<T>(value));
CHECK(object_->CreateDataProperty(context_, index, v8_value).ToChecked());
return *this;
}
v8::Local<v8::Object> Build() {
DCHECK(!object_.IsEmpty());
v8::Local<v8::Object> result = object_;
object_.Clear();
return result;
}
private:
raw_ptr<v8::Isolate> isolate_;
v8::Local<v8::Context> context_;
v8::Local<v8::Object> object_;
};
}
#endif