Skip to main content

nextcloud_users/capabilities/
response.rs

1use serde::{Deserialize, Serialize};
2
3use super::{CoreCapabilities, FilesCapabilities, ServerVersion, ThemingCapabilities};
4
5/// Inner capabilities map grouping feature sets by subsystem.
6#[derive(Clone, Debug, Default, PartialEq, Eq, Deserialize, Serialize)]
7pub struct CapabilitiesData {
8    /// Core server capabilities such as status, poll interval, and WebDAV root.
9    #[serde(default)]
10    pub core: CoreCapabilities,
11    /// Files application capabilities such as chunking, undelete, and versioning.
12    #[serde(default)]
13    pub files: FilesCapabilities,
14    /// Theming and visual branding customization settings, if enabled.
15    #[serde(default)]
16    pub theming: Option<ThemingCapabilities>,
17}
18
19/// Server capabilities response payload returned by Nextcloud.
20///
21/// Decoded from the `data` field of the OCS response from
22/// `/ocs/v1.php/cloud/capabilities` or `/ocs/v2.php/cloud/capabilities`.
23///
24/// See the [Nextcloud Capabilities API Documentation](https://docs.nextcloud.com/server/latest/developer_manual/client_apis/OCS/ocs-api-overview.html#capabilities-api).
25#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
26pub struct Capabilities {
27    /// Nextcloud release version block, if provided at top-level.
28    #[serde(default)]
29    pub version: Option<ServerVersion>,
30    /// Capabilities map categorized by functional area.
31    #[serde(default)]
32    pub capabilities: CapabilitiesData,
33}
34
35impl Capabilities {
36    /// Version information reported by the server, if present.
37    pub fn version(&self) -> Option<&ServerVersion> {
38        self.version.as_ref()
39    }
40
41    /// Core server capabilities.
42    pub const fn core(&self) -> &CoreCapabilities {
43        &self.capabilities.core
44    }
45
46    /// Files app capabilities.
47    pub const fn files(&self) -> &FilesCapabilities {
48        &self.capabilities.files
49    }
50
51    /// Theming and branding capabilities, if enabled.
52    pub fn theming(&self) -> Option<&ThemingCapabilities> {
53        self.capabilities.theming.as_ref()
54    }
55
56    /// Canonical version string, inspecting the top-level `version` block first
57    /// and falling back to `core.status.version_string`.
58    pub fn server_version(&self) -> Option<&str> {
59        self.version
60            .as_ref()
61            .map(|v| v.string.as_str())
62            .or_else(|| {
63                self.capabilities
64                    .core
65                    .status
66                    .as_ref()
67                    .and_then(|s| s.version_string.as_deref())
68            })
69    }
70}