Skip to main content

runar_serializer/
arc_value.rs

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
18// Type alias to simplify very complex function pointer type used for serialization functions.
19type 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    /// Category of this value
116    pub fn category(&self) -> ValueCategory {
117        self.category
118    }
119
120    /// Whether this ArcValue currently holds an inner value
121    pub fn has_value(&self) -> bool {
122        self.value.is_some()
123    }
124
125    /// Best-effort type name for the contained value (if present)
126    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                // Eagerly deserialize primitives without unnecessary copies
299                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                // Try to deserialize as different primitive types based on type_name
311                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                // Bytes can also be eagerly deserialized
333                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                // For complex types (List, Map, Struct, Json), create lazy structure
347                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    /// Serialize using consolidated SerializationContext
367    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            // Pre-allocate to avoid growth during pushes
423            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    // ============================================================
442    // Generic getter with automatic decrypt fallback via registry
443    // ============================================================
444    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        // Fast path – already materialised object stored inside ErasedArc.
453        if !inner.is_lazy {
454            // if is not lazy.. and is of categoty JSON and the requested type is not JSON..
455            // then we need to convert from the json to ArcValue and then to the requested type
456            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        // Use unified lazy data handling
471        self.handle_lazy_data(|payload, type_name| {
472            //handle the case when the serialized type is JSON and the requested type is not JSON
473            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            // Attempt direct deserialisation (primitives, Plain structs, or when
489            // the caller asked for the *encrypted* representation itself).
490            if let Ok(val) = serde_cbor::from_slice::<T>(payload) {
491                return Ok(Arc::new(val));
492            }
493
494            // Registry fallback – decrypt into the requested plain type.
495            // We need to get the keystore from the lazy data for this
496            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    /// Unified lazy data handling helper that extracts and processes lazy data.
595    /// This centralizes all lazy data logic to avoid duplication.
596    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        // Fast path – already materialised object stored inside ErasedArc.
603        if !inner.is_lazy {
604            return Err(anyhow!("Not lazy data"));
605        }
606
607        // Lazy path – must reconstruct from serialized bytes.
608        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 the outer envelope is present, unwrap it first.
613        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 the payload using the provided function
622        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                // First try the stored to_json_fn if available
684                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                // Fallback to registry lookup for deserialized structs
691                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                        // Try to find JSON converter by type name
695                        if let Some(json_fn) = crate::registry::get_json_converter(type_name) {
696                            return json_fn(payload);
697                        }
698
699                        // If registry lookup fails, return a more specific error
700                        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        // Check if this is JSON serialization by checking the serializer type
720        let is_json = std::any::type_name::<S>().contains("serde_json");
721
722        if is_json {
723            // For JSON, use the to_json() method to get proper JSON representation
724            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            // For CBOR and other formats, use the original struct-based serialization
732            use serde::ser::SerializeStruct;
733
734            let mut state = serializer.serialize_struct("ArcValue", 3)?;
735
736            // Serialize category as integer using the enum directly
737            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            // Serialize the actual value using the existing serialize_fn
748            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                // For null values
758                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        // Check if this is JSON deserialization by checking the deserializer type
770        let is_json = std::any::type_name::<D>().contains("serde_json");
771
772        if is_json {
773            // For JSON, deserialize as a JsonValue and convert to ArcValue
774            let json_value = JsonValue::deserialize(deserializer)?;
775            Ok(Self::json_to_arc_value(&json_value))
776        } else {
777            // For CBOR and other formats, use the original struct-based deserialization
778            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                            // Eagerly deserialize primitives
844                            let value: Vec<u8> =
845                                value.ok_or_else(|| de::Error::missing_field("value"))?;
846                            // Try to deserialize as different primitive types
847                            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                            // Bytes can also be eagerly deserialized
861                            let value: Vec<u8> =
862                                value.ok_or_else(|| de::Error::missing_field("value"))?;
863                            Ok(ArcValue::new_bytes(value))
864                        }
865                        _ => {
866                            // For complex types (List, Map, Struct, Json), create lazy structure
867                            let value: Vec<u8> =
868                                value.ok_or_else(|| de::Error::missing_field("value"))?;
869                            let value_len = value.len();
870                            // Create LazyDataWithOffset structure for complex types
871                            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
918// ---------------------------------------------------------------------------
919// Trait: AsArcValue
920// ---------------------------------------------------------------------------
921/// Bidirectional conversion between concrete Rust values and `ArcValue`.
922///
923/// * `as_arc_value` consumes `self` and produces an `ArcValue` for serialization.
924/// * `from_arc_value` attempts to reconstruct `Self` from the given `ArcValue`.
925///
926/// `from_arc_value` has a default implementation that works for any type
927/// implementing [`RunarSerializer`].  This covers the vast majority of cases
928/// once the `#[derive(Serializable)]` macro is applied.  Custom/value-category
929/// specific impls can still be provided to optimise the binary layout (e.g.
930/// primitives vs. structs).
931pub trait AsArcValue: Sized + Clone {
932    /// Convert `self` into an [`ArcValue`].
933    fn into_arc_value(self) -> ArcValue;
934
935    /// Attempt to reconstruct `Self` from the provided [`ArcValue`].
936    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
963// Make ArcValue implement AsArcValue for direct usage
964impl 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}