Skip to main content

cloudreve_api/api/v3/
share.rs

1//! Share-related API endpoints for Cloudreve API v3
2
3use crate::Error;
4use crate::api::v3::ApiV3Client;
5use crate::api::v3::models::*;
6
7impl ApiV3Client {
8    /// Create a share link
9    /// Note: The V3 API may return either an ApiResponse<Share> object or a plain string URL
10    pub async fn create_share(&self, request: &ShareRequest) -> Result<Share, Error> {
11        // Get raw response to handle both formats
12        let raw_text = self.post_raw("/share", request).await?;
13
14        // Try to parse as ApiResponse<Share> first
15        if let Ok(api_response) = serde_json::from_str::<ApiResponse<Share>>(&raw_text) {
16            if let Some(share) = api_response.data {
17                return Ok(share);
18            }
19            return Err(Error::Api {
20                code: api_response.code,
21                message: api_response.msg,
22            });
23        }
24
25        // If that fails, try to parse as plain string URL
26        let url = raw_text.trim();
27        // Extract key from URL (e.g., "https://example.com/s/abc123" -> "abc123")
28        let key = url.split('/').next_back().unwrap_or("").to_string();
29        Ok(Share {
30            key,
31            ..Default::default()
32        })
33    }
34}