1use std::borrow::Cow;
2use std::collections::HashMap;
3use std::fmt::{self, Debug};
4use std::sync::Arc;
5
6use anyhow::{anyhow, Result};
7use base64::Engine;
8use serde::{de::DeserializeOwned, Deserialize, Serialize};
9use serde_json::Value as JsonValue;
10
11use crate::RunarEncrypt;
12
13use super::encryption::decrypt_bytes;
14
15use super::erased_arc::ErasedArc;
16use super::traits::{KeyStore, LabelResolver, SerializationContext};
17
18type SerializeFn = dyn Fn(&ErasedArc, Option<&Arc<KeyStore>>, Option<&dyn LabelResolver>) -> Result<Vec<u8>>
20 + Send
21 + Sync;
22
23type ToJsonFn = dyn Fn(&ErasedArc) -> Result<JsonValue> + Send + Sync;
24
25#[derive(Clone, Copy, Debug, PartialEq, Eq)]
26#[repr(u8)]
27pub enum ValueCategory {
28 Null = 0,
29 Primitive = 1,
30 List = 2,
31 Map = 3,
32 Struct = 4,
33 Bytes = 5,
34 Json = 6,
35}
36
37impl ValueCategory {
38 pub fn from_u8(value: u8) -> Option<Self> {
39 match value {
40 0 => Some(ValueCategory::Null),
41 1 => Some(ValueCategory::Primitive),
42 2 => Some(ValueCategory::List),
43 3 => Some(ValueCategory::Map),
44 4 => Some(ValueCategory::Struct),
45 5 => Some(ValueCategory::Bytes),
46 6 => Some(ValueCategory::Json),
47 _ => None,
48 }
49 }
50}
51
52#[derive(Clone)]
53pub struct ArcValue {
54 category: ValueCategory,
55 value: Option<ErasedArc>,
56 serialize_fn: Option<Arc<SerializeFn>>,
57 to_json_fn: Option<Arc<ToJsonFn>>,
58}
59
60impl fmt::Debug for ArcValue {
61 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
62 f.debug_struct("ArcValue")
63 .field("category", &self.category)
64 .field("value", &self.value)
65 .field(
66 "serialize_fn",
67 &if self.serialize_fn.is_some() {
68 "Some(<fn>)"
69 } else {
70 "None"
71 },
72 )
73 .finish()
74 }
75}
76
77impl PartialEq for ArcValue {
78 fn eq(&self, other: &Self) -> bool {
79 if self.category != other.category {
80 return false;
81 }
82 match (&self.value, &other.value) {
83 (Some(v1), Some(v2)) => v1.eq_value(v2),
84 (None, None) => true,
85 _ => false,
86 }
87 }
88}
89
90impl Eq for ArcValue {}
91
92#[derive(Clone)]
93pub struct LazyDataWithOffset {
94 pub type_name: String,
95 pub original_buffer: Arc<[u8]>,
96 pub start_offset: usize,
97 pub end_offset: usize,
98 pub keystore: Option<Arc<KeyStore>>,
99 pub encrypted: bool,
100}
101
102impl fmt::Debug for LazyDataWithOffset {
103 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
104 f.debug_struct("LazyDataWithOffset")
105 .field("type_name", &self.type_name)
106 .field("original_buffer_len", &self.original_buffer.len())
107 .field("data_segment_len", &(self.end_offset - self.start_offset))
108 .field("start_offset", &self.start_offset)
109 .field("end_offset", &self.end_offset)
110 .finish()
111 }
112}
113
114impl ArcValue {
115 pub fn category(&self) -> ValueCategory {
117 self.category
118 }
119
120 pub fn has_value(&self) -> bool {
122 self.value.is_some()
123 }
124
125 pub fn type_name(&self) -> Option<&str> {
127 self.value.as_ref().map(|v| v.type_name())
128 }
129
130 pub fn null() -> Self {
131 Self {
132 category: ValueCategory::Null,
133 value: None,
134 serialize_fn: None,
135 to_json_fn: None,
136 }
137 }
138
139 pub fn is_null(&self) -> bool {
140 self.category == ValueCategory::Null && self.value.is_none()
141 }
142
143 pub fn new_primitive<T>(value: T) -> Self
144 where
145 T: 'static + Clone + Debug + Send + Sync + Serialize + DeserializeOwned,
146 {
147 let type_name = std::any::type_name::<T>();
148 if !is_primitive(type_name) {
149 panic!("Not a primitive");
150 }
151 let arc = Arc::new(value);
152 let ser_fn: Arc<SerializeFn> = Arc::new(move |erased, _, _| {
153 let val = erased.as_arc::<T>()?;
154 serde_cbor::to_vec(&*val).map_err(anyhow::Error::from)
155 });
156 Self {
157 category: ValueCategory::Primitive,
158 value: Some(ErasedArc::new(arc)),
159 serialize_fn: Some(ser_fn),
160 to_json_fn: None,
161 }
162 }
163
164 pub fn new_list<T>(list: Vec<T>) -> Self
165 where
166 T: 'static + Clone + Debug + Send + Sync + Serialize + DeserializeOwned,
167 {
168 let arc = Arc::new(list);
169 let ser_fn: Arc<SerializeFn> = Arc::new(move |erased, _, _| {
170 let list = erased.as_arc::<Vec<T>>()?;
171 serde_cbor::to_vec(list.as_ref()).map_err(anyhow::Error::from)
172 });
173 let to_json_fn: Arc<ToJsonFn> = Arc::new(move |erased| {
174 let list = erased.as_arc::<Vec<T>>()?;
175 serde_json::to_value(list.as_ref()).map_err(anyhow::Error::from)
176 });
177 Self {
178 category: ValueCategory::List,
179 value: Some(ErasedArc::new(arc)),
180 serialize_fn: Some(ser_fn),
181 to_json_fn: Some(to_json_fn),
182 }
183 }
184
185 pub fn new_map<T>(map: HashMap<String, T>) -> Self
186 where
187 T: 'static + Clone + Debug + Send + Sync + Serialize + DeserializeOwned,
188 {
189 let arc = Arc::new(map);
190 let ser_fn: Arc<SerializeFn> = Arc::new(move |erased, _, _| {
191 let map = erased.as_arc::<HashMap<String, T>>()?;
192 serde_cbor::to_vec(map.as_ref()).map_err(anyhow::Error::from)
193 });
194 let to_json_fn: Arc<ToJsonFn> = Arc::new(move |erased| {
195 let map = erased.as_arc::<HashMap<String, T>>()?;
196 serde_json::to_value(map.as_ref()).map_err(anyhow::Error::from)
197 });
198 Self {
199 category: ValueCategory::Map,
200 value: Some(ErasedArc::new(arc)),
201 serialize_fn: Some(ser_fn),
202 to_json_fn: Some(to_json_fn),
203 }
204 }
205
206 pub fn new_struct<T>(value: T) -> Self
207 where
208 T: 'static + Clone + Debug + Send + Sync + Serialize + DeserializeOwned + RunarEncrypt,
209 {
210 let arc = Arc::new(value);
211 let ser_fn: Arc<SerializeFn> = Arc::new(move |erased, keystore, resolver| {
212 let val = erased.as_arc::<T>()?;
213 if let (Some(ks), Some(res)) = (keystore, resolver) {
214 let result = val.encrypt_with_keystore(ks, res)?;
215 serde_cbor::to_vec(&result).map_err(anyhow::Error::from)
216 } else {
217 serde_cbor::to_vec(&*val).map_err(anyhow::Error::from)
218 }
219 });
220 let to_json_fn: Arc<ToJsonFn> = Arc::new(move |erased| {
221 let val = erased.as_arc::<T>()?;
222 serde_json::to_value(val.as_ref().clone()).map_err(anyhow::Error::from)
223 });
224 Self {
225 category: ValueCategory::Struct,
226 value: Some(ErasedArc::new(arc)),
227 serialize_fn: Some(ser_fn),
228 to_json_fn: Some(to_json_fn),
229 }
230 }
231
232 pub fn new_bytes(bytes: Vec<u8>) -> Self {
233 let arc = Arc::new(bytes);
234 let ser_fn: Arc<SerializeFn> = Arc::new(move |erased, _, _| {
235 let bytes = erased.as_arc::<Vec<u8>>()?;
236 Ok((*bytes).clone())
237 });
238 Self {
239 category: ValueCategory::Bytes,
240 value: Some(ErasedArc::new(arc)),
241 serialize_fn: Some(ser_fn),
242 to_json_fn: None,
243 }
244 }
245
246 pub fn new_json(json: JsonValue) -> Self {
247 let arc = Arc::new(json);
248 let ser_fn: Arc<SerializeFn> = Arc::new(move |erased, _, _| {
249 let json = erased.as_arc::<JsonValue>()?;
250 Ok(serde_cbor::to_vec(&*json)?)
251 });
252 Self {
253 category: ValueCategory::Json,
254 value: Some(ErasedArc::new(arc)),
255 serialize_fn: Some(ser_fn),
256 to_json_fn: None,
257 }
258 }
259
260 pub fn deserialize(bytes: &[u8], keystore: Option<Arc<KeyStore>>) -> Result<Self> {
261 if bytes.is_empty() {
262 return Err(anyhow!("Empty bytes for deserialization"));
263 }
264
265 let category_byte = bytes[0];
266 let category = match category_byte {
267 0 => ValueCategory::Null,
268 1 => ValueCategory::Primitive,
269 2 => ValueCategory::List,
270 3 => ValueCategory::Map,
271 4 => ValueCategory::Struct,
272 5 => ValueCategory::Bytes,
273 6 => ValueCategory::Json,
274 _ => return Err(anyhow!("Invalid category byte: {}", category_byte)),
275 };
276
277 if category == ValueCategory::Null {
278 return Ok(Self::null());
279 }
280
281 let is_encrypted_byte = bytes[1];
282 let is_encrypted = is_encrypted_byte == 0x01;
283
284 let type_name_len = bytes[2] as usize;
285 if type_name_len + 3 > bytes.len() {
286 return Err(anyhow!("Invalid type name length"));
287 }
288 let type_name_bytes = &bytes[3..3 + type_name_len];
289 let type_name = std::str::from_utf8(type_name_bytes)
290 .map_err(|e| anyhow!("Invalid UTF-8 in type name: {e}"))?
291 .to_string();
292
293 let data_start = 3 + type_name_len;
294 let data_bytes = &bytes[data_start..];
295
296 match category {
297 ValueCategory::Primitive => {
298 let bytes_cow: Cow<[u8]> = if is_encrypted {
300 Cow::Owned(decrypt_bytes(
301 data_bytes,
302 keystore
303 .as_ref()
304 .ok_or(anyhow!("Keystore required for decryption"))?,
305 )?)
306 } else {
307 Cow::Borrowed(data_bytes)
308 };
309
310 match type_name.as_str() {
312 "alloc::string::String" => {
313 let value: String = serde_cbor::from_slice(bytes_cow.as_ref())?;
314 Ok(ArcValue::new_primitive(value))
315 }
316 "i64" => {
317 let value: i64 = serde_cbor::from_slice(bytes_cow.as_ref())?;
318 Ok(ArcValue::new_primitive(value))
319 }
320 "f64" => {
321 let value: f64 = serde_cbor::from_slice(bytes_cow.as_ref())?;
322 Ok(ArcValue::new_primitive(value))
323 }
324 "bool" => {
325 let value: bool = serde_cbor::from_slice(bytes_cow.as_ref())?;
326 Ok(ArcValue::new_primitive(value))
327 }
328 _ => Err(anyhow!("Unknown primitive type: {}", type_name)),
329 }
330 }
331 ValueCategory::Bytes => {
332 if is_encrypted {
334 let decrypted = decrypt_bytes(
335 data_bytes,
336 keystore
337 .as_ref()
338 .ok_or(anyhow!("Keystore required for decryption"))?,
339 )?;
340 Ok(ArcValue::new_bytes(decrypted))
341 } else {
342 Ok(ArcValue::new_bytes(data_bytes.to_vec()))
343 }
344 }
345 _ => {
346 let lazy = LazyDataWithOffset {
348 type_name,
349 original_buffer: Arc::from(bytes),
350 start_offset: data_start,
351 end_offset: bytes.len(),
352 keystore,
353 encrypted: is_encrypted,
354 };
355
356 Ok(Self {
357 category,
358 value: Some(ErasedArc::from_value(lazy)),
359 serialize_fn: None,
360 to_json_fn: None,
361 })
362 }
363 }
364 }
365
366 pub fn serialize(&self, context: Option<&SerializationContext>) -> Result<Vec<u8>> {
368 if self.is_null() {
369 return Ok(vec![0]);
370 }
371
372 let inner = self
373 .value
374 .as_ref()
375 .ok_or(anyhow!("No value to serialize"))?;
376 let type_name = inner.type_name();
377 let category_byte = match self.category {
378 ValueCategory::Null => 0,
379 ValueCategory::Primitive => 1,
380 ValueCategory::List => 2,
381 ValueCategory::Map => 3,
382 ValueCategory::Struct => 4,
383 ValueCategory::Bytes => 5,
384 ValueCategory::Json => 6,
385 };
386
387 let mut buf = vec![category_byte];
388 let type_name_bytes = type_name.as_bytes();
389 if type_name_bytes.len() > 255 {
390 return Err(anyhow!("Type name too long: {}", type_name));
391 }
392
393 if let Some(ctx) = context {
394 let ks = &ctx.keystore;
395 let network_id = &ctx.network_id;
396 let profile_public_key = &ctx.profile_public_key;
397 let resolver = &ctx.resolver;
398
399 let bytes = if let Some(ser_fn) = &self.serialize_fn {
400 ser_fn(inner, Some(ks), Some(resolver.as_ref()))
401 } else {
402 return Err(anyhow!("No serialize function available"));
403 }?;
404
405 let recipients: Vec<Vec<u8>> = match profile_public_key.as_ref() {
406 Some(pk) => vec![pk.clone()],
407 None => Vec::new(),
408 };
409 let data = ks.encrypt_with_envelope(&bytes, Some(network_id.as_str()), recipients)?;
410 let is_encrypted_byte = 0x01;
411 buf.push(is_encrypted_byte);
412 buf.push(type_name_bytes.len() as u8);
413 buf.extend_from_slice(type_name_bytes);
414 buf.extend(serde_cbor::to_vec(&data).map_err(|e| anyhow!(e))?);
415 } else {
416 let bytes = if let Some(ser_fn) = &self.serialize_fn {
417 ser_fn(inner, None, None)
418 } else {
419 return Err(anyhow!("No serialize function available"));
420 }?;
421 let is_encrypted_byte = 0x00;
422 buf.reserve_exact(3 + type_name_bytes.len() + bytes.len());
424 buf.push(is_encrypted_byte);
425 buf.push(type_name_bytes.len() as u8);
426 buf.extend_from_slice(type_name_bytes);
427 buf.extend(bytes);
428 }
429
430 Ok(buf)
431 }
432
433 pub fn as_type<T>(&self) -> Result<T>
434 where
435 T: 'static + Clone + Debug + Send + Sync + Serialize + DeserializeOwned,
436 {
437 let ref_value = self.as_type_ref::<T>()?;
438 Ok((*ref_value).clone())
439 }
440
441 pub fn as_type_ref<T>(&self) -> Result<Arc<T>>
445 where
446 T: 'static + Clone + Debug + Send + Sync + Serialize + DeserializeOwned,
447 {
448 let inner = self.value.as_ref().ok_or_else(|| anyhow!("No value"))?;
449
450 let target_name = std::any::type_name::<T>();
451
452 if !inner.is_lazy {
454 if self.category == ValueCategory::Json && target_name != "serde_json::value::Value" {
457 let json_value = inner.as_arc::<JsonValue>()?;
458 if target_name.contains("ArcValue") {
459 let converted_arc = Self::json_to_arc_value(json_value.as_ref());
460 return converted_arc.as_type_ref::<T>();
461 } else {
462 let result: T = serde_json::from_value::<T>(json_value.as_ref().clone())?;
463 return Ok(Arc::new(result));
464 }
465 }
466
467 return inner.as_arc::<T>();
468 }
469
470 self.handle_lazy_data(|payload, type_name| {
472 if type_name == "serde_json::value::Value" && target_name != type_name {
474 if let Ok(json_value) = serde_cbor::from_slice::<serde_json::value::Value>(payload)
475 {
476 if target_name.contains("ArcValue") {
477 let converted_arc = Self::json_to_arc_value(&json_value);
478 return converted_arc.as_type_ref::<T>();
479 } else {
480 let result: T = serde_json::from_value::<T>(json_value)?;
481 return Ok(Arc::new(result));
482 }
483 } else {
484 return Err(anyhow!("Failed to deserialize JSON from CBOR"));
485 }
486 }
487
488 if let Ok(val) = serde_cbor::from_slice::<T>(payload) {
491 return Ok(Arc::new(val));
492 }
493
494 let lazy = inner.get_lazy_data()?;
497 let ks = lazy
498 .keystore
499 .as_ref()
500 .ok_or_else(|| anyhow!("Keystore required for decryptor"))?;
501 let plain: T = crate::registry::try_decrypt_into::<T>(payload, ks)?;
502 Ok(Arc::new(plain))
503 })
504 }
505
506 pub fn as_typed_list_ref<T>(&self) -> Result<Vec<Arc<T>>>
507 where
508 T: 'static + Clone + Debug + Send + Sync + Serialize + DeserializeOwned,
509 {
510 if self.category != ValueCategory::List {
511 return Err(anyhow!("Not a list"));
512 }
513 let list_arc = self.as_type_ref::<Vec<ArcValue>>()?;
514
515 let list_of_type: Vec<Arc<T>> = list_arc
516 .iter()
517 .map(|entry| {
518 entry
519 .as_type_ref::<T>()
520 .expect("can't convert list entry to type")
521 })
522 .collect();
523
524 Ok(list_of_type)
525 }
526
527 pub fn as_list_ref(&self) -> Result<Arc<Vec<ArcValue>>> {
528 if self.category != ValueCategory::List {
529 return Err(anyhow!("Not a list"));
530 }
531 self.as_type_ref::<Vec<ArcValue>>()
532 }
533
534 pub fn as_typed_map_ref<T>(&self) -> Result<HashMap<String, Arc<T>>>
535 where
536 T: 'static + Clone + Debug + Send + Sync + Serialize + DeserializeOwned,
537 {
538 if self.category != ValueCategory::Map {
539 return Err(anyhow!("Not a map"));
540 }
541 let map_arc = self.as_type_ref::<HashMap<String, ArcValue>>()?;
542
543 let map_of_type: HashMap<String, Arc<T>> = map_arc
544 .iter()
545 .map(|(key, value)| {
546 (
547 key.clone(),
548 value
549 .as_type_ref::<T>()
550 .expect("can't convert map entry to type"),
551 )
552 })
553 .collect();
554
555 Ok(map_of_type)
556 }
557
558 pub fn as_map_ref(&self) -> Result<Arc<HashMap<String, ArcValue>>> {
559 if self.category != ValueCategory::Map {
560 return Err(anyhow!("Not a map"));
561 }
562 self.as_type_ref::<HashMap<String, ArcValue>>()
563 }
564
565 pub fn as_struct_ref<T>(&self) -> Result<Arc<T>>
566 where
567 T: 'static + Clone + Debug + Send + Sync + Serialize + DeserializeOwned,
568 {
569 if self.category != ValueCategory::Struct {
570 return Err(anyhow!("Not a struct"));
571 }
572 self.as_type_ref::<T>()
573 }
574
575 pub fn as_bytes_ref(&self) -> Result<Arc<Vec<u8>>> {
576 if self.category != ValueCategory::Bytes {
577 return Err(anyhow!("Not bytes"));
578 }
579 let inner = self.value.as_ref().ok_or(anyhow!("No value"))?;
580 if inner.is_lazy {
581 self.handle_lazy_data(|payload, _type_name| Ok(Arc::new(payload.to_vec())))
582 } else {
583 inner.as_arc::<Vec<u8>>()
584 }
585 }
586
587 pub fn as_json_ref(&self) -> Result<Arc<JsonValue>> {
588 if self.category != ValueCategory::Json {
589 return Err(anyhow!("Not JSON"));
590 }
591 self.as_type_ref::<JsonValue>()
592 }
593
594 fn handle_lazy_data<F, R>(&self, process_fn: F) -> Result<R>
597 where
598 F: FnOnce(&[u8], &str) -> Result<R>,
599 {
600 let inner = self.value.as_ref().ok_or_else(|| anyhow!("No value"))?;
601
602 if !inner.is_lazy {
604 return Err(anyhow!("Not lazy data"));
605 }
606
607 let lazy = inner.get_lazy_data()?;
609 let mut payload: Vec<u8> =
610 lazy.original_buffer[lazy.start_offset..lazy.end_offset].to_vec();
611
612 if lazy.encrypted {
614 let ks = lazy
615 .keystore
616 .as_ref()
617 .ok_or_else(|| anyhow!("Keystore required for outer decryption"))?;
618 payload = crate::encryption::decrypt_bytes(&payload, ks)?;
619 }
620
621 process_fn(&payload, &lazy.type_name)
623 }
624
625 fn json_to_arc_value(json: &JsonValue) -> Self {
626 match json {
627 JsonValue::Null => Self::null(),
628 JsonValue::Bool(b) => Self::new_primitive(*b),
629 JsonValue::Number(n) => {
630 if let Some(i) = n.as_i64() {
631 Self::new_primitive(i)
632 } else if let Some(f) = n.as_f64() {
633 Self::new_primitive(f)
634 } else {
635 Self::null()
636 }
637 }
638 JsonValue::String(s) => Self::new_primitive(s.clone()),
639 JsonValue::Array(arr) => {
640 Self::new_list(arr.iter().map(Self::json_to_arc_value).collect())
641 }
642 JsonValue::Object(obj) => Self::new_map(
643 obj.clone()
644 .into_iter()
645 .map(|(k, v)| (k, Self::json_to_arc_value(&v)))
646 .collect(),
647 ),
648 }
649 }
650
651 pub fn to_json(&self) -> Result<JsonValue> {
652 match self.category {
653 ValueCategory::Null => Ok(JsonValue::Null),
654 ValueCategory::Primitive => {
655 let inner = self.value.as_ref().ok_or_else(|| anyhow!("No value"))?;
656 let type_name = inner.type_name();
657
658 if is_string(type_name) {
659 let value = inner.as_arc::<String>()?;
660 Ok(JsonValue::String(value.as_ref().clone()))
661 } else if is_number(type_name) {
662 to_json_number(inner, type_name)
663 } else if is_bool(type_name) {
664 let value = inner.as_arc::<bool>()?;
665 Ok(JsonValue::Bool(*value))
666 } else if is_char(type_name) {
667 let value = inner.as_arc::<char>()?;
668 Ok(JsonValue::String(value.to_string()))
669 } else if is_bytes(type_name) {
670 let value = inner.as_arc::<Vec<u8>>()?;
671 Ok(JsonValue::String(
672 base64::engine::general_purpose::STANDARD.encode(value.as_ref()),
673 ))
674 } else {
675 Err(anyhow!(
676 "Unsupported primitive type for JSON conversion: {}",
677 type_name
678 ))
679 }
680 }
681 ValueCategory::Json => Ok(self.as_json_ref()?.as_ref().clone()),
682 ValueCategory::Struct | ValueCategory::List | ValueCategory::Map => {
683 if let Some(json_fn) = &self.to_json_fn {
685 let inner = self.value.as_ref().ok_or(anyhow!("No value"))?;
686 let json_value = json_fn(inner)?;
687 return Ok(json_value);
688 }
689
690 let inner = self.value.as_ref().ok_or(anyhow!("No value"))?;
692 if inner.is_lazy {
693 self.handle_lazy_data(|payload, type_name| {
694 if let Some(json_fn) = crate::registry::get_json_converter(type_name) {
696 return json_fn(payload);
697 }
698
699 Err(anyhow!(
701 "No JSON converter available for struct type: {}",
702 type_name
703 ))
704 })
705 } else {
706 Err(anyhow!(
707 "No to_json function available and no registry fallback"
708 ))
709 }
710 }
711 _ => Err(anyhow!("Unsupported category for JSON")),
712 }
713 }
714
715 pub fn serialize_serde<S>(&self, serializer: S) -> ::std::result::Result<S::Ok, S::Error>
716 where
717 S: serde::Serializer,
718 {
719 let is_json = std::any::type_name::<S>().contains("serde_json");
721
722 if is_json {
723 match self.to_json() {
725 Ok(json_value) => json_value.serialize(serializer),
726 Err(e) => Err(serde::ser::Error::custom(format!(
727 "JSON conversion failed: {e}",
728 ))),
729 }
730 } else {
731 use serde::ser::SerializeStruct;
733
734 let mut state = serializer.serialize_struct("ArcValue", 3)?;
735
736 let category_int = self.category as u8;
738 state.serialize_field("category", &category_int)?;
739
740 let inner = self
741 .value
742 .as_ref()
743 .ok_or(serde::ser::Error::custom("No value to serialize"))?;
744 let type_name = inner.type_name();
745 state.serialize_field("typename", type_name)?;
746
747 if let Some(inner) = &self.value {
749 if let Some(ser_fn) = &self.serialize_fn {
750 let serialized_data =
751 ser_fn(inner, None, None).map_err(serde::ser::Error::custom)?;
752 state.serialize_field("value", &serialized_data)?;
753 } else {
754 return Err(serde::ser::Error::custom("No serialize function available"));
755 }
756 } else {
757 state.serialize_field("value", &serde_json::Value::Null)?;
759 }
760
761 state.end()
762 }
763 }
764
765 pub fn deserialize_serde<'de, D>(deserializer: D) -> ::std::result::Result<Self, D::Error>
766 where
767 D: serde::Deserializer<'de>,
768 {
769 let is_json = std::any::type_name::<D>().contains("serde_json");
771
772 if is_json {
773 let json_value = JsonValue::deserialize(deserializer)?;
775 Ok(Self::json_to_arc_value(&json_value))
776 } else {
777 use serde::de::{self, MapAccess, Visitor};
779 use std::fmt;
780
781 #[derive(Deserialize)]
782 #[serde(field_identifier, rename_all = "lowercase")]
783 enum Field {
784 Category,
785 Value,
786 TypeName,
787 }
788
789 struct ArcValueVisitor;
790
791 impl<'de> Visitor<'de> for ArcValueVisitor {
792 type Value = ArcValue;
793
794 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
795 formatter.write_str("struct ArcValue")
796 }
797
798 fn visit_map<V>(self, mut map: V) -> Result<ArcValue, V::Error>
799 where
800 V: MapAccess<'de>,
801 {
802 let mut category = None;
803 let mut value = None;
804 let mut type_name: Option<String> = None;
805 while let Some(key) = map.next_key()? {
806 match key {
807 Field::Category => {
808 if category.is_some() {
809 return Err(de::Error::duplicate_field("category"));
810 }
811 let category_int: u8 = map.next_value()?;
812 category = Some(ValueCategory::from_u8(category_int).ok_or_else(
813 || {
814 de::Error::unknown_variant(
815 &category_int.to_string(),
816 &["0", "1", "2", "3", "4", "5", "6"],
817 )
818 },
819 )?);
820 }
821 Field::Value => {
822 if value.is_some() {
823 return Err(de::Error::duplicate_field("value"));
824 }
825 value = Some(map.next_value()?);
826 }
827 Field::TypeName => {
828 if type_name.is_some() {
829 return Err(de::Error::duplicate_field("typename"));
830 }
831 type_name = Some(map.next_value()?);
832 }
833 }
834 }
835
836 let category = category.ok_or_else(|| de::Error::missing_field("category"))?;
837 let type_name =
838 type_name.ok_or_else(|| de::Error::missing_field("typename"))?;
839
840 match category {
841 ValueCategory::Null => Ok(ArcValue::null()),
842 ValueCategory::Primitive => {
843 let value: Vec<u8> =
845 value.ok_or_else(|| de::Error::missing_field("value"))?;
846 if let Ok(s) = serde_cbor::from_slice::<String>(&value) {
848 Ok(ArcValue::new_primitive(s))
849 } else if let Ok(i) = serde_cbor::from_slice::<i64>(&value) {
850 Ok(ArcValue::new_primitive(i))
851 } else if let Ok(f) = serde_cbor::from_slice::<f64>(&value) {
852 Ok(ArcValue::new_primitive(f))
853 } else if let Ok(b) = serde_cbor::from_slice::<bool>(&value) {
854 Ok(ArcValue::new_primitive(b))
855 } else {
856 Err(de::Error::custom("Failed to deserialize primitive value"))
857 }
858 }
859 ValueCategory::Bytes => {
860 let value: Vec<u8> =
862 value.ok_or_else(|| de::Error::missing_field("value"))?;
863 Ok(ArcValue::new_bytes(value))
864 }
865 _ => {
866 let value: Vec<u8> =
868 value.ok_or_else(|| de::Error::missing_field("value"))?;
869 let value_len = value.len();
870 let lazy_data = LazyDataWithOffset {
872 type_name: type_name.to_string(),
873 original_buffer: Arc::from(value),
874 start_offset: 0,
875 end_offset: value_len,
876 keystore: None,
877 encrypted: false,
878 };
879
880 Ok(ArcValue {
881 category,
882 value: Some(ErasedArc::from_value(lazy_data)),
883 serialize_fn: None,
884 to_json_fn: None,
885 })
886 }
887 }
888 }
889 }
890
891 deserializer.deserialize_struct(
892 "ArcValue",
893 &["category", "value", "typename"],
894 ArcValueVisitor,
895 )
896 }
897 }
898}
899
900impl serde::Serialize for ArcValue {
901 fn serialize<S>(&self, serializer: S) -> ::std::result::Result<S::Ok, S::Error>
902 where
903 S: serde::Serializer,
904 {
905 self.serialize_serde(serializer)
906 }
907}
908
909impl<'de> serde::Deserialize<'de> for ArcValue {
910 fn deserialize<D>(deserializer: D) -> ::std::result::Result<Self, D::Error>
911 where
912 D: serde::Deserializer<'de>,
913 {
914 Self::deserialize_serde(deserializer)
915 }
916}
917
918pub trait AsArcValue: Sized + Clone {
932 fn into_arc_value(self) -> ArcValue;
934
935 fn from_arc_value(value: ArcValue) -> Result<Self>
937 where
938 Self: 'static + Debug + Send + Sync + Serialize + DeserializeOwned,
939 {
940 value.as_type_ref::<Self>().map(|arc| (*arc).clone())
941 }
942}
943
944impl Default for ArcValue {
945 fn default() -> Self {
946 ArcValue::null()
947 }
948}
949
950impl<T> AsArcValue for T
951where
952 T: 'static + Clone + Debug + Send + Sync + Serialize + DeserializeOwned + RunarEncrypt,
953{
954 fn into_arc_value(self) -> ArcValue {
955 ArcValue::new_struct(self)
956 }
957
958 fn from_arc_value(value: ArcValue) -> Result<Self> {
959 value.as_type_ref::<T>().map(|arc| (*arc).clone())
960 }
961}
962
963impl AsArcValue for ArcValue {
965 fn into_arc_value(self) -> ArcValue {
966 self
967 }
968
969 fn from_arc_value(value: ArcValue) -> Result<Self> {
970 Ok(value)
971 }
972}
973
974fn is_primitive(type_name: &str) -> bool {
975 is_string(type_name)
976 || is_number(type_name)
977 || is_bool(type_name)
978 || is_char(type_name)
979 || is_bytes(type_name)
980}
981
982fn is_string(type_name: &str) -> bool {
983 type_name.starts_with("alloc::string::String") || type_name.starts_with("std::string::String")
984}
985
986fn is_number(type_name: &str) -> bool {
987 type_name == "i8"
988 || type_name == "i16"
989 || type_name == "i32"
990 || type_name == "i64"
991 || type_name == "i128"
992 || type_name == "u8"
993 || type_name == "u16"
994 || type_name == "u32"
995 || type_name == "u64"
996 || type_name == "u128"
997 || type_name == "f32"
998 || type_name == "f64"
999}
1000
1001fn to_json_number(inner: &ErasedArc, type_name: &str) -> Result<JsonValue> {
1002 match type_name {
1003 "i8" => {
1004 let value = inner.as_arc::<i8>()?;
1005 Ok(JsonValue::Number((*value as i64).into()))
1006 }
1007 "i16" => {
1008 let value = inner.as_arc::<i16>()?;
1009 Ok(JsonValue::Number((*value as i64).into()))
1010 }
1011 "i32" => {
1012 let value = inner.as_arc::<i32>()?;
1013 Ok(JsonValue::Number((*value as i64).into()))
1014 }
1015 "i64" => {
1016 let value = inner.as_arc::<i64>()?;
1017 Ok(JsonValue::Number((*value).into()))
1018 }
1019 "i128" => {
1020 let value = inner.as_arc::<i128>()?;
1021 Ok(JsonValue::String(value.to_string()))
1022 }
1023 "u8" => {
1024 let value = inner.as_arc::<u8>()?;
1025 Ok(JsonValue::Number((*value as u64).into()))
1026 }
1027 "u16" => {
1028 let value = inner.as_arc::<u16>()?;
1029 Ok(JsonValue::Number((*value as u64).into()))
1030 }
1031 "u32" => {
1032 let value = inner.as_arc::<u32>()?;
1033 Ok(JsonValue::Number((*value as u64).into()))
1034 }
1035 "u64" => {
1036 let value = inner.as_arc::<u64>()?;
1037 Ok(JsonValue::Number((*value).into()))
1038 }
1039 "u128" => {
1040 let value = inner.as_arc::<u128>()?;
1041 Ok(JsonValue::String(value.to_string()))
1042 }
1043 "f32" => {
1044 let value = inner.as_arc::<f32>()?;
1045 Ok(JsonValue::Number(
1046 serde_json::Number::from_f64(*value as f64)
1047 .ok_or_else(|| anyhow!("Invalid f32 value for JSON: {value}"))?,
1048 ))
1049 }
1050 "f64" => {
1051 let value = inner.as_arc::<f64>()?;
1052 Ok(JsonValue::Number(
1053 serde_json::Number::from_f64(*value)
1054 .ok_or_else(|| anyhow!("Invalid f64 value for JSON: {value}"))?,
1055 ))
1056 }
1057 _ => Err(anyhow!("Unsupported number type: {}", type_name)),
1058 }
1059}
1060
1061fn is_bool(type_name: &str) -> bool {
1062 type_name == "bool"
1063}
1064
1065fn is_char(type_name: &str) -> bool {
1066 type_name == "char"
1067}
1068
1069fn is_bytes(type_name: &str) -> bool {
1070 type_name == "alloc::vec::Vec<u8>"
1071}