1use std::collections::HashMap;
4
5use async_trait::async_trait;
6use cid::Cid;
7use serde::{Deserialize, Serialize};
8
9use crate::{AbortOptions, AwaitIterable, GetBlockProgressEvents, HeliaError, ProgressOptions};
10
11#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
13#[serde(rename_all = "lowercase")]
14pub enum PinType {
15 Recursive,
17 Direct,
19 Indirect,
21}
22
23#[derive(Debug, Clone, Serialize, Deserialize)]
25pub struct Pin {
26 pub cid: Cid,
28 pub depth: u64,
30 pub metadata: HashMap<String, PinMetadataValue>,
32}
33
34#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
36#[serde(untagged)]
37pub enum PinMetadataValue {
38 String(String),
39 Number(f64),
40 Boolean(bool),
41}
42
43#[derive(Debug, Clone, Serialize, Deserialize)]
45#[serde(tag = "type")]
46pub enum AddPinEvents {
47 #[serde(rename = "helia:pin:add")]
48 Add { cid: Cid },
49}
50
51#[derive(Debug, Default)]
53pub struct AddOptions {
54 pub abort: AbortOptions,
56 pub progress: ProgressOptions<AddPinProgressEvents>,
58 pub depth: Option<u64>,
60 pub metadata: HashMap<String, PinMetadataValue>,
62}
63
64impl Clone for AddOptions {
65 fn clone(&self) -> Self {
66 Self {
67 abort: self.abort.clone(),
68 progress: self.progress.clone(),
69 depth: self.depth,
70 metadata: self.metadata.clone(),
71 }
72 }
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize)]
77#[serde(untagged)]
78pub enum AddPinProgressEvents {
79 Add(AddPinEvents),
80 GetBlock(GetBlockProgressEvents),
81}
82
83#[derive(Debug, Clone, Default)]
85pub struct RmOptions {
86 pub abort: AbortOptions,
88}
89
90#[derive(Debug, Clone, Default)]
92pub struct LsOptions {
93 pub abort: AbortOptions,
95 pub cid: Option<Cid>,
97}
98
99#[derive(Debug, Clone, Default)]
101pub struct IsPinnedOptions {
102 pub abort: AbortOptions,
104}
105
106#[async_trait]
108pub trait Pins: Send + Sync {
109 async fn add(&self, cid: &Cid, options: Option<AddOptions>) -> Result<(), HeliaError>;
111
112 async fn rm(&self, cid: &Cid, options: Option<RmOptions>) -> Result<(), HeliaError>;
114
115 async fn ls(&self, options: Option<LsOptions>) -> Result<AwaitIterable<Pin>, HeliaError>;
117
118 async fn is_pinned(
120 &self,
121 cid: &Cid,
122 options: Option<IsPinnedOptions>,
123 ) -> Result<bool, HeliaError>;
124}