diff --git a/example/src/getTests.ts b/example/src/getTests.ts index a1f2c1c61..226b2a3f9 100644 --- a/example/src/getTests.ts +++ b/example/src/getTests.ts @@ -1002,6 +1002,21 @@ export function getTests( .didNotThrow() .equals({ age: 24, name: 'marc' }) ), + createTest('jsStyleObjectAsParameters()', async () => + ( + await it(() => + timeoutedPromise((complete) => { + testObject.jsStyleObjectAsParameters({ + value: 55, + onChanged: (num) => complete(num), + }) + }) + ) + ) + .didNotThrow() + .didReturn('number') + .equals(55) + ), // Hybrid Object Tests createTest('get self', () => diff --git a/packages/nitrogen/src/syntax/kotlin/KotlinCxxBridgedType.ts b/packages/nitrogen/src/syntax/kotlin/KotlinCxxBridgedType.ts index 546916374..04bab48cd 100644 --- a/packages/nitrogen/src/syntax/kotlin/KotlinCxxBridgedType.ts +++ b/packages/nitrogen/src/syntax/kotlin/KotlinCxxBridgedType.ts @@ -620,8 +620,7 @@ export class KotlinCxxBridgedType implements BridgedType<'kotlin', 'c++'> { return parameterName } case 'struct': - case 'enum': - case 'function': { + case 'enum': { switch (language) { case 'c++': return `${parameterName}->toCpp()` @@ -662,6 +661,14 @@ export class KotlinCxxBridgedType implements BridgedType<'kotlin', 'c++'> { return parameterName } } + case 'function': { + switch (language) { + case 'c++': + return `${parameterName}->cthis()->getFunction()` + default: + return parameterName + } + } case 'array-buffer': { switch (language) { case 'c++': diff --git a/packages/nitrogen/src/syntax/kotlin/KotlinFunction.ts b/packages/nitrogen/src/syntax/kotlin/KotlinFunction.ts index 1c2fff81c..5f8221c8e 100644 --- a/packages/nitrogen/src/syntax/kotlin/KotlinFunction.ts +++ b/packages/nitrogen/src/syntax/kotlin/KotlinFunction.ts @@ -121,6 +121,11 @@ namespace ${cxxNamespace} { ${indent(callBody, ' ')} } + public: + inline const ${typename}& getFunction() const { + return _func; + } + public: static auto constexpr kJavaDescriptor = "L${jniClassDescriptor};"; static void registerNatives() { diff --git a/packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/HybridTestObjectKotlin.kt b/packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/HybridTestObjectKotlin.kt index 363769c55..ac4b5b38e 100644 --- a/packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/HybridTestObjectKotlin.kt +++ b/packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/HybridTestObjectKotlin.kt @@ -230,6 +230,10 @@ class HybridTestObjectKotlin: HybridTestObjectSwiftKotlinSpec() { return car.driver } + override fun jsStyleObjectAsParameters(params: JsStyleStruct): Unit { + params.onChanged(params.value) + } + override fun createArrayBuffer(): ArrayBuffer { return ArrayBuffer.allocate(1024 * 1024 * 10) // 10 MB } diff --git a/packages/react-native-nitro-image/cpp/HybridTestObjectCpp.cpp b/packages/react-native-nitro-image/cpp/HybridTestObjectCpp.cpp index 0ec714bd8..2a53435f1 100644 --- a/packages/react-native-nitro-image/cpp/HybridTestObjectCpp.cpp +++ b/packages/react-native-nitro-image/cpp/HybridTestObjectCpp.cpp @@ -380,6 +380,10 @@ std::optional HybridTestObjectCpp::getDriver(const Car& car) { } } +void HybridTestObjectCpp::jsStyleObjectAsParameters(const JsStyleStruct& params) { + params.onChanged(params.value); +} + std::shared_ptr HybridTestObjectCpp::createArrayBuffer() { size_t size = 1024 * 1024 * 10; // 10MB uint8_t* buffer = new uint8_t[size]; diff --git a/packages/react-native-nitro-image/cpp/HybridTestObjectCpp.hpp b/packages/react-native-nitro-image/cpp/HybridTestObjectCpp.hpp index 236fb75ef..e031e1771 100644 --- a/packages/react-native-nitro-image/cpp/HybridTestObjectCpp.hpp +++ b/packages/react-native-nitro-image/cpp/HybridTestObjectCpp.hpp @@ -127,6 +127,7 @@ class HybridTestObjectCpp : public HybridTestObjectCppSpec { Car getCar() override; bool isCarElectric(const Car& car) override; std::optional getDriver(const Car& car) override; + void jsStyleObjectAsParameters(const JsStyleStruct& params) override; std::shared_ptr createArrayBuffer() override; double getBufferLastItem(const std::shared_ptr& buffer) override; void setAllValuesTo(const std::shared_ptr& buffer, double value) override; diff --git a/packages/react-native-nitro-image/ios/HybridTestObjectSwift.swift b/packages/react-native-nitro-image/ios/HybridTestObjectSwift.swift index b873fc37b..783d38960 100644 --- a/packages/react-native-nitro-image/ios/HybridTestObjectSwift.swift +++ b/packages/react-native-nitro-image/ios/HybridTestObjectSwift.swift @@ -249,6 +249,10 @@ class HybridTestObjectSwift : HybridTestObjectSwiftKotlinSpec { return car.driver } + func jsStyleObjectAsParameters(params: JsStyleStruct) throws -> Void { + params.onChanged(params.value) + } + func createArrayBuffer() throws -> ArrayBufferHolder { return .allocate(size: 1024 * 1024 * 10) // 10 MB } diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/NitroImageOnLoad.cpp b/packages/react-native-nitro-image/nitrogen/generated/android/NitroImageOnLoad.cpp index a98aaf215..4259c0ae6 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/NitroImageOnLoad.cpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/NitroImageOnLoad.cpp @@ -22,6 +22,7 @@ #include "JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_double____.hpp" #include "JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer_____.hpp" #include "JFunc_std__shared_ptr_Promise_std__string__.hpp" +#include "JFunc_void_double.hpp" #include "JHybridBaseSpec.hpp" #include "JHybridChildSpec.hpp" #include @@ -53,6 +54,7 @@ int initialize(JavaVM* vm) { margelo::nitro::image::JFunc_std__shared_ptr_Promise_double__::registerNatives(); margelo::nitro::image::JFunc_std__shared_ptr_Promise_std__string__::registerNatives(); margelo::nitro::image::JFunc_void_std__string::registerNatives(); + margelo::nitro::image::JFunc_void_double::registerNatives(); margelo::nitro::image::JHybridBaseSpec::registerNatives(); margelo::nitro::image::JHybridChildSpec::registerNatives(); diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_double__.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_double__.hpp index 0635dcb64..28f80b1d0 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_double__.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_double__.hpp @@ -45,6 +45,11 @@ namespace margelo::nitro::image { }(); } + public: + inline const std::function>()>& getFunction() const { + return _func; + } + public: static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/Func_std__shared_ptr_Promise_double__;"; static void registerNatives() { diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_double____.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_double____.hpp index 3a98e3463..d11678955 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_double____.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_double____.hpp @@ -56,6 +56,11 @@ namespace margelo::nitro::image { }(); } + public: + inline const std::function>>>()>& getFunction() const { + return _func; + } + public: static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_double____;"; static void registerNatives() { diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer_____.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer_____.hpp index 66c764ef4..5c277d66f 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer_____.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer_____.hpp @@ -59,6 +59,11 @@ namespace margelo::nitro::image { }(); } + public: + inline const std::function>>>>()>& getFunction() const { + return _func; + } + public: static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer_____;"; static void registerNatives() { diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__string__.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__string__.hpp index d75fb1180..c0733ee45 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__string__.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__string__.hpp @@ -46,6 +46,11 @@ namespace margelo::nitro::image { }(); } + public: + inline const std::function>()>& getFunction() const { + return _func; + } + public: static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/Func_std__shared_ptr_Promise_std__string__;"; static void registerNatives() { diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void.hpp index ff66ac3fd..7ac92680a 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void.hpp @@ -31,6 +31,11 @@ namespace margelo::nitro::image { _func(); } + public: + inline const std::function& getFunction() const { + return _func; + } + public: static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/Func_void;"; static void registerNatives() { diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void_double.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void_double.hpp new file mode 100644 index 000000000..3ca66114a --- /dev/null +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void_double.hpp @@ -0,0 +1,53 @@ +/// +/// JFunc_void_double.hpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#include +#include + +#include + +namespace margelo::nitro::image { + + using namespace facebook; + + /** + * C++ representation of the callback Func_void_double. + * This is a Kotlin `(num: Double) -> Unit`, backed by a `std::function<...>`. + */ + struct JFunc_void_double final: public jni::HybridClass { + public: + static jni::local_ref fromCpp(const std::function& func) { + return JFunc_void_double::newObjectCxxArgs(func); + } + + public: + void call(double num) { + _func(num); + } + + public: + inline const std::function& getFunction() const { + return _func; + } + + public: + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/Func_void_double;"; + static void registerNatives() { + registerHybrid({makeNativeMethod("call", JFunc_void_double::call)}); + } + + private: + explicit JFunc_void_double(const std::function& func): _func(func) { } + + private: + friend HybridBase; + std::function _func; + }; + +} // namespace margelo::nitro::image diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void_std__optional_double_.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void_std__optional_double_.hpp index f974dc2d4..246efd45b 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void_std__optional_double_.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void_std__optional_double_.hpp @@ -32,6 +32,11 @@ namespace margelo::nitro::image { _func(maybe != nullptr ? std::make_optional(maybe->value()) : std::nullopt); } + public: + inline const std::function /* maybe */)>& getFunction() const { + return _func; + } + public: static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/Func_void_std__optional_double_;"; static void registerNatives() { diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void_std__string.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void_std__string.hpp index 3aa8af789..a8c5bf639 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void_std__string.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void_std__string.hpp @@ -32,6 +32,11 @@ namespace margelo::nitro::image { _func(valueFromJs->toStdString()); } + public: + inline const std::function& getFunction() const { + return _func; + } + public: static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/Func_void_std__string;"; static void registerNatives() { diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void_std__vector_Powertrain_.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void_std__vector_Powertrain_.hpp index 66f574887..2b0d39fd9 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void_std__vector_Powertrain_.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void_std__vector_Powertrain_.hpp @@ -43,6 +43,11 @@ namespace margelo::nitro::image { }()); } + public: + inline const std::function& /* array */)>& getFunction() const { + return _func; + } + public: static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/Func_void_std__vector_Powertrain_;"; static void registerNatives() { diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridTestObjectSwiftKotlinSpec.cpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridTestObjectSwiftKotlinSpec.cpp index 6419d08ad..355943620 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridTestObjectSwiftKotlinSpec.cpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridTestObjectSwiftKotlinSpec.cpp @@ -25,6 +25,8 @@ namespace NitroModules { class ArrayBuffer; } namespace margelo::nitro::image { class HybridChildSpec; } // Forward declaration of `HybridBaseSpec` to properly resolve imports. namespace margelo::nitro::image { class HybridBaseSpec; } +// Forward declaration of `JsStyleStruct` to properly resolve imports. +namespace margelo::nitro::image { struct JsStyleStruct; } #include #include "HybridTestObjectSwiftKotlinSpec.hpp" @@ -64,6 +66,9 @@ namespace margelo::nitro::image { class HybridBaseSpec; } #include "JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer_____.hpp" #include "JFunc_std__shared_ptr_Promise_std__string__.hpp" #include "JFunc_void_std__string.hpp" +#include "JsStyleStruct.hpp" +#include "JJsStyleStruct.hpp" +#include "JFunc_void_double.hpp" namespace margelo::nitro::image { @@ -617,6 +622,10 @@ namespace margelo::nitro::image { auto __result = method(_javaPart, JCar::fromCpp(car)); return __result != nullptr ? std::make_optional(__result->toCpp()) : std::nullopt; } + void JHybridTestObjectSwiftKotlinSpec::jsStyleObjectAsParameters(const JsStyleStruct& params) { + static const auto method = _javaPart->getClass()->getMethod /* params */)>("jsStyleObjectAsParameters"); + method(_javaPart, JJsStyleStruct::fromCpp(params)); + } std::shared_ptr JHybridTestObjectSwiftKotlinSpec::createArrayBuffer() { static const auto method = _javaPart->getClass()->getMethod()>("createArrayBuffer"); auto __result = method(_javaPart); diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridTestObjectSwiftKotlinSpec.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridTestObjectSwiftKotlinSpec.hpp index 64d626a9b..05b78b7a8 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridTestObjectSwiftKotlinSpec.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridTestObjectSwiftKotlinSpec.hpp @@ -111,6 +111,7 @@ namespace margelo::nitro::image { Car getCar() override; bool isCarElectric(const Car& car) override; std::optional getDriver(const Car& car) override; + void jsStyleObjectAsParameters(const JsStyleStruct& params) override; std::shared_ptr createArrayBuffer() override; double getBufferLastItem(const std::shared_ptr& buffer) override; void setAllValuesTo(const std::shared_ptr& buffer, double value) override; diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JJsStyleStruct.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JJsStyleStruct.hpp new file mode 100644 index 000000000..778f04364 --- /dev/null +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JJsStyleStruct.hpp @@ -0,0 +1,57 @@ +/// +/// JJsStyleStruct.hpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#include +#include "JsStyleStruct.hpp" + +#include "JFunc_void_double.hpp" +#include + +namespace margelo::nitro::image { + + using namespace facebook; + + /** + * The C++ JNI bridge between the C++ struct "JsStyleStruct" and the the Kotlin data class "JsStyleStruct". + */ + struct JJsStyleStruct final: public jni::JavaClass { + public: + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/JsStyleStruct;"; + + public: + /** + * Convert this Java/Kotlin-based struct to the C++ struct JsStyleStruct by copying all values to C++. + */ + [[maybe_unused]] + JsStyleStruct toCpp() const { + static const auto clazz = javaClassStatic(); + static const auto fieldValue = clazz->getField("value"); + double value = this->getFieldValue(fieldValue); + static const auto fieldOnChanged = clazz->getField("onChanged"); + jni::local_ref onChanged = this->getFieldValue(fieldOnChanged); + return JsStyleStruct( + value, + onChanged->cthis()->getFunction() + ); + } + + public: + /** + * Create a Java/Kotlin-based struct by copying all values from the given C++ struct to Java. + */ + [[maybe_unused]] + static jni::local_ref fromCpp(const JsStyleStruct& value) { + return newInstance( + value.value, + JFunc_void_double::fromCpp(value.onChanged) + ); + } + }; + +} // namespace margelo::nitro::image diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/Func_void_double.kt b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/Func_void_double.kt new file mode 100644 index 000000000..6d6190eea --- /dev/null +++ b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/Func_void_double.kt @@ -0,0 +1,46 @@ +/// +/// Func_void_double.kt +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +package com.margelo.nitro.image + +import androidx.annotation.Keep +import com.facebook.jni.HybridData +import com.facebook.proguard.annotations.DoNotStrip +import com.margelo.nitro.core.* +import dalvik.annotation.optimization.FastNative + +/** + * Represents the JavaScript callback `(num: number) => void`. + * This is implemented in C++, via a `std::function<...>`. + */ +@DoNotStrip +@Keep +@Suppress("RedundantSuppression", "ConvertSecondaryConstructorToPrimary", "RedundantUnitReturnType", "KotlinJniMissingFunction", "ClassName", "unused") +class Func_void_double { + @DoNotStrip + @Keep + private val mHybridData: HybridData + + @DoNotStrip + @Keep + private constructor(hybridData: HybridData) { + mHybridData = hybridData + } + + /** + * Converts this function to a Kotlin Lambda. + * This exists purely as syntactic sugar, and has minimal runtime overhead. + */ + fun toLambda(): (num: Double) -> Unit = this::call + + /** + * Call the given JS callback. + * @throws Throwable if the JS function itself throws an error, or if the JS function/runtime has already been deleted. + */ + @FastNative + external fun call(num: Double): Unit +} diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridTestObjectSwiftKotlinSpec.kt b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridTestObjectSwiftKotlinSpec.kt index 73d700d1c..41f38f6bc 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridTestObjectSwiftKotlinSpec.kt +++ b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridTestObjectSwiftKotlinSpec.kt @@ -322,6 +322,10 @@ abstract class HybridTestObjectSwiftKotlinSpec: HybridObject() { @Keep abstract fun getDriver(car: Car): Person? + @DoNotStrip + @Keep + abstract fun jsStyleObjectAsParameters(params: JsStyleStruct): Unit + @DoNotStrip @Keep abstract fun createArrayBuffer(): ArrayBuffer diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/JsStyleStruct.kt b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/JsStyleStruct.kt new file mode 100644 index 000000000..34d8f9277 --- /dev/null +++ b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/JsStyleStruct.kt @@ -0,0 +1,22 @@ +/// +/// JsStyleStruct.kt +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +package com.margelo.nitro.image + +import androidx.annotation.Keep +import com.facebook.proguard.annotations.DoNotStrip +import com.margelo.nitro.core.* + +/** + * Represents the JavaScript object/struct "JsStyleStruct". + */ +@DoNotStrip +@Keep +data class JsStyleStruct( + val value: Double, + val onChanged: (num: Double) -> Unit +) diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImage-Swift-Cxx-Umbrella.hpp b/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImage-Swift-Cxx-Umbrella.hpp index 693b60e3a..60393df92 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImage-Swift-Cxx-Umbrella.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImage-Swift-Cxx-Umbrella.hpp @@ -28,6 +28,8 @@ namespace margelo::nitro::image { class HybridTestObjectSwiftKotlinSpec; } namespace margelo::nitro::image { enum class ImageFormat; } // Forward declaration of `ImageSize` to properly resolve imports. namespace margelo::nitro::image { struct ImageSize; } +// Forward declaration of `JsStyleStruct` to properly resolve imports. +namespace margelo::nitro::image { struct JsStyleStruct; } // Forward declaration of `OldEnum` to properly resolve imports. namespace margelo::nitro::image { enum class OldEnum; } // Forward declaration of `Person` to properly resolve imports. @@ -46,6 +48,7 @@ namespace margelo::nitro::image { enum class Powertrain; } #include "HybridTestObjectSwiftKotlinSpec.hpp" #include "ImageFormat.hpp" #include "ImageSize.hpp" +#include "JsStyleStruct.hpp" #include "OldEnum.hpp" #include "Person.hpp" #include "PixelFormat.hpp" diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridTestObjectSwiftKotlinSpecSwift.hpp b/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridTestObjectSwiftKotlinSpecSwift.hpp index 6d659eafa..3024ec7b9 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridTestObjectSwiftKotlinSpecSwift.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridTestObjectSwiftKotlinSpecSwift.hpp @@ -28,6 +28,8 @@ namespace margelo::nitro::image { struct Car; } namespace NitroModules { class ArrayBuffer; } // Forward declaration of `ArrayBufferHolder` to properly resolve imports. namespace NitroModules { class ArrayBufferHolder; } +// Forward declaration of `JsStyleStruct` to properly resolve imports. +namespace margelo::nitro::image { struct JsStyleStruct; } // Forward declaration of `HybridChildSpec` to properly resolve imports. namespace margelo::nitro::image { class HybridChildSpec; } // Forward declaration of `HybridBaseSpec` to properly resolve imports. @@ -49,6 +51,7 @@ namespace margelo::nitro::image { class HybridBaseSpec; } #include "Car.hpp" #include #include +#include "JsStyleStruct.hpp" #include "HybridChildSpec.hpp" #include "HybridBaseSpec.hpp" @@ -447,6 +450,12 @@ namespace margelo::nitro::image { auto __value = std::move(__result.value()); return __value; } + inline void jsStyleObjectAsParameters(const JsStyleStruct& params) override { + auto __result = _swiftPart.jsStyleObjectAsParameters(params); + if (__result.hasError()) [[unlikely]] { + std::rethrow_exception(__result.error()); + } + } inline std::shared_ptr createArrayBuffer() override { auto __result = _swiftPart.createArrayBuffer(); if (__result.hasError()) [[unlikely]] { diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/Func_void_double.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/Func_void_double.swift index cbbcf48f0..96ea3f965 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/Func_void_double.swift +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/Func_void_double.swift @@ -8,21 +8,21 @@ import NitroModules /** - * Wraps a Swift `((_ value: Double) -> Void)` as a class. + * Wraps a Swift `((_ num: Double) -> Void)` as a class. * This class can be used from C++, e.g. to wrap the Swift closure as a `std::function`. */ public final class Func_void_double { public typealias bridge = margelo.nitro.image.bridge.swift - private let closure: ((_ value: Double) -> Void) + private let closure: ((_ num: Double) -> Void) - public init(_ closure: @escaping ((_ value: Double) -> Void)) { + public init(_ closure: @escaping ((_ num: Double) -> Void)) { self.closure = closure } @inline(__always) - public func call(value: Double) -> Void { - self.closure(value) + public func call(num: Double) -> Void { + self.closure(num) } /** diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpec.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpec.swift index d998bb865..206ee34ba 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpec.swift +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpec.swift @@ -62,6 +62,7 @@ public protocol HybridTestObjectSwiftKotlinSpec_protocol: AnyObject { func getCar() throws -> Car func isCarElectric(car: Car) throws -> Bool func getDriver(car: Car) throws -> Person? + func jsStyleObjectAsParameters(params: JsStyleStruct) throws -> Void func createArrayBuffer() throws -> ArrayBufferHolder func getBufferLastItem(buffer: ArrayBufferHolder) throws -> Double func setAllValuesTo(buffer: ArrayBufferHolder, value: Double) throws -> Void diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpec_cxx.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpec_cxx.swift index 36e9c2596..ff61ae821 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpec_cxx.swift +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpec_cxx.swift @@ -1132,6 +1132,17 @@ public class HybridTestObjectSwiftKotlinSpec_cxx { } } + @inline(__always) + public func jsStyleObjectAsParameters(params: JsStyleStruct) -> bridge.Result_void_ { + do { + try self.__implementation.jsStyleObjectAsParameters(params: params) + return bridge.create_Result_void_() + } catch (let __error) { + let __exceptionPtr = __error.toCpp() + return bridge.create_Result_void_(__exceptionPtr) + } + } + @inline(__always) public func createArrayBuffer() -> bridge.Result_std__shared_ptr_ArrayBuffer__ { do { diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/JsStyleStruct.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/JsStyleStruct.swift new file mode 100644 index 000000000..c17c15398 --- /dev/null +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/JsStyleStruct.swift @@ -0,0 +1,57 @@ +/// +/// JsStyleStruct.swift +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +import NitroModules + +/** + * Represents an instance of `JsStyleStruct`, backed by a C++ struct. + */ +public typealias JsStyleStruct = margelo.nitro.image.JsStyleStruct + +public extension JsStyleStruct { + private typealias bridge = margelo.nitro.image.bridge.swift + + /** + * Create a new instance of `JsStyleStruct`. + */ + init(value: Double, onChanged: @escaping ((_ num: Double) -> Void)) { + self.init(value, { () -> bridge.Func_void_double in + let __closureWrapper = Func_void_double(onChanged) + return bridge.create_Func_void_double(__closureWrapper.toUnsafe()) + }()) + } + + var value: Double { + @inline(__always) + get { + return self.__value + } + @inline(__always) + set { + self.__value = newValue + } + } + + var onChanged: ((_ num: Double) -> Void) { + @inline(__always) + get { + return { () -> ((Double) -> Void) in + let __wrappedFunction = bridge.wrap_Func_void_double(self.__onChanged) + return { (__num: Double) -> Void in + __wrappedFunction.call(__num) + } + }() + } + @inline(__always) + set { + self.__onChanged = { () -> bridge.Func_void_double in + let __closureWrapper = Func_void_double(newValue) + return bridge.create_Func_void_double(__closureWrapper.toUnsafe()) + }() + } + } +} diff --git a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectCppSpec.cpp b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectCppSpec.cpp index e1c691611..51ce513e0 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectCppSpec.cpp +++ b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectCppSpec.cpp @@ -84,6 +84,7 @@ namespace margelo::nitro::image { prototype.registerHybridMethod("getCar", &HybridTestObjectCppSpec::getCar); prototype.registerHybridMethod("isCarElectric", &HybridTestObjectCppSpec::isCarElectric); prototype.registerHybridMethod("getDriver", &HybridTestObjectCppSpec::getDriver); + prototype.registerHybridMethod("jsStyleObjectAsParameters", &HybridTestObjectCppSpec::jsStyleObjectAsParameters); prototype.registerHybridMethod("createArrayBuffer", &HybridTestObjectCppSpec::createArrayBuffer); prototype.registerHybridMethod("getBufferLastItem", &HybridTestObjectCppSpec::getBufferLastItem); prototype.registerHybridMethod("setAllValuesTo", &HybridTestObjectCppSpec::setAllValuesTo); diff --git a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectCppSpec.hpp b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectCppSpec.hpp index 9025294c0..da51c1910 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectCppSpec.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectCppSpec.hpp @@ -27,6 +27,8 @@ namespace margelo::nitro::image { struct Person; } namespace NitroModules { class AnyMap; } // Forward declaration of `ArrayBuffer` to properly resolve imports. namespace NitroModules { class ArrayBuffer; } +// Forward declaration of `JsStyleStruct` to properly resolve imports. +namespace margelo::nitro::image { struct JsStyleStruct; } // Forward declaration of `HybridChildSpec` to properly resolve imports. namespace margelo::nitro::image { class HybridChildSpec; } // Forward declaration of `HybridBaseSpec` to properly resolve imports. @@ -48,6 +50,7 @@ namespace margelo::nitro::image { class HybridBaseSpec; } #include #include #include +#include "JsStyleStruct.hpp" #include "HybridChildSpec.hpp" #include "HybridBaseSpec.hpp" @@ -151,6 +154,7 @@ namespace margelo::nitro::image { virtual Car getCar() = 0; virtual bool isCarElectric(const Car& car) = 0; virtual std::optional getDriver(const Car& car) = 0; + virtual void jsStyleObjectAsParameters(const JsStyleStruct& params) = 0; virtual std::shared_ptr createArrayBuffer() = 0; virtual double getBufferLastItem(const std::shared_ptr& buffer) = 0; virtual void setAllValuesTo(const std::shared_ptr& buffer, double value) = 0; diff --git a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectSwiftKotlinSpec.cpp b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectSwiftKotlinSpec.cpp index d090eac21..b4dd7930d 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectSwiftKotlinSpec.cpp +++ b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectSwiftKotlinSpec.cpp @@ -75,6 +75,7 @@ namespace margelo::nitro::image { prototype.registerHybridMethod("getCar", &HybridTestObjectSwiftKotlinSpec::getCar); prototype.registerHybridMethod("isCarElectric", &HybridTestObjectSwiftKotlinSpec::isCarElectric); prototype.registerHybridMethod("getDriver", &HybridTestObjectSwiftKotlinSpec::getDriver); + prototype.registerHybridMethod("jsStyleObjectAsParameters", &HybridTestObjectSwiftKotlinSpec::jsStyleObjectAsParameters); prototype.registerHybridMethod("createArrayBuffer", &HybridTestObjectSwiftKotlinSpec::createArrayBuffer); prototype.registerHybridMethod("getBufferLastItem", &HybridTestObjectSwiftKotlinSpec::getBufferLastItem); prototype.registerHybridMethod("setAllValuesTo", &HybridTestObjectSwiftKotlinSpec::setAllValuesTo); diff --git a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectSwiftKotlinSpec.hpp b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectSwiftKotlinSpec.hpp index a1b2b25d4..f1fda565c 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectSwiftKotlinSpec.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectSwiftKotlinSpec.hpp @@ -27,6 +27,8 @@ namespace NitroModules { class AnyMap; } namespace margelo::nitro::image { struct Car; } // Forward declaration of `ArrayBuffer` to properly resolve imports. namespace NitroModules { class ArrayBuffer; } +// Forward declaration of `JsStyleStruct` to properly resolve imports. +namespace margelo::nitro::image { struct JsStyleStruct; } // Forward declaration of `HybridChildSpec` to properly resolve imports. namespace margelo::nitro::image { class HybridChildSpec; } // Forward declaration of `HybridBaseSpec` to properly resolve imports. @@ -47,6 +49,7 @@ namespace margelo::nitro::image { class HybridBaseSpec; } #include #include "Car.hpp" #include +#include "JsStyleStruct.hpp" #include "HybridChildSpec.hpp" #include "HybridBaseSpec.hpp" @@ -141,6 +144,7 @@ namespace margelo::nitro::image { virtual Car getCar() = 0; virtual bool isCarElectric(const Car& car) = 0; virtual std::optional getDriver(const Car& car) = 0; + virtual void jsStyleObjectAsParameters(const JsStyleStruct& params) = 0; virtual std::shared_ptr createArrayBuffer() = 0; virtual double getBufferLastItem(const std::shared_ptr& buffer) = 0; virtual void setAllValuesTo(const std::shared_ptr& buffer, double value) = 0; diff --git a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/JsStyleStruct.hpp b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/JsStyleStruct.hpp new file mode 100644 index 000000000..a049c20f4 --- /dev/null +++ b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/JsStyleStruct.hpp @@ -0,0 +1,72 @@ +/// +/// JsStyleStruct.hpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + + + +#include + +namespace margelo::nitro::image { + + /** + * A struct which can be represented as a JavaScript object (JsStyleStruct). + */ + struct JsStyleStruct { + public: + double value SWIFT_PRIVATE; + std::function onChanged SWIFT_PRIVATE; + + public: + explicit JsStyleStruct(double value, std::function onChanged): value(value), onChanged(onChanged) {} + }; + +} // namespace margelo::nitro::image + +namespace margelo::nitro { + + using namespace margelo::nitro::image; + + // C++ JsStyleStruct <> JS JsStyleStruct (object) + template <> + struct JSIConverter { + static inline JsStyleStruct fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + jsi::Object obj = arg.asObject(runtime); + return JsStyleStruct( + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "value")), + JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "onChanged")) + ); + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, const JsStyleStruct& arg) { + jsi::Object obj(runtime); + obj.setProperty(runtime, "value", JSIConverter::toJSI(runtime, arg.value)); + obj.setProperty(runtime, "onChanged", JSIConverter>::toJSI(runtime, arg.onChanged)); + return obj; + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isObject()) { + return false; + } + jsi::Object obj = value.getObject(runtime); + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "value"))) return false; + if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "onChanged"))) return false; + return true; + } + }; + +} // namespace margelo::nitro diff --git a/packages/react-native-nitro-image/src/specs/TestObject.nitro.ts b/packages/react-native-nitro-image/src/specs/TestObject.nitro.ts index 76431b274..3f19f67db 100644 --- a/packages/react-native-nitro-image/src/specs/TestObject.nitro.ts +++ b/packages/react-native-nitro-image/src/specs/TestObject.nitro.ts @@ -36,6 +36,11 @@ export type Person = { age: number } +interface JsStyleStruct { + value: number + onChanged: (num: number) => void +} + // This is an `interface` we're going to use as a base in both of our `HybridObject`s later. // In this case, the `HybridObject`s will just flatten out and copy over all properties here. // There is no separate type for `SharedTestObjectProps` on the native side. @@ -120,6 +125,7 @@ interface SharedTestObjectProps { getCar(): Car isCarElectric(car: Car): boolean getDriver(car: Car): Person | undefined + jsStyleObjectAsParameters(params: JsStyleStruct): void // ArrayBuffers createArrayBuffer(): ArrayBuffer