// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef NET_COOKIES_COOKIE_ACCESS_RESULT_H_
#define NET_COOKIES_COOKIE_ACCESS_RESULT_H_

#include <ostream>

#include "net/base/net_export.h"
#include "net/cookies/cookie_constants.h"
#include "net/cookies/cookie_inclusion_status.h"

namespace net {

struct NET_EXPORT CookieAccessResult {
  // Creating a CookieAccessResult with out any parameters will create a
  // CookieInclusionStatus that has no exclusion reasons, therefore
  // indicates inclusion.
  CookieAccessResult();
  CookieAccessResult(CookieEffectiveSameSite effective_same_site,
                     CookieInclusionStatus status,
                     CookieAccessSemantics access_semantics,
                     bool is_allowed_to_access_secure_cookie);

  explicit CookieAccessResult(CookieInclusionStatus status);

  CookieAccessResult(const CookieAccessResult& cookie_access_result);

  CookieAccessResult& operator=(const CookieAccessResult& cookie_access_result);

  CookieAccessResult(CookieAccessResult&& cookie_access_result);

  ~CookieAccessResult();

  bool operator==(const CookieAccessResult& other) const {
    return status == other.status &&
           effective_same_site == other.effective_same_site &&
           access_semantics == other.access_semantics &&
           is_allowed_to_access_secure_cookies ==
               other.is_allowed_to_access_secure_cookies;
  }

  bool operator<(const CookieAccessResult& other) const {
    return std::tie(status, effective_same_site, access_semantics,
                    is_allowed_to_access_secure_cookies) <
           std::tie(other.status, other.effective_same_site,
                    other.access_semantics,
                    other.is_allowed_to_access_secure_cookies);
  }

  CookieInclusionStatus status;
  CookieEffectiveSameSite effective_same_site =
      CookieEffectiveSameSite::UNDEFINED;
  CookieAccessSemantics access_semantics = CookieAccessSemantics::UNKNOWN;
  // Whether access to Secure cookies should be allowed. This is expected to be
  // set based on the scheme of the source URL.
  bool is_allowed_to_access_secure_cookies = false;
};

// Provided to allow gtest to create more helpful error messages, instead of
// printing hex.
inline void PrintTo(const CookieAccessResult& car, std::ostream* os) {
  *os << "{ { ";
  PrintTo(car.status, os);
  *os << " }, " << static_cast<int>(car.effective_same_site) << ", "
      << static_cast<int>(car.access_semantics) << ", "
      << car.is_allowed_to_access_secure_cookies << " }";
}

}  // namespace net

#endif  // NET_COOKIES_COOKIE_ACCESS_RESULT_H_
