chromium/google_apis/classroom/classroom_api_students_response_types.h

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

#ifndef GOOGLE_APIS_CLASSROOM_CLASSROOM_API_STUDENTS_RESPONSE_TYPES_H_
#define GOOGLE_APIS_CLASSROOM_CLASSROOM_API_STUDENTS_RESPONSE_TYPES_H_

#include <memory>
#include <string>
#include <vector>

namespace base {
template <class StructType>
class JSONValueConverter;
class Value;
}  // namespace base

namespace google_apis::classroom {

// Details of a user's name.
class Name {
 public:
  Name() = default;
  Name(const Name&) = delete;
  Name& operator=(const Name&) = delete;
  ~Name() = default;

  // Registers the mapping between JSON field names and the members in this
  // class.
  static void RegisterJSONConverter(base::JSONValueConverter<Name>* converter);

  const std::string& full_name() const { return full_name_; }

 private:
  // The user's full name.
  std::string full_name_;
};

// https://developers.google.com/classroom/reference/rest/v1/userProfiles
class UserProfile {
 public:
  UserProfile() = default;
  UserProfile(const UserProfile&) = delete;
  UserProfile& operator=(const UserProfile&) = delete;
  ~UserProfile() = default;

  // Registers the mapping between JSON field names and the members in this
  // class.
  static void RegisterJSONConverter(
      base::JSONValueConverter<UserProfile>* converter);

  const std::string& id() const { return id_; }
  const Name& name() const { return name_; }
  const std::string& email_address() const { return email_address_; }

 private:
  // Identifier of the user.
  std::string id_;

  // Name of the user.
  Name name_;

  // Email address of the user.
  std::string email_address_;
};

// https://developers.google.com/classroom/reference/rest/v1/courses.students
class Student {
 public:
  Student() = default;
  Student(const Student&) = delete;
  Student& operator=(const Student&) = delete;
  ~Student() = default;

  // Registers the mapping between JSON field names and the members in this
  // class.
  static void RegisterJSONConverter(
      base::JSONValueConverter<Student>* converter);

  const UserProfile& profile() const { return profile_; }

 private:
  // Global user information for the student.
  UserProfile profile_;
};

// Container for multiple `Student`s.
class Students {
 public:
  Students();
  Students(const Students&) = delete;
  Students& operator=(const Students&) = delete;
  ~Students();

  // Registers the mapping between JSON field names and the members in this
  // class.
  static void RegisterJSONConverter(
      base::JSONValueConverter<Students>* converter);

  // Creates a `Students` from parsed JSON.
  static std::unique_ptr<Students> CreateFrom(const base::Value& value);

  const std::string& next_page_token() const { return next_page_token_; }
  const std::vector<std::unique_ptr<Student>>& items() const { return items_; }

 private:
  // `Student` items stored in this container.
  std::vector<std::unique_ptr<Student>> items_;

  // Token that can be used to request the next page of this result.
  std::string next_page_token_;
};

}  // namespace google_apis::classroom

#endif  // GOOGLE_APIS_CLASSROOM_CLASSROOM_API_STUDENTS_RESPONSE_TYPES_H_