blob: 658d48a3f648e4d01a183870635e1d465d5777e5 [file] [log] [blame]
// Protocol Buffers - Google's data interchange format
// Copyright 2023 Google Inc. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd
#ifndef GOOGLE_PROTOBUF_FEATURE_RESOLVER_H__
#define GOOGLE_PROTOBUF_FEATURE_RESOLVER_H__
#include <memory>
#include <string>
#include <utility>
#include "absl/container/flat_hash_set.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/string_view.h"
#include "absl/types/span.h"
#include "google/protobuf/descriptor.h"
#include "google/protobuf/descriptor.pb.h"
#include "google/protobuf/dynamic_message.h"
// Must be included last.
#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
// These helpers implement the unique behaviors of edition features. For more
// details, see go/protobuf-editions-features.
class PROTOBUF_EXPORT FeatureResolver {
public:
FeatureResolver(FeatureResolver&&) = default;
FeatureResolver& operator=(FeatureResolver&&) = delete;
// Compiles a set of FeatureSet extensions into a mapping of edition to unique
// defaults. This is the most complicated part of feature resolution, and by
// abstracting this out into an intermediate message, we can make feature
// resolution significantly more portable.
static absl::StatusOr<FeatureSetDefaults> CompileDefaults(
const Descriptor* feature_set,
absl::Span<const FieldDescriptor* const> extensions,
Edition minimum_edition, Edition maximum_edition);
// Creates a new FeatureResolver at a specific edition. This calculates the
// default feature set for that edition, using the output of CompileDefaults.
static absl::StatusOr<FeatureResolver> Create(
Edition edition, const FeatureSetDefaults& defaults);
// Creates a new feature set using inheritance and default behavior. This is
// designed to be called recursively, and the parent feature set is expected
// to be a fully merged one. The returned FeatureSet will be fully resolved
// for any extensions that were used to construct the defaults.
absl::StatusOr<FeatureSet> MergeFeatures(
const FeatureSet& merged_parent, const FeatureSet& unmerged_child) const;
private:
explicit FeatureResolver(FeatureSet defaults)
: defaults_(std::move(defaults)) {}
FeatureSet defaults_;
};
} // namespace protobuf
} // namespace google
#endif // GOOGLE_PROTOBUF_FEATURE_RESOLVER_H__
#include "google/protobuf/port_undef.inc"