Skip to main content

opys_core/
pointer.rs

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}