1use serde::{Deserialize, Serialize};
2
3use crate::integrity::Integrity;
4use crate::source::{decode_source, encode_source, Source, SourceWire};
5
6#[derive(Debug, Clone, PartialEq, Eq)]
7pub struct PointerDescriptor {
8 pub source: Source,
9 pub integrity: Option<Integrity>,
10 pub size: Option<u64>,
11}
12
13#[derive(Debug, Clone, Serialize, Deserialize)]
14pub struct PointerDescriptorWire {
15 pub source: SourceWire,
16 #[serde(default, skip_serializing_if = "Option::is_none")]
17 pub integrity: Option<Integrity>,
18 #[serde(default, skip_serializing_if = "Option::is_none")]
19 pub size: Option<u64>,
20}
21
22pub fn decode_pointer_descriptor(raw: PointerDescriptorWire) -> PointerDescriptor {
23 PointerDescriptor {
24 source: decode_source(raw.source),
25 integrity: raw.integrity,
26 size: raw.size,
27 }
28}
29
30pub fn encode_pointer_descriptor(d: &PointerDescriptor) -> PointerDescriptorWire {
31 PointerDescriptorWire {
32 source: encode_source(&d.source),
33 integrity: d.integrity.clone().map(Integrity::collapsed),
34 size: d.size,
35 }
36}
37
38pub fn parse_pointer_descriptor(input: &str) -> Result<PointerDescriptor, String> {
39 let wire: PointerDescriptorWire = serde_json::from_str(input)
40 .map_err(|e| format!("Pointer descriptor is not valid JSON: {e}"))?;
41 Ok(decode_pointer_descriptor(wire))
42}