/*
 * Copyright (C) 2021 The Android Open Source Project
 *
 * 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.
 */

#ifndef TOOLS_PROTO_MERGER_PROTO_MERGER_H_
#define TOOLS_PROTO_MERGER_PROTO_MERGER_H_

#include "perfetto/base/status.h"
#include "tools/proto_merger/allowlist.h"
#include "tools/proto_merger/proto_file.h"

namespace perfetto {
namespace proto_merger {

// Merges any updates in the proto |upstream| into the proto |input|
// optionally adding any messages/fields/enums/values specified in the
// the |allowlist|.
//
// Some notes about the merging algorithm:
// * Comments for all values are always taken from |upstream|.
// * If an enum is allowed, then so are all it's values.
// * Options for fields are always taken from |input|; any new options in
//   |upstream| are ignored.
// * Changing the type of an existing field is not supported (even if its
//   just a move); this needs to be handled manually.
base::Status MergeProtoFiles(const ProtoFile& input,
                             const ProtoFile& upstream,
                             const Allowlist& allowlist,
                             ProtoFile& out);

}  // namespace proto_merger
}  // namespace perfetto

#endif  // TOOLS_PROTO_MERGER_PROTO_MERGER_H_
