/** * Copyright (c) 2015-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include namespace facebook { namespace react { inline void fromDynamic(const folly::dynamic &value, bool &result) { result = value.getBool(); } inline void fromDynamic(const folly::dynamic &value, int &result) { // All numbers from JS are treated as double, and JS cannot represent int64 in practice. // So this always converts the value to int64 instead. result = value.asInt(); } inline void fromDynamic(const folly::dynamic &value, std::string &result) { result = value.getString(); } template inline void fromDynamic(const folly::dynamic &value, std::vector &result) { result.clear(); T itemResult; for (auto &itemValue : value) { fromDynamic(itemValue, itemResult); result.push_back(itemResult); } } template inline T convertRawProp( const RawProps &rawProps, const std::string &name, const T &sourceValue, const T &defaultValue = T() ) { const auto &iterator = rawProps.find(name); if (iterator == rawProps.end()) { return sourceValue; } const auto &value = iterator->second; // Special case: `null` always means `the prop was removed, use default value`. if (value.isNull()) { return defaultValue; } T result; fromDynamic(value, result); return result; } template inline static folly::Optional convertRawProp( const RawProps &rawProps, const std::string &name, const folly::Optional &sourceValue, const folly::Optional &defaultValue = {} ) { const auto &iterator = rawProps.find(name); if (iterator == rawProps.end()) { return sourceValue; } const auto &value = iterator->second; // Special case: `null` always means `the prop was removed, use default value`. if (value.isNull()) { return defaultValue; } T result; fromDynamic(value, result); return result; } } // namespace react } // namespace facebook