diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a0673f5..d2819836 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ Enhancements ------------ * `$symbol$` is supported in custom syntax to match any symbol. +* `Dynamic::as_string` and `Dynamic::as_immutable_string` are deprecated and replaced by `into_string` and `into_immutable_string` respectively. * `parse_float()`, `PI()` and `E()` now defer to `Decimal` under `no_float` if `decimal` is turned on. diff --git a/codegen/Cargo.toml b/codegen/Cargo.toml index b950aff0..854ad08a 100644 --- a/codegen/Cargo.toml +++ b/codegen/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rhai_codegen" -version = "1.0.0" +version = "1.1.0" edition = "2018" authors = ["jhwgh1968", "Stephen Chung"] description = "Procedural macros support package for Rhai, a scripting language and engine for Rust" diff --git a/codegen/src/function.rs b/codegen/src/function.rs index 8694f266..3158cb33 100644 --- a/codegen/src/function.rs +++ b/codegen/src/function.rs @@ -743,7 +743,7 @@ impl ExportedFn { is_string = true; is_ref = true; quote_spanned!(arg_type.span() => - mem::take(args[#i]).as_immutable_string().unwrap() + mem::take(args[#i]).into_immutable_string().unwrap() ) } _ => panic!("internal error: why wasn't this found earlier!?"), @@ -752,7 +752,7 @@ impl ExportedFn { is_string = true; is_ref = false; quote_spanned!(arg_type.span() => - mem::take(args[#i]).as_string().unwrap() + mem::take(args[#i]).into_string().unwrap() ) } _ => { diff --git a/codegen/src/test/function.rs b/codegen/src/test/function.rs index 6d9eaa33..bca0dfdf 100644 --- a/codegen/src/test/function.rs +++ b/codegen/src/test/function.rs @@ -525,7 +525,7 @@ mod generate_tests { impl PluginFunction for Token { #[inline(always)] fn call(&self, context: NativeCallContext, args: &mut [&mut Dynamic]) -> RhaiResult { - let arg0 = mem::take(args[0usize]).as_immutable_string().unwrap(); + let arg0 = mem::take(args[0usize]).into_immutable_string().unwrap(); Ok(Dynamic::from(special_print(&arg0))) } diff --git a/codegen/src/test/module.rs b/codegen/src/test/module.rs index 620b3a1c..abcdc0cc 100644 --- a/codegen/src/test/module.rs +++ b/codegen/src/test/module.rs @@ -934,7 +934,7 @@ mod generate_tests { impl PluginFunction for print_out_to_token { #[inline(always)] fn call(&self, context: NativeCallContext, args: &mut [&mut Dynamic]) -> RhaiResult { - let arg0 = mem::take(args[0usize]).as_immutable_string().unwrap(); + let arg0 = mem::take(args[0usize]).into_immutable_string().unwrap(); Ok(Dynamic::from(print_out_to(&arg0))) } @@ -987,7 +987,7 @@ mod generate_tests { impl PluginFunction for print_out_to_token { #[inline(always)] fn call(&self, context: NativeCallContext, args: &mut [&mut Dynamic]) -> RhaiResult { - let arg0 = mem::take(args[0usize]).as_string().unwrap(); + let arg0 = mem::take(args[0usize]).into_string().unwrap(); Ok(Dynamic::from(print_out_to(arg0))) } diff --git a/src/dynamic.rs b/src/dynamic.rs index 401e3907..8d401697 100644 --- a/src/dynamic.rs +++ b/src/dynamic.rs @@ -1816,14 +1816,48 @@ impl Dynamic { /// Convert the [`Dynamic`] into a [`String`] and return it. /// If there are other references to the same string, a cloned copy is returned. /// Returns the name of the actual type if the cast fails. - #[inline] + /// + /// # Deprecated + /// + /// This method is deprecated. Use [`into_string`][Dynamic::into_string] instead. + /// + /// This method will be removed in the next major version. + #[deprecated( + since = "1.0.1", + note = "this method is deprecated; use `into_string` instead" + )] + #[inline(always)] pub fn as_string(self) -> Result { - self.as_immutable_string().map(ImmutableString::into_owned) + self.into_string() + } + /// Convert the [`Dynamic`] into a [`String`] and return it. + /// If there are other references to the same string, a cloned copy is returned. + /// Returns the name of the actual type if the cast fails. + #[inline(always)] + pub fn into_string(self) -> Result { + self.into_immutable_string() + .map(ImmutableString::into_owned) + } + /// Convert the [`Dynamic`] into an [`ImmutableString`] and return it. + /// Returns the name of the actual type if the cast fails. + /// + /// # Deprecated + /// + /// This method is deprecated. Use [`into_immutable_string`][Dynamic::into_immutable_string] instead. + /// + /// This method will be removed in the next major version. + #[deprecated( + since = "1.0.1", + note = "this method is deprecated; use `into_string` instead" + )] + #[inline(always)] + pub fn as_immutable_string(self) -> Result { + self.into_immutable_string() } /// Convert the [`Dynamic`] into an [`ImmutableString`] and return it. /// Returns the name of the actual type if the cast fails. #[inline] - pub fn as_immutable_string(self) -> Result { + pub fn into_immutable_string(self) -> Result { match self.0 { Union::Str(s, _, _) => Ok(s), #[cfg(not(feature = "no_closure"))] diff --git a/src/fn_call.rs b/src/fn_call.rs index 8ed8430c..4ad24723 100644 --- a/src/fn_call.rs +++ b/src/fn_call.rs @@ -321,7 +321,7 @@ impl Engine { return Ok(match name { KEYWORD_PRINT => { if let Some(ref print) = self.print { - let text = result.as_immutable_string().map_err(|typ| { + let text = result.into_immutable_string().map_err(|typ| { EvalAltResult::ErrorMismatchOutputType( self.map_type_name(type_name::()).into(), typ.into(), @@ -335,7 +335,7 @@ impl Engine { } KEYWORD_DEBUG => { if let Some(ref debug) = self.debug { - let text = result.as_immutable_string().map_err(|typ| { + let text = result.into_immutable_string().map_err(|typ| { EvalAltResult::ErrorMismatchOutputType( self.map_type_name(type_name::()).into(), typ.into(), @@ -1100,7 +1100,7 @@ impl Engine { // Fn - only in function call style return arg - .as_immutable_string() + .into_immutable_string() .map_err(|typ| self.make_type_mismatch_err::(typ, arg_pos)) .and_then(FnPtr::try_from) .map(Into::::into) @@ -1150,7 +1150,7 @@ impl Engine { )?; let fn_name = arg - .as_immutable_string() + .into_immutable_string() .map_err(|typ| self.make_type_mismatch_err::(typ, arg_pos))?; let (arg, arg_pos) = self.get_arg_value( @@ -1176,7 +1176,7 @@ impl Engine { scope, mods, state, lib, this_ptr, level, args_expr, constants, 0, )?; let var_name = arg - .as_immutable_string() + .into_immutable_string() .map_err(|typ| self.make_type_mismatch_err::(typ, arg_pos))?; return Ok(scope.contains(&var_name).into()); } @@ -1189,7 +1189,7 @@ impl Engine { scope, mods, state, lib, this_ptr, level, args_expr, constants, 0, )?; let script = &value - .as_immutable_string() + .into_immutable_string() .map_err(|typ| self.make_type_mismatch_err::(typ, pos))?; let result = self.eval_script_expr_in_place(scope, mods, state, lib, script, pos, level + 1); diff --git a/src/fn_register.rs b/src/fn_register.rs index 57a4e34f..592c3cac 100644 --- a/src/fn_register.rs +++ b/src/fn_register.rs @@ -53,7 +53,7 @@ pub fn by_value(data: &mut Dynamic) -> T { } else if TypeId::of::() == TypeId::of::() { // If T is `String`, data must be `ImmutableString`, so map directly to it let value = mem::take(data) - .as_string() + .into_string() .expect("never fails because the type was checked"); unsafe_try_cast(value).expect("never fails because the type was checked") } else { diff --git a/src/packages/string_basic.rs b/src/packages/string_basic.rs index 1bb901c8..73193a28 100644 --- a/src/packages/string_basic.rs +++ b/src/packages/string_basic.rs @@ -30,7 +30,7 @@ pub fn print_with_func( ) -> crate::ImmutableString { match ctx.call_fn_dynamic_raw(fn_name, true, &mut [value]) { Ok(result) if result.is::() => result - .as_immutable_string() + .into_immutable_string() .expect("never fails as the result is `ImmutableString`"), Ok(result) => ctx.engine().map_type_name(result.type_name()).into(), Err(_) => ctx.engine().map_type_name(value.type_name()).into(), diff --git a/src/serde/ser.rs b/src/serde/ser.rs index c4b7d56f..f42253dc 100644 --- a/src/serde/ser.rs +++ b/src/serde/ser.rs @@ -547,7 +547,7 @@ impl SerializeMap for DynamicSerializer { #[cfg(not(feature = "no_object"))] { let key = std::mem::take(&mut self._key) - .as_immutable_string() + .into_immutable_string() .map_err(|typ| { EvalAltResult::ErrorMismatchDataType( "string".into(), @@ -577,7 +577,7 @@ impl SerializeMap for DynamicSerializer { #[cfg(not(feature = "no_object"))] { let _key: Dynamic = _key.serialize(&mut *self)?; - let _key = _key.as_immutable_string().map_err(|typ| { + let _key = _key.into_immutable_string().map_err(|typ| { EvalAltResult::ErrorMismatchDataType("string".into(), typ.into(), Position::NONE) })?; let _value = _value.serialize(&mut *self)?; diff --git a/tests/closures.rs b/tests/closures.rs index 922a3cd3..c68038f5 100644 --- a/tests/closures.rs +++ b/tests/closures.rs @@ -343,7 +343,7 @@ fn test_closures_external() -> Result<(), Box> { // Closure 'f' captures: the engine, the AST, and the curried function pointer let f = move |x: INT| fn_ptr.call_dynamic(&context, None, [x.into()]); - assert_eq!(f(42)?.as_string(), Ok("hello42".to_string())); + assert_eq!(f(42)?.into_string(), Ok("hello42".to_string())); Ok(()) } diff --git a/tests/serde.rs b/tests/serde.rs index a02645f3..ac98dc37 100644 --- a/tests/serde.rs +++ b/tests/serde.rs @@ -102,7 +102,7 @@ fn test_serde_ser_struct() -> Result<(), Box> { assert!(obj["b"].as_bool().unwrap()); assert_eq!(Ok(42), map["int"].as_int()); assert_eq!(seq.len(), 3); - assert_eq!("kitty", seq.remove(1).as_string().unwrap()); + assert_eq!("kitty", seq.remove(1).into_string().unwrap()); Ok(()) } @@ -116,10 +116,10 @@ fn test_serde_ser_unit_enum() -> Result<(), Box> { } let d = to_dynamic(MyEnum::VariantFoo)?; - assert_eq!("VariantFoo", d.as_string().unwrap()); + assert_eq!("VariantFoo", d.into_string().unwrap()); let d = to_dynamic(MyEnum::VariantBar)?; - assert_eq!("VariantBar", d.as_string().unwrap()); + assert_eq!("VariantBar", d.into_string().unwrap()); Ok(()) } @@ -145,7 +145,7 @@ fn test_serde_ser_externally_tagged_enum() -> Result<(), Box> { assert_eq!( "VariantUnit", to_dynamic(MyEnum::VariantUnit)? - .as_immutable_string() + .into_immutable_string() .unwrap() .as_str() ); @@ -203,7 +203,7 @@ fn test_serde_ser_internally_tagged_enum() -> Result<(), Box> { "VariantEmptyStruct", map.remove("tag") .unwrap() - .as_immutable_string() + .into_immutable_string() .unwrap() .as_str() ); @@ -214,7 +214,7 @@ fn test_serde_ser_internally_tagged_enum() -> Result<(), Box> { "VariantStruct", map.remove("tag") .unwrap() - .as_immutable_string() + .into_immutable_string() .unwrap() .as_str() ); @@ -247,7 +247,7 @@ fn test_serde_ser_adjacently_tagged_enum() -> Result<(), Box> { "VariantUnit", map.remove("tag") .unwrap() - .as_immutable_string() + .into_immutable_string() .unwrap() .as_str() ); @@ -260,7 +260,7 @@ fn test_serde_ser_adjacently_tagged_enum() -> Result<(), Box> { "VariantUnitTuple", map.remove("tag") .unwrap() - .as_immutable_string() + .into_immutable_string() .unwrap() .as_str() ); @@ -274,7 +274,7 @@ fn test_serde_ser_adjacently_tagged_enum() -> Result<(), Box> { "VariantNewtype", map.remove("tag") .unwrap() - .as_immutable_string() + .into_immutable_string() .unwrap() .as_str() ); @@ -289,7 +289,7 @@ fn test_serde_ser_adjacently_tagged_enum() -> Result<(), Box> { "VariantTuple", map.remove("tag") .unwrap() - .as_immutable_string() + .into_immutable_string() .unwrap() .as_str() ); @@ -305,7 +305,7 @@ fn test_serde_ser_adjacently_tagged_enum() -> Result<(), Box> { "VariantEmptyStruct", map.remove("tag") .unwrap() - .as_immutable_string() + .into_immutable_string() .unwrap() .as_str() ); @@ -316,7 +316,7 @@ fn test_serde_ser_adjacently_tagged_enum() -> Result<(), Box> { let mut map = to_dynamic(MyEnum::VariantStruct { a: 123 })?.cast::(); assert_eq!( "VariantStruct", - map.remove("tag").unwrap().as_string().unwrap() + map.remove("tag").unwrap().into_string().unwrap() ); let mut map_inner = map.remove("content").unwrap().cast::(); assert!(map.is_empty());