use crate::client_api::error::ApiResult; use crate::client_api::IPCApi; use crate::types::files::{GetFileTagsRequest, GetFilesTagsRequest}; use crate::types::identifier::FileIdentifier; use crate::types::tags::{ChangeFileTagsRequest, TagResponse}; use async_trait::async_trait; use rmp_ipc::context::{PoolGuard, PooledContext}; use rmp_ipc::ipc::context::Context; use rmp_ipc::protocol::AsyncProtocolStream; pub struct TagApi { ctx: PooledContext, } impl Clone for TagApi where S: AsyncProtocolStream, { fn clone(&self) -> Self { Self { ctx: self.ctx.clone(), } } } #[async_trait] impl IPCApi for TagApi where S: AsyncProtocolStream, { fn namespace() -> &'static str { "tags" } fn ctx(&self) -> PoolGuard> { self.ctx.acquire() } } impl TagApi where S: AsyncProtocolStream, { pub fn new(ctx: PooledContext) -> Self { Self { ctx } } /// Returns a list of all tags stored in the repo #[tracing::instrument(level = "debug", skip(self))] pub async fn get_all_tags(&self) -> ApiResult> { self.emit_and_get("all_tags", ()).await } /// Returns a list of all tags for a file #[tracing::instrument(level = "debug", skip(self))] pub async fn get_tags_for_file(&self, id: FileIdentifier) -> ApiResult> { self.emit_and_get("tags_for_file", GetFileTagsRequest { id }) .await } /// Returns a list of all tags that are assigned to the list of files #[tracing::instrument(level = "debug", skip_all)] pub async fn get_tags_for_files(&self, hashes: Vec) -> ApiResult> { self.emit_and_get("tags_for_files", GetFilesTagsRequest { hashes }) .await } /// Creates a new tag and returns the created tag object #[tracing::instrument(level = "debug", skip(self))] pub async fn create_tags(&self, tags: Vec) -> ApiResult> { self.emit_and_get("create_tags", tags).await } /// Changes the tags of a file #[tracing::instrument(level = "debug", skip(self))] pub async fn change_file_tags( &self, file_id: FileIdentifier, added_tags: Vec, removed_tags: Vec, ) -> ApiResult> { self.emit_and_get( "change_file_tags", ChangeFileTagsRequest { file_id, added_tags, removed_tags, }, ) .await } }