// 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_FORMATS_EXTRACTOR_RESULT_H_
#define THIRD_PARTY_CREDENTIO_FORMATS_EXTRACTOR_RESULT_H_

#include <ostream>
#include <string>

#include "formats/asset_byte_info.h"

namespace credentio {

// Result of the extraction containing the extracted C2PA Manifest Store and
// any segments found in the asset.
struct ExtractorResult {
  std::string manifest_store;
  AssetByteInfo asset_byte_info;

  bool operator==(const ExtractorResult& other) const {
    return manifest_store == other.manifest_store &&
           asset_byte_info == other.asset_byte_info;
  }
  bool operator!=(const ExtractorResult& other) const {
    return !(*this == other);
  }
};

inline std::ostream& operator<<(std::ostream& os,
                                const ExtractorResult& result) {
  return os << "ExtractorResult{manifest_store: " << result.manifest_store
            << ", asset_byte_info: " << result.asset_byte_info << "}";
}

}  // namespace credentio

#endif  // THIRD_PARTY_CREDENTIO_FORMATS_EXTRACTOR_RESULT_H_
