JSDOMConvertNullable.h [plain text]
#pragma once
#include "IDLTypes.h"
#include "JSDOMConvertAny.h"
#include "JSDOMConvertInterface.h"
#include "JSDOMConvertNumbers.h"
#include "JSDOMConvertStrings.h"
namespace WebCore {
namespace Detail {
template<typename IDLType>
struct NullableConversionType;
template<typename IDLType>
struct NullableConversionType {
using Type = typename IDLNullable<IDLType>::ImplementationType;
};
template<typename T>
struct NullableConversionType<IDLInterface<T>> {
using Type = typename Converter<IDLInterface<T>>::ReturnType;
};
template<>
struct NullableConversionType<IDLAny> {
using Type = typename Converter<IDLAny>::ReturnType;
};
}
template<typename T> struct Converter<IDLNullable<T>> : DefaultConverter<IDLNullable<T>> {
using ReturnType = typename Detail::NullableConversionType<T>::Type;
static ReturnType convert(JSC::JSGlobalObject& lexicalGlobalObject, JSC::JSValue value)
{
if (value.isUndefinedOrNull())
return T::nullValue();
return Converter<T>::convert(lexicalGlobalObject, value);
}
static ReturnType convert(JSC::JSGlobalObject& lexicalGlobalObject, JSC::JSValue value, JSC::JSObject& thisObject)
{
if (value.isUndefinedOrNull())
return T::nullValue();
return Converter<T>::convert(lexicalGlobalObject, value, thisObject);
}
static ReturnType convert(JSC::JSGlobalObject& lexicalGlobalObject, JSC::JSValue value, JSDOMGlobalObject& globalObject)
{
if (value.isUndefinedOrNull())
return T::nullValue();
return Converter<T>::convert(lexicalGlobalObject, value, globalObject);
}
template<typename ExceptionThrower = DefaultExceptionThrower>
static ReturnType convert(JSC::JSGlobalObject& lexicalGlobalObject, JSC::JSValue value, ExceptionThrower&& exceptionThrower)
{
if (value.isUndefinedOrNull())
return T::nullValue();
return Converter<T>::convert(lexicalGlobalObject, value, std::forward<ExceptionThrower>(exceptionThrower));
}
template<typename ExceptionThrower = DefaultExceptionThrower>
static ReturnType convert(JSC::JSGlobalObject& lexicalGlobalObject, JSC::JSValue value, JSC::JSObject& thisObject, ExceptionThrower&& exceptionThrower)
{
if (value.isUndefinedOrNull())
return T::nullValue();
return Converter<T>::convert(lexicalGlobalObject, value, thisObject, std::forward<ExceptionThrower>(exceptionThrower));
}
template<typename ExceptionThrower = DefaultExceptionThrower>
static ReturnType convert(JSC::JSGlobalObject& lexicalGlobalObject, JSC::JSValue value, JSDOMGlobalObject& globalObject, ExceptionThrower&& exceptionThrower)
{
if (value.isUndefinedOrNull())
return T::nullValue();
return Converter<T>::convert(lexicalGlobalObject, value, globalObject, std::forward<ExceptionThrower>(exceptionThrower));
}
};
template<typename T> struct JSConverter<IDLNullable<T>> {
using ImplementationType = typename IDLNullable<T>::ImplementationType;
static constexpr bool needsState = JSConverter<T>::needsState;
static constexpr bool needsGlobalObject = JSConverter<T>::needsGlobalObject;
template<typename U>
static JSC::JSValue convert(U&& value)
{
if (T::isNullValue(value))
return JSC::jsNull();
return JSConverter<T>::convert(T::extractValueFromNullable(value));
}
template<typename U>
static JSC::JSValue convert(JSC::JSGlobalObject& lexicalGlobalObject, U&& value)
{
if (T::isNullValue(value))
return JSC::jsNull();
return JSConverter<T>::convert(lexicalGlobalObject, T::extractValueFromNullable(value));
}
template<typename U>
static JSC::JSValue convert(JSC::JSGlobalObject& lexicalGlobalObject, JSDOMGlobalObject& globalObject, U&& value)
{
if (T::isNullValue(value))
return JSC::jsNull();
return JSConverter<T>::convert(lexicalGlobalObject, globalObject, T::extractValueFromNullable(value));
}
template<typename U>
static JSC::JSValue convertNewlyCreated(JSC::JSGlobalObject& lexicalGlobalObject, JSDOMGlobalObject& globalObject, U&& value)
{
if (T::isNullValue(value))
return JSC::jsNull();
return JSConverter<T>::convert(lexicalGlobalObject, globalObject, T::extractValueFromNullable(value));
}
};
}