Adding DynamicConverter support for enums
authorMarcelo Juchem <marcelo@fb.com>
Thu, 3 Mar 2016 21:48:36 +0000 (13:48 -0800)
committerFacebook Github Bot 6 <facebook-github-bot-6-bot@fb.com>
Thu, 3 Mar 2016 21:50:29 +0000 (13:50 -0800)
Summary:DynamicConverter doesn't currently support reading enums.
This diff addresses that by adding an enum specialization that uses integers as its underlying implementation.
A follow-up is to handle both integers and strings, but that would require a way to parse strings into enums like Thrift static reflection provides (see https://github.com/facebook/fbthrift/blob/d17b072daddbd318f9afaa5562100eaba0f890e3/thrift/lib/cpp2/fatal/folly_dynamic-inl.h#L88,L92.

Reviewed By: yfeldblum

Differential Revision: D3002569

fb-gh-sync-id: 27bf4a9d5a7844762f5311e2c777606a0e7753f0
shipit-source-id: 27bf4a9d5a7844762f5311e2c777606a0e7753f0

folly/DynamicConverter.h
folly/test/DynamicConverterTest.cpp

index 8d61048debb2c40f368cc4468fadce0a2e0bdf39..3775ccb39edf6aed422e3620b18164b299c7bc4d 100644 (file)
@@ -211,6 +211,16 @@ struct DynamicConverter<T,
   }
 };
 
+// enums
+template <typename T>
+struct DynamicConverter<T,
+                        typename std::enable_if<std::is_enum<T>::value>::type> {
+  static T convert(const dynamic& d) {
+    using type = typename std::underlying_type<T>::type;
+    return static_cast<T>(DynamicConverter<type>::convert(d));
+  }
+};
+
 // floating point
 template <typename T>
 struct DynamicConverter<T,
index 5c10d82474fa2ef26a6e3105bf3945ffcb9ee9e3..8f0b1e1e48c0765506d9e4b96c154f2c97dd43d2 100644 (file)
@@ -99,6 +99,28 @@ TEST(DynamicConverter, arithmetic_types) {
   EXPECT_EQ(i8, false);
 }
 
+TEST(DynamicConverter, enums) {
+  enum enum1 { foo = 1, bar = 2 };
+
+  dynamic d1 = 1;
+  auto i1 = convertTo<enum1>(d1);
+  EXPECT_EQ(i1, foo);
+
+  dynamic d2 = 2;
+  auto i2 = convertTo<enum1>(d2);
+  EXPECT_EQ(i2, bar);
+
+  enum class enum2 { FOO = 1, BAR = 2 };
+
+  dynamic d3 = 1;
+  auto i3 = convertTo<enum2>(d3);
+  EXPECT_EQ(i3, enum2::FOO);
+
+  dynamic d4 = 2;
+  auto i4 = convertTo<enum2>(d4);
+  EXPECT_EQ(i4, enum2::BAR);
+}
+
 TEST(DynamicConverter, simple_builtins) {
   dynamic d1 = "Haskell";
   auto i1 = convertTo<folly::fbstring>(d1);