react-native/ReactCommon/fabric/core/propsConversions.h
Kevin Gozali 119fd1efe7 iOS: Fixed some props conversion errors
Summary:
* numbers in JS are doubles in native land, since there's no notion of int or int64 in JS - so simply convert numbers to int instead of assuming it's int
* the parsing of Yoga props with `'...%'` string value has a bug: it should be copying the number instead of the `%`

Reviewed By: shergin

Differential Revision: D8370873

fbshipit-source-id: 44e9e3f0530c000c963e8e9ca66e8b0a48d80bcd
2018-06-11 20:01:42 -07:00

77 lines
1.9 KiB
C++

/**
* 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 <folly/Optional.h>
#include <folly/dynamic.h>
#include <fabric/graphics/Color.h>
#include <fabric/graphics/Geometry.h>
#include <fabric/graphics/conversions.h>
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 <typename T>
inline T convertRawProp(
const RawProps &rawProps,
const std::string &name,
const T &sourceValue,
const T &defaultValue = T()
) {
auto &&iterator = rawProps.find(name);
if (iterator == rawProps.end()) {
return sourceValue;
}
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 <typename T>
inline static folly::Optional<T> convertRawProp(
const RawProps &rawProps,
const std::string &name,
const folly::Optional<T> &sourceValue,
const folly::Optional<T> &defaultValue = {}
) {
auto &&iterator = rawProps.find(name);
if (iterator == rawProps.end()) {
return sourceValue;
}
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