Skip to main content

godot_core/registry/info/
param_metadata.rs

1/*
2 * Copyright (c) godot-rust; Bromeon and contributors.
3 * This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at https://mozilla.org/MPL/2.0/.
6 */
7
8use godot_ffi as sys;
9
10/// Metadata for a method parameter or return value, describing the precise numeric type.
11///
12/// Used in method registration to convey extra type information beyond the basic [`VariantType`][crate::builtin::VariantType]. For example,
13/// distinguishing `i8` from `i64` even though both are represented as `INT` in Godot's type system. While irrelevant for GDScript, this can be
14/// helpful for other languages. The FFI representation is **not** affected by this, underlying types are always `i64`, `f64` or object pointers.
15#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
16#[allow(non_camel_case_types)]
17#[non_exhaustive]
18pub enum ParamMetadata {
19    /// No special metadata; use the default representation.
20    #[default]
21    NONE,
22
23    /// Rust `i8`.
24    INT_IS_INT8,
25
26    /// Rust `i16`.
27    INT_IS_INT16,
28
29    /// Rust `i32`.
30    INT_IS_INT32,
31
32    /// Rust `i64`.
33    INT_IS_INT64,
34
35    /// Rust `u8`.
36    INT_IS_UINT8,
37
38    /// Rust `u16`.
39    INT_IS_UINT16,
40
41    /// Rust `u32`.
42    INT_IS_UINT32,
43
44    /// Rust `u64`.
45    INT_IS_UINT64,
46
47    /// 16-bit character (UTF-16).
48    INT_IS_CHAR16,
49
50    /// 32-bit character (UTF-32).
51    INT_IS_CHAR32,
52
53    /// Rust `f32` single-precision float.
54    REAL_IS_FLOAT,
55
56    /// Rust `f64` double-precision float.
57    REAL_IS_DOUBLE,
58
59    /// Object that must not be null (non-nullable `Gd<T>` parameter).
60    ///
61    /// **Compatibility:** Only has an effect in Godot 4.6+. In earlier versions, this behaves like `NONE`, effectively allowing null objects.
62    OBJECT_IS_REQUIRED,
63}
64
65impl ParamMetadata {
66    /// Converts to the raw GDExtension constant.
67    pub fn to_sys(self) -> sys::GDExtensionClassMethodArgumentMetadata {
68        match self {
69            Self::INT_IS_INT8 => sys::GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT8,
70            Self::INT_IS_INT16 => sys::GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT16,
71            Self::INT_IS_INT32 => sys::GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT32,
72            Self::INT_IS_INT64 => sys::GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT64,
73            Self::INT_IS_UINT8 => sys::GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT8,
74            Self::INT_IS_UINT16 => sys::GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT16,
75            Self::INT_IS_UINT32 => sys::GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT32,
76            Self::INT_IS_UINT64 => sys::GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT64,
77            Self::REAL_IS_FLOAT => sys::GDEXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_FLOAT,
78            Self::REAL_IS_DOUBLE => sys::GDEXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_DOUBLE,
79
80            // Could technically memorize the number and use runtime check with GdextBuild.
81            #[cfg(since_api = "4.4")] #[cfg_attr(published_docs, doc(cfg(since_api = "4.4")))]
82            Self::INT_IS_CHAR16 => sys::GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_CHAR16,
83            #[cfg(since_api = "4.4")] #[cfg_attr(published_docs, doc(cfg(since_api = "4.4")))]
84            Self::INT_IS_CHAR32 => sys::GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_CHAR32,
85            #[cfg(since_api = "4.6")] #[cfg_attr(published_docs, doc(cfg(since_api = "4.6")))]
86            Self::OBJECT_IS_REQUIRED => {
87                sys::GDEXTENSION_METHOD_ARGUMENT_METADATA_OBJECT_IS_REQUIRED
88            }
89
90            // Covers both NONE and unsupported metadata in older versions.
91            _ => sys::GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE,
92        }
93    }
94}