use crate::core_types::{GodotString, Variant, VariantType};
use crate::export::{ClassBuilder, ExportInfo, NativeClass, PropertyUsage};
#[must_use = "SignalBuilder left unbuilt -- did you forget to call done()?"]
pub struct SignalBuilder<'a, C> {
class_builder: &'a ClassBuilder<C>,
name: GodotString,
args: Vec<SignalParam>,
}
impl<'a, C: NativeClass> SignalBuilder<'a, C> {
pub(super) fn new(class_builder: &'a ClassBuilder<C>, signal_name: GodotString) -> Self {
Self {
class_builder,
name: signal_name,
args: vec![],
}
}
#[inline]
pub fn with_param(self, parameter_name: &str, parameter_type: VariantType) -> Self {
self.with_param_custom(SignalParam {
name: parameter_name.into(),
default: Variant::nil(),
export_info: ExportInfo::new(parameter_type),
usage: PropertyUsage::DEFAULT,
})
}
#[inline]
pub fn with_param_default(self, parameter_name: &str, default_value: Variant) -> Self {
let variant_type = default_value.get_type();
self.with_param_custom(SignalParam {
name: parameter_name.into(),
default: default_value,
export_info: ExportInfo::new(variant_type),
usage: PropertyUsage::DEFAULT,
})
}
#[inline]
pub fn with_param_untyped(self, parameter_name: &str) -> Self {
self.with_param_custom(SignalParam {
name: parameter_name.into(),
default: Variant::nil(),
export_info: ExportInfo::new(VariantType::Nil),
usage: PropertyUsage::DEFAULT,
})
}
#[inline]
pub fn with_param_custom(mut self, parameter: SignalParam) -> Self {
self.args.push(parameter);
self
}
#[inline]
pub fn done(self) {
self.class_builder.add_signal(Signal {
name: self.name,
args: self.args,
});
}
}
pub(crate) struct Signal {
pub name: GodotString,
pub args: Vec<SignalParam>,
}
pub struct SignalParam {
pub name: GodotString,
pub default: Variant,
pub export_info: ExportInfo,
pub usage: PropertyUsage,
}