Store RawValue as JValue

This commit is contained in:
Ivan Boldyrev 2024-02-06 20:58:43 +01:00
parent 63c8e3336a
commit f7c8bc8c5b
6 changed files with 14 additions and 51 deletions

View File

@ -107,9 +107,7 @@ fn ensure_error_code_correct(
field_name: &'static str, field_name: &'static str,
) -> Result<(), ErrorObjectError> { ) -> Result<(), ErrorObjectError> {
match value { match value {
JValue::Number(number) if number.is_i64() | number.is_u64() => { JValue::Number(number) => ensure_error_code_is_error(*number),
ensure_error_code_is_error(number.as_i64().unwrap())
}
_ => Err(ErrorObjectError::ScalarFieldIsWrongType { _ => Err(ErrorObjectError::ScalarFieldIsWrongType {
scalar: scalar.clone(), scalar: scalar.clone(),
field_name, field_name,

View File

@ -36,8 +36,7 @@ impl StreamMapKey {
pub fn from_value(value: JValue) -> Option<Self> { pub fn from_value(value: JValue) -> Option<Self> {
match value { match value {
JValue::String(s) => Some(StreamMapKey::Str(s)), JValue::String(s) => Some(StreamMapKey::Str(s)),
JValue::Number(n) if n.is_i64() => Some(StreamMapKey::I64(n.as_i64().unwrap())), JValue::Number(n) => Some(StreamMapKey::I64(n)),
JValue::Number(n) if n.is_u64() => Some(StreamMapKey::U64(n.as_u64().unwrap())),
_ => None, _ => None,
} }
} }
@ -45,8 +44,7 @@ impl StreamMapKey {
pub fn from_value_ref(value: &JValue) -> Option<Self> { pub fn from_value_ref(value: &JValue) -> Option<Self> {
match value { match value {
JValue::String(s) => Some(StreamMapKey::Str(s.clone())), 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) => Some(StreamMapKey::I64(*n)),
JValue::Number(n) if n.is_u64() => Some(StreamMapKey::U64(n.as_u64().unwrap())),
_ => None, _ => None,
} }
} }

View File

@ -124,11 +124,8 @@ fn try_jvalue_as_idx(jvalue: &JValue) -> LambdaResult<u32> {
} }
} }
fn try_number_to_u32(accessor: &serde_json::Number) -> LambdaResult<u32> { fn try_number_to_u32(accessor: &i64) -> LambdaResult<u32> {
accessor (*accessor).try_into().map_err(|_| LambdaError::IndexAccessNotU32 {
.as_u64() accessor: accessor.clone().into(),
.and_then(|v| u32::try_from(v).ok())
.ok_or(LambdaError::IndexAccessNotU32 {
accessor: accessor.clone(),
}) })
} }

View File

@ -33,7 +33,6 @@ use serde::Serialize;
Serialize, Serialize,
Deserialize, Deserialize,
PartialEq, PartialEq,
Eq,
::rkyv::Archive, ::rkyv::Archive,
::rkyv::Serialize, ::rkyv::Serialize,
::rkyv::Deserialize, ::rkyv::Deserialize,

View File

@ -17,9 +17,7 @@
use crate::JValue; use crate::JValue;
use crate::RawValue; use crate::RawValue;
use air_interpreter_cid::raw_value_to_json_cid;
use air_interpreter_cid::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::verify_value;
use air_interpreter_cid::CidCalculationError; use air_interpreter_cid::CidCalculationError;
use air_interpreter_cid::CidRef; use air_interpreter_cid::CidRef;
@ -32,7 +30,7 @@ use thiserror::Error as ThisError;
use std::{collections::HashMap, rc::Rc}; use std::{collections::HashMap, rc::Rc};
/// Stores CID to Value corresponance. /// Stores CID to Value corresponance.
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
#[serde(transparent)] #[serde(transparent)]
#[derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)] #[derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)]
#[archive(check_bytes)] #[archive(check_bytes)]
@ -87,7 +85,7 @@ impl<Val: Serialize> CidStore<Val> {
impl CidStore<RawValue> { impl CidStore<RawValue> {
pub fn verify_raw_value(&self) -> Result<(), CidStoreVerificationError> { pub fn verify_raw_value(&self) -> Result<(), CidStoreVerificationError> {
for (cid, value) in &self.0 { for (cid, value) in &self.0 {
verify_raw_value(cid, value.as_inner())?; verify_value(cid, value)?;
} }
Ok(()) Ok(())
} }
@ -151,7 +149,7 @@ impl<Val: Serialize> CidTracker<Val> {
impl CidTracker<RawValue> { impl CidTracker<RawValue> {
pub fn track_raw_value(&mut self, value: impl Into<Rc<RawValue>>) -> CID<RawValue> { pub fn track_raw_value(&mut self, value: impl Into<Rc<RawValue>>) -> CID<RawValue> {
let value = value.into(); 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); self.cids.insert(cid.clone(), value);
cid cid
} }

View File

@ -19,40 +19,22 @@ use crate::JValue;
use serde::Deserialize; use serde::Deserialize;
use serde::Serialize; use serde::Serialize;
use std::cell::RefCell; #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(transparent)] #[serde(transparent)]
#[derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)] #[derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)]
#[archive(check_bytes)] #[archive(check_bytes)]
pub struct RawValue { pub struct RawValue {
raw: Box<str>, value: JValue,
#[serde(skip)]
#[with(::rkyv::with::Skip)]
parsed: RefCell<Option<JValue>>,
} }
impl RawValue { impl RawValue {
pub fn from_value(value: impl Into<JValue>) -> Self { pub fn from_value(value: impl Into<JValue>) -> Self {
let value = value.into(); let value = value.into();
let raw = value.to_string().into(); Self { value }
Self {
raw,
parsed: Some(value).into(),
}
} }
pub fn get_value(&self) -> JValue { pub fn get_value(&self) -> JValue {
let mut parsed_guard = self.parsed.borrow_mut(); self.value.clone()
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
} }
} }
@ -61,12 +43,3 @@ impl From<JValue> for RawValue {
Self::from_value(value) 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 {}