From b16aa19ccac7abab5467284a8e9592c6dcfe8169 Mon Sep 17 00:00:00 2001 From: EmirVildanov <reddog201030@gmail.com> Date: Wed, 21 Aug 2024 12:56:36 +0300 Subject: [PATCH] fix: change values cast error message --- .../test_app/test/integration/update_test.lua | 2 +- sbroad-core/src/ir/value.rs | 158 ++++-------------- 2 files changed, 33 insertions(+), 127 deletions(-) diff --git a/sbroad-cartridge/test_app/test/integration/update_test.lua b/sbroad-cartridge/test_app/test/integration/update_test.lua index dd5480d3c..019070e17 100644 --- a/sbroad-cartridge/test_app/test/integration/update_test.lua +++ b/sbroad-cartridge/test_app/test/integration/update_test.lua @@ -192,7 +192,7 @@ update_queries.test_invalid = function() _, err = api:call("sbroad.execute", { [[ update "testing_space" set "product_units" = 'hello']], {} }) - t.assert_str_contains(tostring(err), "(FailedTo(Serialize, Some(Value)") + t.assert_str_contains(tostring(err), "Failed to cast 'hello' to integer.") -- table name can't specified on the left side of update _, err = api:call("sbroad.execute", { diff --git a/sbroad-core/src/ir/value.rs b/sbroad-core/src/ir/value.rs index 7069f2b86..a8befc58c 100644 --- a/sbroad-core/src/ir/value.rs +++ b/sbroad-core/src/ir/value.rs @@ -15,7 +15,7 @@ use tarantool::tuple::{FieldType, KeyDefPart}; use tarantool::uuid::Uuid; use crate::error; -use crate::errors::{Action, Entity, SbroadError}; +use crate::errors::{Entity, SbroadError}; use crate::executor::hash::ToHashString; use crate::ir::relation::Type; use crate::ir::value::double::Double; @@ -782,62 +782,37 @@ impl Value { /// - the value cannot be cast to the given type. #[allow(clippy::too_many_lines)] pub fn cast(&self, column_type: &Type) -> Result<EncodedValue, SbroadError> { + let cast_error = SbroadError::Invalid( + Entity::Value, + Some(format_smolstr!("Failed to cast {self} to {column_type}.")), + ); + match column_type { Type::Any => Ok(self.into()), - Type::Map => match self { - Value::Null => Ok(Value::Null.into()), - _ => Err(SbroadError::FailedTo( - Action::Serialize, - Some(Entity::Value), - format_smolstr!("{self:?} into map"), - )), - }, - Type::Array => match self { + Type::Array | Type::Map => match self { Value::Null => Ok(Value::Null.into()), - _ => Err(SbroadError::FailedTo( - Action::Serialize, - Some(Entity::Value), - format_smolstr!("{self:?} into array"), - )), + _ => Err(cast_error), }, Type::Boolean => match self { Value::Boolean(_) => Ok(self.into()), Value::Null => Ok(Value::Null.into()), - _ => Err(SbroadError::FailedTo( - Action::Serialize, - Some(Entity::Value), - format_smolstr!("{self:?} into boolean"), - )), + _ => Err(cast_error), }, Type::Datetime => match self { Value::Null => Ok(Value::Null.into()), Value::Datetime(_) => Ok(self.into()), - _ => Err(SbroadError::FailedTo( - Action::Serialize, - Some(Entity::Value), - format_smolstr!("{self:?} into datetime"), - )), + _ => Err(cast_error), }, Type::Decimal => match self { Value::Decimal(_) => Ok(self.into()), Value::Double(v) => Ok(Value::Decimal( - Decimal::from_str(&format!("{v}")).map_err(|e| { - SbroadError::FailedTo( - Action::Serialize, - Some(Entity::Value), - format_smolstr!("{e:?}"), - ) - })?, + Decimal::from_str(&format!("{v}")).map_err(|_| cast_error)?, ) .into()), Value::Integer(v) => Ok(Value::Decimal(Decimal::from(*v)).into()), Value::Unsigned(v) => Ok(Value::Decimal(Decimal::from(*v)).into()), Value::Null => Ok(Value::Null.into()), - _ => Err(SbroadError::FailedTo( - Action::Serialize, - Some(Entity::Value), - format_smolstr!("{self:?} into decimal"), - )), + _ => Err(cast_error), }, Type::Double => match self { Value::Double(_) => Ok(self.into()), @@ -845,130 +820,61 @@ impl Value { Value::Integer(v) => Ok(Value::Double(Double::from(*v)).into()), Value::Unsigned(v) => Ok(Value::Double(Double::from(*v)).into()), Value::Null => Ok(Value::Null.into()), - _ => Err(SbroadError::FailedTo( - Action::Serialize, - Some(Entity::Value), - format_smolstr!("{self:?} into double"), - )), + _ => Err(cast_error), }, Type::Integer => match self { Value::Integer(_) => Ok(self.into()), - Value::Decimal(v) => Ok(Value::Integer(v.to_i64().ok_or_else(|| { - SbroadError::FailedTo( - Action::Serialize, - Some(Entity::Value), - format_smolstr!("{self:?} into integer"), - ) - })?) - .into()), + Value::Decimal(v) => Ok(Value::Integer(v.to_i64().ok_or(cast_error)?).into()), Value::Double(v) => v .to_string() .parse::<i64>() .map(Value::Integer) .map(EncodedValue::from) - .map_err(|e| { - SbroadError::FailedTo( - Action::Serialize, - Some(Entity::Value), - e.to_smolstr(), - ) - }), - Value::Unsigned(v) => Ok(Value::Integer(i64::try_from(*v).map_err(|e| { - SbroadError::FailedTo( - Action::Serialize, - Some(Entity::Value), - format_smolstr!("u64 {v} into i64: {e}"), - ) - })?) - .into()), + .map_err(|_| cast_error), + Value::Unsigned(v) => { + Ok(Value::Integer(i64::try_from(*v).map_err(|_| cast_error)?).into()) + } Value::Null => Ok(Value::Null.into()), - _ => Err(SbroadError::FailedTo( - Action::Serialize, - Some(Entity::Value), - format_smolstr!("{self:?} into integer"), - )), + _ => Err(cast_error), }, Type::Scalar => match self { - Value::Tuple(_) => Err(SbroadError::FailedTo( - Action::Serialize, - Some(Entity::Value), - format_smolstr!("{self:?} into scalar"), - )), + Value::Tuple(_) => Err(cast_error), _ => Ok(self.into()), }, Type::String => match self { Value::String(_) => Ok(self.into()), Value::Null => Ok(Value::Null.into()), - _ => Err(SbroadError::FailedTo( - Action::Serialize, - Some(Entity::Value), - format_smolstr!("{self:?} into string"), - )), + _ => Err(cast_error), }, Type::Uuid => match self { Value::Uuid(_) => Ok(self.into()), - Value::String(v) => Ok(Value::Uuid(Uuid::parse_str(v).map_err(|e| { - SbroadError::FailedTo( - Action::Serialize, - Some(Entity::Value), - format_smolstr!("uuid {v} into string: {e}"), - ) - })?) - .into()), + Value::String(v) => { + Ok(Value::Uuid(Uuid::parse_str(v).map_err(|_| cast_error)?).into()) + } Value::Null => Ok(Value::Null.into()), - _ => Err(SbroadError::FailedTo( - Action::Serialize, - Some(Entity::Value), - format_smolstr!("{self:?} into uuid"), - )), + _ => Err(cast_error), }, Type::Number => match self { Value::Integer(_) | Value::Decimal(_) | Value::Double(_) | Value::Unsigned(_) => { Ok(self.into()) } Value::Null => Ok(Value::Null.into()), - _ => Err(SbroadError::FailedTo( - Action::Serialize, - Some(Entity::Value), - format_smolstr!("{self:?} into number"), - )), + _ => Err(cast_error), }, Type::Unsigned => match self { Value::Unsigned(_) => Ok(self.into()), - Value::Integer(v) => Ok(Value::Unsigned(u64::try_from(*v).map_err(|e| { - SbroadError::FailedTo( - Action::Serialize, - Some(Entity::Value), - format_smolstr!("i64 {v} into u64: {e}"), - ) - })?) - .into()), - Value::Decimal(v) => Ok(Value::Unsigned(v.to_u64().ok_or_else(|| { - SbroadError::FailedTo( - Action::Serialize, - Some(Entity::Value), - format_smolstr!("{self:?} into unsigned"), - ) - })?) - .into()), + Value::Integer(v) => { + Ok(Value::Unsigned(u64::try_from(*v).map_err(|_| cast_error)?).into()) + } + Value::Decimal(v) => Ok(Value::Unsigned(v.to_u64().ok_or(cast_error)?).into()), Value::Double(v) => v .to_string() .parse::<u64>() .map(Value::Unsigned) .map(EncodedValue::from) - .map_err(|_| { - SbroadError::FailedTo( - Action::Serialize, - Some(Entity::Value), - format_smolstr!("{self:?} into unsigned"), - ) - }), + .map_err(|_| cast_error), Value::Null => Ok(Value::Null.into()), - _ => Err(SbroadError::FailedTo( - Action::Serialize, - Some(Entity::Value), - format_smolstr!("{self:?} into unsigned"), - )), + _ => Err(cast_error), }, } } -- GitLab