mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
ceb1d0dea6
Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/36030 Generate enum types in c++ turbo modules. For enums in the ts schema file such as: ``` export enum NumEnum { ONE = 1, TWO = 2, } ``` This would export enums and the relevant Bridging to js and from js code to the spec H files such as: ``` #pragma mark - SampleTurboModuleCxxNumEnum enum SampleTurboModuleCxxNumEnum { ONE, TWO }; template <> struct Bridging<SampleTurboModuleCxxNumEnum> { static SampleTurboModuleCxxNumEnum fromJs(jsi::Runtime &rt, int32_t value) { if (value == 1) { return SampleTurboModuleCxxNumEnum::ONE; } else if (value == 2) { return SampleTurboModuleCxxNumEnum::TWO; } else { throw jsi::JSError(rt, "No appropriate enum member found for value"); } } static jsi::Value toJs(jsi::Runtime &rt, SampleTurboModuleCxxNumEnum value) { if (value == SampleTurboModuleCxxNumEnum::ONE) { return bridging::toJs(rt, 1); } else if (value == SampleTurboModuleCxxNumEnum::TWO) { return bridging::toJs(rt, 2); } else { throw jsi::JSError(rt, "No appropriate enum member found for enum value"); } } }; ``` That code would allow us to use these enums in the cxx files like this: ``` NativeCxxModuleExampleCxxEnumInt getNumEnum( jsi::Runtime &rt, NativeCxxModuleExampleCxxEnumInt arg); ``` Changelog: [General] [Added] Generate enum types that would be allowed to be used as well as string/number in c++ turbo modules generators Reviewed By: christophpurrer Differential Revision: D42884147 fbshipit-source-id: d34d1fc7ba268b570821dc108444196f69a431b2
54 lines
1.2 KiB
JavaScript
54 lines
1.2 KiB
JavaScript
/**
|
|
* 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.
|
|
*
|
|
* @flow strict
|
|
* @format
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
function capitalize(string: string): string {
|
|
return string.charAt(0).toUpperCase() + string.slice(1);
|
|
}
|
|
|
|
function indent(nice: string, spaces: number): string {
|
|
return nice
|
|
.split('\n')
|
|
.map((line, index) => {
|
|
if (line.length === 0 || index === 0) {
|
|
return line;
|
|
}
|
|
const emptySpaces = new Array<mixed>(spaces + 1).join(' ');
|
|
return emptySpaces + line;
|
|
})
|
|
.join('\n');
|
|
}
|
|
|
|
function toPascalCase(inString: string): string {
|
|
if (inString.length === 0) {
|
|
return inString;
|
|
}
|
|
|
|
return inString[0].toUpperCase() + inString.slice(1);
|
|
}
|
|
|
|
function toSafeCppString(input: string): string {
|
|
return input.split('-').map(toPascalCase).join('');
|
|
}
|
|
|
|
function getEnumName(moduleName: string, origEnumName: string): string {
|
|
const uppercasedPropName = toSafeCppString(origEnumName);
|
|
return `${moduleName}${uppercasedPropName}`;
|
|
}
|
|
|
|
module.exports = {
|
|
capitalize,
|
|
indent,
|
|
toPascalCase,
|
|
toSafeCppString,
|
|
getEnumName,
|
|
};
|