// Protocol Buffers - Google's data interchange format
// Copyright 2023 Google LLC.  All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd

#ifndef PYUPB_DESCRIPTOR_H__
#define PYUPB_DESCRIPTOR_H__

// clang-format off
#include "Python.h"
// clang-format on
#include <stdbool.h>

#include "python/python_api.h"
#include "upb/reflection/def.h"

typedef enum {
  kPyUpb_Descriptor = 0,
  kPyUpb_EnumDescriptor = 1,
  kPyUpb_EnumValueDescriptor = 2,
  kPyUpb_FieldDescriptor = 3,
  kPyUpb_FileDescriptor = 4,
  kPyUpb_MethodDescriptor = 5,
  kPyUpb_OneofDescriptor = 6,
  kPyUpb_ServiceDescriptor = 7,
  kPyUpb_Descriptor_Count = 8,
} PyUpb_DescriptorType;

// Given a descriptor object |desc|, returns a Python message class object for
// the msgdef |m|, which must be from the same pool.
PyObject* PyUpb_Descriptor_GetClass(PyObject* pool, const upb_MessageDef* m);

// Set the message descriptor's meta class.
void PyUpb_Descriptor_SetClass(PyObject* py_descriptor, PyObject* meta);

// Returns a Python wrapper object for the given def. This will return an
// existing object if one already exists, otherwise a new object will be
// created.  The caller always owns a ref on the returned object.
// Returns the DescriptorPool object for the given descriptor.

PyObject* PyUpb_Descriptor_Get(PyObject* pool, const upb_MessageDef* msgdef);
PyObject* PyUpb_EnumDescriptor_Get(PyObject* pool, const upb_EnumDef* enumdef);
PyObject* PyUpb_FieldDescriptor_Get(PyObject* pool, const upb_FieldDef* field);
PyObject* PyUpb_FileDescriptor_Get(PyObject* pool, const upb_FileDef* file);
PyObject* PyUpb_OneofDescriptor_Get(PyObject* pool, const upb_OneofDef* oneof);
PyObject* PyUpb_EnumValueDescriptor_Get(PyObject* pool,
                                        const upb_EnumValueDef* ev);
PyObject* PyUpb_Descriptor_GetOrCreateWrapper(const upb_MessageDef* msg);
PyObject* PyUpb_ServiceDescriptor_Get(PyObject* pool, const upb_ServiceDef* s);
PyObject* PyUpb_MethodDescriptor_Get(PyObject* pool, const upb_MethodDef* s);

// Returns the underlying |def| for a given wrapper object. The caller must
// have already verified that the given Python object is of the expected type.
const upb_FileDef* PyUpb_FileDescriptor_GetDef(PyObject* file);
const upb_FieldDef* PyUpb_FieldDescriptor_GetDef(PyObject* file);
const upb_MessageDef* PyUpb_Descriptor_GetDef(PyObject* _self);
const void* PyUpb_AnyDescriptor_GetDef(PyObject* desc);
PyObject* PyUpb_AnyDescriptor_GetPool(PyObject* desc);

// Returns the underlying |def| for a given wrapper object. The caller must
// have already verified that the given Python object is of the expected type.
const upb_FileDef* PyUpb_FileDescriptor_GetDef(PyObject* file);

// Module-level init.
bool PyUpb_InitDescriptor(PyObject* m);

#endif  // PYUPB_DESCRIPTOR_H__
