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}