#ifndef GOOGLE_APIS_GAIA_GAIA_ID_H_
#define GOOGLE_APIS_GAIA_GAIA_ID_H_
#include <iosfwd>
#include <string>
#include <string_view>
#include "base/component_export.h"
#include "build/build_config.h"
#if BUILDFLAG(IS_ANDROID)
#include "base/android/scoped_java_ref.h"
#endif
#if BUILDFLAG(IS_IOS) && defined(__OBJC__)
@class NSString;
#endif
class COMPONENT_EXPORT(GOOGLE_APIS) GaiaId {
public:
struct Hash {
size_t operator()(const GaiaId& gaia_id) const {
return std::hash<std::string>()(gaia_id.ToString());
}
};
GaiaId() = default;
explicit GaiaId(std::string value);
#if BUILDFLAG(IS_IOS) && defined(__OBJC__)
explicit GaiaId(NSString* value);
#endif
GaiaId(const GaiaId&) = default;
GaiaId(GaiaId&&) noexcept = default;
~GaiaId() = default;
GaiaId& operator=(const GaiaId&) = default;
GaiaId& operator=(GaiaId&&) noexcept = default;
bool empty() const;
[[nodiscard]] const std::string& ToString() const;
#if BUILDFLAG(IS_IOS) && defined(__OBJC__)
[[nodiscard]] NSString* ToNSString() const;
#endif
friend bool operator==(const GaiaId&, const GaiaId&) = default;
friend auto operator<=>(const GaiaId&, const GaiaId&) = default;
#if defined(UNIT_TEST)
class Literal {
public:
constexpr explicit Literal(std::string_view gaia_id) : gaia_id_(gaia_id) {}
~Literal() = default;
operator GaiaId() const { return GaiaId(std::string(gaia_id_)); }
std::string ToString() const { return std::string(gaia_id_); }
private:
std::string_view gaia_id_;
};
#endif
private:
std::string id_;
};
COMPONENT_EXPORT(GOOGLE_APIS)
std::ostream& operator<<(std::ostream& out, const GaiaId& id);
#if BUILDFLAG(IS_ANDROID)
COMPONENT_EXPORT(GOOGLE_APIS)
base::android::ScopedJavaLocalRef<jobject> ConvertToJavaGaiaId(
JNIEnv* env,
const GaiaId& gaia_id);
COMPONENT_EXPORT(GOOGLE_APIS)
GaiaId ConvertFromJavaGaiaId(JNIEnv* env,
const base::android::JavaRef<jobject>& j_gaia_id);
namespace jni_zero {
template <>
inline GaiaId FromJniType<GaiaId>(
JNIEnv* env,
const base::android::JavaRef<jobject>& j_gaia_id) {
return ConvertFromJavaGaiaId(env, j_gaia_id);
}
template <>
inline ScopedJavaLocalRef<jobject> ToJniType(JNIEnv* env,
const GaiaId& gaia_id) {
return ConvertToJavaGaiaId(env, gaia_id);
}
}
#endif
#endif