// Copyright 2026 Google LLC
//
// 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
//
//    https://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 THIRD_PARTY_CREDENTIO_VALIDATOR_INGREDIENT_RESULT_H_
#define THIRD_PARTY_CREDENTIO_VALIDATOR_INGREDIENT_RESULT_H_

#include <memory>
#include <utility>

#include "proto/ingredient_validation_result.pb.h"

namespace credentio {

// Result of validating a C2PA ingredient.
//
// For now, this is just a wrapper for `IngredientValidationResultProto`.
class IngredientResult {
 public:
  explicit IngredientResult(
      std::unique_ptr<IngredientValidationResultProto> proto)
      : proto_(std::move(proto)) {}

  explicit IngredientResult(IngredientValidationResultProto&& proto)
      : proto_(std::make_unique<IngredientValidationResultProto>(
            std::move(proto))) {}

  const IngredientValidationResultProto& proto() const { return *proto_; }

  std::unique_ptr<IngredientValidationResultProto> release_proto() && {
    return std::move(proto_);
  }

 private:
  std::unique_ptr<IngredientValidationResultProto> proto_;
};

}  // namespace credentio

#endif  // THIRD_PARTY_CREDENTIO_VALIDATOR_INGREDIENT_RESULT_H_
