chromium/google_apis/classroom/classroom_api_courses_response_types.h

// Copyright 2023 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_COURSES_RESPONSE_TYPES_H_
#define GOOGLE_APIS_CLASSROOM_CLASSROOM_API_COURSES_RESPONSE_TYPES_H_

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

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

namespace google_apis::classroom {

// https://developers.google.com/classroom/reference/rest/v1/courses
class Course {
 public:
  // State of the course.
  // There are more states can be returned by the API, but current users only
  // need "ACTIVE" courses.
  enum class State {
    kActive,
    kOther,
  };

  Course() = default;
  Course(const Course&) = delete;
  Course& operator=(const Course&) = delete;
  ~Course() = default;

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

  static std::string StateToString(State state);

  const std::string& id() const { return id_; }
  const std::string& name() const { return name_; }
  State state() const { return state_; }

 private:
  // Identifier for this course assigned by Classroom.
  std::string id_;

  // Name of the course. For example, "10th Grade Biology".
  std::string name_;

  // State of the course.
  State state_ = State::kOther;
};

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

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

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

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

 private:
  // `Course` items stored in this container.
  std::vector<std::unique_ptr<Course>> 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_COURSES_RESPONSE_TYPES_H_