colink 0.3.10

CoLink Rust SDK
Documentation
use crate::colink_proto::*;
use colink_remote_storage_proto::*;
use prost::Message;

mod colink_remote_storage_proto {
    include!(concat!(env!("OUT_DIR"), "/colink_remote_storage.rs"));
}

type Error = Box<dyn std::error::Error + Send + Sync + 'static>;

impl crate::application::CoLink {
    pub async fn remote_storage_create(
        &self,
        providers: &[String],
        key: &str,
        payload: &[u8],
        is_public: bool,
    ) -> Result<(), Error> {
        let mut participants = vec![Participant {
            user_id: self.get_user_id()?,
            role: "requester".to_string(),
        }];
        for provider in providers {
            participants.push(Participant {
                user_id: provider.to_string(),
                role: "provider".to_string(),
            });
        }
        let params = CreateParams {
            remote_key_name: key.to_string(),
            payload: payload.to_vec(),
            is_public,
        };
        let mut payload = vec![];
        params.encode(&mut payload).unwrap();
        self.run_task("remote_storage.create", &payload, &participants, false)
            .await?;
        Ok(())
    }

    pub async fn remote_storage_read(
        &self,
        provider: &str,
        key: &str,
        is_public: bool,
        holder_id: &str,
    ) -> Result<Vec<u8>, Error> {
        let participants = vec![
            Participant {
                user_id: self.get_user_id()?,
                role: "requester".to_string(),
            },
            Participant {
                user_id: provider.to_string(),
                role: "provider".to_string(),
            },
        ];
        let params = ReadParams {
            remote_key_name: key.to_string(),
            is_public,
            holder_id: holder_id.to_string(),
        };
        let mut payload = vec![];
        params.encode(&mut payload).unwrap();
        let task_id = self
            .run_task("remote_storage.read", &payload, &participants, false)
            .await?;
        let status = self
            .read_or_wait(&format!("tasks:{}:status", task_id))
            .await?;
        if status[0] == 0 {
            let data = self
                .read_or_wait(&format!("tasks:{}:output", task_id))
                .await?;
            Ok(data)
        } else {
            Err(format!("remote_storage.read: status_code: {}", status[0]))?
        }
    }

    pub async fn remote_storage_update(
        &self,
        providers: &[String],
        key: &str,
        payload: &[u8],
        is_public: bool,
    ) -> Result<(), Error> {
        let mut participants = vec![Participant {
            user_id: self.get_user_id()?,
            role: "requester".to_string(),
        }];
        for provider in providers {
            participants.push(Participant {
                user_id: provider.to_string(),
                role: "provider".to_string(),
            });
        }
        let params = UpdateParams {
            remote_key_name: key.to_string(),
            payload: payload.to_vec(),
            is_public,
        };
        let mut payload = vec![];
        params.encode(&mut payload).unwrap();
        self.run_task("remote_storage.update", &payload, &participants, false)
            .await?;
        Ok(())
    }

    pub async fn remote_storage_delete(
        &self,
        providers: &[String],
        key: &str,
        is_public: bool,
    ) -> Result<(), Error> {
        let mut participants = vec![Participant {
            user_id: self.get_user_id()?,
            role: "requester".to_string(),
        }];
        for provider in providers {
            participants.push(Participant {
                user_id: provider.to_string(),
                role: "provider".to_string(),
            });
        }
        let params = DeleteParams {
            remote_key_name: key.to_string(),
            is_public,
        };
        let mut payload = vec![];
        params.encode(&mut payload).unwrap();
        self.run_task("remote_storage.delete", &payload, &participants, false)
            .await?;
        Ok(())
    }
}