From f7c8bc8c5ba57c64be3cad2bf8be0ba1e3f456d5 Mon Sep 17 00:00:00 2001 From: Ivan Boldyrev Date: Tue, 6 Feb 2024 20:58:43 +0100 Subject: [PATCH] Store RawValue as JValue --- .../instruction_error_definition.rs | 4 +-- .../stream_maps_variables/stream_map_key.rs | 6 ++-- .../execution_step/lambda_applier/utils.rs | 11 +++--- .../air-lib/interpreter-data/src/cid_info.rs | 1 - .../air-lib/interpreter-data/src/cid_store.rs | 8 ++--- .../air-lib/interpreter-data/src/raw_value.rs | 35 +++---------------- 6 files changed, 14 insertions(+), 51 deletions(-) diff --git a/air/src/execution_step/execution_context/instruction_error/instruction_error_definition.rs b/air/src/execution_step/execution_context/instruction_error/instruction_error_definition.rs index a9b1bd0c..63909573 100644 --- a/air/src/execution_step/execution_context/instruction_error/instruction_error_definition.rs +++ b/air/src/execution_step/execution_context/instruction_error/instruction_error_definition.rs @@ -107,9 +107,7 @@ fn ensure_error_code_correct( field_name: &'static str, ) -> Result<(), ErrorObjectError> { match value { - JValue::Number(number) if number.is_i64() | number.is_u64() => { - ensure_error_code_is_error(number.as_i64().unwrap()) - } + JValue::Number(number) => ensure_error_code_is_error(*number), _ => Err(ErrorObjectError::ScalarFieldIsWrongType { scalar: scalar.clone(), field_name, diff --git a/air/src/execution_step/execution_context/stream_maps_variables/stream_map_key.rs b/air/src/execution_step/execution_context/stream_maps_variables/stream_map_key.rs index 688d5644..0737e544 100644 --- a/air/src/execution_step/execution_context/stream_maps_variables/stream_map_key.rs +++ b/air/src/execution_step/execution_context/stream_maps_variables/stream_map_key.rs @@ -36,8 +36,7 @@ impl StreamMapKey { pub fn from_value(value: JValue) -> Option { match value { JValue::String(s) => Some(StreamMapKey::Str(s)), - JValue::Number(n) if n.is_i64() => Some(StreamMapKey::I64(n.as_i64().unwrap())), - JValue::Number(n) if n.is_u64() => Some(StreamMapKey::U64(n.as_u64().unwrap())), + JValue::Number(n) => Some(StreamMapKey::I64(n)), _ => None, } } @@ -45,8 +44,7 @@ impl StreamMapKey { pub fn from_value_ref(value: &JValue) -> Option { match value { JValue::String(s) => Some(StreamMapKey::Str(s.clone())), - JValue::Number(n) if n.is_i64() => Some(StreamMapKey::I64(n.as_i64().unwrap())), - JValue::Number(n) if n.is_u64() => Some(StreamMapKey::U64(n.as_u64().unwrap())), + JValue::Number(n) => Some(StreamMapKey::I64(*n)), _ => None, } } diff --git a/air/src/execution_step/lambda_applier/utils.rs b/air/src/execution_step/lambda_applier/utils.rs index 7a557fb4..35e74767 100644 --- a/air/src/execution_step/lambda_applier/utils.rs +++ b/air/src/execution_step/lambda_applier/utils.rs @@ -124,11 +124,8 @@ fn try_jvalue_as_idx(jvalue: &JValue) -> LambdaResult { } } -fn try_number_to_u32(accessor: &serde_json::Number) -> LambdaResult { - accessor - .as_u64() - .and_then(|v| u32::try_from(v).ok()) - .ok_or(LambdaError::IndexAccessNotU32 { - accessor: accessor.clone(), - }) +fn try_number_to_u32(accessor: &i64) -> LambdaResult { + (*accessor).try_into().map_err(|_| LambdaError::IndexAccessNotU32 { + accessor: accessor.clone().into(), + }) } diff --git a/crates/air-lib/interpreter-data/src/cid_info.rs b/crates/air-lib/interpreter-data/src/cid_info.rs index f5b9f9a8..2bb8e035 100644 --- a/crates/air-lib/interpreter-data/src/cid_info.rs +++ b/crates/air-lib/interpreter-data/src/cid_info.rs @@ -33,7 +33,6 @@ use serde::Serialize; Serialize, Deserialize, PartialEq, - Eq, ::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize, diff --git a/crates/air-lib/interpreter-data/src/cid_store.rs b/crates/air-lib/interpreter-data/src/cid_store.rs index f5dab3b9..df4562c1 100644 --- a/crates/air-lib/interpreter-data/src/cid_store.rs +++ b/crates/air-lib/interpreter-data/src/cid_store.rs @@ -17,9 +17,7 @@ use crate::JValue; use crate::RawValue; -use air_interpreter_cid::raw_value_to_json_cid; use air_interpreter_cid::value_to_json_cid; -use air_interpreter_cid::verify_raw_value; use air_interpreter_cid::verify_value; use air_interpreter_cid::CidCalculationError; use air_interpreter_cid::CidRef; @@ -32,7 +30,7 @@ use thiserror::Error as ThisError; use std::{collections::HashMap, rc::Rc}; /// Stores CID to Value corresponance. -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] #[serde(transparent)] #[derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)] #[archive(check_bytes)] @@ -87,7 +85,7 @@ impl CidStore { impl CidStore { pub fn verify_raw_value(&self) -> Result<(), CidStoreVerificationError> { for (cid, value) in &self.0 { - verify_raw_value(cid, value.as_inner())?; + verify_value(cid, value)?; } Ok(()) } @@ -151,7 +149,7 @@ impl CidTracker { impl CidTracker { pub fn track_raw_value(&mut self, value: impl Into>) -> CID { let value = value.into(); - let cid = raw_value_to_json_cid(value.as_inner()); + let cid = value_to_json_cid(&*value).expect("TODO refcator"); self.cids.insert(cid.clone(), value); cid } diff --git a/crates/air-lib/interpreter-data/src/raw_value.rs b/crates/air-lib/interpreter-data/src/raw_value.rs index e4289775..3fb554dd 100644 --- a/crates/air-lib/interpreter-data/src/raw_value.rs +++ b/crates/air-lib/interpreter-data/src/raw_value.rs @@ -19,40 +19,22 @@ use crate::JValue; use serde::Deserialize; use serde::Serialize; -use std::cell::RefCell; - -#[derive(Serialize, Deserialize, Debug, Clone)] +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] #[serde(transparent)] #[derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)] #[archive(check_bytes)] pub struct RawValue { - raw: Box, - - #[serde(skip)] - #[with(::rkyv::with::Skip)] - parsed: RefCell>, + value: JValue, } impl RawValue { pub fn from_value(value: impl Into) -> Self { let value = value.into(); - let raw = value.to_string().into(); - Self { - raw, - parsed: Some(value).into(), - } + Self { value } } pub fn get_value(&self) -> JValue { - let mut parsed_guard = self.parsed.borrow_mut(); - - let parsed_value = parsed_guard - .get_or_insert_with(|| serde_json::from_str(&self.raw).expect("TODO handle error")); - parsed_value.clone() - } - - pub(crate) fn as_inner(&self) -> &str { - &self.raw + self.value.clone() } } @@ -61,12 +43,3 @@ impl From for RawValue { Self::from_value(value) } } - -impl PartialEq for RawValue { - fn eq(&self, other: &Self) -> bool { - self.get_value() == other.get_value() - } -} - -// TODO is it implemented for JValue? -impl Eq for RawValue {}