/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // // Docs: https://fburl.com/fbcref_dynamic // 1-minute video primer: https://www.youtube.com/watch?v=3XubaLCDYOM // /** * dynamic is a runtime dynamically typed value. It holds types from a specific * predetermined set of types: int, double, bool, nullptr_t, string, array, * map. In particular, it can be used as a convenient in-memory representation * for complete JSON objects. * * In general, dynamic can be used as if it were the type it represents * (although in some cases with a slightly less complete interface than the raw * type). If there is a runtime type mismatch, then dynamic will throw a * TypeError. * * See folly/json.h for serialization and deserialization functions for JSON. * * Additional documentation is in * https://github.com/facebook/folly/blob/main/folly/docs/Dynamic.md * * @refcode folly/docs/examples/folly/dynamic.cpp * @struct folly::dynamic */ /* * Some examples: * * dynamic twelve = 12; * dynamic str = "string"; * dynamic map = dynamic::object; * map[str] = twelve; * map[str + "another_str"] = dynamic::array("array", "of", 4, "elements"); * map.insert("null_element", nullptr); * ++map[str]; * assert(map[str] == 13); * * // Building a complex object with a sub array inline: * dynamic d = dynamic::object * ("key", "value") * ("key2", dynamic::array("a", "array")) * ; */ #pragma once #include <cstdint> #include <memory> #include <ostream> #include <string> #include <type_traits> #include <utility> #include <vector> #include <folly/Expected.h> #include <folly/Range.h> #include <folly/Traits.h> #include <folly/container/F14Map.h> #include <folly/json_pointer.h> namespace folly { ////////////////////////////////////////////////////////////////////// struct const_dynamic_view; struct dynamic; struct dynamic_view; struct TypeError; ////////////////////////////////////////////////////////////////////// namespace dynamic_detail { detect_construct_string; } struct dynamic { … }; ////////////////////////////////////////////////////////////////////// /** * This is a helper class for traversing an instance of dynamic and accessing * the values within without risking throwing an exception. The primary use case * is to help write cleaner code when using dynamic instances without strict * schemas - eg. where keys may be missing, or present but with null values, * when expecting non-null values. * * Some examples: * * dynamic twelve = 12; * dynamic str = "string"; * dynamic map = dynamic::object("str", str)("twelve", 12); * * dynamic_view view{map}; * assert(view.descend("str").string_or("bad") == "string"); * assert(view.descend("twelve").int_or(-1) == 12); * assert(view.descend("zzz").string_or("aaa") == "aaa"); * * dynamic wrapper = dynamic::object("child", map); * dynamic_view wrapper_view{wrapper}; * * assert(wrapper_view.descend("child", "str").string_or("bad") == "string"); * assert(wrapper_view.descend("wrong", 0, "huh").value_or(nullptr).isNull()); */ struct const_dynamic_view { … }; struct dynamic_view : public const_dynamic_view { … }; // A helper method which returns a contextually-correct dynamic_view for the // given view. If passed a dynamic const&, returns a const_dynamic_view, and // if passed a dynamic&, returns a dynamic_view. inline auto make_dynamic_view(dynamic const& d) { … } inline auto make_dynamic_view(dynamic& d) { … } auto make_dynamic_view(dynamic&&) = delete; ////////////////////////////////////////////////////////////////////// } // namespace folly namespace std { template <> struct hash<::folly::dynamic> { … }; } // namespace std #include <folly/json/dynamic-inl.h>