From 4432d5063a44c082d1f20c4c4889865b927ed7d9 Mon Sep 17 00:00:00 2001 From: Tristan Guichaoua Date: Mon, 8 Aug 2022 17:39:15 +0200 Subject: [PATCH 01/10] impl TypeBuilder --- src/api/build_type.rs | 192 +++++++++++++++++++++++++++++++++++++++--- src/lib.rs | 5 +- tests/build_type.rs | 118 ++++++++++++++++++++++++++ 3 files changed, 303 insertions(+), 12 deletions(-) create mode 100644 tests/build_type.rs diff --git a/src/api/build_type.rs b/src/api/build_type.rs index 13e05c4e..dc84f80d 100644 --- a/src/api/build_type.rs +++ b/src/api/build_type.rs @@ -1,4 +1,9 @@ -use crate::Engine; +use core::marker::PhantomData; + +use crate::{ + func::SendSync, types::dynamic::Variant, Engine, Identifier, RegisterNativeFunction, + RhaiResultOf, +}; /// Trait to build a custom type for use with the [`Engine`]. /// i.e. register the type, getters, setters, methods, etc... @@ -6,7 +11,7 @@ use crate::Engine; /// # Example /// /// ``` -/// use rhai::{Engine, RhaiCustomType}; +/// use rhai::{CustomType, TypeBuilder, Engine}; /// /// #[derive(Debug, Clone, Eq, PartialEq)] /// struct TestStruct { @@ -20,14 +25,21 @@ use crate::Engine; /// fn update(&mut self, offset: i64) { /// self.field += offset; /// } +/// fn get_value(&mut self) -> i64 { +/// self.field +/// } +/// fn set_value(&mut self, value: i64) { +/// self.field = value; +/// } /// } /// -/// impl RhaiCustomType for TestStruct { -/// fn build(engine: &mut Engine) { -/// engine -/// .register_type::() -/// .register_fn("new_ts", Self::new) -/// .register_fn("update", Self::update); +/// impl CustomType for TestStruct { +/// fn build(mut builder: TypeBuilder) { +/// builder +/// .with_name("TestStruct") +/// .with_fn("new_ts", Self::new) +/// .with_fn("update", Self::update) +/// .with_get_set("value", Self::get_value, Self::set_value); /// } /// } /// @@ -38,18 +50,25 @@ use crate::Engine; /// // Register API for the custom type. /// engine.build_type::(); /// +/// /// # #[cfg(not(feature = "no_object"))] /// assert_eq!( /// engine.eval::("let x = new_ts(); x.update(41); x")?, /// TestStruct { field: 42 } /// ); +/// +/// # #[cfg(not(feature = "no_object"))] +/// assert_eq!( +/// engine.eval::("let x = new_ts(); x.value = 5 + x.value; x")?, +/// TestStruct { field: 6 } +/// ); /// # Ok(()) /// # } /// ``` -pub trait CustomType { +pub trait CustomType: Variant + Clone { /// Builds the custom type for use with the [`Engine`]. /// i.e. register the type, getters, setters, methods, etc... - fn build(engine: &mut Engine); + fn build(builder: TypeBuilder); } impl Engine { @@ -61,7 +80,158 @@ impl Engine { where T: CustomType, { - T::build(self); + T::build(TypeBuilder::new(self)); self } } + +#[allow(missing_docs)] // TODO: add docs +pub struct TypeBuilder<'a, T> +where + T: Variant + Clone, +{ + engine: &'a mut Engine, + name: Option<&'static str>, + _marker: PhantomData, +} + +#[allow(missing_docs)] // TODO: add docs +impl<'a, T> TypeBuilder<'a, T> +where + T: Variant + Clone, +{ + pub(crate) fn new(engine: &'a mut Engine) -> Self { + Self { + engine, + name: None, + _marker: PhantomData::default(), + } + } + + pub fn build(self) { + /* empty */ + } + + pub fn with_name(&mut self, name: &'static str) -> &mut Self { + self.name = Some(name); + self + } + + pub fn with_fn(&mut self, name: N, method: F) -> &mut Self + where + N: AsRef + Into, + F: RegisterNativeFunction, + { + self.engine.register_fn(name, method); + self + } + + pub fn with_result_fn(&mut self, name: N, method: F) -> &mut Self + where + N: AsRef + Into, + F: RegisterNativeFunction>, + { + self.engine.register_result_fn(name, method); + self + } + + pub fn with_get( + &mut self, + name: impl AsRef, + get_fn: impl Fn(&mut T) -> V + SendSync + 'static, + ) -> &mut Self { + self.engine.register_get(name, get_fn); + self + } + + pub fn with_get_result( + &mut self, + name: impl AsRef, + get_fn: impl Fn(&mut T) -> RhaiResultOf + SendSync + 'static, + ) -> &mut Self { + self.engine.register_get_result(name, get_fn); + self + } + + pub fn with_set( + &mut self, + name: impl AsRef, + set_fn: impl Fn(&mut T, V) + SendSync + 'static, + ) -> &mut Self { + self.engine.register_set(name, set_fn); + self + } + + pub fn with_set_result( + &mut self, + name: impl AsRef, + set_fn: impl Fn(&mut T, V) -> RhaiResultOf<()> + SendSync + 'static, + ) -> &mut Self { + self.engine.register_set_result(name, set_fn); + self + } + + pub fn with_get_set( + &mut self, + name: impl AsRef, + get_fn: impl Fn(&mut T) -> V + SendSync + 'static, + set_fn: impl Fn(&mut T, V) + SendSync + 'static, + ) -> &mut Self { + self.engine.register_get_set(name, get_fn, set_fn); + self + } + + pub fn with_indexer_get( + &mut self, + get_fn: impl Fn(&mut T, X) -> V + SendSync + 'static, + ) -> &mut Self { + self.engine.register_indexer_get(get_fn); + self + } + + pub fn with_indexer_get_result( + &mut self, + get_fn: impl Fn(&mut T, X) -> RhaiResultOf + SendSync + 'static, + ) -> &mut Self { + self.engine.register_indexer_get_result(get_fn); + self + } + + pub fn with_indexer_set( + &mut self, + set_fn: impl Fn(&mut T, X, V) + SendSync + 'static, + ) -> &mut Self { + self.engine.register_indexer_set(set_fn); + self + } + + pub fn with_indexer_set_result( + &mut self, + set_fn: impl Fn(&mut T, X, V) -> RhaiResultOf<()> + SendSync + 'static, + ) -> &mut Self { + self.engine.register_indexer_set_result(set_fn); + self + } + + pub fn with_indexer_get_set( + &mut self, + get_fn: impl Fn(&mut T, X) -> V + SendSync + 'static, + set_fn: impl Fn(&mut T, X, V) + SendSync + 'static, + ) -> &mut Self { + self.engine.register_indexer_get_set(get_fn, set_fn); + self + } +} + +impl<'a, T> Drop for TypeBuilder<'a, T> +where + T: Variant + Clone, +{ + fn drop(&mut self) { + if let Some(name) = self.name { + self.engine.register_type_with_name::(name); + } else { + self.engine.register_type::(); + } + } +} diff --git a/src/lib.rs b/src/lib.rs index cf7d0a04..875e1cad 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -166,7 +166,10 @@ type ExclusiveRange = std::ops::Range; /// An inclusive integer range. type InclusiveRange = std::ops::RangeInclusive; -pub use api::{build_type::CustomType, events::VarDefInfo}; +pub use api::{ + build_type::{CustomType, TypeBuilder}, + events::VarDefInfo, +}; pub use ast::{FnAccess, AST}; pub use engine::{Engine, OP_CONTAINS, OP_EQUALS}; pub use eval::EvalContext; diff --git a/tests/build_type.rs b/tests/build_type.rs new file mode 100644 index 00000000..76d1bcac --- /dev/null +++ b/tests/build_type.rs @@ -0,0 +1,118 @@ +use rhai::{CustomType, Engine, EvalAltResult, Position, TypeBuilder}; + +#[test] +fn build_type() -> Result<(), Box> { + #[derive(Debug, Clone, PartialEq)] + struct Vec3 { + x: i64, + y: i64, + z: i64, + } + + impl Vec3 { + fn new(x: i64, y: i64, z: i64) -> Self { + Self { x, y, z } + } + fn get_x(&mut self) -> i64 { + self.x + } + fn set_x(&mut self, x: i64) { + self.x = x + } + fn get_y(&mut self) -> i64 { + self.y + } + fn set_y(&mut self, y: i64) { + self.y = y + } + fn get_z(&mut self) -> i64 { + self.z + } + fn set_z(&mut self, z: i64) { + self.z = z + } + fn get_component(&mut self, idx: i64) -> Result> { + match idx { + 0 => Ok(self.x), + 1 => Ok(self.y), + 2 => Ok(self.z), + _ => Err(Box::new(EvalAltResult::ErrorIndexNotFound( + idx.into(), + Position::NONE, + ))), + } + } + } + + impl CustomType for Vec3 { + fn build(mut builder: TypeBuilder) { + builder + .with_name("Vec3") + .with_fn("vec3", Self::new) + .with_get_set("x", Self::get_x, Self::set_x) + .with_get_set("y", Self::get_y, Self::set_y) + .with_get_set("z", Self::get_z, Self::set_z) + .with_indexer_get_result(Self::get_component); + } + } + + let mut engine = Engine::new(); + engine.build_type::(); + + assert_eq!( + engine.eval::( + r#" + let v = vec3(1, 2, 3); + v +"#, + )?, + Vec3::new(1, 2, 3), + ); + assert_eq!( + engine.eval::( + r#" + let v = vec3(1, 2, 3); + v.x +"#, + )?, + 1, + ); + assert_eq!( + engine.eval::( + r#" + let v = vec3(1, 2, 3); + v.y +"#, + )?, + 2, + ); + assert_eq!( + engine.eval::( + r#" + let v = vec3(1, 2, 3); + v.z +"#, + )?, + 3, + ); + assert!(engine.eval::( + r#" + let v = vec3(1, 2, 3); + v.x == v[0] && v.y == v[1] && v.z == v[2] +"#, + )?); + assert_eq!( + engine.eval::( + r#" + let v = vec3(1, 2, 3); + v.x = 5; + v.y = 6; + v.z = 7; + v +"#, + )?, + Vec3::new(5, 6, 7), + ); + + Ok(()) +} From acbda7f66c644ec9dfe06688f3fa179431d56c47 Mon Sep 17 00:00:00 2001 From: Tristan Guichaoua Date: Tue, 9 Aug 2022 09:43:12 +0200 Subject: [PATCH 02/10] fix doc typo --- src/api/build_type.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/build_type.rs b/src/api/build_type.rs index dc84f80d..a7e5dc30 100644 --- a/src/api/build_type.rs +++ b/src/api/build_type.rs @@ -75,7 +75,7 @@ impl Engine { /// Build a custom type for use with the [`Engine`]. /// i.e. register the type, getters, setters, methods, etc... /// - /// See [`RhaiCustomType`]. + /// See [`CustomType`]. pub fn build_type(&mut self) -> &mut Self where T: CustomType, From 87baed717f1b4a45676f9774a513edb1944c9be4 Mon Sep 17 00:00:00 2001 From: Tristan Guichaoua Date: Tue, 9 Aug 2022 09:44:01 +0200 Subject: [PATCH 03/10] make TypeBuilder::new private --- src/api/build_type.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/build_type.rs b/src/api/build_type.rs index a7e5dc30..7bc8d52a 100644 --- a/src/api/build_type.rs +++ b/src/api/build_type.rs @@ -100,7 +100,7 @@ impl<'a, T> TypeBuilder<'a, T> where T: Variant + Clone, { - pub(crate) fn new(engine: &'a mut Engine) -> Self { + fn new(engine: &'a mut Engine) -> Self { Self { engine, name: None, From 6b2d9d2cdd75c00c450e2e53e1d4fa3a61e6b537 Mon Sep 17 00:00:00 2001 From: Tristan Guichaoua Date: Tue, 9 Aug 2022 09:44:16 +0200 Subject: [PATCH 04/10] rm TypeBuilder::build --- src/api/build_type.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/api/build_type.rs b/src/api/build_type.rs index 7bc8d52a..d22d1142 100644 --- a/src/api/build_type.rs +++ b/src/api/build_type.rs @@ -108,10 +108,6 @@ where } } - pub fn build(self) { - /* empty */ - } - pub fn with_name(&mut self, name: &'static str) -> &mut Self { self.name = Some(name); self From de7efa18a56ce7f963d0ae2e02e0ef09f54da467 Mon Sep 17 00:00:00 2001 From: Tristan Guichaoua Date: Tue, 9 Aug 2022 09:48:46 +0200 Subject: [PATCH 05/10] add volatile api notes --- src/api/build_type.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/api/build_type.rs b/src/api/build_type.rs index d22d1142..ce192367 100644 --- a/src/api/build_type.rs +++ b/src/api/build_type.rs @@ -76,6 +76,7 @@ impl Engine { /// i.e. register the type, getters, setters, methods, etc... /// /// See [`CustomType`]. + #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn build_type(&mut self) -> &mut Self where T: CustomType, @@ -108,11 +109,13 @@ where } } + #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_name(&mut self, name: &'static str) -> &mut Self { self.name = Some(name); self } + #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_fn(&mut self, name: N, method: F) -> &mut Self where N: AsRef + Into, @@ -122,6 +125,7 @@ where self } + #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_result_fn(&mut self, name: N, method: F) -> &mut Self where N: AsRef + Into, @@ -131,6 +135,7 @@ where self } + #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_get( &mut self, name: impl AsRef, @@ -140,6 +145,7 @@ where self } + #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_get_result( &mut self, name: impl AsRef, @@ -149,6 +155,7 @@ where self } + #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_set( &mut self, name: impl AsRef, @@ -158,6 +165,7 @@ where self } + #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_set_result( &mut self, name: impl AsRef, @@ -167,6 +175,7 @@ where self } + #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_get_set( &mut self, name: impl AsRef, @@ -177,6 +186,7 @@ where self } + #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_indexer_get( &mut self, get_fn: impl Fn(&mut T, X) -> V + SendSync + 'static, @@ -185,6 +195,7 @@ where self } + #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_indexer_get_result( &mut self, get_fn: impl Fn(&mut T, X) -> RhaiResultOf + SendSync + 'static, @@ -193,6 +204,7 @@ where self } + #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_indexer_set( &mut self, set_fn: impl Fn(&mut T, X, V) + SendSync + 'static, @@ -201,6 +213,7 @@ where self } + #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_indexer_set_result( &mut self, set_fn: impl Fn(&mut T, X, V) -> RhaiResultOf<()> + SendSync + 'static, @@ -209,6 +222,7 @@ where self } + #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_indexer_get_set( &mut self, get_fn: impl Fn(&mut T, X) -> V + SendSync + 'static, From addefec17c46ff53d5b3da9ea54caa7dba2f146b Mon Sep 17 00:00:00 2001 From: Tristan Guichaoua Date: Tue, 9 Aug 2022 09:49:55 +0200 Subject: [PATCH 06/10] TypeBuilder : split pub/private api impl block --- src/api/build_type.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/api/build_type.rs b/src/api/build_type.rs index ce192367..484aa95a 100644 --- a/src/api/build_type.rs +++ b/src/api/build_type.rs @@ -96,7 +96,6 @@ where _marker: PhantomData, } -#[allow(missing_docs)] // TODO: add docs impl<'a, T> TypeBuilder<'a, T> where T: Variant + Clone, @@ -108,7 +107,13 @@ where _marker: PhantomData::default(), } } +} +#[allow(missing_docs)] // TODO: add docs +impl<'a, T> TypeBuilder<'a, T> +where + T: Variant + Clone, +{ #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_name(&mut self, name: &'static str) -> &mut Self { self.name = Some(name); From 19dc368cfd9b150f04007e141dedfe545b4a7c12 Mon Sep 17 00:00:00 2001 From: Tristan Guichaoua Date: Tue, 9 Aug 2022 10:08:56 +0200 Subject: [PATCH 07/10] add docs --- src/api/build_type.rs | 57 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/src/api/build_type.rs b/src/api/build_type.rs index 484aa95a..3385b187 100644 --- a/src/api/build_type.rs +++ b/src/api/build_type.rs @@ -6,7 +6,7 @@ use crate::{ }; /// Trait to build a custom type for use with the [`Engine`]. -/// i.e. register the type, getters, setters, methods, etc... +/// i.e. register the type and its getters, setters, methods, etc... /// /// # Example /// @@ -73,7 +73,7 @@ pub trait CustomType: Variant + Clone { impl Engine { /// Build a custom type for use with the [`Engine`]. - /// i.e. register the type, getters, setters, methods, etc... + /// i.e. register the type and its getters, setters, methods, etc... /// /// See [`CustomType`]. #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] @@ -86,7 +86,14 @@ impl Engine { } } -#[allow(missing_docs)] // TODO: add docs +/// Builder to build a custom type i.e. register this type and its getters, setters, methods, etc... +/// +/// The type is automatically registered when this builder is dropped. +/// +/// ## Pretty name +/// By default the type is registered with [`Engine::register_type`] i.e. without a pretty name. +/// +/// To define a pretty name call `.with_name`, in this case [`Engine::register_type_with_name`] will be used. pub struct TypeBuilder<'a, T> where T: Variant + Clone, @@ -109,17 +116,18 @@ where } } -#[allow(missing_docs)] // TODO: add docs impl<'a, T> TypeBuilder<'a, T> where T: Variant + Clone, { + /// Sets a pretty-print name for the `type_of` function. #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_name(&mut self, name: &'static str) -> &mut Self { self.name = Some(name); self } + /// Register a custom function. #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_fn(&mut self, name: N, method: F) -> &mut Self where @@ -130,6 +138,7 @@ where self } + /// Register a custom fallible function. #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_result_fn(&mut self, name: N, method: F) -> &mut Self where @@ -140,6 +149,11 @@ where self } + /// Register a getter function. + /// + /// The function signature must start with `&mut self` and not `&self`. + /// + /// Not available under `no_object`. #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_get( &mut self, @@ -150,6 +164,11 @@ where self } + /// Register a fallible getter function. + /// + /// The function signature must start with `&mut self` and not `&self`. + /// + /// Not available under `no_object`. #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_get_result( &mut self, @@ -160,6 +179,9 @@ where self } + /// Register a setter function. + /// + /// Not available under `no_object`. #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_set( &mut self, @@ -170,6 +192,9 @@ where self } + /// Register a fallible setter function. + /// + /// Not available under `no_object`. #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_set_result( &mut self, @@ -180,6 +205,11 @@ where self } + /// Short-hand for registering both getter and setter functions. + /// + /// All function signatures must start with `&mut self` and not `&self`. + /// + /// Not available under `no_object`. #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_get_set( &mut self, @@ -191,6 +221,11 @@ where self } + /// Register an index getter. + /// + /// The function signature must start with `&mut self` and not `&self`. + /// + /// Not available under both `no_index` and `no_object`. #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_indexer_get( &mut self, @@ -200,6 +235,11 @@ where self } + /// Register an index getter. + /// + /// The function signature must start with `&mut self` and not `&self`. + /// + /// Not available under both `no_index` and `no_object`. #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_indexer_get_result( &mut self, @@ -209,6 +249,9 @@ where self } + /// Register an index setter. + /// + /// Not available under both `no_index` and `no_object`. #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_indexer_set( &mut self, @@ -218,6 +261,9 @@ where self } + /// Register an index setter. + /// + /// Not available under both `no_index` and `no_object`. #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_indexer_set_result( &mut self, @@ -227,6 +273,9 @@ where self } + /// Short-hand for registering both index getter and setter functions. + /// + /// Not available under both `no_index` and `no_object`. #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] pub fn with_indexer_get_set( &mut self, From e4e315fb2a0d26941e137dcc93181a3ac1660a15 Mon Sep 17 00:00:00 2001 From: Tristan Guichaoua Date: Tue, 9 Aug 2022 10:14:18 +0200 Subject: [PATCH 08/10] add cfg --- src/api/build_type.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/api/build_type.rs b/src/api/build_type.rs index 3385b187..c93da739 100644 --- a/src/api/build_type.rs +++ b/src/api/build_type.rs @@ -148,7 +148,13 @@ where self.engine.register_result_fn(name, method); self } +} +#[cfg(not(feature = "no_object"))] +impl<'a, T> TypeBuilder<'a, T> +where + T: Variant + Clone, +{ /// Register a getter function. /// /// The function signature must start with `&mut self` and not `&self`. @@ -220,7 +226,13 @@ where self.engine.register_get_set(name, get_fn, set_fn); self } +} +#[cfg(any(not(feature = "no_index"), not(feature = "no_object")))] +impl<'a, T> TypeBuilder<'a, T> +where + T: Variant + Clone, +{ /// Register an index getter. /// /// The function signature must start with `&mut self` and not `&self`. From 5370031068f188563183d02189caf38a4c6b2f3b Mon Sep 17 00:00:00 2001 From: Tristan Guichaoua Date: Tue, 9 Aug 2022 10:15:49 +0200 Subject: [PATCH 09/10] inline methods --- src/api/build_type.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/api/build_type.rs b/src/api/build_type.rs index c93da739..8f8cc497 100644 --- a/src/api/build_type.rs +++ b/src/api/build_type.rs @@ -77,6 +77,7 @@ impl Engine { /// /// See [`CustomType`]. #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] + #[inline] pub fn build_type(&mut self) -> &mut Self where T: CustomType, @@ -107,6 +108,7 @@ impl<'a, T> TypeBuilder<'a, T> where T: Variant + Clone, { + #[inline] fn new(engine: &'a mut Engine) -> Self { Self { engine, @@ -161,6 +163,7 @@ where /// /// Not available under `no_object`. #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] + #[inline] pub fn with_get( &mut self, name: impl AsRef, @@ -176,6 +179,7 @@ where /// /// Not available under `no_object`. #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] + #[inline] pub fn with_get_result( &mut self, name: impl AsRef, @@ -189,6 +193,7 @@ where /// /// Not available under `no_object`. #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] + #[inline] pub fn with_set( &mut self, name: impl AsRef, @@ -202,6 +207,7 @@ where /// /// Not available under `no_object`. #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] + #[inline] pub fn with_set_result( &mut self, name: impl AsRef, @@ -217,6 +223,7 @@ where /// /// Not available under `no_object`. #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] + #[inline] pub fn with_get_set( &mut self, name: impl AsRef, @@ -239,6 +246,7 @@ where /// /// Not available under both `no_index` and `no_object`. #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] + #[inline] pub fn with_indexer_get( &mut self, get_fn: impl Fn(&mut T, X) -> V + SendSync + 'static, @@ -253,6 +261,7 @@ where /// /// Not available under both `no_index` and `no_object`. #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] + #[inline] pub fn with_indexer_get_result( &mut self, get_fn: impl Fn(&mut T, X) -> RhaiResultOf + SendSync + 'static, @@ -265,6 +274,7 @@ where /// /// Not available under both `no_index` and `no_object`. #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] + #[inline] pub fn with_indexer_set( &mut self, set_fn: impl Fn(&mut T, X, V) + SendSync + 'static, @@ -277,6 +287,7 @@ where /// /// Not available under both `no_index` and `no_object`. #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] + #[inline] pub fn with_indexer_set_result( &mut self, set_fn: impl Fn(&mut T, X, V) -> RhaiResultOf<()> + SendSync + 'static, @@ -289,6 +300,7 @@ where /// /// Not available under both `no_index` and `no_object`. #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."] + #[inline] pub fn with_indexer_get_set( &mut self, get_fn: impl Fn(&mut T, X) -> V + SendSync + 'static, @@ -303,6 +315,7 @@ impl<'a, T> Drop for TypeBuilder<'a, T> where T: Variant + Clone, { + #[inline] fn drop(&mut self) { if let Some(name) = self.name { self.engine.register_type_with_name::(name); From 6d400b747a180e965f3e9e5f92b3e4104d861d49 Mon Sep 17 00:00:00 2001 From: Tristan Guichaoua Date: Tue, 9 Aug 2022 10:16:34 +0200 Subject: [PATCH 10/10] fix doc --- src/api/build_type.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/api/build_type.rs b/src/api/build_type.rs index 8f8cc497..2ac83b3f 100644 --- a/src/api/build_type.rs +++ b/src/api/build_type.rs @@ -255,7 +255,7 @@ where self } - /// Register an index getter. + /// Register an fallible index getter. /// /// The function signature must start with `&mut self` and not `&self`. /// @@ -283,7 +283,7 @@ where self } - /// Register an index setter. + /// Register an fallible index setter. /// /// Not available under both `no_index` and `no_object`. #[deprecated = "This API is NOT deprecated, but it is considered volatile and may change in the future."]