Skip to main content

dropbox_sdk/generated/types/
sharing.rs

1// DO NOT EDIT
2// This file was @generated by Stone
3
4#![allow(
5    clippy::too_many_arguments,
6    clippy::large_enum_variant,
7    clippy::result_large_err,
8    clippy::doc_markdown,
9    clippy::doc_lazy_continuation,
10)]
11
12//! This namespace contains endpoints and data types for creating and managing shared links and
13//! shared folders.
14
15pub type DropboxId = String;
16pub type GetSharedLinkFileArg = GetSharedLinkMetadataArg;
17pub type Id = crate::types::files::Id;
18pub type Path = crate::types::files::Path;
19pub type PathOrId = String;
20pub type ReadPath = crate::types::files::ReadPath;
21pub type Rev = crate::types::files::Rev;
22pub type TeamInfo = crate::types::users::Team;
23
24/// Information about the inheritance policy of a shared folder.
25#[derive(Debug, Clone, PartialEq, Eq)]
26#[non_exhaustive] // variants may be added in the future
27pub enum AccessInheritance {
28    /// The shared folder inherits its members from the parent folder.
29    Inherit,
30    /// The shared folder does not inherit its members from the parent folder.
31    NoInherit,
32    /// Catch-all used for unrecognized values returned from the server. Encountering this value
33    /// typically indicates that this SDK version is out of date.
34    Other,
35}
36
37impl<'de> ::serde::de::Deserialize<'de> for AccessInheritance {
38    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
39        // union deserializer
40        use serde::de::{self, MapAccess, Visitor};
41        struct EnumVisitor;
42        impl<'de> Visitor<'de> for EnumVisitor {
43            type Value = AccessInheritance;
44            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
45                f.write_str("a AccessInheritance structure")
46            }
47            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
48                let tag: &str = match map.next_key()? {
49                    Some(".tag") => map.next_value()?,
50                    _ => return Err(de::Error::missing_field(".tag"))
51                };
52                let value = match tag {
53                    "inherit" => AccessInheritance::Inherit,
54                    "no_inherit" => AccessInheritance::NoInherit,
55                    _ => AccessInheritance::Other,
56                };
57                crate::eat_json_fields(&mut map)?;
58                Ok(value)
59            }
60        }
61        const VARIANTS: &[&str] = &["inherit",
62                                    "no_inherit",
63                                    "other"];
64        deserializer.deserialize_struct("AccessInheritance", VARIANTS, EnumVisitor)
65    }
66}
67
68impl ::serde::ser::Serialize for AccessInheritance {
69    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
70        // union serializer
71        use serde::ser::SerializeStruct;
72        match self {
73            AccessInheritance::Inherit => {
74                // unit
75                let mut s = serializer.serialize_struct("AccessInheritance", 1)?;
76                s.serialize_field(".tag", "inherit")?;
77                s.end()
78            }
79            AccessInheritance::NoInherit => {
80                // unit
81                let mut s = serializer.serialize_struct("AccessInheritance", 1)?;
82                s.serialize_field(".tag", "no_inherit")?;
83                s.end()
84            }
85            AccessInheritance::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
86        }
87    }
88}
89
90/// Defines the access levels for collaborators.
91#[derive(Debug, Clone, PartialEq, Eq)]
92#[non_exhaustive] // variants may be added in the future
93pub enum AccessLevel {
94    /// The collaborator is the owner of the shared folder. Owners can view and edit the shared
95    /// folder as well as set the folder's policies using
96    /// [`update_folder_policy()`](crate::sharing::update_folder_policy).
97    Owner,
98    /// The collaborator can both view and edit the shared folder.
99    Editor,
100    /// The collaborator can only view the shared folder.
101    Viewer,
102    /// The collaborator can only view the shared folder and does not have any access to comments.
103    ViewerNoComment,
104    /// The collaborator can only view the shared folder that they have access to.
105    Traverse,
106    /// If there is a Righteous Link on the folder which grants access and the user has visited such
107    /// link, they are allowed to perform certain action (i.e. add themselves to the folder) via the
108    /// link access even though the user themselves are not a member on the shared folder yet.
109    NoAccess,
110    /// Catch-all used for unrecognized values returned from the server. Encountering this value
111    /// typically indicates that this SDK version is out of date.
112    Other,
113}
114
115impl<'de> ::serde::de::Deserialize<'de> for AccessLevel {
116    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
117        // union deserializer
118        use serde::de::{self, MapAccess, Visitor};
119        struct EnumVisitor;
120        impl<'de> Visitor<'de> for EnumVisitor {
121            type Value = AccessLevel;
122            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
123                f.write_str("a AccessLevel structure")
124            }
125            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
126                let tag: &str = match map.next_key()? {
127                    Some(".tag") => map.next_value()?,
128                    _ => return Err(de::Error::missing_field(".tag"))
129                };
130                let value = match tag {
131                    "owner" => AccessLevel::Owner,
132                    "editor" => AccessLevel::Editor,
133                    "viewer" => AccessLevel::Viewer,
134                    "viewer_no_comment" => AccessLevel::ViewerNoComment,
135                    "traverse" => AccessLevel::Traverse,
136                    "no_access" => AccessLevel::NoAccess,
137                    _ => AccessLevel::Other,
138                };
139                crate::eat_json_fields(&mut map)?;
140                Ok(value)
141            }
142        }
143        const VARIANTS: &[&str] = &["owner",
144                                    "editor",
145                                    "viewer",
146                                    "viewer_no_comment",
147                                    "traverse",
148                                    "no_access",
149                                    "other"];
150        deserializer.deserialize_struct("AccessLevel", VARIANTS, EnumVisitor)
151    }
152}
153
154impl ::serde::ser::Serialize for AccessLevel {
155    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
156        // union serializer
157        use serde::ser::SerializeStruct;
158        match self {
159            AccessLevel::Owner => {
160                // unit
161                let mut s = serializer.serialize_struct("AccessLevel", 1)?;
162                s.serialize_field(".tag", "owner")?;
163                s.end()
164            }
165            AccessLevel::Editor => {
166                // unit
167                let mut s = serializer.serialize_struct("AccessLevel", 1)?;
168                s.serialize_field(".tag", "editor")?;
169                s.end()
170            }
171            AccessLevel::Viewer => {
172                // unit
173                let mut s = serializer.serialize_struct("AccessLevel", 1)?;
174                s.serialize_field(".tag", "viewer")?;
175                s.end()
176            }
177            AccessLevel::ViewerNoComment => {
178                // unit
179                let mut s = serializer.serialize_struct("AccessLevel", 1)?;
180                s.serialize_field(".tag", "viewer_no_comment")?;
181                s.end()
182            }
183            AccessLevel::Traverse => {
184                // unit
185                let mut s = serializer.serialize_struct("AccessLevel", 1)?;
186                s.serialize_field(".tag", "traverse")?;
187                s.end()
188            }
189            AccessLevel::NoAccess => {
190                // unit
191                let mut s = serializer.serialize_struct("AccessLevel", 1)?;
192                s.serialize_field(".tag", "no_access")?;
193                s.end()
194            }
195            AccessLevel::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
196        }
197    }
198}
199
200/// Who can change a shared folder's access control list (ACL). In other words, who can add, remove,
201/// or change the privileges of members.
202#[derive(Debug, Clone, PartialEq, Eq)]
203#[non_exhaustive] // variants may be added in the future
204pub enum AclUpdatePolicy {
205    /// Only the owner can update the ACL.
206    Owner,
207    /// Any editor can update the ACL. This may be further restricted to editors on the same team.
208    Editors,
209    /// Catch-all used for unrecognized values returned from the server. Encountering this value
210    /// typically indicates that this SDK version is out of date.
211    Other,
212}
213
214impl<'de> ::serde::de::Deserialize<'de> for AclUpdatePolicy {
215    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
216        // union deserializer
217        use serde::de::{self, MapAccess, Visitor};
218        struct EnumVisitor;
219        impl<'de> Visitor<'de> for EnumVisitor {
220            type Value = AclUpdatePolicy;
221            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
222                f.write_str("a AclUpdatePolicy structure")
223            }
224            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
225                let tag: &str = match map.next_key()? {
226                    Some(".tag") => map.next_value()?,
227                    _ => return Err(de::Error::missing_field(".tag"))
228                };
229                let value = match tag {
230                    "owner" => AclUpdatePolicy::Owner,
231                    "editors" => AclUpdatePolicy::Editors,
232                    _ => AclUpdatePolicy::Other,
233                };
234                crate::eat_json_fields(&mut map)?;
235                Ok(value)
236            }
237        }
238        const VARIANTS: &[&str] = &["owner",
239                                    "editors",
240                                    "other"];
241        deserializer.deserialize_struct("AclUpdatePolicy", VARIANTS, EnumVisitor)
242    }
243}
244
245impl ::serde::ser::Serialize for AclUpdatePolicy {
246    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
247        // union serializer
248        use serde::ser::SerializeStruct;
249        match self {
250            AclUpdatePolicy::Owner => {
251                // unit
252                let mut s = serializer.serialize_struct("AclUpdatePolicy", 1)?;
253                s.serialize_field(".tag", "owner")?;
254                s.end()
255            }
256            AclUpdatePolicy::Editors => {
257                // unit
258                let mut s = serializer.serialize_struct("AclUpdatePolicy", 1)?;
259                s.serialize_field(".tag", "editors")?;
260                s.end()
261            }
262            AclUpdatePolicy::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
263        }
264    }
265}
266
267/// Arguments for [`add_file_member()`](crate::sharing::add_file_member).
268#[derive(Debug, Clone, PartialEq, Eq)]
269#[non_exhaustive] // structs may have more fields added in the future.
270pub struct AddFileMemberArgs {
271    /// File to which to add members.
272    pub file: PathOrId,
273    /// Members to add. Note that even an email address is given, this may result in a user being
274    /// directly added to the membership if that email is the user's main account email.
275    pub members: Vec<MemberSelector>,
276    /// Message to send to added members in their invitation.
277    pub custom_message: Option<String>,
278    /// Whether added members should be notified via email and device notifications of their
279    /// invitation.
280    pub quiet: bool,
281    /// AccessLevel union object, describing what access level we want to give new members.
282    pub access_level: Option<AccessLevel>,
283    /// If the custom message should be added as a comment on the file. Only meant for Paper files.
284    pub add_message_as_comment: bool,
285    /// The FingerprintJS Sealed Client Result value
286    pub fp_sealed_result: Option<String>,
287}
288
289impl AddFileMemberArgs {
290    pub fn new(file: PathOrId, members: Vec<MemberSelector>) -> Self {
291        AddFileMemberArgs {
292            file,
293            members,
294            custom_message: None,
295            quiet: false,
296            access_level: None,
297            add_message_as_comment: false,
298            fp_sealed_result: None,
299        }
300    }
301
302    pub fn with_custom_message(mut self, value: String) -> Self {
303        self.custom_message = Some(value);
304        self
305    }
306
307    pub fn with_quiet(mut self, value: bool) -> Self {
308        self.quiet = value;
309        self
310    }
311
312    pub fn with_access_level(mut self, value: AccessLevel) -> Self {
313        self.access_level = Some(value);
314        self
315    }
316
317    pub fn with_add_message_as_comment(mut self, value: bool) -> Self {
318        self.add_message_as_comment = value;
319        self
320    }
321
322    pub fn with_fp_sealed_result(mut self, value: String) -> Self {
323        self.fp_sealed_result = Some(value);
324        self
325    }
326}
327
328const ADD_FILE_MEMBER_ARGS_FIELDS: &[&str] = &["file",
329                                               "members",
330                                               "custom_message",
331                                               "quiet",
332                                               "access_level",
333                                               "add_message_as_comment",
334                                               "fp_sealed_result"];
335impl AddFileMemberArgs {
336    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
337        map: V,
338    ) -> Result<AddFileMemberArgs, V::Error> {
339        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
340    }
341
342    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
343        mut map: V,
344        optional: bool,
345    ) -> Result<Option<AddFileMemberArgs>, V::Error> {
346        let mut field_file = None;
347        let mut field_members = None;
348        let mut field_custom_message = None;
349        let mut field_quiet = None;
350        let mut field_access_level = None;
351        let mut field_add_message_as_comment = None;
352        let mut field_fp_sealed_result = None;
353        let mut nothing = true;
354        while let Some(key) = map.next_key::<&str>()? {
355            nothing = false;
356            match key {
357                "file" => {
358                    if field_file.is_some() {
359                        return Err(::serde::de::Error::duplicate_field("file"));
360                    }
361                    field_file = Some(map.next_value()?);
362                }
363                "members" => {
364                    if field_members.is_some() {
365                        return Err(::serde::de::Error::duplicate_field("members"));
366                    }
367                    field_members = Some(map.next_value()?);
368                }
369                "custom_message" => {
370                    if field_custom_message.is_some() {
371                        return Err(::serde::de::Error::duplicate_field("custom_message"));
372                    }
373                    field_custom_message = Some(map.next_value()?);
374                }
375                "quiet" => {
376                    if field_quiet.is_some() {
377                        return Err(::serde::de::Error::duplicate_field("quiet"));
378                    }
379                    field_quiet = Some(map.next_value()?);
380                }
381                "access_level" => {
382                    if field_access_level.is_some() {
383                        return Err(::serde::de::Error::duplicate_field("access_level"));
384                    }
385                    field_access_level = Some(map.next_value()?);
386                }
387                "add_message_as_comment" => {
388                    if field_add_message_as_comment.is_some() {
389                        return Err(::serde::de::Error::duplicate_field("add_message_as_comment"));
390                    }
391                    field_add_message_as_comment = Some(map.next_value()?);
392                }
393                "fp_sealed_result" => {
394                    if field_fp_sealed_result.is_some() {
395                        return Err(::serde::de::Error::duplicate_field("fp_sealed_result"));
396                    }
397                    field_fp_sealed_result = Some(map.next_value()?);
398                }
399                _ => {
400                    // unknown field allowed and ignored
401                    map.next_value::<::serde_json::Value>()?;
402                }
403            }
404        }
405        if optional && nothing {
406            return Ok(None);
407        }
408        let result = AddFileMemberArgs {
409            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
410            members: field_members.ok_or_else(|| ::serde::de::Error::missing_field("members"))?,
411            custom_message: field_custom_message.and_then(Option::flatten),
412            quiet: field_quiet.unwrap_or(false),
413            access_level: field_access_level.and_then(Option::flatten),
414            add_message_as_comment: field_add_message_as_comment.unwrap_or(false),
415            fp_sealed_result: field_fp_sealed_result.and_then(Option::flatten),
416        };
417        Ok(Some(result))
418    }
419
420    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
421        &self,
422        s: &mut S::SerializeStruct,
423    ) -> Result<(), S::Error> {
424        use serde::ser::SerializeStruct;
425        s.serialize_field("file", &self.file)?;
426        s.serialize_field("members", &self.members)?;
427        if let Some(val) = &self.custom_message {
428            s.serialize_field("custom_message", val)?;
429        }
430        if self.quiet {
431            s.serialize_field("quiet", &self.quiet)?;
432        }
433        if let Some(val) = &self.access_level {
434            s.serialize_field("access_level", val)?;
435        }
436        if self.add_message_as_comment {
437            s.serialize_field("add_message_as_comment", &self.add_message_as_comment)?;
438        }
439        if let Some(val) = &self.fp_sealed_result {
440            s.serialize_field("fp_sealed_result", val)?;
441        }
442        Ok(())
443    }
444}
445
446impl<'de> ::serde::de::Deserialize<'de> for AddFileMemberArgs {
447    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
448        // struct deserializer
449        use serde::de::{MapAccess, Visitor};
450        struct StructVisitor;
451        impl<'de> Visitor<'de> for StructVisitor {
452            type Value = AddFileMemberArgs;
453            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
454                f.write_str("a AddFileMemberArgs struct")
455            }
456            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
457                AddFileMemberArgs::internal_deserialize(map)
458            }
459        }
460        deserializer.deserialize_struct("AddFileMemberArgs", ADD_FILE_MEMBER_ARGS_FIELDS, StructVisitor)
461    }
462}
463
464impl ::serde::ser::Serialize for AddFileMemberArgs {
465    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
466        // struct serializer
467        use serde::ser::SerializeStruct;
468        let mut s = serializer.serialize_struct("AddFileMemberArgs", 7)?;
469        self.internal_serialize::<S>(&mut s)?;
470        s.end()
471    }
472}
473
474/// Errors for [`add_file_member()`](crate::sharing::add_file_member).
475#[derive(Debug, Clone, PartialEq, Eq)]
476#[non_exhaustive] // variants may be added in the future
477pub enum AddFileMemberError {
478    UserError(SharingUserError),
479    AccessError(SharingFileAccessError),
480    /// The user has reached the rate limit for invitations.
481    RateLimit,
482    /// The custom message did not pass comment permissions checks.
483    InvalidComment,
484    /// The current user has been banned for abuse reasons.
485    BannedMember,
486    /// Catch-all used for unrecognized values returned from the server. Encountering this value
487    /// typically indicates that this SDK version is out of date.
488    Other,
489}
490
491impl<'de> ::serde::de::Deserialize<'de> for AddFileMemberError {
492    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
493        // union deserializer
494        use serde::de::{self, MapAccess, Visitor};
495        struct EnumVisitor;
496        impl<'de> Visitor<'de> for EnumVisitor {
497            type Value = AddFileMemberError;
498            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
499                f.write_str("a AddFileMemberError structure")
500            }
501            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
502                let tag: &str = match map.next_key()? {
503                    Some(".tag") => map.next_value()?,
504                    _ => return Err(de::Error::missing_field(".tag"))
505                };
506                let value = match tag {
507                    "user_error" => {
508                        match map.next_key()? {
509                            Some("user_error") => AddFileMemberError::UserError(map.next_value()?),
510                            None => return Err(de::Error::missing_field("user_error")),
511                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
512                        }
513                    }
514                    "access_error" => {
515                        match map.next_key()? {
516                            Some("access_error") => AddFileMemberError::AccessError(map.next_value()?),
517                            None => return Err(de::Error::missing_field("access_error")),
518                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
519                        }
520                    }
521                    "rate_limit" => AddFileMemberError::RateLimit,
522                    "invalid_comment" => AddFileMemberError::InvalidComment,
523                    "banned_member" => AddFileMemberError::BannedMember,
524                    _ => AddFileMemberError::Other,
525                };
526                crate::eat_json_fields(&mut map)?;
527                Ok(value)
528            }
529        }
530        const VARIANTS: &[&str] = &["user_error",
531                                    "access_error",
532                                    "rate_limit",
533                                    "invalid_comment",
534                                    "banned_member",
535                                    "other"];
536        deserializer.deserialize_struct("AddFileMemberError", VARIANTS, EnumVisitor)
537    }
538}
539
540impl ::serde::ser::Serialize for AddFileMemberError {
541    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
542        // union serializer
543        use serde::ser::SerializeStruct;
544        match self {
545            AddFileMemberError::UserError(x) => {
546                // union or polymporphic struct
547                let mut s = serializer.serialize_struct("AddFileMemberError", 2)?;
548                s.serialize_field(".tag", "user_error")?;
549                s.serialize_field("user_error", x)?;
550                s.end()
551            }
552            AddFileMemberError::AccessError(x) => {
553                // union or polymporphic struct
554                let mut s = serializer.serialize_struct("AddFileMemberError", 2)?;
555                s.serialize_field(".tag", "access_error")?;
556                s.serialize_field("access_error", x)?;
557                s.end()
558            }
559            AddFileMemberError::RateLimit => {
560                // unit
561                let mut s = serializer.serialize_struct("AddFileMemberError", 1)?;
562                s.serialize_field(".tag", "rate_limit")?;
563                s.end()
564            }
565            AddFileMemberError::InvalidComment => {
566                // unit
567                let mut s = serializer.serialize_struct("AddFileMemberError", 1)?;
568                s.serialize_field(".tag", "invalid_comment")?;
569                s.end()
570            }
571            AddFileMemberError::BannedMember => {
572                // unit
573                let mut s = serializer.serialize_struct("AddFileMemberError", 1)?;
574                s.serialize_field(".tag", "banned_member")?;
575                s.end()
576            }
577            AddFileMemberError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
578        }
579    }
580}
581
582impl ::std::error::Error for AddFileMemberError {
583    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
584        match self {
585            AddFileMemberError::UserError(inner) => Some(inner),
586            AddFileMemberError::AccessError(inner) => Some(inner),
587            _ => None,
588        }
589    }
590}
591
592impl ::std::fmt::Display for AddFileMemberError {
593    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
594        match self {
595            AddFileMemberError::UserError(inner) => write!(f, "AddFileMemberError: {}", inner),
596            AddFileMemberError::AccessError(inner) => write!(f, "AddFileMemberError: {}", inner),
597            AddFileMemberError::RateLimit => f.write_str("The user has reached the rate limit for invitations."),
598            AddFileMemberError::InvalidComment => f.write_str("The custom message did not pass comment permissions checks."),
599            AddFileMemberError::BannedMember => f.write_str("The current user has been banned for abuse reasons."),
600            _ => write!(f, "{:?}", *self),
601        }
602    }
603}
604
605#[derive(Debug, Clone, PartialEq, Eq)]
606#[non_exhaustive] // structs may have more fields added in the future.
607pub struct AddFolderMemberArg {
608    /// The ID for the shared folder.
609    pub shared_folder_id: crate::types::common::SharedFolderId,
610    /// The intended list of members to add.  Added members will receive invites to join the shared
611    /// folder.
612    pub members: Vec<AddMember>,
613    /// Whether added members should be notified via email and device notifications of their invite.
614    pub quiet: bool,
615    /// Optional message to display to added members in their invitation.
616    pub custom_message: Option<String>,
617    /// The FingerprintJS Sealed Client Result value
618    pub fp_sealed_result: Option<String>,
619}
620
621impl AddFolderMemberArg {
622    pub fn new(
623        shared_folder_id: crate::types::common::SharedFolderId,
624        members: Vec<AddMember>,
625    ) -> Self {
626        AddFolderMemberArg {
627            shared_folder_id,
628            members,
629            quiet: false,
630            custom_message: None,
631            fp_sealed_result: None,
632        }
633    }
634
635    pub fn with_quiet(mut self, value: bool) -> Self {
636        self.quiet = value;
637        self
638    }
639
640    pub fn with_custom_message(mut self, value: String) -> Self {
641        self.custom_message = Some(value);
642        self
643    }
644
645    pub fn with_fp_sealed_result(mut self, value: String) -> Self {
646        self.fp_sealed_result = Some(value);
647        self
648    }
649}
650
651const ADD_FOLDER_MEMBER_ARG_FIELDS: &[&str] = &["shared_folder_id",
652                                                "members",
653                                                "quiet",
654                                                "custom_message",
655                                                "fp_sealed_result"];
656impl AddFolderMemberArg {
657    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
658        map: V,
659    ) -> Result<AddFolderMemberArg, V::Error> {
660        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
661    }
662
663    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
664        mut map: V,
665        optional: bool,
666    ) -> Result<Option<AddFolderMemberArg>, V::Error> {
667        let mut field_shared_folder_id = None;
668        let mut field_members = None;
669        let mut field_quiet = None;
670        let mut field_custom_message = None;
671        let mut field_fp_sealed_result = None;
672        let mut nothing = true;
673        while let Some(key) = map.next_key::<&str>()? {
674            nothing = false;
675            match key {
676                "shared_folder_id" => {
677                    if field_shared_folder_id.is_some() {
678                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
679                    }
680                    field_shared_folder_id = Some(map.next_value()?);
681                }
682                "members" => {
683                    if field_members.is_some() {
684                        return Err(::serde::de::Error::duplicate_field("members"));
685                    }
686                    field_members = Some(map.next_value()?);
687                }
688                "quiet" => {
689                    if field_quiet.is_some() {
690                        return Err(::serde::de::Error::duplicate_field("quiet"));
691                    }
692                    field_quiet = Some(map.next_value()?);
693                }
694                "custom_message" => {
695                    if field_custom_message.is_some() {
696                        return Err(::serde::de::Error::duplicate_field("custom_message"));
697                    }
698                    field_custom_message = Some(map.next_value()?);
699                }
700                "fp_sealed_result" => {
701                    if field_fp_sealed_result.is_some() {
702                        return Err(::serde::de::Error::duplicate_field("fp_sealed_result"));
703                    }
704                    field_fp_sealed_result = Some(map.next_value()?);
705                }
706                _ => {
707                    // unknown field allowed and ignored
708                    map.next_value::<::serde_json::Value>()?;
709                }
710            }
711        }
712        if optional && nothing {
713            return Ok(None);
714        }
715        let result = AddFolderMemberArg {
716            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
717            members: field_members.ok_or_else(|| ::serde::de::Error::missing_field("members"))?,
718            quiet: field_quiet.unwrap_or(false),
719            custom_message: field_custom_message.and_then(Option::flatten),
720            fp_sealed_result: field_fp_sealed_result.and_then(Option::flatten),
721        };
722        Ok(Some(result))
723    }
724
725    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
726        &self,
727        s: &mut S::SerializeStruct,
728    ) -> Result<(), S::Error> {
729        use serde::ser::SerializeStruct;
730        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
731        s.serialize_field("members", &self.members)?;
732        if self.quiet {
733            s.serialize_field("quiet", &self.quiet)?;
734        }
735        if let Some(val) = &self.custom_message {
736            s.serialize_field("custom_message", val)?;
737        }
738        if let Some(val) = &self.fp_sealed_result {
739            s.serialize_field("fp_sealed_result", val)?;
740        }
741        Ok(())
742    }
743}
744
745impl<'de> ::serde::de::Deserialize<'de> for AddFolderMemberArg {
746    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
747        // struct deserializer
748        use serde::de::{MapAccess, Visitor};
749        struct StructVisitor;
750        impl<'de> Visitor<'de> for StructVisitor {
751            type Value = AddFolderMemberArg;
752            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
753                f.write_str("a AddFolderMemberArg struct")
754            }
755            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
756                AddFolderMemberArg::internal_deserialize(map)
757            }
758        }
759        deserializer.deserialize_struct("AddFolderMemberArg", ADD_FOLDER_MEMBER_ARG_FIELDS, StructVisitor)
760    }
761}
762
763impl ::serde::ser::Serialize for AddFolderMemberArg {
764    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
765        // struct serializer
766        use serde::ser::SerializeStruct;
767        let mut s = serializer.serialize_struct("AddFolderMemberArg", 5)?;
768        self.internal_serialize::<S>(&mut s)?;
769        s.end()
770    }
771}
772
773#[derive(Debug, Clone, PartialEq, Eq)]
774#[non_exhaustive] // variants may be added in the future
775pub enum AddFolderMemberError {
776    /// Unable to access shared folder.
777    AccessError(SharedFolderAccessError),
778    /// This user's email address is not verified. This functionality is only available on accounts
779    /// with a verified email address. Users can verify their email address
780    /// [here](https://www.dropbox.com/help/317).
781    EmailUnverified,
782    /// The current user has been banned.
783    BannedMember,
784    /// [`AddFolderMemberArg::members`](AddFolderMemberArg) contains a bad invitation recipient.
785    BadMember(AddMemberSelectorError),
786    /// Your team policy does not allow sharing outside of the team.
787    CantShareOutsideTeam,
788    /// The value is the member limit that was reached.
789    TooManyMembers(u64),
790    /// The value is the pending invite limit that was reached.
791    TooManyPendingInvites(u64),
792    /// The current user has hit the limit of invites they can send per day. Try again in 24 hours.
793    RateLimit,
794    /// The current user is trying to share with too many people at once.
795    TooManyInvitees,
796    /// The current user's account doesn't support this action. An example of this is when adding a
797    /// read-only member. This action can only be performed by users that have upgraded to a Pro or
798    /// Business plan.
799    InsufficientPlan,
800    /// This action cannot be performed on a team shared folder.
801    TeamFolder,
802    /// The current user does not have permission to perform this action.
803    NoPermission,
804    /// Field is deprecated. Invalid shared folder error will be returned as an access_error.
805    #[deprecated]
806    InvalidSharedFolder,
807    /// Catch-all used for unrecognized values returned from the server. Encountering this value
808    /// typically indicates that this SDK version is out of date.
809    Other,
810}
811
812impl<'de> ::serde::de::Deserialize<'de> for AddFolderMemberError {
813    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
814        // union deserializer
815        use serde::de::{self, MapAccess, Visitor};
816        struct EnumVisitor;
817        impl<'de> Visitor<'de> for EnumVisitor {
818            type Value = AddFolderMemberError;
819            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
820                f.write_str("a AddFolderMemberError structure")
821            }
822            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
823                let tag: &str = match map.next_key()? {
824                    Some(".tag") => map.next_value()?,
825                    _ => return Err(de::Error::missing_field(".tag"))
826                };
827                let value = match tag {
828                    "access_error" => {
829                        match map.next_key()? {
830                            Some("access_error") => AddFolderMemberError::AccessError(map.next_value()?),
831                            None => return Err(de::Error::missing_field("access_error")),
832                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
833                        }
834                    }
835                    "email_unverified" => AddFolderMemberError::EmailUnverified,
836                    "banned_member" => AddFolderMemberError::BannedMember,
837                    "bad_member" => {
838                        match map.next_key()? {
839                            Some("bad_member") => AddFolderMemberError::BadMember(map.next_value()?),
840                            None => return Err(de::Error::missing_field("bad_member")),
841                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
842                        }
843                    }
844                    "cant_share_outside_team" => AddFolderMemberError::CantShareOutsideTeam,
845                    "too_many_members" => {
846                        match map.next_key()? {
847                            Some("too_many_members") => AddFolderMemberError::TooManyMembers(map.next_value()?),
848                            None => return Err(de::Error::missing_field("too_many_members")),
849                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
850                        }
851                    }
852                    "too_many_pending_invites" => {
853                        match map.next_key()? {
854                            Some("too_many_pending_invites") => AddFolderMemberError::TooManyPendingInvites(map.next_value()?),
855                            None => return Err(de::Error::missing_field("too_many_pending_invites")),
856                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
857                        }
858                    }
859                    "rate_limit" => AddFolderMemberError::RateLimit,
860                    "too_many_invitees" => AddFolderMemberError::TooManyInvitees,
861                    "insufficient_plan" => AddFolderMemberError::InsufficientPlan,
862                    "team_folder" => AddFolderMemberError::TeamFolder,
863                    "no_permission" => AddFolderMemberError::NoPermission,
864                    #[allow(deprecated)]
865                    "invalid_shared_folder" => AddFolderMemberError::InvalidSharedFolder,
866                    _ => AddFolderMemberError::Other,
867                };
868                crate::eat_json_fields(&mut map)?;
869                Ok(value)
870            }
871        }
872        const VARIANTS: &[&str] = &["access_error",
873                                    "email_unverified",
874                                    "banned_member",
875                                    "bad_member",
876                                    "cant_share_outside_team",
877                                    "too_many_members",
878                                    "too_many_pending_invites",
879                                    "rate_limit",
880                                    "too_many_invitees",
881                                    "insufficient_plan",
882                                    "team_folder",
883                                    "no_permission",
884                                    "invalid_shared_folder",
885                                    "other"];
886        deserializer.deserialize_struct("AddFolderMemberError", VARIANTS, EnumVisitor)
887    }
888}
889
890impl ::serde::ser::Serialize for AddFolderMemberError {
891    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
892        // union serializer
893        use serde::ser::SerializeStruct;
894        match self {
895            AddFolderMemberError::AccessError(x) => {
896                // union or polymporphic struct
897                let mut s = serializer.serialize_struct("AddFolderMemberError", 2)?;
898                s.serialize_field(".tag", "access_error")?;
899                s.serialize_field("access_error", x)?;
900                s.end()
901            }
902            AddFolderMemberError::EmailUnverified => {
903                // unit
904                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
905                s.serialize_field(".tag", "email_unverified")?;
906                s.end()
907            }
908            AddFolderMemberError::BannedMember => {
909                // unit
910                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
911                s.serialize_field(".tag", "banned_member")?;
912                s.end()
913            }
914            AddFolderMemberError::BadMember(x) => {
915                // union or polymporphic struct
916                let mut s = serializer.serialize_struct("AddFolderMemberError", 2)?;
917                s.serialize_field(".tag", "bad_member")?;
918                s.serialize_field("bad_member", x)?;
919                s.end()
920            }
921            AddFolderMemberError::CantShareOutsideTeam => {
922                // unit
923                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
924                s.serialize_field(".tag", "cant_share_outside_team")?;
925                s.end()
926            }
927            AddFolderMemberError::TooManyMembers(x) => {
928                // primitive
929                let mut s = serializer.serialize_struct("AddFolderMemberError", 2)?;
930                s.serialize_field(".tag", "too_many_members")?;
931                s.serialize_field("too_many_members", x)?;
932                s.end()
933            }
934            AddFolderMemberError::TooManyPendingInvites(x) => {
935                // primitive
936                let mut s = serializer.serialize_struct("AddFolderMemberError", 2)?;
937                s.serialize_field(".tag", "too_many_pending_invites")?;
938                s.serialize_field("too_many_pending_invites", x)?;
939                s.end()
940            }
941            AddFolderMemberError::RateLimit => {
942                // unit
943                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
944                s.serialize_field(".tag", "rate_limit")?;
945                s.end()
946            }
947            AddFolderMemberError::TooManyInvitees => {
948                // unit
949                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
950                s.serialize_field(".tag", "too_many_invitees")?;
951                s.end()
952            }
953            AddFolderMemberError::InsufficientPlan => {
954                // unit
955                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
956                s.serialize_field(".tag", "insufficient_plan")?;
957                s.end()
958            }
959            AddFolderMemberError::TeamFolder => {
960                // unit
961                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
962                s.serialize_field(".tag", "team_folder")?;
963                s.end()
964            }
965            AddFolderMemberError::NoPermission => {
966                // unit
967                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
968                s.serialize_field(".tag", "no_permission")?;
969                s.end()
970            }
971            #[allow(deprecated)]
972            AddFolderMemberError::InvalidSharedFolder => {
973                // unit
974                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
975                s.serialize_field(".tag", "invalid_shared_folder")?;
976                s.end()
977            }
978            AddFolderMemberError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
979        }
980    }
981}
982
983impl ::std::error::Error for AddFolderMemberError {
984    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
985        match self {
986            AddFolderMemberError::AccessError(inner) => Some(inner),
987            AddFolderMemberError::BadMember(inner) => Some(inner),
988            _ => None,
989        }
990    }
991}
992
993impl ::std::fmt::Display for AddFolderMemberError {
994    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
995        match self {
996            AddFolderMemberError::AccessError(inner) => write!(f, "Unable to access shared folder: {}", inner),
997            AddFolderMemberError::BannedMember => f.write_str("The current user has been banned."),
998            AddFolderMemberError::BadMember(inner) => write!(f, "AddFolderMemberError: {}", inner),
999            AddFolderMemberError::CantShareOutsideTeam => f.write_str("Your team policy does not allow sharing outside of the team."),
1000            AddFolderMemberError::TooManyMembers(inner) => write!(f, "The value is the member limit that was reached: {:?}", inner),
1001            AddFolderMemberError::TooManyPendingInvites(inner) => write!(f, "The value is the pending invite limit that was reached: {:?}", inner),
1002            AddFolderMemberError::RateLimit => f.write_str("The current user has hit the limit of invites they can send per day. Try again in 24 hours."),
1003            AddFolderMemberError::TooManyInvitees => f.write_str("The current user is trying to share with too many people at once."),
1004            AddFolderMemberError::InsufficientPlan => f.write_str("The current user's account doesn't support this action. An example of this is when adding a read-only member. This action can only be performed by users that have upgraded to a Pro or Business plan."),
1005            AddFolderMemberError::TeamFolder => f.write_str("This action cannot be performed on a team shared folder."),
1006            AddFolderMemberError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
1007            #[allow(deprecated)] AddFolderMemberError::InvalidSharedFolder => f.write_str("Field is deprecated. Invalid shared folder error will be returned as an access_error."),
1008            _ => write!(f, "{:?}", *self),
1009        }
1010    }
1011}
1012
1013/// The member and type of access the member should have when added to a shared folder.
1014#[derive(Debug, Clone, PartialEq, Eq)]
1015#[non_exhaustive] // structs may have more fields added in the future.
1016pub struct AddMember {
1017    /// The member to add to the shared folder.
1018    pub member: MemberSelector,
1019    /// The access level to grant `member` to the shared folder.  [`AccessLevel::Owner`] is
1020    /// disallowed.
1021    pub access_level: Option<AccessLevel>,
1022}
1023
1024impl AddMember {
1025    pub fn new(member: MemberSelector) -> Self {
1026        AddMember {
1027            member,
1028            access_level: None,
1029        }
1030    }
1031
1032    pub fn with_access_level(mut self, value: AccessLevel) -> Self {
1033        self.access_level = Some(value);
1034        self
1035    }
1036}
1037
1038const ADD_MEMBER_FIELDS: &[&str] = &["member",
1039                                     "access_level"];
1040impl AddMember {
1041    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
1042        map: V,
1043    ) -> Result<AddMember, V::Error> {
1044        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
1045    }
1046
1047    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
1048        mut map: V,
1049        optional: bool,
1050    ) -> Result<Option<AddMember>, V::Error> {
1051        let mut field_member = None;
1052        let mut field_access_level = None;
1053        let mut nothing = true;
1054        while let Some(key) = map.next_key::<&str>()? {
1055            nothing = false;
1056            match key {
1057                "member" => {
1058                    if field_member.is_some() {
1059                        return Err(::serde::de::Error::duplicate_field("member"));
1060                    }
1061                    field_member = Some(map.next_value()?);
1062                }
1063                "access_level" => {
1064                    if field_access_level.is_some() {
1065                        return Err(::serde::de::Error::duplicate_field("access_level"));
1066                    }
1067                    field_access_level = Some(map.next_value()?);
1068                }
1069                _ => {
1070                    // unknown field allowed and ignored
1071                    map.next_value::<::serde_json::Value>()?;
1072                }
1073            }
1074        }
1075        if optional && nothing {
1076            return Ok(None);
1077        }
1078        let result = AddMember {
1079            member: field_member.ok_or_else(|| ::serde::de::Error::missing_field("member"))?,
1080            access_level: field_access_level.and_then(Option::flatten),
1081        };
1082        Ok(Some(result))
1083    }
1084
1085    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
1086        &self,
1087        s: &mut S::SerializeStruct,
1088    ) -> Result<(), S::Error> {
1089        use serde::ser::SerializeStruct;
1090        s.serialize_field("member", &self.member)?;
1091        if let Some(val) = &self.access_level {
1092            s.serialize_field("access_level", val)?;
1093        }
1094        Ok(())
1095    }
1096}
1097
1098impl<'de> ::serde::de::Deserialize<'de> for AddMember {
1099    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1100        // struct deserializer
1101        use serde::de::{MapAccess, Visitor};
1102        struct StructVisitor;
1103        impl<'de> Visitor<'de> for StructVisitor {
1104            type Value = AddMember;
1105            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1106                f.write_str("a AddMember struct")
1107            }
1108            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
1109                AddMember::internal_deserialize(map)
1110            }
1111        }
1112        deserializer.deserialize_struct("AddMember", ADD_MEMBER_FIELDS, StructVisitor)
1113    }
1114}
1115
1116impl ::serde::ser::Serialize for AddMember {
1117    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1118        // struct serializer
1119        use serde::ser::SerializeStruct;
1120        let mut s = serializer.serialize_struct("AddMember", 2)?;
1121        self.internal_serialize::<S>(&mut s)?;
1122        s.end()
1123    }
1124}
1125
1126#[derive(Debug, Clone, PartialEq, Eq)]
1127#[non_exhaustive] // variants may be added in the future
1128pub enum AddMemberSelectorError {
1129    /// Automatically created groups can only be added to team folders.
1130    AutomaticGroup,
1131    /// The value is the ID that could not be identified.
1132    InvalidDropboxId(DropboxId),
1133    /// The value is the e-email address that is malformed.
1134    InvalidEmail(crate::types::common::EmailAddress),
1135    /// Provided group is invalid.
1136    InvalidGroup,
1137    /// The value is the ID of the Dropbox user with an unverified email address. Invite unverified
1138    /// users by email address instead of by their Dropbox ID.
1139    UnverifiedDropboxId(DropboxId),
1140    /// At least one of the specified groups in [`AddFolderMemberArg::members`](AddFolderMemberArg)
1141    /// is deleted.
1142    GroupDeleted,
1143    /// Sharing to a group that is not on the current user's team.
1144    GroupNotOnTeam,
1145    /// Catch-all used for unrecognized values returned from the server. Encountering this value
1146    /// typically indicates that this SDK version is out of date.
1147    Other,
1148}
1149
1150impl<'de> ::serde::de::Deserialize<'de> for AddMemberSelectorError {
1151    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1152        // union deserializer
1153        use serde::de::{self, MapAccess, Visitor};
1154        struct EnumVisitor;
1155        impl<'de> Visitor<'de> for EnumVisitor {
1156            type Value = AddMemberSelectorError;
1157            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1158                f.write_str("a AddMemberSelectorError structure")
1159            }
1160            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
1161                let tag: &str = match map.next_key()? {
1162                    Some(".tag") => map.next_value()?,
1163                    _ => return Err(de::Error::missing_field(".tag"))
1164                };
1165                let value = match tag {
1166                    "automatic_group" => AddMemberSelectorError::AutomaticGroup,
1167                    "invalid_dropbox_id" => {
1168                        match map.next_key()? {
1169                            Some("invalid_dropbox_id") => AddMemberSelectorError::InvalidDropboxId(map.next_value()?),
1170                            None => return Err(de::Error::missing_field("invalid_dropbox_id")),
1171                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
1172                        }
1173                    }
1174                    "invalid_email" => {
1175                        match map.next_key()? {
1176                            Some("invalid_email") => AddMemberSelectorError::InvalidEmail(map.next_value()?),
1177                            None => return Err(de::Error::missing_field("invalid_email")),
1178                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
1179                        }
1180                    }
1181                    "invalid_group" => AddMemberSelectorError::InvalidGroup,
1182                    "unverified_dropbox_id" => {
1183                        match map.next_key()? {
1184                            Some("unverified_dropbox_id") => AddMemberSelectorError::UnverifiedDropboxId(map.next_value()?),
1185                            None => return Err(de::Error::missing_field("unverified_dropbox_id")),
1186                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
1187                        }
1188                    }
1189                    "group_deleted" => AddMemberSelectorError::GroupDeleted,
1190                    "group_not_on_team" => AddMemberSelectorError::GroupNotOnTeam,
1191                    _ => AddMemberSelectorError::Other,
1192                };
1193                crate::eat_json_fields(&mut map)?;
1194                Ok(value)
1195            }
1196        }
1197        const VARIANTS: &[&str] = &["automatic_group",
1198                                    "invalid_dropbox_id",
1199                                    "invalid_email",
1200                                    "invalid_group",
1201                                    "unverified_dropbox_id",
1202                                    "group_deleted",
1203                                    "group_not_on_team",
1204                                    "other"];
1205        deserializer.deserialize_struct("AddMemberSelectorError", VARIANTS, EnumVisitor)
1206    }
1207}
1208
1209impl ::serde::ser::Serialize for AddMemberSelectorError {
1210    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1211        // union serializer
1212        use serde::ser::SerializeStruct;
1213        match self {
1214            AddMemberSelectorError::AutomaticGroup => {
1215                // unit
1216                let mut s = serializer.serialize_struct("AddMemberSelectorError", 1)?;
1217                s.serialize_field(".tag", "automatic_group")?;
1218                s.end()
1219            }
1220            AddMemberSelectorError::InvalidDropboxId(x) => {
1221                // primitive
1222                let mut s = serializer.serialize_struct("AddMemberSelectorError", 2)?;
1223                s.serialize_field(".tag", "invalid_dropbox_id")?;
1224                s.serialize_field("invalid_dropbox_id", x)?;
1225                s.end()
1226            }
1227            AddMemberSelectorError::InvalidEmail(x) => {
1228                // primitive
1229                let mut s = serializer.serialize_struct("AddMemberSelectorError", 2)?;
1230                s.serialize_field(".tag", "invalid_email")?;
1231                s.serialize_field("invalid_email", x)?;
1232                s.end()
1233            }
1234            AddMemberSelectorError::InvalidGroup => {
1235                // unit
1236                let mut s = serializer.serialize_struct("AddMemberSelectorError", 1)?;
1237                s.serialize_field(".tag", "invalid_group")?;
1238                s.end()
1239            }
1240            AddMemberSelectorError::UnverifiedDropboxId(x) => {
1241                // primitive
1242                let mut s = serializer.serialize_struct("AddMemberSelectorError", 2)?;
1243                s.serialize_field(".tag", "unverified_dropbox_id")?;
1244                s.serialize_field("unverified_dropbox_id", x)?;
1245                s.end()
1246            }
1247            AddMemberSelectorError::GroupDeleted => {
1248                // unit
1249                let mut s = serializer.serialize_struct("AddMemberSelectorError", 1)?;
1250                s.serialize_field(".tag", "group_deleted")?;
1251                s.end()
1252            }
1253            AddMemberSelectorError::GroupNotOnTeam => {
1254                // unit
1255                let mut s = serializer.serialize_struct("AddMemberSelectorError", 1)?;
1256                s.serialize_field(".tag", "group_not_on_team")?;
1257                s.end()
1258            }
1259            AddMemberSelectorError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
1260        }
1261    }
1262}
1263
1264impl ::std::error::Error for AddMemberSelectorError {
1265}
1266
1267impl ::std::fmt::Display for AddMemberSelectorError {
1268    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1269        match self {
1270            AddMemberSelectorError::AutomaticGroup => f.write_str("Automatically created groups can only be added to team folders."),
1271            AddMemberSelectorError::InvalidDropboxId(inner) => write!(f, "The value is the ID that could not be identified: {:?}", inner),
1272            AddMemberSelectorError::InvalidEmail(inner) => write!(f, "The value is the e-email address that is malformed: {:?}", inner),
1273            AddMemberSelectorError::InvalidGroup => f.write_str("Provided group is invalid."),
1274            AddMemberSelectorError::UnverifiedDropboxId(inner) => write!(f, "The value is the ID of the Dropbox user with an unverified email address. Invite unverified users by email address instead of by their Dropbox ID: {:?}", inner),
1275            AddMemberSelectorError::GroupNotOnTeam => f.write_str("Sharing to a group that is not on the current user's team."),
1276            _ => write!(f, "{:?}", *self),
1277        }
1278    }
1279}
1280
1281/// check documentation for ResolvedVisibility.
1282#[derive(Debug, Clone, PartialEq, Eq)]
1283#[non_exhaustive] // variants may be added in the future
1284pub enum AlphaResolvedVisibility {
1285    /// Anyone who has received the link can access it. No login required.
1286    Public,
1287    /// Only members of the same team can access the link. Login is required.
1288    TeamOnly,
1289    /// A link-specific password is required to access the link. Login is not required.
1290    Password,
1291    /// Only members of the same team who have the link-specific password can access the link. Login
1292    /// is required.
1293    TeamAndPassword,
1294    /// Only members of the shared folder containing the linked file can access the link. Login is
1295    /// required.
1296    SharedFolderOnly,
1297    /// The link merely points the user to the content, and does not grant any additional rights.
1298    /// Existing members of the content who use this link can only access the content with their
1299    /// pre-existing access rights. Either on the file directly, or inherited from a parent folder.
1300    NoOne,
1301    /// Only the current user can view this link.
1302    OnlyYou,
1303    /// Catch-all used for unrecognized values returned from the server. Encountering this value
1304    /// typically indicates that this SDK version is out of date.
1305    Other,
1306}
1307
1308impl<'de> ::serde::de::Deserialize<'de> for AlphaResolvedVisibility {
1309    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1310        // union deserializer
1311        use serde::de::{self, MapAccess, Visitor};
1312        struct EnumVisitor;
1313        impl<'de> Visitor<'de> for EnumVisitor {
1314            type Value = AlphaResolvedVisibility;
1315            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1316                f.write_str("a AlphaResolvedVisibility structure")
1317            }
1318            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
1319                let tag: &str = match map.next_key()? {
1320                    Some(".tag") => map.next_value()?,
1321                    _ => return Err(de::Error::missing_field(".tag"))
1322                };
1323                let value = match tag {
1324                    "public" => AlphaResolvedVisibility::Public,
1325                    "team_only" => AlphaResolvedVisibility::TeamOnly,
1326                    "password" => AlphaResolvedVisibility::Password,
1327                    "team_and_password" => AlphaResolvedVisibility::TeamAndPassword,
1328                    "shared_folder_only" => AlphaResolvedVisibility::SharedFolderOnly,
1329                    "no_one" => AlphaResolvedVisibility::NoOne,
1330                    "only_you" => AlphaResolvedVisibility::OnlyYou,
1331                    _ => AlphaResolvedVisibility::Other,
1332                };
1333                crate::eat_json_fields(&mut map)?;
1334                Ok(value)
1335            }
1336        }
1337        const VARIANTS: &[&str] = &["public",
1338                                    "team_only",
1339                                    "password",
1340                                    "team_and_password",
1341                                    "shared_folder_only",
1342                                    "no_one",
1343                                    "only_you",
1344                                    "other"];
1345        deserializer.deserialize_struct("AlphaResolvedVisibility", VARIANTS, EnumVisitor)
1346    }
1347}
1348
1349impl ::serde::ser::Serialize for AlphaResolvedVisibility {
1350    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1351        // union serializer
1352        use serde::ser::SerializeStruct;
1353        match self {
1354            AlphaResolvedVisibility::Public => {
1355                // unit
1356                let mut s = serializer.serialize_struct("AlphaResolvedVisibility", 1)?;
1357                s.serialize_field(".tag", "public")?;
1358                s.end()
1359            }
1360            AlphaResolvedVisibility::TeamOnly => {
1361                // unit
1362                let mut s = serializer.serialize_struct("AlphaResolvedVisibility", 1)?;
1363                s.serialize_field(".tag", "team_only")?;
1364                s.end()
1365            }
1366            AlphaResolvedVisibility::Password => {
1367                // unit
1368                let mut s = serializer.serialize_struct("AlphaResolvedVisibility", 1)?;
1369                s.serialize_field(".tag", "password")?;
1370                s.end()
1371            }
1372            AlphaResolvedVisibility::TeamAndPassword => {
1373                // unit
1374                let mut s = serializer.serialize_struct("AlphaResolvedVisibility", 1)?;
1375                s.serialize_field(".tag", "team_and_password")?;
1376                s.end()
1377            }
1378            AlphaResolvedVisibility::SharedFolderOnly => {
1379                // unit
1380                let mut s = serializer.serialize_struct("AlphaResolvedVisibility", 1)?;
1381                s.serialize_field(".tag", "shared_folder_only")?;
1382                s.end()
1383            }
1384            AlphaResolvedVisibility::NoOne => {
1385                // unit
1386                let mut s = serializer.serialize_struct("AlphaResolvedVisibility", 1)?;
1387                s.serialize_field(".tag", "no_one")?;
1388                s.end()
1389            }
1390            AlphaResolvedVisibility::OnlyYou => {
1391                // unit
1392                let mut s = serializer.serialize_struct("AlphaResolvedVisibility", 1)?;
1393                s.serialize_field(".tag", "only_you")?;
1394                s.end()
1395            }
1396            AlphaResolvedVisibility::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
1397        }
1398    }
1399}
1400
1401// union extends ResolvedVisibility
1402impl From<ResolvedVisibility> for AlphaResolvedVisibility {
1403    fn from(parent: ResolvedVisibility) -> Self {
1404        match parent {
1405            ResolvedVisibility::Public => AlphaResolvedVisibility::Public,
1406            ResolvedVisibility::TeamOnly => AlphaResolvedVisibility::TeamOnly,
1407            ResolvedVisibility::Password => AlphaResolvedVisibility::Password,
1408            ResolvedVisibility::TeamAndPassword => AlphaResolvedVisibility::TeamAndPassword,
1409            ResolvedVisibility::SharedFolderOnly => AlphaResolvedVisibility::SharedFolderOnly,
1410            ResolvedVisibility::NoOne => AlphaResolvedVisibility::NoOne,
1411            ResolvedVisibility::OnlyYou => AlphaResolvedVisibility::OnlyYou,
1412            ResolvedVisibility::Other => AlphaResolvedVisibility::Other,
1413        }
1414    }
1415}
1416/// Information about the content that has a link audience different than that of this folder.
1417#[derive(Debug, Clone, PartialEq, Eq)]
1418#[non_exhaustive] // structs may have more fields added in the future.
1419pub struct AudienceExceptionContentInfo {
1420    /// The name of the content, which is either a file or a folder.
1421    pub name: String,
1422}
1423
1424impl AudienceExceptionContentInfo {
1425    pub fn new(name: String) -> Self {
1426        AudienceExceptionContentInfo {
1427            name,
1428        }
1429    }
1430}
1431
1432const AUDIENCE_EXCEPTION_CONTENT_INFO_FIELDS: &[&str] = &["name"];
1433impl AudienceExceptionContentInfo {
1434    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
1435        map: V,
1436    ) -> Result<AudienceExceptionContentInfo, V::Error> {
1437        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
1438    }
1439
1440    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
1441        mut map: V,
1442        optional: bool,
1443    ) -> Result<Option<AudienceExceptionContentInfo>, V::Error> {
1444        let mut field_name = None;
1445        let mut nothing = true;
1446        while let Some(key) = map.next_key::<&str>()? {
1447            nothing = false;
1448            match key {
1449                "name" => {
1450                    if field_name.is_some() {
1451                        return Err(::serde::de::Error::duplicate_field("name"));
1452                    }
1453                    field_name = Some(map.next_value()?);
1454                }
1455                _ => {
1456                    // unknown field allowed and ignored
1457                    map.next_value::<::serde_json::Value>()?;
1458                }
1459            }
1460        }
1461        if optional && nothing {
1462            return Ok(None);
1463        }
1464        let result = AudienceExceptionContentInfo {
1465            name: field_name.ok_or_else(|| ::serde::de::Error::missing_field("name"))?,
1466        };
1467        Ok(Some(result))
1468    }
1469
1470    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
1471        &self,
1472        s: &mut S::SerializeStruct,
1473    ) -> Result<(), S::Error> {
1474        use serde::ser::SerializeStruct;
1475        s.serialize_field("name", &self.name)?;
1476        Ok(())
1477    }
1478}
1479
1480impl<'de> ::serde::de::Deserialize<'de> for AudienceExceptionContentInfo {
1481    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1482        // struct deserializer
1483        use serde::de::{MapAccess, Visitor};
1484        struct StructVisitor;
1485        impl<'de> Visitor<'de> for StructVisitor {
1486            type Value = AudienceExceptionContentInfo;
1487            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1488                f.write_str("a AudienceExceptionContentInfo struct")
1489            }
1490            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
1491                AudienceExceptionContentInfo::internal_deserialize(map)
1492            }
1493        }
1494        deserializer.deserialize_struct("AudienceExceptionContentInfo", AUDIENCE_EXCEPTION_CONTENT_INFO_FIELDS, StructVisitor)
1495    }
1496}
1497
1498impl ::serde::ser::Serialize for AudienceExceptionContentInfo {
1499    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1500        // struct serializer
1501        use serde::ser::SerializeStruct;
1502        let mut s = serializer.serialize_struct("AudienceExceptionContentInfo", 1)?;
1503        self.internal_serialize::<S>(&mut s)?;
1504        s.end()
1505    }
1506}
1507
1508/// The total count and truncated list of information of content inside this folder that has a
1509/// different audience than the link on this folder. This is only returned for folders.
1510#[derive(Debug, Clone, PartialEq, Eq)]
1511#[non_exhaustive] // structs may have more fields added in the future.
1512pub struct AudienceExceptions {
1513    pub count: u32,
1514    /// A truncated list of some of the content that is an exception. The length of this list could
1515    /// be smaller than the count since it is only a sample but will not be empty as long as count
1516    /// is not 0.
1517    pub exceptions: Vec<AudienceExceptionContentInfo>,
1518}
1519
1520impl AudienceExceptions {
1521    pub fn new(count: u32, exceptions: Vec<AudienceExceptionContentInfo>) -> Self {
1522        AudienceExceptions {
1523            count,
1524            exceptions,
1525        }
1526    }
1527}
1528
1529const AUDIENCE_EXCEPTIONS_FIELDS: &[&str] = &["count",
1530                                              "exceptions"];
1531impl AudienceExceptions {
1532    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
1533        map: V,
1534    ) -> Result<AudienceExceptions, V::Error> {
1535        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
1536    }
1537
1538    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
1539        mut map: V,
1540        optional: bool,
1541    ) -> Result<Option<AudienceExceptions>, V::Error> {
1542        let mut field_count = None;
1543        let mut field_exceptions = None;
1544        let mut nothing = true;
1545        while let Some(key) = map.next_key::<&str>()? {
1546            nothing = false;
1547            match key {
1548                "count" => {
1549                    if field_count.is_some() {
1550                        return Err(::serde::de::Error::duplicate_field("count"));
1551                    }
1552                    field_count = Some(map.next_value()?);
1553                }
1554                "exceptions" => {
1555                    if field_exceptions.is_some() {
1556                        return Err(::serde::de::Error::duplicate_field("exceptions"));
1557                    }
1558                    field_exceptions = Some(map.next_value()?);
1559                }
1560                _ => {
1561                    // unknown field allowed and ignored
1562                    map.next_value::<::serde_json::Value>()?;
1563                }
1564            }
1565        }
1566        if optional && nothing {
1567            return Ok(None);
1568        }
1569        let result = AudienceExceptions {
1570            count: field_count.ok_or_else(|| ::serde::de::Error::missing_field("count"))?,
1571            exceptions: field_exceptions.ok_or_else(|| ::serde::de::Error::missing_field("exceptions"))?,
1572        };
1573        Ok(Some(result))
1574    }
1575
1576    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
1577        &self,
1578        s: &mut S::SerializeStruct,
1579    ) -> Result<(), S::Error> {
1580        use serde::ser::SerializeStruct;
1581        s.serialize_field("count", &self.count)?;
1582        s.serialize_field("exceptions", &self.exceptions)?;
1583        Ok(())
1584    }
1585}
1586
1587impl<'de> ::serde::de::Deserialize<'de> for AudienceExceptions {
1588    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1589        // struct deserializer
1590        use serde::de::{MapAccess, Visitor};
1591        struct StructVisitor;
1592        impl<'de> Visitor<'de> for StructVisitor {
1593            type Value = AudienceExceptions;
1594            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1595                f.write_str("a AudienceExceptions struct")
1596            }
1597            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
1598                AudienceExceptions::internal_deserialize(map)
1599            }
1600        }
1601        deserializer.deserialize_struct("AudienceExceptions", AUDIENCE_EXCEPTIONS_FIELDS, StructVisitor)
1602    }
1603}
1604
1605impl ::serde::ser::Serialize for AudienceExceptions {
1606    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1607        // struct serializer
1608        use serde::ser::SerializeStruct;
1609        let mut s = serializer.serialize_struct("AudienceExceptions", 2)?;
1610        self.internal_serialize::<S>(&mut s)?;
1611        s.end()
1612    }
1613}
1614
1615/// Information about the shared folder that prevents the link audience for this link from being
1616/// more restrictive.
1617#[derive(Debug, Clone, PartialEq, Eq)]
1618#[non_exhaustive] // structs may have more fields added in the future.
1619pub struct AudienceRestrictingSharedFolder {
1620    /// The ID of the shared folder.
1621    pub shared_folder_id: crate::types::common::SharedFolderId,
1622    /// The name of the shared folder.
1623    pub name: String,
1624    /// The link audience of the shared folder.
1625    pub audience: LinkAudience,
1626}
1627
1628impl AudienceRestrictingSharedFolder {
1629    pub fn new(
1630        shared_folder_id: crate::types::common::SharedFolderId,
1631        name: String,
1632        audience: LinkAudience,
1633    ) -> Self {
1634        AudienceRestrictingSharedFolder {
1635            shared_folder_id,
1636            name,
1637            audience,
1638        }
1639    }
1640}
1641
1642const AUDIENCE_RESTRICTING_SHARED_FOLDER_FIELDS: &[&str] = &["shared_folder_id",
1643                                                             "name",
1644                                                             "audience"];
1645impl AudienceRestrictingSharedFolder {
1646    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
1647        map: V,
1648    ) -> Result<AudienceRestrictingSharedFolder, V::Error> {
1649        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
1650    }
1651
1652    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
1653        mut map: V,
1654        optional: bool,
1655    ) -> Result<Option<AudienceRestrictingSharedFolder>, V::Error> {
1656        let mut field_shared_folder_id = None;
1657        let mut field_name = None;
1658        let mut field_audience = None;
1659        let mut nothing = true;
1660        while let Some(key) = map.next_key::<&str>()? {
1661            nothing = false;
1662            match key {
1663                "shared_folder_id" => {
1664                    if field_shared_folder_id.is_some() {
1665                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
1666                    }
1667                    field_shared_folder_id = Some(map.next_value()?);
1668                }
1669                "name" => {
1670                    if field_name.is_some() {
1671                        return Err(::serde::de::Error::duplicate_field("name"));
1672                    }
1673                    field_name = Some(map.next_value()?);
1674                }
1675                "audience" => {
1676                    if field_audience.is_some() {
1677                        return Err(::serde::de::Error::duplicate_field("audience"));
1678                    }
1679                    field_audience = Some(map.next_value()?);
1680                }
1681                _ => {
1682                    // unknown field allowed and ignored
1683                    map.next_value::<::serde_json::Value>()?;
1684                }
1685            }
1686        }
1687        if optional && nothing {
1688            return Ok(None);
1689        }
1690        let result = AudienceRestrictingSharedFolder {
1691            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
1692            name: field_name.ok_or_else(|| ::serde::de::Error::missing_field("name"))?,
1693            audience: field_audience.ok_or_else(|| ::serde::de::Error::missing_field("audience"))?,
1694        };
1695        Ok(Some(result))
1696    }
1697
1698    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
1699        &self,
1700        s: &mut S::SerializeStruct,
1701    ) -> Result<(), S::Error> {
1702        use serde::ser::SerializeStruct;
1703        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
1704        s.serialize_field("name", &self.name)?;
1705        s.serialize_field("audience", &self.audience)?;
1706        Ok(())
1707    }
1708}
1709
1710impl<'de> ::serde::de::Deserialize<'de> for AudienceRestrictingSharedFolder {
1711    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1712        // struct deserializer
1713        use serde::de::{MapAccess, Visitor};
1714        struct StructVisitor;
1715        impl<'de> Visitor<'de> for StructVisitor {
1716            type Value = AudienceRestrictingSharedFolder;
1717            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1718                f.write_str("a AudienceRestrictingSharedFolder struct")
1719            }
1720            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
1721                AudienceRestrictingSharedFolder::internal_deserialize(map)
1722            }
1723        }
1724        deserializer.deserialize_struct("AudienceRestrictingSharedFolder", AUDIENCE_RESTRICTING_SHARED_FOLDER_FIELDS, StructVisitor)
1725    }
1726}
1727
1728impl ::serde::ser::Serialize for AudienceRestrictingSharedFolder {
1729    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1730        // struct serializer
1731        use serde::ser::SerializeStruct;
1732        let mut s = serializer.serialize_struct("AudienceRestrictingSharedFolder", 3)?;
1733        self.internal_serialize::<S>(&mut s)?;
1734        s.end()
1735    }
1736}
1737
1738/// Enumerates acceptable values for team's ChangeLinkExpirationPolicy setting.
1739#[derive(Debug, Clone, PartialEq, Eq)]
1740#[non_exhaustive] // variants may be added in the future
1741pub enum ChangeLinkExpirationPolicy {
1742    Allowed,
1743    NotAllowed,
1744    /// Catch-all used for unrecognized values returned from the server. Encountering this value
1745    /// typically indicates that this SDK version is out of date.
1746    Other,
1747}
1748
1749impl<'de> ::serde::de::Deserialize<'de> for ChangeLinkExpirationPolicy {
1750    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1751        // union deserializer
1752        use serde::de::{self, MapAccess, Visitor};
1753        struct EnumVisitor;
1754        impl<'de> Visitor<'de> for EnumVisitor {
1755            type Value = ChangeLinkExpirationPolicy;
1756            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1757                f.write_str("a ChangeLinkExpirationPolicy structure")
1758            }
1759            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
1760                let tag: &str = match map.next_key()? {
1761                    Some(".tag") => map.next_value()?,
1762                    _ => return Err(de::Error::missing_field(".tag"))
1763                };
1764                let value = match tag {
1765                    "allowed" => ChangeLinkExpirationPolicy::Allowed,
1766                    "not_allowed" => ChangeLinkExpirationPolicy::NotAllowed,
1767                    _ => ChangeLinkExpirationPolicy::Other,
1768                };
1769                crate::eat_json_fields(&mut map)?;
1770                Ok(value)
1771            }
1772        }
1773        const VARIANTS: &[&str] = &["allowed",
1774                                    "not_allowed",
1775                                    "other"];
1776        deserializer.deserialize_struct("ChangeLinkExpirationPolicy", VARIANTS, EnumVisitor)
1777    }
1778}
1779
1780impl ::serde::ser::Serialize for ChangeLinkExpirationPolicy {
1781    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1782        // union serializer
1783        use serde::ser::SerializeStruct;
1784        match self {
1785            ChangeLinkExpirationPolicy::Allowed => {
1786                // unit
1787                let mut s = serializer.serialize_struct("ChangeLinkExpirationPolicy", 1)?;
1788                s.serialize_field(".tag", "allowed")?;
1789                s.end()
1790            }
1791            ChangeLinkExpirationPolicy::NotAllowed => {
1792                // unit
1793                let mut s = serializer.serialize_struct("ChangeLinkExpirationPolicy", 1)?;
1794                s.serialize_field(".tag", "not_allowed")?;
1795                s.end()
1796            }
1797            ChangeLinkExpirationPolicy::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
1798        }
1799    }
1800}
1801
1802/// Metadata for a collection-based shared link.
1803#[derive(Debug, Clone, PartialEq, Eq)]
1804#[non_exhaustive] // structs may have more fields added in the future.
1805pub struct CollectionLinkMetadata {
1806    /// URL of the shared link.
1807    pub url: String,
1808    /// Who can access the link.
1809    pub visibility: Visibility,
1810    /// Expiration time, if set. By default the link won't expire.
1811    pub expires: Option<crate::types::common::DropboxTimestamp>,
1812}
1813
1814impl CollectionLinkMetadata {
1815    pub fn new(url: String, visibility: Visibility) -> Self {
1816        CollectionLinkMetadata {
1817            url,
1818            visibility,
1819            expires: None,
1820        }
1821    }
1822
1823    pub fn with_expires(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
1824        self.expires = Some(value);
1825        self
1826    }
1827}
1828
1829const COLLECTION_LINK_METADATA_FIELDS: &[&str] = &["url",
1830                                                   "visibility",
1831                                                   "expires"];
1832impl CollectionLinkMetadata {
1833    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
1834        map: V,
1835    ) -> Result<CollectionLinkMetadata, V::Error> {
1836        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
1837    }
1838
1839    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
1840        mut map: V,
1841        optional: bool,
1842    ) -> Result<Option<CollectionLinkMetadata>, V::Error> {
1843        let mut field_url = None;
1844        let mut field_visibility = None;
1845        let mut field_expires = None;
1846        let mut nothing = true;
1847        while let Some(key) = map.next_key::<&str>()? {
1848            nothing = false;
1849            match key {
1850                "url" => {
1851                    if field_url.is_some() {
1852                        return Err(::serde::de::Error::duplicate_field("url"));
1853                    }
1854                    field_url = Some(map.next_value()?);
1855                }
1856                "visibility" => {
1857                    if field_visibility.is_some() {
1858                        return Err(::serde::de::Error::duplicate_field("visibility"));
1859                    }
1860                    field_visibility = Some(map.next_value()?);
1861                }
1862                "expires" => {
1863                    if field_expires.is_some() {
1864                        return Err(::serde::de::Error::duplicate_field("expires"));
1865                    }
1866                    field_expires = Some(map.next_value()?);
1867                }
1868                _ => {
1869                    // unknown field allowed and ignored
1870                    map.next_value::<::serde_json::Value>()?;
1871                }
1872            }
1873        }
1874        if optional && nothing {
1875            return Ok(None);
1876        }
1877        let result = CollectionLinkMetadata {
1878            url: field_url.ok_or_else(|| ::serde::de::Error::missing_field("url"))?,
1879            visibility: field_visibility.ok_or_else(|| ::serde::de::Error::missing_field("visibility"))?,
1880            expires: field_expires.and_then(Option::flatten),
1881        };
1882        Ok(Some(result))
1883    }
1884
1885    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
1886        &self,
1887        s: &mut S::SerializeStruct,
1888    ) -> Result<(), S::Error> {
1889        use serde::ser::SerializeStruct;
1890        s.serialize_field("url", &self.url)?;
1891        s.serialize_field("visibility", &self.visibility)?;
1892        if let Some(val) = &self.expires {
1893            s.serialize_field("expires", val)?;
1894        }
1895        Ok(())
1896    }
1897}
1898
1899impl<'de> ::serde::de::Deserialize<'de> for CollectionLinkMetadata {
1900    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1901        // struct deserializer
1902        use serde::de::{MapAccess, Visitor};
1903        struct StructVisitor;
1904        impl<'de> Visitor<'de> for StructVisitor {
1905            type Value = CollectionLinkMetadata;
1906            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1907                f.write_str("a CollectionLinkMetadata struct")
1908            }
1909            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
1910                CollectionLinkMetadata::internal_deserialize(map)
1911            }
1912        }
1913        deserializer.deserialize_struct("CollectionLinkMetadata", COLLECTION_LINK_METADATA_FIELDS, StructVisitor)
1914    }
1915}
1916
1917impl ::serde::ser::Serialize for CollectionLinkMetadata {
1918    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1919        // struct serializer
1920        use serde::ser::SerializeStruct;
1921        let mut s = serializer.serialize_struct("CollectionLinkMetadata", 3)?;
1922        self.internal_serialize::<S>(&mut s)?;
1923        s.end()
1924    }
1925}
1926
1927// struct extends polymorphic struct LinkMetadata
1928impl From<CollectionLinkMetadata> for LinkMetadata {
1929    fn from(subtype: CollectionLinkMetadata) -> Self {
1930        LinkMetadata::Collection(subtype)
1931    }
1932}
1933#[derive(Debug, Clone, PartialEq, Eq)]
1934#[non_exhaustive] // structs may have more fields added in the future.
1935pub struct CreateSharedLinkArg {
1936    /// The path to share.
1937    pub path: String,
1938    /// Field is deprecated. None
1939    #[deprecated]
1940    pub short_url: bool,
1941    /// If it's okay to share a path that does not yet exist, set this to either
1942    /// [`PendingUploadMode::File`] or [`PendingUploadMode::Folder`] to indicate whether to assume
1943    /// it's a file or folder.
1944    pub pending_upload: Option<PendingUploadMode>,
1945}
1946
1947impl CreateSharedLinkArg {
1948    pub fn new(path: String) -> Self {
1949        CreateSharedLinkArg {
1950            path,
1951            #[allow(deprecated)] short_url: false,
1952            pending_upload: None,
1953        }
1954    }
1955
1956    #[deprecated]
1957    #[allow(deprecated)]
1958    pub fn with_short_url(mut self, value: bool) -> Self {
1959        self.short_url = value;
1960        self
1961    }
1962
1963    pub fn with_pending_upload(mut self, value: PendingUploadMode) -> Self {
1964        self.pending_upload = Some(value);
1965        self
1966    }
1967}
1968
1969const CREATE_SHARED_LINK_ARG_FIELDS: &[&str] = &["path",
1970                                                 "short_url",
1971                                                 "pending_upload"];
1972impl CreateSharedLinkArg {
1973    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
1974        map: V,
1975    ) -> Result<CreateSharedLinkArg, V::Error> {
1976        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
1977    }
1978
1979    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
1980        mut map: V,
1981        optional: bool,
1982    ) -> Result<Option<CreateSharedLinkArg>, V::Error> {
1983        let mut field_path = None;
1984        let mut field_short_url = None;
1985        let mut field_pending_upload = None;
1986        let mut nothing = true;
1987        while let Some(key) = map.next_key::<&str>()? {
1988            nothing = false;
1989            match key {
1990                "path" => {
1991                    if field_path.is_some() {
1992                        return Err(::serde::de::Error::duplicate_field("path"));
1993                    }
1994                    field_path = Some(map.next_value()?);
1995                }
1996                "short_url" => {
1997                    if field_short_url.is_some() {
1998                        return Err(::serde::de::Error::duplicate_field("short_url"));
1999                    }
2000                    field_short_url = Some(map.next_value()?);
2001                }
2002                "pending_upload" => {
2003                    if field_pending_upload.is_some() {
2004                        return Err(::serde::de::Error::duplicate_field("pending_upload"));
2005                    }
2006                    field_pending_upload = Some(map.next_value()?);
2007                }
2008                _ => {
2009                    // unknown field allowed and ignored
2010                    map.next_value::<::serde_json::Value>()?;
2011                }
2012            }
2013        }
2014        if optional && nothing {
2015            return Ok(None);
2016        }
2017        let result = CreateSharedLinkArg {
2018            path: field_path.ok_or_else(|| ::serde::de::Error::missing_field("path"))?,
2019            #[allow(deprecated)] short_url: field_short_url.unwrap_or(false),
2020            pending_upload: field_pending_upload.and_then(Option::flatten),
2021        };
2022        Ok(Some(result))
2023    }
2024
2025    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
2026        &self,
2027        s: &mut S::SerializeStruct,
2028    ) -> Result<(), S::Error> {
2029        use serde::ser::SerializeStruct;
2030        s.serialize_field("path", &self.path)?;
2031        #[allow(deprecated)]
2032        if self.short_url {
2033            s.serialize_field("short_url", &self.short_url)?;
2034        }
2035        if let Some(val) = &self.pending_upload {
2036            s.serialize_field("pending_upload", val)?;
2037        }
2038        Ok(())
2039    }
2040}
2041
2042impl<'de> ::serde::de::Deserialize<'de> for CreateSharedLinkArg {
2043    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2044        // struct deserializer
2045        use serde::de::{MapAccess, Visitor};
2046        struct StructVisitor;
2047        impl<'de> Visitor<'de> for StructVisitor {
2048            type Value = CreateSharedLinkArg;
2049            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
2050                f.write_str("a CreateSharedLinkArg struct")
2051            }
2052            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
2053                CreateSharedLinkArg::internal_deserialize(map)
2054            }
2055        }
2056        deserializer.deserialize_struct("CreateSharedLinkArg", CREATE_SHARED_LINK_ARG_FIELDS, StructVisitor)
2057    }
2058}
2059
2060impl ::serde::ser::Serialize for CreateSharedLinkArg {
2061    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
2062        // struct serializer
2063        use serde::ser::SerializeStruct;
2064        let mut s = serializer.serialize_struct("CreateSharedLinkArg", 3)?;
2065        self.internal_serialize::<S>(&mut s)?;
2066        s.end()
2067    }
2068}
2069
2070#[derive(Debug, Clone, PartialEq, Eq)]
2071#[non_exhaustive] // variants may be added in the future
2072pub enum CreateSharedLinkError {
2073    Path(crate::types::files::LookupError),
2074    /// Catch-all used for unrecognized values returned from the server. Encountering this value
2075    /// typically indicates that this SDK version is out of date.
2076    Other,
2077}
2078
2079impl<'de> ::serde::de::Deserialize<'de> for CreateSharedLinkError {
2080    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2081        // union deserializer
2082        use serde::de::{self, MapAccess, Visitor};
2083        struct EnumVisitor;
2084        impl<'de> Visitor<'de> for EnumVisitor {
2085            type Value = CreateSharedLinkError;
2086            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
2087                f.write_str("a CreateSharedLinkError structure")
2088            }
2089            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
2090                let tag: &str = match map.next_key()? {
2091                    Some(".tag") => map.next_value()?,
2092                    _ => return Err(de::Error::missing_field(".tag"))
2093                };
2094                let value = match tag {
2095                    "path" => {
2096                        match map.next_key()? {
2097                            Some("path") => CreateSharedLinkError::Path(map.next_value()?),
2098                            None => return Err(de::Error::missing_field("path")),
2099                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
2100                        }
2101                    }
2102                    _ => CreateSharedLinkError::Other,
2103                };
2104                crate::eat_json_fields(&mut map)?;
2105                Ok(value)
2106            }
2107        }
2108        const VARIANTS: &[&str] = &["path",
2109                                    "other"];
2110        deserializer.deserialize_struct("CreateSharedLinkError", VARIANTS, EnumVisitor)
2111    }
2112}
2113
2114impl ::serde::ser::Serialize for CreateSharedLinkError {
2115    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
2116        // union serializer
2117        use serde::ser::SerializeStruct;
2118        match self {
2119            CreateSharedLinkError::Path(x) => {
2120                // union or polymporphic struct
2121                let mut s = serializer.serialize_struct("CreateSharedLinkError", 2)?;
2122                s.serialize_field(".tag", "path")?;
2123                s.serialize_field("path", x)?;
2124                s.end()
2125            }
2126            CreateSharedLinkError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
2127        }
2128    }
2129}
2130
2131impl ::std::error::Error for CreateSharedLinkError {
2132    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
2133        match self {
2134            CreateSharedLinkError::Path(inner) => Some(inner),
2135            _ => None,
2136        }
2137    }
2138}
2139
2140impl ::std::fmt::Display for CreateSharedLinkError {
2141    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
2142        match self {
2143            CreateSharedLinkError::Path(inner) => write!(f, "CreateSharedLinkError: {}", inner),
2144            _ => write!(f, "{:?}", *self),
2145        }
2146    }
2147}
2148
2149#[derive(Debug, Clone, PartialEq, Eq)]
2150#[non_exhaustive] // structs may have more fields added in the future.
2151pub struct CreateSharedLinkWithSettingsArg {
2152    /// The path to be shared by the shared link.
2153    pub path: ReadPath,
2154    /// The requested settings for the newly created shared link.
2155    pub settings: Option<SharedLinkSettings>,
2156}
2157
2158impl CreateSharedLinkWithSettingsArg {
2159    pub fn new(path: ReadPath) -> Self {
2160        CreateSharedLinkWithSettingsArg {
2161            path,
2162            settings: None,
2163        }
2164    }
2165
2166    pub fn with_settings(mut self, value: SharedLinkSettings) -> Self {
2167        self.settings = Some(value);
2168        self
2169    }
2170}
2171
2172const CREATE_SHARED_LINK_WITH_SETTINGS_ARG_FIELDS: &[&str] = &["path",
2173                                                               "settings"];
2174impl CreateSharedLinkWithSettingsArg {
2175    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
2176        map: V,
2177    ) -> Result<CreateSharedLinkWithSettingsArg, V::Error> {
2178        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
2179    }
2180
2181    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
2182        mut map: V,
2183        optional: bool,
2184    ) -> Result<Option<CreateSharedLinkWithSettingsArg>, V::Error> {
2185        let mut field_path = None;
2186        let mut field_settings = None;
2187        let mut nothing = true;
2188        while let Some(key) = map.next_key::<&str>()? {
2189            nothing = false;
2190            match key {
2191                "path" => {
2192                    if field_path.is_some() {
2193                        return Err(::serde::de::Error::duplicate_field("path"));
2194                    }
2195                    field_path = Some(map.next_value()?);
2196                }
2197                "settings" => {
2198                    if field_settings.is_some() {
2199                        return Err(::serde::de::Error::duplicate_field("settings"));
2200                    }
2201                    field_settings = Some(map.next_value()?);
2202                }
2203                _ => {
2204                    // unknown field allowed and ignored
2205                    map.next_value::<::serde_json::Value>()?;
2206                }
2207            }
2208        }
2209        if optional && nothing {
2210            return Ok(None);
2211        }
2212        let result = CreateSharedLinkWithSettingsArg {
2213            path: field_path.ok_or_else(|| ::serde::de::Error::missing_field("path"))?,
2214            settings: field_settings.and_then(Option::flatten),
2215        };
2216        Ok(Some(result))
2217    }
2218
2219    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
2220        &self,
2221        s: &mut S::SerializeStruct,
2222    ) -> Result<(), S::Error> {
2223        use serde::ser::SerializeStruct;
2224        s.serialize_field("path", &self.path)?;
2225        if let Some(val) = &self.settings {
2226            s.serialize_field("settings", val)?;
2227        }
2228        Ok(())
2229    }
2230}
2231
2232impl<'de> ::serde::de::Deserialize<'de> for CreateSharedLinkWithSettingsArg {
2233    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2234        // struct deserializer
2235        use serde::de::{MapAccess, Visitor};
2236        struct StructVisitor;
2237        impl<'de> Visitor<'de> for StructVisitor {
2238            type Value = CreateSharedLinkWithSettingsArg;
2239            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
2240                f.write_str("a CreateSharedLinkWithSettingsArg struct")
2241            }
2242            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
2243                CreateSharedLinkWithSettingsArg::internal_deserialize(map)
2244            }
2245        }
2246        deserializer.deserialize_struct("CreateSharedLinkWithSettingsArg", CREATE_SHARED_LINK_WITH_SETTINGS_ARG_FIELDS, StructVisitor)
2247    }
2248}
2249
2250impl ::serde::ser::Serialize for CreateSharedLinkWithSettingsArg {
2251    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
2252        // struct serializer
2253        use serde::ser::SerializeStruct;
2254        let mut s = serializer.serialize_struct("CreateSharedLinkWithSettingsArg", 2)?;
2255        self.internal_serialize::<S>(&mut s)?;
2256        s.end()
2257    }
2258}
2259
2260#[derive(Debug, Clone, PartialEq, Eq)]
2261pub enum CreateSharedLinkWithSettingsError {
2262    Path(crate::types::files::LookupError),
2263    /// This user's email address is not verified. This functionality is only available on accounts
2264    /// with a verified email address. Users can verify their email address
2265    /// [here](https://www.dropbox.com/help/317).
2266    EmailNotVerified,
2267    /// The shared link already exists. You can call
2268    /// [`list_shared_links()`](crate::sharing::list_shared_links) to get the existing link, or use
2269    /// the provided metadata if it is returned. Existing link metadata will not be returned if
2270    /// custom settings were specified in the request that could make the existing link incompatible
2271    /// with the requested settings.
2272    SharedLinkAlreadyExists(Option<SharedLinkAlreadyExistsMetadata>),
2273    /// There is an error with the given settings.
2274    SettingsError(SharedLinkSettingsError),
2275    /// The user is not allowed to create a shared link to the specified file. For example, this can
2276    /// occur if the file is restricted or if the user's links are
2277    /// [banned](https://help.dropbox.com/files-folders/share/banned-links).
2278    AccessDenied,
2279    /// The current user has been
2280    /// [banned](https://help.dropbox.com/files-folders/share/banned-links) for abuse reasons.
2281    BannedMember,
2282    /// Your Dropbox folder will have too many shared folders after the operation.
2283    /// https://help.dropbox.com/share/shared-folder-faq#Is-there-a-limit-to-the-number-of-shared-folders-I-can-create
2284    TooManySharedFolders,
2285}
2286
2287impl<'de> ::serde::de::Deserialize<'de> for CreateSharedLinkWithSettingsError {
2288    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2289        // union deserializer
2290        use serde::de::{self, MapAccess, Visitor};
2291        struct EnumVisitor;
2292        impl<'de> Visitor<'de> for EnumVisitor {
2293            type Value = CreateSharedLinkWithSettingsError;
2294            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
2295                f.write_str("a CreateSharedLinkWithSettingsError structure")
2296            }
2297            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
2298                let tag: &str = match map.next_key()? {
2299                    Some(".tag") => map.next_value()?,
2300                    _ => return Err(de::Error::missing_field(".tag"))
2301                };
2302                let value = match tag {
2303                    "path" => {
2304                        match map.next_key()? {
2305                            Some("path") => CreateSharedLinkWithSettingsError::Path(map.next_value()?),
2306                            None => return Err(de::Error::missing_field("path")),
2307                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
2308                        }
2309                    }
2310                    "email_not_verified" => CreateSharedLinkWithSettingsError::EmailNotVerified,
2311                    "shared_link_already_exists" => {
2312                        match map.next_key()? {
2313                            Some("shared_link_already_exists") => CreateSharedLinkWithSettingsError::SharedLinkAlreadyExists(map.next_value()?),
2314                            None => CreateSharedLinkWithSettingsError::SharedLinkAlreadyExists(None),
2315                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
2316                        }
2317                    }
2318                    "settings_error" => {
2319                        match map.next_key()? {
2320                            Some("settings_error") => CreateSharedLinkWithSettingsError::SettingsError(map.next_value()?),
2321                            None => return Err(de::Error::missing_field("settings_error")),
2322                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
2323                        }
2324                    }
2325                    "access_denied" => CreateSharedLinkWithSettingsError::AccessDenied,
2326                    "banned_member" => CreateSharedLinkWithSettingsError::BannedMember,
2327                    "too_many_shared_folders" => CreateSharedLinkWithSettingsError::TooManySharedFolders,
2328                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
2329                };
2330                crate::eat_json_fields(&mut map)?;
2331                Ok(value)
2332            }
2333        }
2334        const VARIANTS: &[&str] = &["path",
2335                                    "email_not_verified",
2336                                    "shared_link_already_exists",
2337                                    "settings_error",
2338                                    "access_denied",
2339                                    "banned_member",
2340                                    "too_many_shared_folders"];
2341        deserializer.deserialize_struct("CreateSharedLinkWithSettingsError", VARIANTS, EnumVisitor)
2342    }
2343}
2344
2345impl ::serde::ser::Serialize for CreateSharedLinkWithSettingsError {
2346    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
2347        // union serializer
2348        use serde::ser::SerializeStruct;
2349        match self {
2350            CreateSharedLinkWithSettingsError::Path(x) => {
2351                // union or polymporphic struct
2352                let mut s = serializer.serialize_struct("CreateSharedLinkWithSettingsError", 2)?;
2353                s.serialize_field(".tag", "path")?;
2354                s.serialize_field("path", x)?;
2355                s.end()
2356            }
2357            CreateSharedLinkWithSettingsError::EmailNotVerified => {
2358                // unit
2359                let mut s = serializer.serialize_struct("CreateSharedLinkWithSettingsError", 1)?;
2360                s.serialize_field(".tag", "email_not_verified")?;
2361                s.end()
2362            }
2363            CreateSharedLinkWithSettingsError::SharedLinkAlreadyExists(x) => {
2364                // union or polymporphic struct
2365                let mut s = serializer.serialize_struct("CreateSharedLinkWithSettingsError", 2)?;
2366                s.serialize_field(".tag", "shared_link_already_exists")?;
2367                s.serialize_field("shared_link_already_exists", x)?;
2368                s.end()
2369            }
2370            CreateSharedLinkWithSettingsError::SettingsError(x) => {
2371                // union or polymporphic struct
2372                let mut s = serializer.serialize_struct("CreateSharedLinkWithSettingsError", 2)?;
2373                s.serialize_field(".tag", "settings_error")?;
2374                s.serialize_field("settings_error", x)?;
2375                s.end()
2376            }
2377            CreateSharedLinkWithSettingsError::AccessDenied => {
2378                // unit
2379                let mut s = serializer.serialize_struct("CreateSharedLinkWithSettingsError", 1)?;
2380                s.serialize_field(".tag", "access_denied")?;
2381                s.end()
2382            }
2383            CreateSharedLinkWithSettingsError::BannedMember => {
2384                // unit
2385                let mut s = serializer.serialize_struct("CreateSharedLinkWithSettingsError", 1)?;
2386                s.serialize_field(".tag", "banned_member")?;
2387                s.end()
2388            }
2389            CreateSharedLinkWithSettingsError::TooManySharedFolders => {
2390                // unit
2391                let mut s = serializer.serialize_struct("CreateSharedLinkWithSettingsError", 1)?;
2392                s.serialize_field(".tag", "too_many_shared_folders")?;
2393                s.end()
2394            }
2395        }
2396    }
2397}
2398
2399impl ::std::error::Error for CreateSharedLinkWithSettingsError {
2400    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
2401        match self {
2402            CreateSharedLinkWithSettingsError::Path(inner) => Some(inner),
2403            CreateSharedLinkWithSettingsError::SettingsError(inner) => Some(inner),
2404            _ => None,
2405        }
2406    }
2407}
2408
2409impl ::std::fmt::Display for CreateSharedLinkWithSettingsError {
2410    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
2411        match self {
2412            CreateSharedLinkWithSettingsError::Path(inner) => write!(f, "CreateSharedLinkWithSettingsError: {}", inner),
2413            CreateSharedLinkWithSettingsError::SharedLinkAlreadyExists(None) => f.write_str("shared_link_already_exists"),
2414            CreateSharedLinkWithSettingsError::SharedLinkAlreadyExists(Some(inner)) => write!(f, "shared_link_already_exists: {:?}", inner),
2415            CreateSharedLinkWithSettingsError::SettingsError(inner) => write!(f, "There is an error with the given settings: {}", inner),
2416            CreateSharedLinkWithSettingsError::TooManySharedFolders => f.write_str("Your Dropbox folder will have too many shared folders after the operation. https://help.dropbox.com/share/shared-folder-faq#Is-there-a-limit-to-the-number-of-shared-folders-I-can-create"),
2417            _ => write!(f, "{:?}", *self),
2418        }
2419    }
2420}
2421
2422/// The expected metadata of a shared link for a file or folder when a link is first created for the
2423/// content. Absent if the link already exists.
2424#[derive(Debug, Clone, PartialEq, Eq)]
2425#[non_exhaustive] // structs may have more fields added in the future.
2426pub struct ExpectedSharedContentLinkMetadata {
2427    /// The audience options that are available for the content. Some audience options may be
2428    /// unavailable. For example, team_only may be unavailable if the content is not owned by a user
2429    /// on a team. The 'default' audience option is always available if the user can modify link
2430    /// settings.
2431    pub audience_options: Vec<LinkAudience>,
2432    /// The current audience of the link.
2433    pub current_audience: LinkAudience,
2434    /// A list of permissions for actions you can perform on the link.
2435    pub link_permissions: Vec<LinkPermission>,
2436    /// Whether the link is protected by a password.
2437    pub password_protected: bool,
2438    /// The access level on the link for this file.
2439    pub access_level: Option<AccessLevel>,
2440    /// The shared folder that prevents the link audience for this link from being more restrictive.
2441    pub audience_restricting_shared_folder: Option<AudienceRestrictingSharedFolder>,
2442    /// Whether the link has an expiry set on it. A link with an expiry will have its audience
2443    /// changed to members when the expiry is reached.
2444    pub expiry: Option<crate::types::common::DropboxTimestamp>,
2445}
2446
2447impl ExpectedSharedContentLinkMetadata {
2448    pub fn new(
2449        audience_options: Vec<LinkAudience>,
2450        current_audience: LinkAudience,
2451        link_permissions: Vec<LinkPermission>,
2452        password_protected: bool,
2453    ) -> Self {
2454        ExpectedSharedContentLinkMetadata {
2455            audience_options,
2456            current_audience,
2457            link_permissions,
2458            password_protected,
2459            access_level: None,
2460            audience_restricting_shared_folder: None,
2461            expiry: None,
2462        }
2463    }
2464
2465    pub fn with_access_level(mut self, value: AccessLevel) -> Self {
2466        self.access_level = Some(value);
2467        self
2468    }
2469
2470    pub fn with_audience_restricting_shared_folder(
2471        mut self,
2472        value: AudienceRestrictingSharedFolder,
2473    ) -> Self {
2474        self.audience_restricting_shared_folder = Some(value);
2475        self
2476    }
2477
2478    pub fn with_expiry(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
2479        self.expiry = Some(value);
2480        self
2481    }
2482}
2483
2484const EXPECTED_SHARED_CONTENT_LINK_METADATA_FIELDS: &[&str] = &["audience_options",
2485                                                                "current_audience",
2486                                                                "link_permissions",
2487                                                                "password_protected",
2488                                                                "access_level",
2489                                                                "audience_restricting_shared_folder",
2490                                                                "expiry"];
2491impl ExpectedSharedContentLinkMetadata {
2492    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
2493        map: V,
2494    ) -> Result<ExpectedSharedContentLinkMetadata, V::Error> {
2495        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
2496    }
2497
2498    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
2499        mut map: V,
2500        optional: bool,
2501    ) -> Result<Option<ExpectedSharedContentLinkMetadata>, V::Error> {
2502        let mut field_audience_options = None;
2503        let mut field_current_audience = None;
2504        let mut field_link_permissions = None;
2505        let mut field_password_protected = None;
2506        let mut field_access_level = None;
2507        let mut field_audience_restricting_shared_folder = None;
2508        let mut field_expiry = None;
2509        let mut nothing = true;
2510        while let Some(key) = map.next_key::<&str>()? {
2511            nothing = false;
2512            match key {
2513                "audience_options" => {
2514                    if field_audience_options.is_some() {
2515                        return Err(::serde::de::Error::duplicate_field("audience_options"));
2516                    }
2517                    field_audience_options = Some(map.next_value()?);
2518                }
2519                "current_audience" => {
2520                    if field_current_audience.is_some() {
2521                        return Err(::serde::de::Error::duplicate_field("current_audience"));
2522                    }
2523                    field_current_audience = Some(map.next_value()?);
2524                }
2525                "link_permissions" => {
2526                    if field_link_permissions.is_some() {
2527                        return Err(::serde::de::Error::duplicate_field("link_permissions"));
2528                    }
2529                    field_link_permissions = Some(map.next_value()?);
2530                }
2531                "password_protected" => {
2532                    if field_password_protected.is_some() {
2533                        return Err(::serde::de::Error::duplicate_field("password_protected"));
2534                    }
2535                    field_password_protected = Some(map.next_value()?);
2536                }
2537                "access_level" => {
2538                    if field_access_level.is_some() {
2539                        return Err(::serde::de::Error::duplicate_field("access_level"));
2540                    }
2541                    field_access_level = Some(map.next_value()?);
2542                }
2543                "audience_restricting_shared_folder" => {
2544                    if field_audience_restricting_shared_folder.is_some() {
2545                        return Err(::serde::de::Error::duplicate_field("audience_restricting_shared_folder"));
2546                    }
2547                    field_audience_restricting_shared_folder = Some(map.next_value()?);
2548                }
2549                "expiry" => {
2550                    if field_expiry.is_some() {
2551                        return Err(::serde::de::Error::duplicate_field("expiry"));
2552                    }
2553                    field_expiry = Some(map.next_value()?);
2554                }
2555                _ => {
2556                    // unknown field allowed and ignored
2557                    map.next_value::<::serde_json::Value>()?;
2558                }
2559            }
2560        }
2561        if optional && nothing {
2562            return Ok(None);
2563        }
2564        let result = ExpectedSharedContentLinkMetadata {
2565            audience_options: field_audience_options.ok_or_else(|| ::serde::de::Error::missing_field("audience_options"))?,
2566            current_audience: field_current_audience.ok_or_else(|| ::serde::de::Error::missing_field("current_audience"))?,
2567            link_permissions: field_link_permissions.ok_or_else(|| ::serde::de::Error::missing_field("link_permissions"))?,
2568            password_protected: field_password_protected.ok_or_else(|| ::serde::de::Error::missing_field("password_protected"))?,
2569            access_level: field_access_level.and_then(Option::flatten),
2570            audience_restricting_shared_folder: field_audience_restricting_shared_folder.and_then(Option::flatten),
2571            expiry: field_expiry.and_then(Option::flatten),
2572        };
2573        Ok(Some(result))
2574    }
2575
2576    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
2577        &self,
2578        s: &mut S::SerializeStruct,
2579    ) -> Result<(), S::Error> {
2580        use serde::ser::SerializeStruct;
2581        s.serialize_field("audience_options", &self.audience_options)?;
2582        s.serialize_field("current_audience", &self.current_audience)?;
2583        s.serialize_field("link_permissions", &self.link_permissions)?;
2584        s.serialize_field("password_protected", &self.password_protected)?;
2585        if let Some(val) = &self.access_level {
2586            s.serialize_field("access_level", val)?;
2587        }
2588        if let Some(val) = &self.audience_restricting_shared_folder {
2589            s.serialize_field("audience_restricting_shared_folder", val)?;
2590        }
2591        if let Some(val) = &self.expiry {
2592            s.serialize_field("expiry", val)?;
2593        }
2594        Ok(())
2595    }
2596}
2597
2598impl<'de> ::serde::de::Deserialize<'de> for ExpectedSharedContentLinkMetadata {
2599    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2600        // struct deserializer
2601        use serde::de::{MapAccess, Visitor};
2602        struct StructVisitor;
2603        impl<'de> Visitor<'de> for StructVisitor {
2604            type Value = ExpectedSharedContentLinkMetadata;
2605            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
2606                f.write_str("a ExpectedSharedContentLinkMetadata struct")
2607            }
2608            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
2609                ExpectedSharedContentLinkMetadata::internal_deserialize(map)
2610            }
2611        }
2612        deserializer.deserialize_struct("ExpectedSharedContentLinkMetadata", EXPECTED_SHARED_CONTENT_LINK_METADATA_FIELDS, StructVisitor)
2613    }
2614}
2615
2616impl ::serde::ser::Serialize for ExpectedSharedContentLinkMetadata {
2617    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
2618        // struct serializer
2619        use serde::ser::SerializeStruct;
2620        let mut s = serializer.serialize_struct("ExpectedSharedContentLinkMetadata", 7)?;
2621        self.internal_serialize::<S>(&mut s)?;
2622        s.end()
2623    }
2624}
2625
2626// struct extends SharedContentLinkMetadataBase
2627impl From<ExpectedSharedContentLinkMetadata> for SharedContentLinkMetadataBase {
2628    fn from(subtype: ExpectedSharedContentLinkMetadata) -> Self {
2629        Self {
2630            audience_options: subtype.audience_options,
2631            current_audience: subtype.current_audience,
2632            link_permissions: subtype.link_permissions,
2633            password_protected: subtype.password_protected,
2634            access_level: subtype.access_level,
2635            audience_restricting_shared_folder: subtype.audience_restricting_shared_folder,
2636            expiry: subtype.expiry,
2637        }
2638    }
2639}
2640/// Sharing actions that may be taken on files.
2641#[derive(Debug, Clone, PartialEq, Eq)]
2642#[non_exhaustive] // variants may be added in the future
2643pub enum FileAction {
2644    /// Disable viewer information on the file.
2645    DisableViewerInfo,
2646    /// Change or edit contents of the file.
2647    EditContents,
2648    /// Enable viewer information on the file.
2649    EnableViewerInfo,
2650    /// Add a member with view permissions.
2651    InviteViewer,
2652    /// Add a member with view permissions but no comment permissions.
2653    InviteViewerNoComment,
2654    /// Add a member with edit permissions.
2655    InviteEditor,
2656    /// Stop sharing this file.
2657    Unshare,
2658    /// Relinquish one's own membership to the file.
2659    RelinquishMembership,
2660    /// Field is deprecated. Use create_view_link and create_edit_link instead.
2661    #[deprecated]
2662    ShareLink,
2663    /// Field is deprecated. Use create_view_link and create_edit_link instead.
2664    #[deprecated]
2665    CreateLink,
2666    /// Create a shared link to a file that only allows users to view the content.
2667    CreateViewLink,
2668    /// Create a shared link to a file that allows users to edit the content.
2669    CreateEditLink,
2670    /// Catch-all used for unrecognized values returned from the server. Encountering this value
2671    /// typically indicates that this SDK version is out of date.
2672    Other,
2673}
2674
2675impl<'de> ::serde::de::Deserialize<'de> for FileAction {
2676    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2677        // union deserializer
2678        use serde::de::{self, MapAccess, Visitor};
2679        struct EnumVisitor;
2680        impl<'de> Visitor<'de> for EnumVisitor {
2681            type Value = FileAction;
2682            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
2683                f.write_str("a FileAction structure")
2684            }
2685            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
2686                let tag: &str = match map.next_key()? {
2687                    Some(".tag") => map.next_value()?,
2688                    _ => return Err(de::Error::missing_field(".tag"))
2689                };
2690                let value = match tag {
2691                    "disable_viewer_info" => FileAction::DisableViewerInfo,
2692                    "edit_contents" => FileAction::EditContents,
2693                    "enable_viewer_info" => FileAction::EnableViewerInfo,
2694                    "invite_viewer" => FileAction::InviteViewer,
2695                    "invite_viewer_no_comment" => FileAction::InviteViewerNoComment,
2696                    "invite_editor" => FileAction::InviteEditor,
2697                    "unshare" => FileAction::Unshare,
2698                    "relinquish_membership" => FileAction::RelinquishMembership,
2699                    #[allow(deprecated)]
2700                    "share_link" => FileAction::ShareLink,
2701                    #[allow(deprecated)]
2702                    "create_link" => FileAction::CreateLink,
2703                    "create_view_link" => FileAction::CreateViewLink,
2704                    "create_edit_link" => FileAction::CreateEditLink,
2705                    _ => FileAction::Other,
2706                };
2707                crate::eat_json_fields(&mut map)?;
2708                Ok(value)
2709            }
2710        }
2711        const VARIANTS: &[&str] = &["disable_viewer_info",
2712                                    "edit_contents",
2713                                    "enable_viewer_info",
2714                                    "invite_viewer",
2715                                    "invite_viewer_no_comment",
2716                                    "invite_editor",
2717                                    "unshare",
2718                                    "relinquish_membership",
2719                                    "share_link",
2720                                    "create_link",
2721                                    "create_view_link",
2722                                    "create_edit_link",
2723                                    "other"];
2724        deserializer.deserialize_struct("FileAction", VARIANTS, EnumVisitor)
2725    }
2726}
2727
2728impl ::serde::ser::Serialize for FileAction {
2729    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
2730        // union serializer
2731        use serde::ser::SerializeStruct;
2732        match self {
2733            FileAction::DisableViewerInfo => {
2734                // unit
2735                let mut s = serializer.serialize_struct("FileAction", 1)?;
2736                s.serialize_field(".tag", "disable_viewer_info")?;
2737                s.end()
2738            }
2739            FileAction::EditContents => {
2740                // unit
2741                let mut s = serializer.serialize_struct("FileAction", 1)?;
2742                s.serialize_field(".tag", "edit_contents")?;
2743                s.end()
2744            }
2745            FileAction::EnableViewerInfo => {
2746                // unit
2747                let mut s = serializer.serialize_struct("FileAction", 1)?;
2748                s.serialize_field(".tag", "enable_viewer_info")?;
2749                s.end()
2750            }
2751            FileAction::InviteViewer => {
2752                // unit
2753                let mut s = serializer.serialize_struct("FileAction", 1)?;
2754                s.serialize_field(".tag", "invite_viewer")?;
2755                s.end()
2756            }
2757            FileAction::InviteViewerNoComment => {
2758                // unit
2759                let mut s = serializer.serialize_struct("FileAction", 1)?;
2760                s.serialize_field(".tag", "invite_viewer_no_comment")?;
2761                s.end()
2762            }
2763            FileAction::InviteEditor => {
2764                // unit
2765                let mut s = serializer.serialize_struct("FileAction", 1)?;
2766                s.serialize_field(".tag", "invite_editor")?;
2767                s.end()
2768            }
2769            FileAction::Unshare => {
2770                // unit
2771                let mut s = serializer.serialize_struct("FileAction", 1)?;
2772                s.serialize_field(".tag", "unshare")?;
2773                s.end()
2774            }
2775            FileAction::RelinquishMembership => {
2776                // unit
2777                let mut s = serializer.serialize_struct("FileAction", 1)?;
2778                s.serialize_field(".tag", "relinquish_membership")?;
2779                s.end()
2780            }
2781            #[allow(deprecated)]
2782            FileAction::ShareLink => {
2783                // unit
2784                let mut s = serializer.serialize_struct("FileAction", 1)?;
2785                s.serialize_field(".tag", "share_link")?;
2786                s.end()
2787            }
2788            #[allow(deprecated)]
2789            FileAction::CreateLink => {
2790                // unit
2791                let mut s = serializer.serialize_struct("FileAction", 1)?;
2792                s.serialize_field(".tag", "create_link")?;
2793                s.end()
2794            }
2795            FileAction::CreateViewLink => {
2796                // unit
2797                let mut s = serializer.serialize_struct("FileAction", 1)?;
2798                s.serialize_field(".tag", "create_view_link")?;
2799                s.end()
2800            }
2801            FileAction::CreateEditLink => {
2802                // unit
2803                let mut s = serializer.serialize_struct("FileAction", 1)?;
2804                s.serialize_field(".tag", "create_edit_link")?;
2805                s.end()
2806            }
2807            FileAction::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
2808        }
2809    }
2810}
2811
2812#[derive(Debug, Clone, PartialEq, Eq)]
2813#[non_exhaustive] // variants may be added in the future
2814pub enum FileErrorResult {
2815    /// File specified by id was not found.
2816    FileNotFoundError(crate::types::files::Id),
2817    /// User does not have permission to take the specified action on the file.
2818    InvalidFileActionError(crate::types::files::Id),
2819    /// User does not have permission to access file specified by file.Id.
2820    PermissionDeniedError(crate::types::files::Id),
2821    /// Catch-all used for unrecognized values returned from the server. Encountering this value
2822    /// typically indicates that this SDK version is out of date.
2823    Other,
2824}
2825
2826impl<'de> ::serde::de::Deserialize<'de> for FileErrorResult {
2827    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2828        // union deserializer
2829        use serde::de::{self, MapAccess, Visitor};
2830        struct EnumVisitor;
2831        impl<'de> Visitor<'de> for EnumVisitor {
2832            type Value = FileErrorResult;
2833            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
2834                f.write_str("a FileErrorResult structure")
2835            }
2836            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
2837                let tag: &str = match map.next_key()? {
2838                    Some(".tag") => map.next_value()?,
2839                    _ => return Err(de::Error::missing_field(".tag"))
2840                };
2841                let value = match tag {
2842                    "file_not_found_error" => {
2843                        match map.next_key()? {
2844                            Some("file_not_found_error") => FileErrorResult::FileNotFoundError(map.next_value()?),
2845                            None => return Err(de::Error::missing_field("file_not_found_error")),
2846                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
2847                        }
2848                    }
2849                    "invalid_file_action_error" => {
2850                        match map.next_key()? {
2851                            Some("invalid_file_action_error") => FileErrorResult::InvalidFileActionError(map.next_value()?),
2852                            None => return Err(de::Error::missing_field("invalid_file_action_error")),
2853                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
2854                        }
2855                    }
2856                    "permission_denied_error" => {
2857                        match map.next_key()? {
2858                            Some("permission_denied_error") => FileErrorResult::PermissionDeniedError(map.next_value()?),
2859                            None => return Err(de::Error::missing_field("permission_denied_error")),
2860                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
2861                        }
2862                    }
2863                    _ => FileErrorResult::Other,
2864                };
2865                crate::eat_json_fields(&mut map)?;
2866                Ok(value)
2867            }
2868        }
2869        const VARIANTS: &[&str] = &["file_not_found_error",
2870                                    "invalid_file_action_error",
2871                                    "permission_denied_error",
2872                                    "other"];
2873        deserializer.deserialize_struct("FileErrorResult", VARIANTS, EnumVisitor)
2874    }
2875}
2876
2877impl ::serde::ser::Serialize for FileErrorResult {
2878    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
2879        // union serializer
2880        use serde::ser::SerializeStruct;
2881        match self {
2882            FileErrorResult::FileNotFoundError(x) => {
2883                // primitive
2884                let mut s = serializer.serialize_struct("FileErrorResult", 2)?;
2885                s.serialize_field(".tag", "file_not_found_error")?;
2886                s.serialize_field("file_not_found_error", x)?;
2887                s.end()
2888            }
2889            FileErrorResult::InvalidFileActionError(x) => {
2890                // primitive
2891                let mut s = serializer.serialize_struct("FileErrorResult", 2)?;
2892                s.serialize_field(".tag", "invalid_file_action_error")?;
2893                s.serialize_field("invalid_file_action_error", x)?;
2894                s.end()
2895            }
2896            FileErrorResult::PermissionDeniedError(x) => {
2897                // primitive
2898                let mut s = serializer.serialize_struct("FileErrorResult", 2)?;
2899                s.serialize_field(".tag", "permission_denied_error")?;
2900                s.serialize_field("permission_denied_error", x)?;
2901                s.end()
2902            }
2903            FileErrorResult::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
2904        }
2905    }
2906}
2907
2908/// The metadata of a file shared link.
2909#[derive(Debug, Clone, PartialEq, Eq)]
2910#[non_exhaustive] // structs may have more fields added in the future.
2911pub struct FileLinkMetadata {
2912    /// URL of the shared link.
2913    pub url: String,
2914    /// The linked file name (including extension). This never contains a slash.
2915    pub name: String,
2916    /// The link's access permissions.
2917    pub link_permissions: LinkPermissions,
2918    /// The modification time set by the desktop client when the file was added to Dropbox. Since
2919    /// this time is not verified (the Dropbox server stores whatever the desktop client sends up),
2920    /// this should only be used for display purposes (such as sorting) and not, for example, to
2921    /// determine if a file has changed or not.
2922    pub client_modified: crate::types::common::DropboxTimestamp,
2923    /// The last time the file was modified on Dropbox.
2924    pub server_modified: crate::types::common::DropboxTimestamp,
2925    /// A unique identifier for the current revision of a file. This field is the same rev as
2926    /// elsewhere in the API and can be used to detect changes and avoid conflicts.
2927    pub rev: Rev,
2928    /// The file size in bytes.
2929    pub size: u64,
2930    /// A unique identifier for the linked file.
2931    pub id: Option<Id>,
2932    /// Expiration time, if set. By default the link won't expire.
2933    pub expires: Option<crate::types::common::DropboxTimestamp>,
2934    /// The lowercased full path in the user's Dropbox. This always starts with a slash. This field
2935    /// will only be present only if the linked file is in the authenticated user's dropbox and the
2936    /// user is the owner of the link.
2937    pub path_lower: Option<String>,
2938    /// The team membership information of the link's owner.  This field will only be present if the
2939    /// link's owner is a team member.
2940    pub team_member_info: Option<TeamMemberInfo>,
2941    /// The team information of the content's owner. This field will only be present if the
2942    /// content's owner is a team member and the content's owner team is different from the link's
2943    /// owner team.
2944    pub content_owner_team_info: Option<TeamInfo>,
2945}
2946
2947impl FileLinkMetadata {
2948    pub fn new(
2949        url: String,
2950        name: String,
2951        link_permissions: LinkPermissions,
2952        client_modified: crate::types::common::DropboxTimestamp,
2953        server_modified: crate::types::common::DropboxTimestamp,
2954        rev: Rev,
2955        size: u64,
2956    ) -> Self {
2957        FileLinkMetadata {
2958            url,
2959            name,
2960            link_permissions,
2961            client_modified,
2962            server_modified,
2963            rev,
2964            size,
2965            id: None,
2966            expires: None,
2967            path_lower: None,
2968            team_member_info: None,
2969            content_owner_team_info: None,
2970        }
2971    }
2972
2973    pub fn with_id(mut self, value: Id) -> Self {
2974        self.id = Some(value);
2975        self
2976    }
2977
2978    pub fn with_expires(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
2979        self.expires = Some(value);
2980        self
2981    }
2982
2983    pub fn with_path_lower(mut self, value: String) -> Self {
2984        self.path_lower = Some(value);
2985        self
2986    }
2987
2988    pub fn with_team_member_info(mut self, value: TeamMemberInfo) -> Self {
2989        self.team_member_info = Some(value);
2990        self
2991    }
2992
2993    pub fn with_content_owner_team_info(mut self, value: TeamInfo) -> Self {
2994        self.content_owner_team_info = Some(value);
2995        self
2996    }
2997}
2998
2999const FILE_LINK_METADATA_FIELDS: &[&str] = &["url",
3000                                             "name",
3001                                             "link_permissions",
3002                                             "client_modified",
3003                                             "server_modified",
3004                                             "rev",
3005                                             "size",
3006                                             "id",
3007                                             "expires",
3008                                             "path_lower",
3009                                             "team_member_info",
3010                                             "content_owner_team_info"];
3011impl FileLinkMetadata {
3012    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
3013        map: V,
3014    ) -> Result<FileLinkMetadata, V::Error> {
3015        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
3016    }
3017
3018    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
3019        mut map: V,
3020        optional: bool,
3021    ) -> Result<Option<FileLinkMetadata>, V::Error> {
3022        let mut field_url = None;
3023        let mut field_name = None;
3024        let mut field_link_permissions = None;
3025        let mut field_client_modified = None;
3026        let mut field_server_modified = None;
3027        let mut field_rev = None;
3028        let mut field_size = None;
3029        let mut field_id = None;
3030        let mut field_expires = None;
3031        let mut field_path_lower = None;
3032        let mut field_team_member_info = None;
3033        let mut field_content_owner_team_info = None;
3034        let mut nothing = true;
3035        while let Some(key) = map.next_key::<&str>()? {
3036            nothing = false;
3037            match key {
3038                "url" => {
3039                    if field_url.is_some() {
3040                        return Err(::serde::de::Error::duplicate_field("url"));
3041                    }
3042                    field_url = Some(map.next_value()?);
3043                }
3044                "name" => {
3045                    if field_name.is_some() {
3046                        return Err(::serde::de::Error::duplicate_field("name"));
3047                    }
3048                    field_name = Some(map.next_value()?);
3049                }
3050                "link_permissions" => {
3051                    if field_link_permissions.is_some() {
3052                        return Err(::serde::de::Error::duplicate_field("link_permissions"));
3053                    }
3054                    field_link_permissions = Some(map.next_value()?);
3055                }
3056                "client_modified" => {
3057                    if field_client_modified.is_some() {
3058                        return Err(::serde::de::Error::duplicate_field("client_modified"));
3059                    }
3060                    field_client_modified = Some(map.next_value()?);
3061                }
3062                "server_modified" => {
3063                    if field_server_modified.is_some() {
3064                        return Err(::serde::de::Error::duplicate_field("server_modified"));
3065                    }
3066                    field_server_modified = Some(map.next_value()?);
3067                }
3068                "rev" => {
3069                    if field_rev.is_some() {
3070                        return Err(::serde::de::Error::duplicate_field("rev"));
3071                    }
3072                    field_rev = Some(map.next_value()?);
3073                }
3074                "size" => {
3075                    if field_size.is_some() {
3076                        return Err(::serde::de::Error::duplicate_field("size"));
3077                    }
3078                    field_size = Some(map.next_value()?);
3079                }
3080                "id" => {
3081                    if field_id.is_some() {
3082                        return Err(::serde::de::Error::duplicate_field("id"));
3083                    }
3084                    field_id = Some(map.next_value()?);
3085                }
3086                "expires" => {
3087                    if field_expires.is_some() {
3088                        return Err(::serde::de::Error::duplicate_field("expires"));
3089                    }
3090                    field_expires = Some(map.next_value()?);
3091                }
3092                "path_lower" => {
3093                    if field_path_lower.is_some() {
3094                        return Err(::serde::de::Error::duplicate_field("path_lower"));
3095                    }
3096                    field_path_lower = Some(map.next_value()?);
3097                }
3098                "team_member_info" => {
3099                    if field_team_member_info.is_some() {
3100                        return Err(::serde::de::Error::duplicate_field("team_member_info"));
3101                    }
3102                    field_team_member_info = Some(map.next_value()?);
3103                }
3104                "content_owner_team_info" => {
3105                    if field_content_owner_team_info.is_some() {
3106                        return Err(::serde::de::Error::duplicate_field("content_owner_team_info"));
3107                    }
3108                    field_content_owner_team_info = Some(map.next_value()?);
3109                }
3110                _ => {
3111                    // unknown field allowed and ignored
3112                    map.next_value::<::serde_json::Value>()?;
3113                }
3114            }
3115        }
3116        if optional && nothing {
3117            return Ok(None);
3118        }
3119        let result = FileLinkMetadata {
3120            url: field_url.ok_or_else(|| ::serde::de::Error::missing_field("url"))?,
3121            name: field_name.ok_or_else(|| ::serde::de::Error::missing_field("name"))?,
3122            link_permissions: field_link_permissions.ok_or_else(|| ::serde::de::Error::missing_field("link_permissions"))?,
3123            client_modified: field_client_modified.ok_or_else(|| ::serde::de::Error::missing_field("client_modified"))?,
3124            server_modified: field_server_modified.ok_or_else(|| ::serde::de::Error::missing_field("server_modified"))?,
3125            rev: field_rev.ok_or_else(|| ::serde::de::Error::missing_field("rev"))?,
3126            size: field_size.ok_or_else(|| ::serde::de::Error::missing_field("size"))?,
3127            id: field_id.and_then(Option::flatten),
3128            expires: field_expires.and_then(Option::flatten),
3129            path_lower: field_path_lower.and_then(Option::flatten),
3130            team_member_info: field_team_member_info.and_then(Option::flatten),
3131            content_owner_team_info: field_content_owner_team_info.and_then(Option::flatten),
3132        };
3133        Ok(Some(result))
3134    }
3135
3136    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
3137        &self,
3138        s: &mut S::SerializeStruct,
3139    ) -> Result<(), S::Error> {
3140        use serde::ser::SerializeStruct;
3141        s.serialize_field("url", &self.url)?;
3142        s.serialize_field("name", &self.name)?;
3143        s.serialize_field("link_permissions", &self.link_permissions)?;
3144        s.serialize_field("client_modified", &self.client_modified)?;
3145        s.serialize_field("server_modified", &self.server_modified)?;
3146        s.serialize_field("rev", &self.rev)?;
3147        s.serialize_field("size", &self.size)?;
3148        if let Some(val) = &self.id {
3149            s.serialize_field("id", val)?;
3150        }
3151        if let Some(val) = &self.expires {
3152            s.serialize_field("expires", val)?;
3153        }
3154        if let Some(val) = &self.path_lower {
3155            s.serialize_field("path_lower", val)?;
3156        }
3157        if let Some(val) = &self.team_member_info {
3158            s.serialize_field("team_member_info", val)?;
3159        }
3160        if let Some(val) = &self.content_owner_team_info {
3161            s.serialize_field("content_owner_team_info", val)?;
3162        }
3163        Ok(())
3164    }
3165}
3166
3167impl<'de> ::serde::de::Deserialize<'de> for FileLinkMetadata {
3168    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3169        // struct deserializer
3170        use serde::de::{MapAccess, Visitor};
3171        struct StructVisitor;
3172        impl<'de> Visitor<'de> for StructVisitor {
3173            type Value = FileLinkMetadata;
3174            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
3175                f.write_str("a FileLinkMetadata struct")
3176            }
3177            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
3178                FileLinkMetadata::internal_deserialize(map)
3179            }
3180        }
3181        deserializer.deserialize_struct("FileLinkMetadata", FILE_LINK_METADATA_FIELDS, StructVisitor)
3182    }
3183}
3184
3185impl ::serde::ser::Serialize for FileLinkMetadata {
3186    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3187        // struct serializer
3188        use serde::ser::SerializeStruct;
3189        let mut s = serializer.serialize_struct("FileLinkMetadata", 12)?;
3190        self.internal_serialize::<S>(&mut s)?;
3191        s.end()
3192    }
3193}
3194
3195// struct extends polymorphic struct SharedLinkMetadata
3196impl From<FileLinkMetadata> for SharedLinkMetadata {
3197    fn from(subtype: FileLinkMetadata) -> Self {
3198        SharedLinkMetadata::File(subtype)
3199    }
3200}
3201#[derive(Debug, Clone, PartialEq, Eq)]
3202#[non_exhaustive] // variants may be added in the future
3203pub enum FileMemberActionError {
3204    /// Specified member was not found.
3205    InvalidMember,
3206    /// User does not have permission to perform this action on this member.
3207    NoPermission,
3208    /// Specified file was invalid or user does not have access.
3209    AccessError(SharingFileAccessError),
3210    /// The action cannot be completed because the target member does not have explicit access to
3211    /// the file. The return value is the access that the member has to the file from a parent
3212    /// folder.
3213    NoExplicitAccess(MemberAccessLevelResult),
3214    /// Catch-all used for unrecognized values returned from the server. Encountering this value
3215    /// typically indicates that this SDK version is out of date.
3216    Other,
3217}
3218
3219impl<'de> ::serde::de::Deserialize<'de> for FileMemberActionError {
3220    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3221        // union deserializer
3222        use serde::de::{self, MapAccess, Visitor};
3223        struct EnumVisitor;
3224        impl<'de> Visitor<'de> for EnumVisitor {
3225            type Value = FileMemberActionError;
3226            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
3227                f.write_str("a FileMemberActionError structure")
3228            }
3229            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
3230                let tag: &str = match map.next_key()? {
3231                    Some(".tag") => map.next_value()?,
3232                    _ => return Err(de::Error::missing_field(".tag"))
3233                };
3234                let value = match tag {
3235                    "invalid_member" => FileMemberActionError::InvalidMember,
3236                    "no_permission" => FileMemberActionError::NoPermission,
3237                    "access_error" => {
3238                        match map.next_key()? {
3239                            Some("access_error") => FileMemberActionError::AccessError(map.next_value()?),
3240                            None => return Err(de::Error::missing_field("access_error")),
3241                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
3242                        }
3243                    }
3244                    "no_explicit_access" => FileMemberActionError::NoExplicitAccess(MemberAccessLevelResult::internal_deserialize(&mut map)?),
3245                    _ => FileMemberActionError::Other,
3246                };
3247                crate::eat_json_fields(&mut map)?;
3248                Ok(value)
3249            }
3250        }
3251        const VARIANTS: &[&str] = &["invalid_member",
3252                                    "no_permission",
3253                                    "access_error",
3254                                    "no_explicit_access",
3255                                    "other"];
3256        deserializer.deserialize_struct("FileMemberActionError", VARIANTS, EnumVisitor)
3257    }
3258}
3259
3260impl ::serde::ser::Serialize for FileMemberActionError {
3261    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3262        // union serializer
3263        use serde::ser::SerializeStruct;
3264        match self {
3265            FileMemberActionError::InvalidMember => {
3266                // unit
3267                let mut s = serializer.serialize_struct("FileMemberActionError", 1)?;
3268                s.serialize_field(".tag", "invalid_member")?;
3269                s.end()
3270            }
3271            FileMemberActionError::NoPermission => {
3272                // unit
3273                let mut s = serializer.serialize_struct("FileMemberActionError", 1)?;
3274                s.serialize_field(".tag", "no_permission")?;
3275                s.end()
3276            }
3277            FileMemberActionError::AccessError(x) => {
3278                // union or polymporphic struct
3279                let mut s = serializer.serialize_struct("FileMemberActionError", 2)?;
3280                s.serialize_field(".tag", "access_error")?;
3281                s.serialize_field("access_error", x)?;
3282                s.end()
3283            }
3284            FileMemberActionError::NoExplicitAccess(x) => {
3285                // struct
3286                let mut s = serializer.serialize_struct("FileMemberActionError", 4)?;
3287                s.serialize_field(".tag", "no_explicit_access")?;
3288                x.internal_serialize::<S>(&mut s)?;
3289                s.end()
3290            }
3291            FileMemberActionError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
3292        }
3293    }
3294}
3295
3296impl ::std::error::Error for FileMemberActionError {
3297    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
3298        match self {
3299            FileMemberActionError::AccessError(inner) => Some(inner),
3300            _ => None,
3301        }
3302    }
3303}
3304
3305impl ::std::fmt::Display for FileMemberActionError {
3306    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
3307        match self {
3308            FileMemberActionError::InvalidMember => f.write_str("Specified member was not found."),
3309            FileMemberActionError::NoPermission => f.write_str("User does not have permission to perform this action on this member."),
3310            FileMemberActionError::AccessError(inner) => write!(f, "Specified file was invalid or user does not have access: {}", inner),
3311            FileMemberActionError::NoExplicitAccess(inner) => write!(f, "The action cannot be completed because the target member does not have explicit access to the file. The return value is the access that the member has to the file from a parent folder: {:?}", inner),
3312            _ => write!(f, "{:?}", *self),
3313        }
3314    }
3315}
3316
3317#[derive(Debug, Clone, PartialEq, Eq)]
3318pub enum FileMemberActionIndividualResult {
3319    /// Part of the response for both add_file_member and remove_file_member_v1 (deprecated). For
3320    /// add_file_member, indicates giving access was successful and at what AccessLevel. For
3321    /// remove_file_member_v1, indicates member was successfully removed from the file. If
3322    /// AccessLevel is given, the member still has access via a parent shared folder.
3323    Success(Option<AccessLevel>),
3324    /// User was not able to perform this action.
3325    MemberError(FileMemberActionError),
3326}
3327
3328impl<'de> ::serde::de::Deserialize<'de> for FileMemberActionIndividualResult {
3329    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3330        // union deserializer
3331        use serde::de::{self, MapAccess, Visitor};
3332        struct EnumVisitor;
3333        impl<'de> Visitor<'de> for EnumVisitor {
3334            type Value = FileMemberActionIndividualResult;
3335            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
3336                f.write_str("a FileMemberActionIndividualResult structure")
3337            }
3338            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
3339                let tag: &str = match map.next_key()? {
3340                    Some(".tag") => map.next_value()?,
3341                    _ => return Err(de::Error::missing_field(".tag"))
3342                };
3343                let value = match tag {
3344                    "success" => {
3345                        match map.next_key()? {
3346                            Some("success") => FileMemberActionIndividualResult::Success(map.next_value()?),
3347                            None => FileMemberActionIndividualResult::Success(None),
3348                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
3349                        }
3350                    }
3351                    "member_error" => {
3352                        match map.next_key()? {
3353                            Some("member_error") => FileMemberActionIndividualResult::MemberError(map.next_value()?),
3354                            None => return Err(de::Error::missing_field("member_error")),
3355                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
3356                        }
3357                    }
3358                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
3359                };
3360                crate::eat_json_fields(&mut map)?;
3361                Ok(value)
3362            }
3363        }
3364        const VARIANTS: &[&str] = &["success",
3365                                    "member_error"];
3366        deserializer.deserialize_struct("FileMemberActionIndividualResult", VARIANTS, EnumVisitor)
3367    }
3368}
3369
3370impl ::serde::ser::Serialize for FileMemberActionIndividualResult {
3371    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3372        // union serializer
3373        use serde::ser::SerializeStruct;
3374        match self {
3375            FileMemberActionIndividualResult::Success(x) => {
3376                // union or polymporphic struct
3377                let mut s = serializer.serialize_struct("FileMemberActionIndividualResult", 2)?;
3378                s.serialize_field(".tag", "success")?;
3379                s.serialize_field("success", x)?;
3380                s.end()
3381            }
3382            FileMemberActionIndividualResult::MemberError(x) => {
3383                // union or polymporphic struct
3384                let mut s = serializer.serialize_struct("FileMemberActionIndividualResult", 2)?;
3385                s.serialize_field(".tag", "member_error")?;
3386                s.serialize_field("member_error", x)?;
3387                s.end()
3388            }
3389        }
3390    }
3391}
3392
3393/// Per-member result for [`add_file_member()`](crate::sharing::add_file_member).
3394#[derive(Debug, Clone, PartialEq, Eq)]
3395#[non_exhaustive] // structs may have more fields added in the future.
3396pub struct FileMemberActionResult {
3397    /// One of specified input members.
3398    pub member: MemberSelector,
3399    /// The outcome of the action on this member.
3400    pub result: FileMemberActionIndividualResult,
3401    /// The SHA-1 encrypted shared content key.
3402    pub sckey_sha1: Option<String>,
3403    /// The sharing sender-recipient invitation signatures for the input member_id. A member_id can
3404    /// be a group and thus have multiple users and multiple invitation signatures.
3405    pub invitation_signature: Option<Vec<String>>,
3406}
3407
3408impl FileMemberActionResult {
3409    pub fn new(member: MemberSelector, result: FileMemberActionIndividualResult) -> Self {
3410        FileMemberActionResult {
3411            member,
3412            result,
3413            sckey_sha1: None,
3414            invitation_signature: None,
3415        }
3416    }
3417
3418    pub fn with_sckey_sha1(mut self, value: String) -> Self {
3419        self.sckey_sha1 = Some(value);
3420        self
3421    }
3422
3423    pub fn with_invitation_signature(mut self, value: Vec<String>) -> Self {
3424        self.invitation_signature = Some(value);
3425        self
3426    }
3427}
3428
3429const FILE_MEMBER_ACTION_RESULT_FIELDS: &[&str] = &["member",
3430                                                    "result",
3431                                                    "sckey_sha1",
3432                                                    "invitation_signature"];
3433impl FileMemberActionResult {
3434    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
3435        map: V,
3436    ) -> Result<FileMemberActionResult, V::Error> {
3437        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
3438    }
3439
3440    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
3441        mut map: V,
3442        optional: bool,
3443    ) -> Result<Option<FileMemberActionResult>, V::Error> {
3444        let mut field_member = None;
3445        let mut field_result = None;
3446        let mut field_sckey_sha1 = None;
3447        let mut field_invitation_signature = None;
3448        let mut nothing = true;
3449        while let Some(key) = map.next_key::<&str>()? {
3450            nothing = false;
3451            match key {
3452                "member" => {
3453                    if field_member.is_some() {
3454                        return Err(::serde::de::Error::duplicate_field("member"));
3455                    }
3456                    field_member = Some(map.next_value()?);
3457                }
3458                "result" => {
3459                    if field_result.is_some() {
3460                        return Err(::serde::de::Error::duplicate_field("result"));
3461                    }
3462                    field_result = Some(map.next_value()?);
3463                }
3464                "sckey_sha1" => {
3465                    if field_sckey_sha1.is_some() {
3466                        return Err(::serde::de::Error::duplicate_field("sckey_sha1"));
3467                    }
3468                    field_sckey_sha1 = Some(map.next_value()?);
3469                }
3470                "invitation_signature" => {
3471                    if field_invitation_signature.is_some() {
3472                        return Err(::serde::de::Error::duplicate_field("invitation_signature"));
3473                    }
3474                    field_invitation_signature = Some(map.next_value()?);
3475                }
3476                _ => {
3477                    // unknown field allowed and ignored
3478                    map.next_value::<::serde_json::Value>()?;
3479                }
3480            }
3481        }
3482        if optional && nothing {
3483            return Ok(None);
3484        }
3485        let result = FileMemberActionResult {
3486            member: field_member.ok_or_else(|| ::serde::de::Error::missing_field("member"))?,
3487            result: field_result.ok_or_else(|| ::serde::de::Error::missing_field("result"))?,
3488            sckey_sha1: field_sckey_sha1.and_then(Option::flatten),
3489            invitation_signature: field_invitation_signature.and_then(Option::flatten),
3490        };
3491        Ok(Some(result))
3492    }
3493
3494    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
3495        &self,
3496        s: &mut S::SerializeStruct,
3497    ) -> Result<(), S::Error> {
3498        use serde::ser::SerializeStruct;
3499        s.serialize_field("member", &self.member)?;
3500        s.serialize_field("result", &self.result)?;
3501        if let Some(val) = &self.sckey_sha1 {
3502            s.serialize_field("sckey_sha1", val)?;
3503        }
3504        if let Some(val) = &self.invitation_signature {
3505            s.serialize_field("invitation_signature", val)?;
3506        }
3507        Ok(())
3508    }
3509}
3510
3511impl<'de> ::serde::de::Deserialize<'de> for FileMemberActionResult {
3512    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3513        // struct deserializer
3514        use serde::de::{MapAccess, Visitor};
3515        struct StructVisitor;
3516        impl<'de> Visitor<'de> for StructVisitor {
3517            type Value = FileMemberActionResult;
3518            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
3519                f.write_str("a FileMemberActionResult struct")
3520            }
3521            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
3522                FileMemberActionResult::internal_deserialize(map)
3523            }
3524        }
3525        deserializer.deserialize_struct("FileMemberActionResult", FILE_MEMBER_ACTION_RESULT_FIELDS, StructVisitor)
3526    }
3527}
3528
3529impl ::serde::ser::Serialize for FileMemberActionResult {
3530    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3531        // struct serializer
3532        use serde::ser::SerializeStruct;
3533        let mut s = serializer.serialize_struct("FileMemberActionResult", 4)?;
3534        self.internal_serialize::<S>(&mut s)?;
3535        s.end()
3536    }
3537}
3538
3539#[derive(Debug, Clone, PartialEq, Eq)]
3540#[non_exhaustive] // variants may be added in the future
3541pub enum FileMemberRemoveActionResult {
3542    /// Member was successfully removed from this file.
3543    Success(MemberAccessLevelResult),
3544    /// User was not able to remove this member.
3545    MemberError(FileMemberActionError),
3546    /// Catch-all used for unrecognized values returned from the server. Encountering this value
3547    /// typically indicates that this SDK version is out of date.
3548    Other,
3549}
3550
3551impl<'de> ::serde::de::Deserialize<'de> for FileMemberRemoveActionResult {
3552    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3553        // union deserializer
3554        use serde::de::{self, MapAccess, Visitor};
3555        struct EnumVisitor;
3556        impl<'de> Visitor<'de> for EnumVisitor {
3557            type Value = FileMemberRemoveActionResult;
3558            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
3559                f.write_str("a FileMemberRemoveActionResult structure")
3560            }
3561            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
3562                let tag: &str = match map.next_key()? {
3563                    Some(".tag") => map.next_value()?,
3564                    _ => return Err(de::Error::missing_field(".tag"))
3565                };
3566                let value = match tag {
3567                    "success" => FileMemberRemoveActionResult::Success(MemberAccessLevelResult::internal_deserialize(&mut map)?),
3568                    "member_error" => {
3569                        match map.next_key()? {
3570                            Some("member_error") => FileMemberRemoveActionResult::MemberError(map.next_value()?),
3571                            None => return Err(de::Error::missing_field("member_error")),
3572                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
3573                        }
3574                    }
3575                    _ => FileMemberRemoveActionResult::Other,
3576                };
3577                crate::eat_json_fields(&mut map)?;
3578                Ok(value)
3579            }
3580        }
3581        const VARIANTS: &[&str] = &["success",
3582                                    "member_error",
3583                                    "other"];
3584        deserializer.deserialize_struct("FileMemberRemoveActionResult", VARIANTS, EnumVisitor)
3585    }
3586}
3587
3588impl ::serde::ser::Serialize for FileMemberRemoveActionResult {
3589    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3590        // union serializer
3591        use serde::ser::SerializeStruct;
3592        match self {
3593            FileMemberRemoveActionResult::Success(x) => {
3594                // struct
3595                let mut s = serializer.serialize_struct("FileMemberRemoveActionResult", 4)?;
3596                s.serialize_field(".tag", "success")?;
3597                x.internal_serialize::<S>(&mut s)?;
3598                s.end()
3599            }
3600            FileMemberRemoveActionResult::MemberError(x) => {
3601                // union or polymporphic struct
3602                let mut s = serializer.serialize_struct("FileMemberRemoveActionResult", 2)?;
3603                s.serialize_field(".tag", "member_error")?;
3604                s.serialize_field("member_error", x)?;
3605                s.end()
3606            }
3607            FileMemberRemoveActionResult::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
3608        }
3609    }
3610}
3611
3612/// Whether the user is allowed to take the sharing action on the file.
3613#[derive(Debug, Clone, PartialEq, Eq)]
3614#[non_exhaustive] // structs may have more fields added in the future.
3615pub struct FilePermission {
3616    /// The action that the user may wish to take on the file.
3617    pub action: FileAction,
3618    /// True if the user is allowed to take the action.
3619    pub allow: bool,
3620    /// The reason why the user is denied the permission. Not present if the action is allowed.
3621    pub reason: Option<PermissionDeniedReason>,
3622}
3623
3624impl FilePermission {
3625    pub fn new(action: FileAction, allow: bool) -> Self {
3626        FilePermission {
3627            action,
3628            allow,
3629            reason: None,
3630        }
3631    }
3632
3633    pub fn with_reason(mut self, value: PermissionDeniedReason) -> Self {
3634        self.reason = Some(value);
3635        self
3636    }
3637}
3638
3639const FILE_PERMISSION_FIELDS: &[&str] = &["action",
3640                                          "allow",
3641                                          "reason"];
3642impl FilePermission {
3643    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
3644        map: V,
3645    ) -> Result<FilePermission, V::Error> {
3646        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
3647    }
3648
3649    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
3650        mut map: V,
3651        optional: bool,
3652    ) -> Result<Option<FilePermission>, V::Error> {
3653        let mut field_action = None;
3654        let mut field_allow = None;
3655        let mut field_reason = None;
3656        let mut nothing = true;
3657        while let Some(key) = map.next_key::<&str>()? {
3658            nothing = false;
3659            match key {
3660                "action" => {
3661                    if field_action.is_some() {
3662                        return Err(::serde::de::Error::duplicate_field("action"));
3663                    }
3664                    field_action = Some(map.next_value()?);
3665                }
3666                "allow" => {
3667                    if field_allow.is_some() {
3668                        return Err(::serde::de::Error::duplicate_field("allow"));
3669                    }
3670                    field_allow = Some(map.next_value()?);
3671                }
3672                "reason" => {
3673                    if field_reason.is_some() {
3674                        return Err(::serde::de::Error::duplicate_field("reason"));
3675                    }
3676                    field_reason = Some(map.next_value()?);
3677                }
3678                _ => {
3679                    // unknown field allowed and ignored
3680                    map.next_value::<::serde_json::Value>()?;
3681                }
3682            }
3683        }
3684        if optional && nothing {
3685            return Ok(None);
3686        }
3687        let result = FilePermission {
3688            action: field_action.ok_or_else(|| ::serde::de::Error::missing_field("action"))?,
3689            allow: field_allow.ok_or_else(|| ::serde::de::Error::missing_field("allow"))?,
3690            reason: field_reason.and_then(Option::flatten),
3691        };
3692        Ok(Some(result))
3693    }
3694
3695    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
3696        &self,
3697        s: &mut S::SerializeStruct,
3698    ) -> Result<(), S::Error> {
3699        use serde::ser::SerializeStruct;
3700        s.serialize_field("action", &self.action)?;
3701        s.serialize_field("allow", &self.allow)?;
3702        if let Some(val) = &self.reason {
3703            s.serialize_field("reason", val)?;
3704        }
3705        Ok(())
3706    }
3707}
3708
3709impl<'de> ::serde::de::Deserialize<'de> for FilePermission {
3710    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3711        // struct deserializer
3712        use serde::de::{MapAccess, Visitor};
3713        struct StructVisitor;
3714        impl<'de> Visitor<'de> for StructVisitor {
3715            type Value = FilePermission;
3716            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
3717                f.write_str("a FilePermission struct")
3718            }
3719            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
3720                FilePermission::internal_deserialize(map)
3721            }
3722        }
3723        deserializer.deserialize_struct("FilePermission", FILE_PERMISSION_FIELDS, StructVisitor)
3724    }
3725}
3726
3727impl ::serde::ser::Serialize for FilePermission {
3728    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3729        // struct serializer
3730        use serde::ser::SerializeStruct;
3731        let mut s = serializer.serialize_struct("FilePermission", 3)?;
3732        self.internal_serialize::<S>(&mut s)?;
3733        s.end()
3734    }
3735}
3736
3737/// Actions that may be taken on shared folders.
3738#[derive(Debug, Clone, PartialEq, Eq)]
3739#[non_exhaustive] // variants may be added in the future
3740pub enum FolderAction {
3741    /// Change folder options, such as who can be invited to join the folder.
3742    ChangeOptions,
3743    /// Disable viewer information for this folder.
3744    DisableViewerInfo,
3745    /// Change or edit contents of the folder.
3746    EditContents,
3747    /// Enable viewer information on the folder.
3748    EnableViewerInfo,
3749    /// Invite a user or group to join the folder with read and write permission.
3750    InviteEditor,
3751    /// Invite a user or group to join the folder with read permission.
3752    InviteViewer,
3753    /// Invite a user or group to join the folder with read permission but no comment permissions.
3754    InviteViewerNoComment,
3755    /// Relinquish one's own membership in the folder.
3756    RelinquishMembership,
3757    /// Unmount the folder.
3758    Unmount,
3759    /// Stop sharing this folder.
3760    Unshare,
3761    /// Keep a copy of the contents upon leaving or being kicked from the folder.
3762    LeaveACopy,
3763    /// Field is deprecated. Use create_view_link and create_edit_link instead.
3764    #[deprecated]
3765    ShareLink,
3766    /// Field is deprecated. Use create_view_link and create_edit_link instead.
3767    #[deprecated]
3768    CreateLink,
3769    /// Create a shared link that only allows users to view the content.
3770    CreateViewLink,
3771    /// Create a shared link that allows users to edit the content.
3772    CreateEditLink,
3773    /// Set whether the folder inherits permissions from its parent.
3774    SetAccessInheritance,
3775    /// Catch-all used for unrecognized values returned from the server. Encountering this value
3776    /// typically indicates that this SDK version is out of date.
3777    Other,
3778}
3779
3780impl<'de> ::serde::de::Deserialize<'de> for FolderAction {
3781    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3782        // union deserializer
3783        use serde::de::{self, MapAccess, Visitor};
3784        struct EnumVisitor;
3785        impl<'de> Visitor<'de> for EnumVisitor {
3786            type Value = FolderAction;
3787            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
3788                f.write_str("a FolderAction structure")
3789            }
3790            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
3791                let tag: &str = match map.next_key()? {
3792                    Some(".tag") => map.next_value()?,
3793                    _ => return Err(de::Error::missing_field(".tag"))
3794                };
3795                let value = match tag {
3796                    "change_options" => FolderAction::ChangeOptions,
3797                    "disable_viewer_info" => FolderAction::DisableViewerInfo,
3798                    "edit_contents" => FolderAction::EditContents,
3799                    "enable_viewer_info" => FolderAction::EnableViewerInfo,
3800                    "invite_editor" => FolderAction::InviteEditor,
3801                    "invite_viewer" => FolderAction::InviteViewer,
3802                    "invite_viewer_no_comment" => FolderAction::InviteViewerNoComment,
3803                    "relinquish_membership" => FolderAction::RelinquishMembership,
3804                    "unmount" => FolderAction::Unmount,
3805                    "unshare" => FolderAction::Unshare,
3806                    "leave_a_copy" => FolderAction::LeaveACopy,
3807                    #[allow(deprecated)]
3808                    "share_link" => FolderAction::ShareLink,
3809                    #[allow(deprecated)]
3810                    "create_link" => FolderAction::CreateLink,
3811                    "create_view_link" => FolderAction::CreateViewLink,
3812                    "create_edit_link" => FolderAction::CreateEditLink,
3813                    "set_access_inheritance" => FolderAction::SetAccessInheritance,
3814                    _ => FolderAction::Other,
3815                };
3816                crate::eat_json_fields(&mut map)?;
3817                Ok(value)
3818            }
3819        }
3820        const VARIANTS: &[&str] = &["change_options",
3821                                    "disable_viewer_info",
3822                                    "edit_contents",
3823                                    "enable_viewer_info",
3824                                    "invite_editor",
3825                                    "invite_viewer",
3826                                    "invite_viewer_no_comment",
3827                                    "relinquish_membership",
3828                                    "unmount",
3829                                    "unshare",
3830                                    "leave_a_copy",
3831                                    "share_link",
3832                                    "create_link",
3833                                    "create_view_link",
3834                                    "create_edit_link",
3835                                    "set_access_inheritance",
3836                                    "other"];
3837        deserializer.deserialize_struct("FolderAction", VARIANTS, EnumVisitor)
3838    }
3839}
3840
3841impl ::serde::ser::Serialize for FolderAction {
3842    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3843        // union serializer
3844        use serde::ser::SerializeStruct;
3845        match self {
3846            FolderAction::ChangeOptions => {
3847                // unit
3848                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3849                s.serialize_field(".tag", "change_options")?;
3850                s.end()
3851            }
3852            FolderAction::DisableViewerInfo => {
3853                // unit
3854                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3855                s.serialize_field(".tag", "disable_viewer_info")?;
3856                s.end()
3857            }
3858            FolderAction::EditContents => {
3859                // unit
3860                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3861                s.serialize_field(".tag", "edit_contents")?;
3862                s.end()
3863            }
3864            FolderAction::EnableViewerInfo => {
3865                // unit
3866                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3867                s.serialize_field(".tag", "enable_viewer_info")?;
3868                s.end()
3869            }
3870            FolderAction::InviteEditor => {
3871                // unit
3872                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3873                s.serialize_field(".tag", "invite_editor")?;
3874                s.end()
3875            }
3876            FolderAction::InviteViewer => {
3877                // unit
3878                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3879                s.serialize_field(".tag", "invite_viewer")?;
3880                s.end()
3881            }
3882            FolderAction::InviteViewerNoComment => {
3883                // unit
3884                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3885                s.serialize_field(".tag", "invite_viewer_no_comment")?;
3886                s.end()
3887            }
3888            FolderAction::RelinquishMembership => {
3889                // unit
3890                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3891                s.serialize_field(".tag", "relinquish_membership")?;
3892                s.end()
3893            }
3894            FolderAction::Unmount => {
3895                // unit
3896                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3897                s.serialize_field(".tag", "unmount")?;
3898                s.end()
3899            }
3900            FolderAction::Unshare => {
3901                // unit
3902                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3903                s.serialize_field(".tag", "unshare")?;
3904                s.end()
3905            }
3906            FolderAction::LeaveACopy => {
3907                // unit
3908                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3909                s.serialize_field(".tag", "leave_a_copy")?;
3910                s.end()
3911            }
3912            #[allow(deprecated)]
3913            FolderAction::ShareLink => {
3914                // unit
3915                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3916                s.serialize_field(".tag", "share_link")?;
3917                s.end()
3918            }
3919            #[allow(deprecated)]
3920            FolderAction::CreateLink => {
3921                // unit
3922                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3923                s.serialize_field(".tag", "create_link")?;
3924                s.end()
3925            }
3926            FolderAction::CreateViewLink => {
3927                // unit
3928                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3929                s.serialize_field(".tag", "create_view_link")?;
3930                s.end()
3931            }
3932            FolderAction::CreateEditLink => {
3933                // unit
3934                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3935                s.serialize_field(".tag", "create_edit_link")?;
3936                s.end()
3937            }
3938            FolderAction::SetAccessInheritance => {
3939                // unit
3940                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3941                s.serialize_field(".tag", "set_access_inheritance")?;
3942                s.end()
3943            }
3944            FolderAction::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
3945        }
3946    }
3947}
3948
3949/// The metadata of a folder shared link.
3950#[derive(Debug, Clone, PartialEq, Eq)]
3951#[non_exhaustive] // structs may have more fields added in the future.
3952pub struct FolderLinkMetadata {
3953    /// URL of the shared link.
3954    pub url: String,
3955    /// The linked file name (including extension). This never contains a slash.
3956    pub name: String,
3957    /// The link's access permissions.
3958    pub link_permissions: LinkPermissions,
3959    /// A unique identifier for the linked file.
3960    pub id: Option<Id>,
3961    /// Expiration time, if set. By default the link won't expire.
3962    pub expires: Option<crate::types::common::DropboxTimestamp>,
3963    /// The lowercased full path in the user's Dropbox. This always starts with a slash. This field
3964    /// will only be present only if the linked file is in the authenticated user's dropbox and the
3965    /// user is the owner of the link.
3966    pub path_lower: Option<String>,
3967    /// The team membership information of the link's owner.  This field will only be present if the
3968    /// link's owner is a team member.
3969    pub team_member_info: Option<TeamMemberInfo>,
3970    /// The team information of the content's owner. This field will only be present if the
3971    /// content's owner is a team member and the content's owner team is different from the link's
3972    /// owner team.
3973    pub content_owner_team_info: Option<TeamInfo>,
3974}
3975
3976impl FolderLinkMetadata {
3977    pub fn new(url: String, name: String, link_permissions: LinkPermissions) -> Self {
3978        FolderLinkMetadata {
3979            url,
3980            name,
3981            link_permissions,
3982            id: None,
3983            expires: None,
3984            path_lower: None,
3985            team_member_info: None,
3986            content_owner_team_info: None,
3987        }
3988    }
3989
3990    pub fn with_id(mut self, value: Id) -> Self {
3991        self.id = Some(value);
3992        self
3993    }
3994
3995    pub fn with_expires(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
3996        self.expires = Some(value);
3997        self
3998    }
3999
4000    pub fn with_path_lower(mut self, value: String) -> Self {
4001        self.path_lower = Some(value);
4002        self
4003    }
4004
4005    pub fn with_team_member_info(mut self, value: TeamMemberInfo) -> Self {
4006        self.team_member_info = Some(value);
4007        self
4008    }
4009
4010    pub fn with_content_owner_team_info(mut self, value: TeamInfo) -> Self {
4011        self.content_owner_team_info = Some(value);
4012        self
4013    }
4014}
4015
4016const FOLDER_LINK_METADATA_FIELDS: &[&str] = &["url",
4017                                               "name",
4018                                               "link_permissions",
4019                                               "id",
4020                                               "expires",
4021                                               "path_lower",
4022                                               "team_member_info",
4023                                               "content_owner_team_info"];
4024impl FolderLinkMetadata {
4025    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
4026        map: V,
4027    ) -> Result<FolderLinkMetadata, V::Error> {
4028        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
4029    }
4030
4031    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
4032        mut map: V,
4033        optional: bool,
4034    ) -> Result<Option<FolderLinkMetadata>, V::Error> {
4035        let mut field_url = None;
4036        let mut field_name = None;
4037        let mut field_link_permissions = None;
4038        let mut field_id = None;
4039        let mut field_expires = None;
4040        let mut field_path_lower = None;
4041        let mut field_team_member_info = None;
4042        let mut field_content_owner_team_info = None;
4043        let mut nothing = true;
4044        while let Some(key) = map.next_key::<&str>()? {
4045            nothing = false;
4046            match key {
4047                "url" => {
4048                    if field_url.is_some() {
4049                        return Err(::serde::de::Error::duplicate_field("url"));
4050                    }
4051                    field_url = Some(map.next_value()?);
4052                }
4053                "name" => {
4054                    if field_name.is_some() {
4055                        return Err(::serde::de::Error::duplicate_field("name"));
4056                    }
4057                    field_name = Some(map.next_value()?);
4058                }
4059                "link_permissions" => {
4060                    if field_link_permissions.is_some() {
4061                        return Err(::serde::de::Error::duplicate_field("link_permissions"));
4062                    }
4063                    field_link_permissions = Some(map.next_value()?);
4064                }
4065                "id" => {
4066                    if field_id.is_some() {
4067                        return Err(::serde::de::Error::duplicate_field("id"));
4068                    }
4069                    field_id = Some(map.next_value()?);
4070                }
4071                "expires" => {
4072                    if field_expires.is_some() {
4073                        return Err(::serde::de::Error::duplicate_field("expires"));
4074                    }
4075                    field_expires = Some(map.next_value()?);
4076                }
4077                "path_lower" => {
4078                    if field_path_lower.is_some() {
4079                        return Err(::serde::de::Error::duplicate_field("path_lower"));
4080                    }
4081                    field_path_lower = Some(map.next_value()?);
4082                }
4083                "team_member_info" => {
4084                    if field_team_member_info.is_some() {
4085                        return Err(::serde::de::Error::duplicate_field("team_member_info"));
4086                    }
4087                    field_team_member_info = Some(map.next_value()?);
4088                }
4089                "content_owner_team_info" => {
4090                    if field_content_owner_team_info.is_some() {
4091                        return Err(::serde::de::Error::duplicate_field("content_owner_team_info"));
4092                    }
4093                    field_content_owner_team_info = Some(map.next_value()?);
4094                }
4095                _ => {
4096                    // unknown field allowed and ignored
4097                    map.next_value::<::serde_json::Value>()?;
4098                }
4099            }
4100        }
4101        if optional && nothing {
4102            return Ok(None);
4103        }
4104        let result = FolderLinkMetadata {
4105            url: field_url.ok_or_else(|| ::serde::de::Error::missing_field("url"))?,
4106            name: field_name.ok_or_else(|| ::serde::de::Error::missing_field("name"))?,
4107            link_permissions: field_link_permissions.ok_or_else(|| ::serde::de::Error::missing_field("link_permissions"))?,
4108            id: field_id.and_then(Option::flatten),
4109            expires: field_expires.and_then(Option::flatten),
4110            path_lower: field_path_lower.and_then(Option::flatten),
4111            team_member_info: field_team_member_info.and_then(Option::flatten),
4112            content_owner_team_info: field_content_owner_team_info.and_then(Option::flatten),
4113        };
4114        Ok(Some(result))
4115    }
4116
4117    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
4118        &self,
4119        s: &mut S::SerializeStruct,
4120    ) -> Result<(), S::Error> {
4121        use serde::ser::SerializeStruct;
4122        s.serialize_field("url", &self.url)?;
4123        s.serialize_field("name", &self.name)?;
4124        s.serialize_field("link_permissions", &self.link_permissions)?;
4125        if let Some(val) = &self.id {
4126            s.serialize_field("id", val)?;
4127        }
4128        if let Some(val) = &self.expires {
4129            s.serialize_field("expires", val)?;
4130        }
4131        if let Some(val) = &self.path_lower {
4132            s.serialize_field("path_lower", val)?;
4133        }
4134        if let Some(val) = &self.team_member_info {
4135            s.serialize_field("team_member_info", val)?;
4136        }
4137        if let Some(val) = &self.content_owner_team_info {
4138            s.serialize_field("content_owner_team_info", val)?;
4139        }
4140        Ok(())
4141    }
4142}
4143
4144impl<'de> ::serde::de::Deserialize<'de> for FolderLinkMetadata {
4145    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4146        // struct deserializer
4147        use serde::de::{MapAccess, Visitor};
4148        struct StructVisitor;
4149        impl<'de> Visitor<'de> for StructVisitor {
4150            type Value = FolderLinkMetadata;
4151            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4152                f.write_str("a FolderLinkMetadata struct")
4153            }
4154            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
4155                FolderLinkMetadata::internal_deserialize(map)
4156            }
4157        }
4158        deserializer.deserialize_struct("FolderLinkMetadata", FOLDER_LINK_METADATA_FIELDS, StructVisitor)
4159    }
4160}
4161
4162impl ::serde::ser::Serialize for FolderLinkMetadata {
4163    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4164        // struct serializer
4165        use serde::ser::SerializeStruct;
4166        let mut s = serializer.serialize_struct("FolderLinkMetadata", 8)?;
4167        self.internal_serialize::<S>(&mut s)?;
4168        s.end()
4169    }
4170}
4171
4172// struct extends polymorphic struct SharedLinkMetadata
4173impl From<FolderLinkMetadata> for SharedLinkMetadata {
4174    fn from(subtype: FolderLinkMetadata) -> Self {
4175        SharedLinkMetadata::Folder(subtype)
4176    }
4177}
4178/// Whether the user is allowed to take the action on the shared folder.
4179#[derive(Debug, Clone, PartialEq, Eq)]
4180#[non_exhaustive] // structs may have more fields added in the future.
4181pub struct FolderPermission {
4182    /// The action that the user may wish to take on the folder.
4183    pub action: FolderAction,
4184    /// True if the user is allowed to take the action.
4185    pub allow: bool,
4186    /// The reason why the user is denied the permission. Not present if the action is allowed, or
4187    /// if no reason is available.
4188    pub reason: Option<PermissionDeniedReason>,
4189}
4190
4191impl FolderPermission {
4192    pub fn new(action: FolderAction, allow: bool) -> Self {
4193        FolderPermission {
4194            action,
4195            allow,
4196            reason: None,
4197        }
4198    }
4199
4200    pub fn with_reason(mut self, value: PermissionDeniedReason) -> Self {
4201        self.reason = Some(value);
4202        self
4203    }
4204}
4205
4206const FOLDER_PERMISSION_FIELDS: &[&str] = &["action",
4207                                            "allow",
4208                                            "reason"];
4209impl FolderPermission {
4210    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
4211        map: V,
4212    ) -> Result<FolderPermission, V::Error> {
4213        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
4214    }
4215
4216    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
4217        mut map: V,
4218        optional: bool,
4219    ) -> Result<Option<FolderPermission>, V::Error> {
4220        let mut field_action = None;
4221        let mut field_allow = None;
4222        let mut field_reason = None;
4223        let mut nothing = true;
4224        while let Some(key) = map.next_key::<&str>()? {
4225            nothing = false;
4226            match key {
4227                "action" => {
4228                    if field_action.is_some() {
4229                        return Err(::serde::de::Error::duplicate_field("action"));
4230                    }
4231                    field_action = Some(map.next_value()?);
4232                }
4233                "allow" => {
4234                    if field_allow.is_some() {
4235                        return Err(::serde::de::Error::duplicate_field("allow"));
4236                    }
4237                    field_allow = Some(map.next_value()?);
4238                }
4239                "reason" => {
4240                    if field_reason.is_some() {
4241                        return Err(::serde::de::Error::duplicate_field("reason"));
4242                    }
4243                    field_reason = Some(map.next_value()?);
4244                }
4245                _ => {
4246                    // unknown field allowed and ignored
4247                    map.next_value::<::serde_json::Value>()?;
4248                }
4249            }
4250        }
4251        if optional && nothing {
4252            return Ok(None);
4253        }
4254        let result = FolderPermission {
4255            action: field_action.ok_or_else(|| ::serde::de::Error::missing_field("action"))?,
4256            allow: field_allow.ok_or_else(|| ::serde::de::Error::missing_field("allow"))?,
4257            reason: field_reason.and_then(Option::flatten),
4258        };
4259        Ok(Some(result))
4260    }
4261
4262    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
4263        &self,
4264        s: &mut S::SerializeStruct,
4265    ) -> Result<(), S::Error> {
4266        use serde::ser::SerializeStruct;
4267        s.serialize_field("action", &self.action)?;
4268        s.serialize_field("allow", &self.allow)?;
4269        if let Some(val) = &self.reason {
4270            s.serialize_field("reason", val)?;
4271        }
4272        Ok(())
4273    }
4274}
4275
4276impl<'de> ::serde::de::Deserialize<'de> for FolderPermission {
4277    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4278        // struct deserializer
4279        use serde::de::{MapAccess, Visitor};
4280        struct StructVisitor;
4281        impl<'de> Visitor<'de> for StructVisitor {
4282            type Value = FolderPermission;
4283            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4284                f.write_str("a FolderPermission struct")
4285            }
4286            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
4287                FolderPermission::internal_deserialize(map)
4288            }
4289        }
4290        deserializer.deserialize_struct("FolderPermission", FOLDER_PERMISSION_FIELDS, StructVisitor)
4291    }
4292}
4293
4294impl ::serde::ser::Serialize for FolderPermission {
4295    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4296        // struct serializer
4297        use serde::ser::SerializeStruct;
4298        let mut s = serializer.serialize_struct("FolderPermission", 3)?;
4299        self.internal_serialize::<S>(&mut s)?;
4300        s.end()
4301    }
4302}
4303
4304/// A set of policies governing membership and privileges for a shared folder.
4305#[derive(Debug, Clone, PartialEq, Eq)]
4306#[non_exhaustive] // structs may have more fields added in the future.
4307pub struct FolderPolicy {
4308    /// Who can add and remove members from this shared folder.
4309    pub acl_update_policy: AclUpdatePolicy,
4310    /// Who links can be shared with.
4311    pub shared_link_policy: SharedLinkPolicy,
4312    /// Who can be a member of this shared folder, as set on the folder itself. The effective policy
4313    /// may differ from this value if the team-wide policy is more restrictive. Present only if the
4314    /// folder is owned by a team.
4315    pub member_policy: Option<MemberPolicy>,
4316    /// Who can be a member of this shared folder, taking into account both the folder and the
4317    /// team-wide policy. This value may differ from that of member_policy if the team-wide policy
4318    /// is more restrictive than the folder policy. Present only if the folder is owned by a team.
4319    pub resolved_member_policy: Option<MemberPolicy>,
4320    /// Who can enable/disable viewer info for this shared folder.
4321    pub viewer_info_policy: Option<ViewerInfoPolicy>,
4322}
4323
4324impl FolderPolicy {
4325    pub fn new(acl_update_policy: AclUpdatePolicy, shared_link_policy: SharedLinkPolicy) -> Self {
4326        FolderPolicy {
4327            acl_update_policy,
4328            shared_link_policy,
4329            member_policy: None,
4330            resolved_member_policy: None,
4331            viewer_info_policy: None,
4332        }
4333    }
4334
4335    pub fn with_member_policy(mut self, value: MemberPolicy) -> Self {
4336        self.member_policy = Some(value);
4337        self
4338    }
4339
4340    pub fn with_resolved_member_policy(mut self, value: MemberPolicy) -> Self {
4341        self.resolved_member_policy = Some(value);
4342        self
4343    }
4344
4345    pub fn with_viewer_info_policy(mut self, value: ViewerInfoPolicy) -> Self {
4346        self.viewer_info_policy = Some(value);
4347        self
4348    }
4349}
4350
4351const FOLDER_POLICY_FIELDS: &[&str] = &["acl_update_policy",
4352                                        "shared_link_policy",
4353                                        "member_policy",
4354                                        "resolved_member_policy",
4355                                        "viewer_info_policy"];
4356impl FolderPolicy {
4357    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
4358        map: V,
4359    ) -> Result<FolderPolicy, V::Error> {
4360        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
4361    }
4362
4363    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
4364        mut map: V,
4365        optional: bool,
4366    ) -> Result<Option<FolderPolicy>, V::Error> {
4367        let mut field_acl_update_policy = None;
4368        let mut field_shared_link_policy = None;
4369        let mut field_member_policy = None;
4370        let mut field_resolved_member_policy = None;
4371        let mut field_viewer_info_policy = None;
4372        let mut nothing = true;
4373        while let Some(key) = map.next_key::<&str>()? {
4374            nothing = false;
4375            match key {
4376                "acl_update_policy" => {
4377                    if field_acl_update_policy.is_some() {
4378                        return Err(::serde::de::Error::duplicate_field("acl_update_policy"));
4379                    }
4380                    field_acl_update_policy = Some(map.next_value()?);
4381                }
4382                "shared_link_policy" => {
4383                    if field_shared_link_policy.is_some() {
4384                        return Err(::serde::de::Error::duplicate_field("shared_link_policy"));
4385                    }
4386                    field_shared_link_policy = Some(map.next_value()?);
4387                }
4388                "member_policy" => {
4389                    if field_member_policy.is_some() {
4390                        return Err(::serde::de::Error::duplicate_field("member_policy"));
4391                    }
4392                    field_member_policy = Some(map.next_value()?);
4393                }
4394                "resolved_member_policy" => {
4395                    if field_resolved_member_policy.is_some() {
4396                        return Err(::serde::de::Error::duplicate_field("resolved_member_policy"));
4397                    }
4398                    field_resolved_member_policy = Some(map.next_value()?);
4399                }
4400                "viewer_info_policy" => {
4401                    if field_viewer_info_policy.is_some() {
4402                        return Err(::serde::de::Error::duplicate_field("viewer_info_policy"));
4403                    }
4404                    field_viewer_info_policy = Some(map.next_value()?);
4405                }
4406                _ => {
4407                    // unknown field allowed and ignored
4408                    map.next_value::<::serde_json::Value>()?;
4409                }
4410            }
4411        }
4412        if optional && nothing {
4413            return Ok(None);
4414        }
4415        let result = FolderPolicy {
4416            acl_update_policy: field_acl_update_policy.ok_or_else(|| ::serde::de::Error::missing_field("acl_update_policy"))?,
4417            shared_link_policy: field_shared_link_policy.ok_or_else(|| ::serde::de::Error::missing_field("shared_link_policy"))?,
4418            member_policy: field_member_policy.and_then(Option::flatten),
4419            resolved_member_policy: field_resolved_member_policy.and_then(Option::flatten),
4420            viewer_info_policy: field_viewer_info_policy.and_then(Option::flatten),
4421        };
4422        Ok(Some(result))
4423    }
4424
4425    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
4426        &self,
4427        s: &mut S::SerializeStruct,
4428    ) -> Result<(), S::Error> {
4429        use serde::ser::SerializeStruct;
4430        s.serialize_field("acl_update_policy", &self.acl_update_policy)?;
4431        s.serialize_field("shared_link_policy", &self.shared_link_policy)?;
4432        if let Some(val) = &self.member_policy {
4433            s.serialize_field("member_policy", val)?;
4434        }
4435        if let Some(val) = &self.resolved_member_policy {
4436            s.serialize_field("resolved_member_policy", val)?;
4437        }
4438        if let Some(val) = &self.viewer_info_policy {
4439            s.serialize_field("viewer_info_policy", val)?;
4440        }
4441        Ok(())
4442    }
4443}
4444
4445impl<'de> ::serde::de::Deserialize<'de> for FolderPolicy {
4446    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4447        // struct deserializer
4448        use serde::de::{MapAccess, Visitor};
4449        struct StructVisitor;
4450        impl<'de> Visitor<'de> for StructVisitor {
4451            type Value = FolderPolicy;
4452            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4453                f.write_str("a FolderPolicy struct")
4454            }
4455            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
4456                FolderPolicy::internal_deserialize(map)
4457            }
4458        }
4459        deserializer.deserialize_struct("FolderPolicy", FOLDER_POLICY_FIELDS, StructVisitor)
4460    }
4461}
4462
4463impl ::serde::ser::Serialize for FolderPolicy {
4464    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4465        // struct serializer
4466        use serde::ser::SerializeStruct;
4467        let mut s = serializer.serialize_struct("FolderPolicy", 5)?;
4468        self.internal_serialize::<S>(&mut s)?;
4469        s.end()
4470    }
4471}
4472
4473/// Arguments of [`get_file_metadata()`](crate::sharing::get_file_metadata).
4474#[derive(Debug, Clone, PartialEq, Eq)]
4475#[non_exhaustive] // structs may have more fields added in the future.
4476pub struct GetFileMetadataArg {
4477    /// The file to query.
4478    pub file: PathOrId,
4479    /// A list of `FileAction`s corresponding to `FilePermission`s that should appear in the
4480    /// response's [`SharedFileMetadata::permissions`](SharedFileMetadata) field describing the
4481    /// actions the authenticated user can perform on the file.
4482    pub actions: Option<Vec<FileAction>>,
4483}
4484
4485impl GetFileMetadataArg {
4486    pub fn new(file: PathOrId) -> Self {
4487        GetFileMetadataArg {
4488            file,
4489            actions: None,
4490        }
4491    }
4492
4493    pub fn with_actions(mut self, value: Vec<FileAction>) -> Self {
4494        self.actions = Some(value);
4495        self
4496    }
4497}
4498
4499const GET_FILE_METADATA_ARG_FIELDS: &[&str] = &["file",
4500                                                "actions"];
4501impl GetFileMetadataArg {
4502    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
4503        map: V,
4504    ) -> Result<GetFileMetadataArg, V::Error> {
4505        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
4506    }
4507
4508    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
4509        mut map: V,
4510        optional: bool,
4511    ) -> Result<Option<GetFileMetadataArg>, V::Error> {
4512        let mut field_file = None;
4513        let mut field_actions = None;
4514        let mut nothing = true;
4515        while let Some(key) = map.next_key::<&str>()? {
4516            nothing = false;
4517            match key {
4518                "file" => {
4519                    if field_file.is_some() {
4520                        return Err(::serde::de::Error::duplicate_field("file"));
4521                    }
4522                    field_file = Some(map.next_value()?);
4523                }
4524                "actions" => {
4525                    if field_actions.is_some() {
4526                        return Err(::serde::de::Error::duplicate_field("actions"));
4527                    }
4528                    field_actions = Some(map.next_value()?);
4529                }
4530                _ => {
4531                    // unknown field allowed and ignored
4532                    map.next_value::<::serde_json::Value>()?;
4533                }
4534            }
4535        }
4536        if optional && nothing {
4537            return Ok(None);
4538        }
4539        let result = GetFileMetadataArg {
4540            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
4541            actions: field_actions.and_then(Option::flatten),
4542        };
4543        Ok(Some(result))
4544    }
4545
4546    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
4547        &self,
4548        s: &mut S::SerializeStruct,
4549    ) -> Result<(), S::Error> {
4550        use serde::ser::SerializeStruct;
4551        s.serialize_field("file", &self.file)?;
4552        if let Some(val) = &self.actions {
4553            s.serialize_field("actions", val)?;
4554        }
4555        Ok(())
4556    }
4557}
4558
4559impl<'de> ::serde::de::Deserialize<'de> for GetFileMetadataArg {
4560    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4561        // struct deserializer
4562        use serde::de::{MapAccess, Visitor};
4563        struct StructVisitor;
4564        impl<'de> Visitor<'de> for StructVisitor {
4565            type Value = GetFileMetadataArg;
4566            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4567                f.write_str("a GetFileMetadataArg struct")
4568            }
4569            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
4570                GetFileMetadataArg::internal_deserialize(map)
4571            }
4572        }
4573        deserializer.deserialize_struct("GetFileMetadataArg", GET_FILE_METADATA_ARG_FIELDS, StructVisitor)
4574    }
4575}
4576
4577impl ::serde::ser::Serialize for GetFileMetadataArg {
4578    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4579        // struct serializer
4580        use serde::ser::SerializeStruct;
4581        let mut s = serializer.serialize_struct("GetFileMetadataArg", 2)?;
4582        self.internal_serialize::<S>(&mut s)?;
4583        s.end()
4584    }
4585}
4586
4587/// Arguments of [`get_file_metadata_batch()`](crate::sharing::get_file_metadata_batch).
4588#[derive(Debug, Clone, PartialEq, Eq)]
4589#[non_exhaustive] // structs may have more fields added in the future.
4590pub struct GetFileMetadataBatchArg {
4591    /// The files to query.
4592    pub files: Vec<PathOrId>,
4593    /// A list of `FileAction`s corresponding to `FilePermission`s that should appear in the
4594    /// response's [`SharedFileMetadata::permissions`](SharedFileMetadata) field describing the
4595    /// actions the authenticated user can perform on the file.
4596    pub actions: Option<Vec<FileAction>>,
4597}
4598
4599impl GetFileMetadataBatchArg {
4600    pub fn new(files: Vec<PathOrId>) -> Self {
4601        GetFileMetadataBatchArg {
4602            files,
4603            actions: None,
4604        }
4605    }
4606
4607    pub fn with_actions(mut self, value: Vec<FileAction>) -> Self {
4608        self.actions = Some(value);
4609        self
4610    }
4611}
4612
4613const GET_FILE_METADATA_BATCH_ARG_FIELDS: &[&str] = &["files",
4614                                                      "actions"];
4615impl GetFileMetadataBatchArg {
4616    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
4617        map: V,
4618    ) -> Result<GetFileMetadataBatchArg, V::Error> {
4619        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
4620    }
4621
4622    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
4623        mut map: V,
4624        optional: bool,
4625    ) -> Result<Option<GetFileMetadataBatchArg>, V::Error> {
4626        let mut field_files = None;
4627        let mut field_actions = None;
4628        let mut nothing = true;
4629        while let Some(key) = map.next_key::<&str>()? {
4630            nothing = false;
4631            match key {
4632                "files" => {
4633                    if field_files.is_some() {
4634                        return Err(::serde::de::Error::duplicate_field("files"));
4635                    }
4636                    field_files = Some(map.next_value()?);
4637                }
4638                "actions" => {
4639                    if field_actions.is_some() {
4640                        return Err(::serde::de::Error::duplicate_field("actions"));
4641                    }
4642                    field_actions = Some(map.next_value()?);
4643                }
4644                _ => {
4645                    // unknown field allowed and ignored
4646                    map.next_value::<::serde_json::Value>()?;
4647                }
4648            }
4649        }
4650        if optional && nothing {
4651            return Ok(None);
4652        }
4653        let result = GetFileMetadataBatchArg {
4654            files: field_files.ok_or_else(|| ::serde::de::Error::missing_field("files"))?,
4655            actions: field_actions.and_then(Option::flatten),
4656        };
4657        Ok(Some(result))
4658    }
4659
4660    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
4661        &self,
4662        s: &mut S::SerializeStruct,
4663    ) -> Result<(), S::Error> {
4664        use serde::ser::SerializeStruct;
4665        s.serialize_field("files", &self.files)?;
4666        if let Some(val) = &self.actions {
4667            s.serialize_field("actions", val)?;
4668        }
4669        Ok(())
4670    }
4671}
4672
4673impl<'de> ::serde::de::Deserialize<'de> for GetFileMetadataBatchArg {
4674    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4675        // struct deserializer
4676        use serde::de::{MapAccess, Visitor};
4677        struct StructVisitor;
4678        impl<'de> Visitor<'de> for StructVisitor {
4679            type Value = GetFileMetadataBatchArg;
4680            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4681                f.write_str("a GetFileMetadataBatchArg struct")
4682            }
4683            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
4684                GetFileMetadataBatchArg::internal_deserialize(map)
4685            }
4686        }
4687        deserializer.deserialize_struct("GetFileMetadataBatchArg", GET_FILE_METADATA_BATCH_ARG_FIELDS, StructVisitor)
4688    }
4689}
4690
4691impl ::serde::ser::Serialize for GetFileMetadataBatchArg {
4692    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4693        // struct serializer
4694        use serde::ser::SerializeStruct;
4695        let mut s = serializer.serialize_struct("GetFileMetadataBatchArg", 2)?;
4696        self.internal_serialize::<S>(&mut s)?;
4697        s.end()
4698    }
4699}
4700
4701/// Per file results of [`get_file_metadata_batch()`](crate::sharing::get_file_metadata_batch).
4702#[derive(Debug, Clone, PartialEq, Eq)]
4703#[non_exhaustive] // structs may have more fields added in the future.
4704pub struct GetFileMetadataBatchResult {
4705    /// This is the input file identifier corresponding to one of
4706    /// [`GetFileMetadataBatchArg::files`](GetFileMetadataBatchArg).
4707    pub file: PathOrId,
4708    /// The result for this particular file.
4709    pub result: GetFileMetadataIndividualResult,
4710}
4711
4712impl GetFileMetadataBatchResult {
4713    pub fn new(file: PathOrId, result: GetFileMetadataIndividualResult) -> Self {
4714        GetFileMetadataBatchResult {
4715            file,
4716            result,
4717        }
4718    }
4719}
4720
4721const GET_FILE_METADATA_BATCH_RESULT_FIELDS: &[&str] = &["file",
4722                                                         "result"];
4723impl GetFileMetadataBatchResult {
4724    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
4725        map: V,
4726    ) -> Result<GetFileMetadataBatchResult, V::Error> {
4727        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
4728    }
4729
4730    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
4731        mut map: V,
4732        optional: bool,
4733    ) -> Result<Option<GetFileMetadataBatchResult>, V::Error> {
4734        let mut field_file = None;
4735        let mut field_result = None;
4736        let mut nothing = true;
4737        while let Some(key) = map.next_key::<&str>()? {
4738            nothing = false;
4739            match key {
4740                "file" => {
4741                    if field_file.is_some() {
4742                        return Err(::serde::de::Error::duplicate_field("file"));
4743                    }
4744                    field_file = Some(map.next_value()?);
4745                }
4746                "result" => {
4747                    if field_result.is_some() {
4748                        return Err(::serde::de::Error::duplicate_field("result"));
4749                    }
4750                    field_result = Some(map.next_value()?);
4751                }
4752                _ => {
4753                    // unknown field allowed and ignored
4754                    map.next_value::<::serde_json::Value>()?;
4755                }
4756            }
4757        }
4758        if optional && nothing {
4759            return Ok(None);
4760        }
4761        let result = GetFileMetadataBatchResult {
4762            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
4763            result: field_result.ok_or_else(|| ::serde::de::Error::missing_field("result"))?,
4764        };
4765        Ok(Some(result))
4766    }
4767
4768    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
4769        &self,
4770        s: &mut S::SerializeStruct,
4771    ) -> Result<(), S::Error> {
4772        use serde::ser::SerializeStruct;
4773        s.serialize_field("file", &self.file)?;
4774        s.serialize_field("result", &self.result)?;
4775        Ok(())
4776    }
4777}
4778
4779impl<'de> ::serde::de::Deserialize<'de> for GetFileMetadataBatchResult {
4780    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4781        // struct deserializer
4782        use serde::de::{MapAccess, Visitor};
4783        struct StructVisitor;
4784        impl<'de> Visitor<'de> for StructVisitor {
4785            type Value = GetFileMetadataBatchResult;
4786            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4787                f.write_str("a GetFileMetadataBatchResult struct")
4788            }
4789            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
4790                GetFileMetadataBatchResult::internal_deserialize(map)
4791            }
4792        }
4793        deserializer.deserialize_struct("GetFileMetadataBatchResult", GET_FILE_METADATA_BATCH_RESULT_FIELDS, StructVisitor)
4794    }
4795}
4796
4797impl ::serde::ser::Serialize for GetFileMetadataBatchResult {
4798    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4799        // struct serializer
4800        use serde::ser::SerializeStruct;
4801        let mut s = serializer.serialize_struct("GetFileMetadataBatchResult", 2)?;
4802        self.internal_serialize::<S>(&mut s)?;
4803        s.end()
4804    }
4805}
4806
4807/// Error result for [`get_file_metadata()`](crate::sharing::get_file_metadata).
4808#[derive(Debug, Clone, PartialEq, Eq)]
4809#[non_exhaustive] // variants may be added in the future
4810pub enum GetFileMetadataError {
4811    UserError(SharingUserError),
4812    AccessError(SharingFileAccessError),
4813    /// Catch-all used for unrecognized values returned from the server. Encountering this value
4814    /// typically indicates that this SDK version is out of date.
4815    Other,
4816}
4817
4818impl<'de> ::serde::de::Deserialize<'de> for GetFileMetadataError {
4819    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4820        // union deserializer
4821        use serde::de::{self, MapAccess, Visitor};
4822        struct EnumVisitor;
4823        impl<'de> Visitor<'de> for EnumVisitor {
4824            type Value = GetFileMetadataError;
4825            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4826                f.write_str("a GetFileMetadataError structure")
4827            }
4828            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
4829                let tag: &str = match map.next_key()? {
4830                    Some(".tag") => map.next_value()?,
4831                    _ => return Err(de::Error::missing_field(".tag"))
4832                };
4833                let value = match tag {
4834                    "user_error" => {
4835                        match map.next_key()? {
4836                            Some("user_error") => GetFileMetadataError::UserError(map.next_value()?),
4837                            None => return Err(de::Error::missing_field("user_error")),
4838                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
4839                        }
4840                    }
4841                    "access_error" => {
4842                        match map.next_key()? {
4843                            Some("access_error") => GetFileMetadataError::AccessError(map.next_value()?),
4844                            None => return Err(de::Error::missing_field("access_error")),
4845                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
4846                        }
4847                    }
4848                    _ => GetFileMetadataError::Other,
4849                };
4850                crate::eat_json_fields(&mut map)?;
4851                Ok(value)
4852            }
4853        }
4854        const VARIANTS: &[&str] = &["user_error",
4855                                    "access_error",
4856                                    "other"];
4857        deserializer.deserialize_struct("GetFileMetadataError", VARIANTS, EnumVisitor)
4858    }
4859}
4860
4861impl ::serde::ser::Serialize for GetFileMetadataError {
4862    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4863        // union serializer
4864        use serde::ser::SerializeStruct;
4865        match self {
4866            GetFileMetadataError::UserError(x) => {
4867                // union or polymporphic struct
4868                let mut s = serializer.serialize_struct("GetFileMetadataError", 2)?;
4869                s.serialize_field(".tag", "user_error")?;
4870                s.serialize_field("user_error", x)?;
4871                s.end()
4872            }
4873            GetFileMetadataError::AccessError(x) => {
4874                // union or polymporphic struct
4875                let mut s = serializer.serialize_struct("GetFileMetadataError", 2)?;
4876                s.serialize_field(".tag", "access_error")?;
4877                s.serialize_field("access_error", x)?;
4878                s.end()
4879            }
4880            GetFileMetadataError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
4881        }
4882    }
4883}
4884
4885impl ::std::error::Error for GetFileMetadataError {
4886    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
4887        match self {
4888            GetFileMetadataError::UserError(inner) => Some(inner),
4889            GetFileMetadataError::AccessError(inner) => Some(inner),
4890            _ => None,
4891        }
4892    }
4893}
4894
4895impl ::std::fmt::Display for GetFileMetadataError {
4896    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4897        match self {
4898            GetFileMetadataError::UserError(inner) => write!(f, "GetFileMetadataError: {}", inner),
4899            GetFileMetadataError::AccessError(inner) => write!(f, "GetFileMetadataError: {}", inner),
4900            _ => write!(f, "{:?}", *self),
4901        }
4902    }
4903}
4904
4905#[derive(Debug, Clone, PartialEq, Eq)]
4906#[non_exhaustive] // variants may be added in the future
4907pub enum GetFileMetadataIndividualResult {
4908    /// The result for this file if it was successful.
4909    Metadata(SharedFileMetadata),
4910    /// The result for this file if it was an error.
4911    AccessError(SharingFileAccessError),
4912    /// Catch-all used for unrecognized values returned from the server. Encountering this value
4913    /// typically indicates that this SDK version is out of date.
4914    Other,
4915}
4916
4917impl<'de> ::serde::de::Deserialize<'de> for GetFileMetadataIndividualResult {
4918    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4919        // union deserializer
4920        use serde::de::{self, MapAccess, Visitor};
4921        struct EnumVisitor;
4922        impl<'de> Visitor<'de> for EnumVisitor {
4923            type Value = GetFileMetadataIndividualResult;
4924            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4925                f.write_str("a GetFileMetadataIndividualResult structure")
4926            }
4927            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
4928                let tag: &str = match map.next_key()? {
4929                    Some(".tag") => map.next_value()?,
4930                    _ => return Err(de::Error::missing_field(".tag"))
4931                };
4932                let value = match tag {
4933                    "metadata" => GetFileMetadataIndividualResult::Metadata(SharedFileMetadata::internal_deserialize(&mut map)?),
4934                    "access_error" => {
4935                        match map.next_key()? {
4936                            Some("access_error") => GetFileMetadataIndividualResult::AccessError(map.next_value()?),
4937                            None => return Err(de::Error::missing_field("access_error")),
4938                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
4939                        }
4940                    }
4941                    _ => GetFileMetadataIndividualResult::Other,
4942                };
4943                crate::eat_json_fields(&mut map)?;
4944                Ok(value)
4945            }
4946        }
4947        const VARIANTS: &[&str] = &["metadata",
4948                                    "access_error",
4949                                    "other"];
4950        deserializer.deserialize_struct("GetFileMetadataIndividualResult", VARIANTS, EnumVisitor)
4951    }
4952}
4953
4954impl ::serde::ser::Serialize for GetFileMetadataIndividualResult {
4955    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4956        // union serializer
4957        use serde::ser::SerializeStruct;
4958        match self {
4959            GetFileMetadataIndividualResult::Metadata(x) => {
4960                // struct
4961                let mut s = serializer.serialize_struct("GetFileMetadataIndividualResult", 15)?;
4962                s.serialize_field(".tag", "metadata")?;
4963                x.internal_serialize::<S>(&mut s)?;
4964                s.end()
4965            }
4966            GetFileMetadataIndividualResult::AccessError(x) => {
4967                // union or polymporphic struct
4968                let mut s = serializer.serialize_struct("GetFileMetadataIndividualResult", 2)?;
4969                s.serialize_field(".tag", "access_error")?;
4970                s.serialize_field("access_error", x)?;
4971                s.end()
4972            }
4973            GetFileMetadataIndividualResult::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
4974        }
4975    }
4976}
4977
4978#[derive(Debug, Clone, PartialEq, Eq)]
4979#[non_exhaustive] // structs may have more fields added in the future.
4980pub struct GetMetadataArgs {
4981    /// The ID for the shared folder.
4982    pub shared_folder_id: crate::types::common::SharedFolderId,
4983    /// A list of `FolderAction`s corresponding to `FolderPermission`s that should appear in the
4984    /// response's [`SharedFolderMetadata::permissions`](SharedFolderMetadata) field describing the
4985    /// actions the authenticated user can perform on the folder.
4986    pub actions: Option<Vec<FolderAction>>,
4987}
4988
4989impl GetMetadataArgs {
4990    pub fn new(shared_folder_id: crate::types::common::SharedFolderId) -> Self {
4991        GetMetadataArgs {
4992            shared_folder_id,
4993            actions: None,
4994        }
4995    }
4996
4997    pub fn with_actions(mut self, value: Vec<FolderAction>) -> Self {
4998        self.actions = Some(value);
4999        self
5000    }
5001}
5002
5003const GET_METADATA_ARGS_FIELDS: &[&str] = &["shared_folder_id",
5004                                            "actions"];
5005impl GetMetadataArgs {
5006    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
5007        map: V,
5008    ) -> Result<GetMetadataArgs, V::Error> {
5009        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
5010    }
5011
5012    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
5013        mut map: V,
5014        optional: bool,
5015    ) -> Result<Option<GetMetadataArgs>, V::Error> {
5016        let mut field_shared_folder_id = None;
5017        let mut field_actions = None;
5018        let mut nothing = true;
5019        while let Some(key) = map.next_key::<&str>()? {
5020            nothing = false;
5021            match key {
5022                "shared_folder_id" => {
5023                    if field_shared_folder_id.is_some() {
5024                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
5025                    }
5026                    field_shared_folder_id = Some(map.next_value()?);
5027                }
5028                "actions" => {
5029                    if field_actions.is_some() {
5030                        return Err(::serde::de::Error::duplicate_field("actions"));
5031                    }
5032                    field_actions = Some(map.next_value()?);
5033                }
5034                _ => {
5035                    // unknown field allowed and ignored
5036                    map.next_value::<::serde_json::Value>()?;
5037                }
5038            }
5039        }
5040        if optional && nothing {
5041            return Ok(None);
5042        }
5043        let result = GetMetadataArgs {
5044            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
5045            actions: field_actions.and_then(Option::flatten),
5046        };
5047        Ok(Some(result))
5048    }
5049
5050    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
5051        &self,
5052        s: &mut S::SerializeStruct,
5053    ) -> Result<(), S::Error> {
5054        use serde::ser::SerializeStruct;
5055        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
5056        if let Some(val) = &self.actions {
5057            s.serialize_field("actions", val)?;
5058        }
5059        Ok(())
5060    }
5061}
5062
5063impl<'de> ::serde::de::Deserialize<'de> for GetMetadataArgs {
5064    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5065        // struct deserializer
5066        use serde::de::{MapAccess, Visitor};
5067        struct StructVisitor;
5068        impl<'de> Visitor<'de> for StructVisitor {
5069            type Value = GetMetadataArgs;
5070            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5071                f.write_str("a GetMetadataArgs struct")
5072            }
5073            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
5074                GetMetadataArgs::internal_deserialize(map)
5075            }
5076        }
5077        deserializer.deserialize_struct("GetMetadataArgs", GET_METADATA_ARGS_FIELDS, StructVisitor)
5078    }
5079}
5080
5081impl ::serde::ser::Serialize for GetMetadataArgs {
5082    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5083        // struct serializer
5084        use serde::ser::SerializeStruct;
5085        let mut s = serializer.serialize_struct("GetMetadataArgs", 2)?;
5086        self.internal_serialize::<S>(&mut s)?;
5087        s.end()
5088    }
5089}
5090
5091#[derive(Debug, Clone, PartialEq, Eq)]
5092#[non_exhaustive] // variants may be added in the future
5093pub enum GetSharedLinkFileError {
5094    /// The shared link wasn't found.
5095    SharedLinkNotFound,
5096    /// The caller is not allowed to access this shared link.
5097    SharedLinkAccessDenied,
5098    /// This type of link is not supported; use [`files::export()`](crate::files::export) instead.
5099    UnsupportedLinkType,
5100    /// Private shared links do not support `path` or `link_password` parameter fields.
5101    UnsupportedParameterField,
5102    /// Directories cannot be retrieved by this endpoint.
5103    SharedLinkIsDirectory,
5104    /// Catch-all used for unrecognized values returned from the server. Encountering this value
5105    /// typically indicates that this SDK version is out of date.
5106    Other,
5107}
5108
5109impl<'de> ::serde::de::Deserialize<'de> for GetSharedLinkFileError {
5110    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5111        // union deserializer
5112        use serde::de::{self, MapAccess, Visitor};
5113        struct EnumVisitor;
5114        impl<'de> Visitor<'de> for EnumVisitor {
5115            type Value = GetSharedLinkFileError;
5116            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5117                f.write_str("a GetSharedLinkFileError structure")
5118            }
5119            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
5120                let tag: &str = match map.next_key()? {
5121                    Some(".tag") => map.next_value()?,
5122                    _ => return Err(de::Error::missing_field(".tag"))
5123                };
5124                let value = match tag {
5125                    "shared_link_not_found" => GetSharedLinkFileError::SharedLinkNotFound,
5126                    "shared_link_access_denied" => GetSharedLinkFileError::SharedLinkAccessDenied,
5127                    "unsupported_link_type" => GetSharedLinkFileError::UnsupportedLinkType,
5128                    "unsupported_parameter_field" => GetSharedLinkFileError::UnsupportedParameterField,
5129                    "shared_link_is_directory" => GetSharedLinkFileError::SharedLinkIsDirectory,
5130                    _ => GetSharedLinkFileError::Other,
5131                };
5132                crate::eat_json_fields(&mut map)?;
5133                Ok(value)
5134            }
5135        }
5136        const VARIANTS: &[&str] = &["shared_link_not_found",
5137                                    "shared_link_access_denied",
5138                                    "unsupported_link_type",
5139                                    "unsupported_parameter_field",
5140                                    "other",
5141                                    "shared_link_is_directory"];
5142        deserializer.deserialize_struct("GetSharedLinkFileError", VARIANTS, EnumVisitor)
5143    }
5144}
5145
5146impl ::serde::ser::Serialize for GetSharedLinkFileError {
5147    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5148        // union serializer
5149        use serde::ser::SerializeStruct;
5150        match self {
5151            GetSharedLinkFileError::SharedLinkNotFound => {
5152                // unit
5153                let mut s = serializer.serialize_struct("GetSharedLinkFileError", 1)?;
5154                s.serialize_field(".tag", "shared_link_not_found")?;
5155                s.end()
5156            }
5157            GetSharedLinkFileError::SharedLinkAccessDenied => {
5158                // unit
5159                let mut s = serializer.serialize_struct("GetSharedLinkFileError", 1)?;
5160                s.serialize_field(".tag", "shared_link_access_denied")?;
5161                s.end()
5162            }
5163            GetSharedLinkFileError::UnsupportedLinkType => {
5164                // unit
5165                let mut s = serializer.serialize_struct("GetSharedLinkFileError", 1)?;
5166                s.serialize_field(".tag", "unsupported_link_type")?;
5167                s.end()
5168            }
5169            GetSharedLinkFileError::UnsupportedParameterField => {
5170                // unit
5171                let mut s = serializer.serialize_struct("GetSharedLinkFileError", 1)?;
5172                s.serialize_field(".tag", "unsupported_parameter_field")?;
5173                s.end()
5174            }
5175            GetSharedLinkFileError::SharedLinkIsDirectory => {
5176                // unit
5177                let mut s = serializer.serialize_struct("GetSharedLinkFileError", 1)?;
5178                s.serialize_field(".tag", "shared_link_is_directory")?;
5179                s.end()
5180            }
5181            GetSharedLinkFileError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
5182        }
5183    }
5184}
5185
5186impl ::std::error::Error for GetSharedLinkFileError {
5187}
5188
5189impl ::std::fmt::Display for GetSharedLinkFileError {
5190    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5191        match self {
5192            GetSharedLinkFileError::SharedLinkNotFound => f.write_str("The shared link wasn't found."),
5193            GetSharedLinkFileError::SharedLinkAccessDenied => f.write_str("The caller is not allowed to access this shared link."),
5194            GetSharedLinkFileError::UnsupportedParameterField => f.write_str("Private shared links do not support `path` or `link_password` parameter fields."),
5195            GetSharedLinkFileError::SharedLinkIsDirectory => f.write_str("Directories cannot be retrieved by this endpoint."),
5196            _ => write!(f, "{:?}", *self),
5197        }
5198    }
5199}
5200
5201// union extends SharedLinkError
5202impl From<SharedLinkError> for GetSharedLinkFileError {
5203    fn from(parent: SharedLinkError) -> Self {
5204        match parent {
5205            SharedLinkError::SharedLinkNotFound => GetSharedLinkFileError::SharedLinkNotFound,
5206            SharedLinkError::SharedLinkAccessDenied => GetSharedLinkFileError::SharedLinkAccessDenied,
5207            SharedLinkError::UnsupportedLinkType => GetSharedLinkFileError::UnsupportedLinkType,
5208            SharedLinkError::UnsupportedParameterField => GetSharedLinkFileError::UnsupportedParameterField,
5209            SharedLinkError::Other => GetSharedLinkFileError::Other,
5210        }
5211    }
5212}
5213#[derive(Debug, Clone, PartialEq, Eq)]
5214#[non_exhaustive] // structs may have more fields added in the future.
5215pub struct GetSharedLinkMetadataArg {
5216    /// URL of the shared link.
5217    pub url: String,
5218    /// If the shared link is to a folder, this parameter can be used to retrieve the metadata for a
5219    /// specific file or sub-folder in this folder. A relative path should be used.
5220    pub path: Option<Path>,
5221    /// If the shared link has a password, this parameter can be used.
5222    pub link_password: Option<String>,
5223}
5224
5225impl GetSharedLinkMetadataArg {
5226    pub fn new(url: String) -> Self {
5227        GetSharedLinkMetadataArg {
5228            url,
5229            path: None,
5230            link_password: None,
5231        }
5232    }
5233
5234    pub fn with_path(mut self, value: Path) -> Self {
5235        self.path = Some(value);
5236        self
5237    }
5238
5239    pub fn with_link_password(mut self, value: String) -> Self {
5240        self.link_password = Some(value);
5241        self
5242    }
5243}
5244
5245const GET_SHARED_LINK_METADATA_ARG_FIELDS: &[&str] = &["url",
5246                                                       "path",
5247                                                       "link_password"];
5248impl GetSharedLinkMetadataArg {
5249    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
5250        map: V,
5251    ) -> Result<GetSharedLinkMetadataArg, V::Error> {
5252        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
5253    }
5254
5255    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
5256        mut map: V,
5257        optional: bool,
5258    ) -> Result<Option<GetSharedLinkMetadataArg>, V::Error> {
5259        let mut field_url = None;
5260        let mut field_path = None;
5261        let mut field_link_password = None;
5262        let mut nothing = true;
5263        while let Some(key) = map.next_key::<&str>()? {
5264            nothing = false;
5265            match key {
5266                "url" => {
5267                    if field_url.is_some() {
5268                        return Err(::serde::de::Error::duplicate_field("url"));
5269                    }
5270                    field_url = Some(map.next_value()?);
5271                }
5272                "path" => {
5273                    if field_path.is_some() {
5274                        return Err(::serde::de::Error::duplicate_field("path"));
5275                    }
5276                    field_path = Some(map.next_value()?);
5277                }
5278                "link_password" => {
5279                    if field_link_password.is_some() {
5280                        return Err(::serde::de::Error::duplicate_field("link_password"));
5281                    }
5282                    field_link_password = Some(map.next_value()?);
5283                }
5284                _ => {
5285                    // unknown field allowed and ignored
5286                    map.next_value::<::serde_json::Value>()?;
5287                }
5288            }
5289        }
5290        if optional && nothing {
5291            return Ok(None);
5292        }
5293        let result = GetSharedLinkMetadataArg {
5294            url: field_url.ok_or_else(|| ::serde::de::Error::missing_field("url"))?,
5295            path: field_path.and_then(Option::flatten),
5296            link_password: field_link_password.and_then(Option::flatten),
5297        };
5298        Ok(Some(result))
5299    }
5300
5301    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
5302        &self,
5303        s: &mut S::SerializeStruct,
5304    ) -> Result<(), S::Error> {
5305        use serde::ser::SerializeStruct;
5306        s.serialize_field("url", &self.url)?;
5307        if let Some(val) = &self.path {
5308            s.serialize_field("path", val)?;
5309        }
5310        if let Some(val) = &self.link_password {
5311            s.serialize_field("link_password", val)?;
5312        }
5313        Ok(())
5314    }
5315}
5316
5317impl<'de> ::serde::de::Deserialize<'de> for GetSharedLinkMetadataArg {
5318    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5319        // struct deserializer
5320        use serde::de::{MapAccess, Visitor};
5321        struct StructVisitor;
5322        impl<'de> Visitor<'de> for StructVisitor {
5323            type Value = GetSharedLinkMetadataArg;
5324            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5325                f.write_str("a GetSharedLinkMetadataArg struct")
5326            }
5327            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
5328                GetSharedLinkMetadataArg::internal_deserialize(map)
5329            }
5330        }
5331        deserializer.deserialize_struct("GetSharedLinkMetadataArg", GET_SHARED_LINK_METADATA_ARG_FIELDS, StructVisitor)
5332    }
5333}
5334
5335impl ::serde::ser::Serialize for GetSharedLinkMetadataArg {
5336    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5337        // struct serializer
5338        use serde::ser::SerializeStruct;
5339        let mut s = serializer.serialize_struct("GetSharedLinkMetadataArg", 3)?;
5340        self.internal_serialize::<S>(&mut s)?;
5341        s.end()
5342    }
5343}
5344
5345#[derive(Debug, Clone, PartialEq, Eq, Default)]
5346#[non_exhaustive] // structs may have more fields added in the future.
5347pub struct GetSharedLinksArg {
5348    /// See [`get_shared_links()`](crate::sharing::get_shared_links) description.
5349    pub path: Option<String>,
5350}
5351
5352impl GetSharedLinksArg {
5353    pub fn with_path(mut self, value: String) -> Self {
5354        self.path = Some(value);
5355        self
5356    }
5357}
5358
5359const GET_SHARED_LINKS_ARG_FIELDS: &[&str] = &["path"];
5360impl GetSharedLinksArg {
5361    // no _opt deserializer
5362    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
5363        mut map: V,
5364    ) -> Result<GetSharedLinksArg, V::Error> {
5365        let mut field_path = None;
5366        while let Some(key) = map.next_key::<&str>()? {
5367            match key {
5368                "path" => {
5369                    if field_path.is_some() {
5370                        return Err(::serde::de::Error::duplicate_field("path"));
5371                    }
5372                    field_path = Some(map.next_value()?);
5373                }
5374                _ => {
5375                    // unknown field allowed and ignored
5376                    map.next_value::<::serde_json::Value>()?;
5377                }
5378            }
5379        }
5380        let result = GetSharedLinksArg {
5381            path: field_path.and_then(Option::flatten),
5382        };
5383        Ok(result)
5384    }
5385
5386    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
5387        &self,
5388        s: &mut S::SerializeStruct,
5389    ) -> Result<(), S::Error> {
5390        use serde::ser::SerializeStruct;
5391        if let Some(val) = &self.path {
5392            s.serialize_field("path", val)?;
5393        }
5394        Ok(())
5395    }
5396}
5397
5398impl<'de> ::serde::de::Deserialize<'de> for GetSharedLinksArg {
5399    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5400        // struct deserializer
5401        use serde::de::{MapAccess, Visitor};
5402        struct StructVisitor;
5403        impl<'de> Visitor<'de> for StructVisitor {
5404            type Value = GetSharedLinksArg;
5405            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5406                f.write_str("a GetSharedLinksArg struct")
5407            }
5408            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
5409                GetSharedLinksArg::internal_deserialize(map)
5410            }
5411        }
5412        deserializer.deserialize_struct("GetSharedLinksArg", GET_SHARED_LINKS_ARG_FIELDS, StructVisitor)
5413    }
5414}
5415
5416impl ::serde::ser::Serialize for GetSharedLinksArg {
5417    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5418        // struct serializer
5419        use serde::ser::SerializeStruct;
5420        let mut s = serializer.serialize_struct("GetSharedLinksArg", 1)?;
5421        self.internal_serialize::<S>(&mut s)?;
5422        s.end()
5423    }
5424}
5425
5426#[derive(Debug, Clone, PartialEq, Eq)]
5427#[non_exhaustive] // variants may be added in the future
5428pub enum GetSharedLinksError {
5429    Path(crate::types::files::MalformedPathError),
5430    /// Catch-all used for unrecognized values returned from the server. Encountering this value
5431    /// typically indicates that this SDK version is out of date.
5432    Other,
5433}
5434
5435impl<'de> ::serde::de::Deserialize<'de> for GetSharedLinksError {
5436    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5437        // union deserializer
5438        use serde::de::{self, MapAccess, Visitor};
5439        struct EnumVisitor;
5440        impl<'de> Visitor<'de> for EnumVisitor {
5441            type Value = GetSharedLinksError;
5442            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5443                f.write_str("a GetSharedLinksError structure")
5444            }
5445            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
5446                let tag: &str = match map.next_key()? {
5447                    Some(".tag") => map.next_value()?,
5448                    _ => return Err(de::Error::missing_field(".tag"))
5449                };
5450                let value = match tag {
5451                    "path" => {
5452                        match map.next_key()? {
5453                            Some("path") => GetSharedLinksError::Path(map.next_value()?),
5454                            None => GetSharedLinksError::Path(None),
5455                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
5456                        }
5457                    }
5458                    _ => GetSharedLinksError::Other,
5459                };
5460                crate::eat_json_fields(&mut map)?;
5461                Ok(value)
5462            }
5463        }
5464        const VARIANTS: &[&str] = &["path",
5465                                    "other"];
5466        deserializer.deserialize_struct("GetSharedLinksError", VARIANTS, EnumVisitor)
5467    }
5468}
5469
5470impl ::serde::ser::Serialize for GetSharedLinksError {
5471    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5472        // union serializer
5473        use serde::ser::SerializeStruct;
5474        match self {
5475            GetSharedLinksError::Path(x) => {
5476                // nullable (struct or primitive)
5477                let n = if x.is_some() { 2 } else { 1 };
5478                let mut s = serializer.serialize_struct("GetSharedLinksError", n)?;
5479                s.serialize_field(".tag", "path")?;
5480                if let Some(x) = x {
5481                    s.serialize_field("path", &x)?;
5482                }
5483                s.end()
5484            }
5485            GetSharedLinksError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
5486        }
5487    }
5488}
5489
5490impl ::std::error::Error for GetSharedLinksError {
5491}
5492
5493impl ::std::fmt::Display for GetSharedLinksError {
5494    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5495        match self {
5496            GetSharedLinksError::Path(inner) => write!(f, "path: {:?}", inner),
5497            _ => write!(f, "{:?}", *self),
5498        }
5499    }
5500}
5501
5502#[derive(Debug, Clone, PartialEq, Eq)]
5503#[non_exhaustive] // structs may have more fields added in the future.
5504pub struct GetSharedLinksResult {
5505    /// Shared links applicable to the path argument.
5506    pub links: Vec<LinkMetadata>,
5507}
5508
5509impl GetSharedLinksResult {
5510    pub fn new(links: Vec<LinkMetadata>) -> Self {
5511        GetSharedLinksResult {
5512            links,
5513        }
5514    }
5515}
5516
5517const GET_SHARED_LINKS_RESULT_FIELDS: &[&str] = &["links"];
5518impl GetSharedLinksResult {
5519    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
5520        map: V,
5521    ) -> Result<GetSharedLinksResult, V::Error> {
5522        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
5523    }
5524
5525    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
5526        mut map: V,
5527        optional: bool,
5528    ) -> Result<Option<GetSharedLinksResult>, V::Error> {
5529        let mut field_links = None;
5530        let mut nothing = true;
5531        while let Some(key) = map.next_key::<&str>()? {
5532            nothing = false;
5533            match key {
5534                "links" => {
5535                    if field_links.is_some() {
5536                        return Err(::serde::de::Error::duplicate_field("links"));
5537                    }
5538                    field_links = Some(map.next_value()?);
5539                }
5540                _ => {
5541                    // unknown field allowed and ignored
5542                    map.next_value::<::serde_json::Value>()?;
5543                }
5544            }
5545        }
5546        if optional && nothing {
5547            return Ok(None);
5548        }
5549        let result = GetSharedLinksResult {
5550            links: field_links.ok_or_else(|| ::serde::de::Error::missing_field("links"))?,
5551        };
5552        Ok(Some(result))
5553    }
5554
5555    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
5556        &self,
5557        s: &mut S::SerializeStruct,
5558    ) -> Result<(), S::Error> {
5559        use serde::ser::SerializeStruct;
5560        s.serialize_field("links", &self.links)?;
5561        Ok(())
5562    }
5563}
5564
5565impl<'de> ::serde::de::Deserialize<'de> for GetSharedLinksResult {
5566    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5567        // struct deserializer
5568        use serde::de::{MapAccess, Visitor};
5569        struct StructVisitor;
5570        impl<'de> Visitor<'de> for StructVisitor {
5571            type Value = GetSharedLinksResult;
5572            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5573                f.write_str("a GetSharedLinksResult struct")
5574            }
5575            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
5576                GetSharedLinksResult::internal_deserialize(map)
5577            }
5578        }
5579        deserializer.deserialize_struct("GetSharedLinksResult", GET_SHARED_LINKS_RESULT_FIELDS, StructVisitor)
5580    }
5581}
5582
5583impl ::serde::ser::Serialize for GetSharedLinksResult {
5584    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5585        // struct serializer
5586        use serde::ser::SerializeStruct;
5587        let mut s = serializer.serialize_struct("GetSharedLinksResult", 1)?;
5588        self.internal_serialize::<S>(&mut s)?;
5589        s.end()
5590    }
5591}
5592
5593/// The information about a group. Groups is a way to manage a list of users who need same access
5594/// permission to the shared folder.
5595#[derive(Debug, Clone, PartialEq, Eq)]
5596#[non_exhaustive] // structs may have more fields added in the future.
5597pub struct GroupInfo {
5598    pub group_name: String,
5599    pub group_id: crate::types::team_common::GroupId,
5600    /// Who is allowed to manage the group.
5601    pub group_management_type: crate::types::team_common::GroupManagementType,
5602    /// Field is deprecated. The type of group.
5603    #[deprecated]
5604    pub group_type: crate::types::team_common::GroupType,
5605    /// If the current user is a member of the group.
5606    pub is_member: bool,
5607    /// If the current user is an owner of the group.
5608    pub is_owner: bool,
5609    /// If the group is owned by the current user's team.
5610    pub same_team: bool,
5611    /// External ID of group. This is an arbitrary ID that an admin can attach to a group.
5612    pub group_external_id: Option<crate::types::team_common::GroupExternalId>,
5613    /// The number of members in the group.
5614    pub member_count: Option<u32>,
5615}
5616
5617impl GroupInfo {
5618    pub fn new(
5619        group_name: String,
5620        group_id: crate::types::team_common::GroupId,
5621        group_management_type: crate::types::team_common::GroupManagementType,
5622        group_type: crate::types::team_common::GroupType,
5623        is_member: bool,
5624        is_owner: bool,
5625        same_team: bool,
5626    ) -> Self {
5627        GroupInfo {
5628            group_name,
5629            group_id,
5630            group_management_type,
5631            #[allow(deprecated)] group_type,
5632            is_member,
5633            is_owner,
5634            same_team,
5635            group_external_id: None,
5636            member_count: None,
5637        }
5638    }
5639
5640    pub fn with_group_external_id(
5641        mut self,
5642        value: crate::types::team_common::GroupExternalId,
5643    ) -> Self {
5644        self.group_external_id = Some(value);
5645        self
5646    }
5647
5648    pub fn with_member_count(mut self, value: u32) -> Self {
5649        self.member_count = Some(value);
5650        self
5651    }
5652}
5653
5654const GROUP_INFO_FIELDS: &[&str] = &["group_name",
5655                                     "group_id",
5656                                     "group_management_type",
5657                                     "group_type",
5658                                     "is_member",
5659                                     "is_owner",
5660                                     "same_team",
5661                                     "group_external_id",
5662                                     "member_count"];
5663impl GroupInfo {
5664    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
5665        map: V,
5666    ) -> Result<GroupInfo, V::Error> {
5667        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
5668    }
5669
5670    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
5671        mut map: V,
5672        optional: bool,
5673    ) -> Result<Option<GroupInfo>, V::Error> {
5674        let mut field_group_name = None;
5675        let mut field_group_id = None;
5676        let mut field_group_management_type = None;
5677        let mut field_group_type = None;
5678        let mut field_is_member = None;
5679        let mut field_is_owner = None;
5680        let mut field_same_team = None;
5681        let mut field_group_external_id = None;
5682        let mut field_member_count = None;
5683        let mut nothing = true;
5684        while let Some(key) = map.next_key::<&str>()? {
5685            nothing = false;
5686            match key {
5687                "group_name" => {
5688                    if field_group_name.is_some() {
5689                        return Err(::serde::de::Error::duplicate_field("group_name"));
5690                    }
5691                    field_group_name = Some(map.next_value()?);
5692                }
5693                "group_id" => {
5694                    if field_group_id.is_some() {
5695                        return Err(::serde::de::Error::duplicate_field("group_id"));
5696                    }
5697                    field_group_id = Some(map.next_value()?);
5698                }
5699                "group_management_type" => {
5700                    if field_group_management_type.is_some() {
5701                        return Err(::serde::de::Error::duplicate_field("group_management_type"));
5702                    }
5703                    field_group_management_type = Some(map.next_value()?);
5704                }
5705                "group_type" => {
5706                    if field_group_type.is_some() {
5707                        return Err(::serde::de::Error::duplicate_field("group_type"));
5708                    }
5709                    field_group_type = Some(map.next_value()?);
5710                }
5711                "is_member" => {
5712                    if field_is_member.is_some() {
5713                        return Err(::serde::de::Error::duplicate_field("is_member"));
5714                    }
5715                    field_is_member = Some(map.next_value()?);
5716                }
5717                "is_owner" => {
5718                    if field_is_owner.is_some() {
5719                        return Err(::serde::de::Error::duplicate_field("is_owner"));
5720                    }
5721                    field_is_owner = Some(map.next_value()?);
5722                }
5723                "same_team" => {
5724                    if field_same_team.is_some() {
5725                        return Err(::serde::de::Error::duplicate_field("same_team"));
5726                    }
5727                    field_same_team = Some(map.next_value()?);
5728                }
5729                "group_external_id" => {
5730                    if field_group_external_id.is_some() {
5731                        return Err(::serde::de::Error::duplicate_field("group_external_id"));
5732                    }
5733                    field_group_external_id = Some(map.next_value()?);
5734                }
5735                "member_count" => {
5736                    if field_member_count.is_some() {
5737                        return Err(::serde::de::Error::duplicate_field("member_count"));
5738                    }
5739                    field_member_count = Some(map.next_value()?);
5740                }
5741                _ => {
5742                    // unknown field allowed and ignored
5743                    map.next_value::<::serde_json::Value>()?;
5744                }
5745            }
5746        }
5747        if optional && nothing {
5748            return Ok(None);
5749        }
5750        let result = GroupInfo {
5751            group_name: field_group_name.ok_or_else(|| ::serde::de::Error::missing_field("group_name"))?,
5752            group_id: field_group_id.ok_or_else(|| ::serde::de::Error::missing_field("group_id"))?,
5753            group_management_type: field_group_management_type.ok_or_else(|| ::serde::de::Error::missing_field("group_management_type"))?,
5754            #[allow(deprecated)] group_type: field_group_type.ok_or_else(|| ::serde::de::Error::missing_field("group_type"))?,
5755            is_member: field_is_member.ok_or_else(|| ::serde::de::Error::missing_field("is_member"))?,
5756            is_owner: field_is_owner.ok_or_else(|| ::serde::de::Error::missing_field("is_owner"))?,
5757            same_team: field_same_team.ok_or_else(|| ::serde::de::Error::missing_field("same_team"))?,
5758            group_external_id: field_group_external_id.and_then(Option::flatten),
5759            member_count: field_member_count.and_then(Option::flatten),
5760        };
5761        Ok(Some(result))
5762    }
5763
5764    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
5765        &self,
5766        s: &mut S::SerializeStruct,
5767    ) -> Result<(), S::Error> {
5768        use serde::ser::SerializeStruct;
5769        s.serialize_field("group_name", &self.group_name)?;
5770        s.serialize_field("group_id", &self.group_id)?;
5771        s.serialize_field("group_management_type", &self.group_management_type)?;
5772        #[allow(deprecated)]
5773        s.serialize_field("group_type", &self.group_type)?;
5774        s.serialize_field("is_member", &self.is_member)?;
5775        s.serialize_field("is_owner", &self.is_owner)?;
5776        s.serialize_field("same_team", &self.same_team)?;
5777        if let Some(val) = &self.group_external_id {
5778            s.serialize_field("group_external_id", val)?;
5779        }
5780        if let Some(val) = &self.member_count {
5781            s.serialize_field("member_count", val)?;
5782        }
5783        Ok(())
5784    }
5785}
5786
5787impl<'de> ::serde::de::Deserialize<'de> for GroupInfo {
5788    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5789        // struct deserializer
5790        use serde::de::{MapAccess, Visitor};
5791        struct StructVisitor;
5792        impl<'de> Visitor<'de> for StructVisitor {
5793            type Value = GroupInfo;
5794            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5795                f.write_str("a GroupInfo struct")
5796            }
5797            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
5798                GroupInfo::internal_deserialize(map)
5799            }
5800        }
5801        deserializer.deserialize_struct("GroupInfo", GROUP_INFO_FIELDS, StructVisitor)
5802    }
5803}
5804
5805impl ::serde::ser::Serialize for GroupInfo {
5806    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5807        // struct serializer
5808        use serde::ser::SerializeStruct;
5809        let mut s = serializer.serialize_struct("GroupInfo", 9)?;
5810        self.internal_serialize::<S>(&mut s)?;
5811        s.end()
5812    }
5813}
5814
5815// struct extends crate::types::team_common::GroupSummary
5816impl From<GroupInfo> for crate::types::team_common::GroupSummary {
5817    fn from(subtype: GroupInfo) -> Self {
5818        Self {
5819            group_name: subtype.group_name,
5820            group_id: subtype.group_id,
5821            group_management_type: subtype.group_management_type,
5822            group_external_id: subtype.group_external_id,
5823            member_count: subtype.member_count,
5824        }
5825    }
5826}
5827/// The information about a group member of the shared content.
5828#[derive(Debug, Clone, PartialEq, Eq)]
5829#[non_exhaustive] // structs may have more fields added in the future.
5830pub struct GroupMembershipInfo {
5831    /// The access type for this member. It contains inherited access type from parent folder, and
5832    /// acquired access type from this folder.
5833    pub access_type: AccessLevel,
5834    /// The information about the membership group.
5835    pub group: GroupInfo,
5836    /// The permissions that requesting user has on this member. The set of permissions corresponds
5837    /// to the MemberActions in the request.
5838    pub permissions: Option<Vec<MemberPermission>>,
5839    /// Field is deprecated. Never set.
5840    #[deprecated]
5841    pub initials: Option<String>,
5842    /// True if the member has access on a parent folder.
5843    pub is_inherited: bool,
5844}
5845
5846impl GroupMembershipInfo {
5847    pub fn new(access_type: AccessLevel, group: GroupInfo) -> Self {
5848        GroupMembershipInfo {
5849            access_type,
5850            group,
5851            permissions: None,
5852            #[allow(deprecated)] initials: None,
5853            is_inherited: false,
5854        }
5855    }
5856
5857    pub fn with_permissions(mut self, value: Vec<MemberPermission>) -> Self {
5858        self.permissions = Some(value);
5859        self
5860    }
5861
5862    #[deprecated]
5863    #[allow(deprecated)]
5864    pub fn with_initials(mut self, value: String) -> Self {
5865        self.initials = Some(value);
5866        self
5867    }
5868
5869    pub fn with_is_inherited(mut self, value: bool) -> Self {
5870        self.is_inherited = value;
5871        self
5872    }
5873}
5874
5875const GROUP_MEMBERSHIP_INFO_FIELDS: &[&str] = &["access_type",
5876                                                "group",
5877                                                "permissions",
5878                                                "initials",
5879                                                "is_inherited"];
5880impl GroupMembershipInfo {
5881    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
5882        map: V,
5883    ) -> Result<GroupMembershipInfo, V::Error> {
5884        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
5885    }
5886
5887    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
5888        mut map: V,
5889        optional: bool,
5890    ) -> Result<Option<GroupMembershipInfo>, V::Error> {
5891        let mut field_access_type = None;
5892        let mut field_group = None;
5893        let mut field_permissions = None;
5894        let mut field_initials = None;
5895        let mut field_is_inherited = None;
5896        let mut nothing = true;
5897        while let Some(key) = map.next_key::<&str>()? {
5898            nothing = false;
5899            match key {
5900                "access_type" => {
5901                    if field_access_type.is_some() {
5902                        return Err(::serde::de::Error::duplicate_field("access_type"));
5903                    }
5904                    field_access_type = Some(map.next_value()?);
5905                }
5906                "group" => {
5907                    if field_group.is_some() {
5908                        return Err(::serde::de::Error::duplicate_field("group"));
5909                    }
5910                    field_group = Some(map.next_value()?);
5911                }
5912                "permissions" => {
5913                    if field_permissions.is_some() {
5914                        return Err(::serde::de::Error::duplicate_field("permissions"));
5915                    }
5916                    field_permissions = Some(map.next_value()?);
5917                }
5918                "initials" => {
5919                    if field_initials.is_some() {
5920                        return Err(::serde::de::Error::duplicate_field("initials"));
5921                    }
5922                    field_initials = Some(map.next_value()?);
5923                }
5924                "is_inherited" => {
5925                    if field_is_inherited.is_some() {
5926                        return Err(::serde::de::Error::duplicate_field("is_inherited"));
5927                    }
5928                    field_is_inherited = Some(map.next_value()?);
5929                }
5930                _ => {
5931                    // unknown field allowed and ignored
5932                    map.next_value::<::serde_json::Value>()?;
5933                }
5934            }
5935        }
5936        if optional && nothing {
5937            return Ok(None);
5938        }
5939        let result = GroupMembershipInfo {
5940            access_type: field_access_type.ok_or_else(|| ::serde::de::Error::missing_field("access_type"))?,
5941            group: field_group.ok_or_else(|| ::serde::de::Error::missing_field("group"))?,
5942            permissions: field_permissions.and_then(Option::flatten),
5943            #[allow(deprecated)] initials: field_initials.and_then(Option::flatten),
5944            is_inherited: field_is_inherited.unwrap_or(false),
5945        };
5946        Ok(Some(result))
5947    }
5948
5949    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
5950        &self,
5951        s: &mut S::SerializeStruct,
5952    ) -> Result<(), S::Error> {
5953        use serde::ser::SerializeStruct;
5954        s.serialize_field("access_type", &self.access_type)?;
5955        s.serialize_field("group", &self.group)?;
5956        if let Some(val) = &self.permissions {
5957            s.serialize_field("permissions", val)?;
5958        }
5959        #[allow(deprecated)]
5960        if let Some(val) = &self.initials {
5961            s.serialize_field("initials", val)?;
5962        }
5963        if self.is_inherited {
5964            s.serialize_field("is_inherited", &self.is_inherited)?;
5965        }
5966        Ok(())
5967    }
5968}
5969
5970impl<'de> ::serde::de::Deserialize<'de> for GroupMembershipInfo {
5971    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5972        // struct deserializer
5973        use serde::de::{MapAccess, Visitor};
5974        struct StructVisitor;
5975        impl<'de> Visitor<'de> for StructVisitor {
5976            type Value = GroupMembershipInfo;
5977            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5978                f.write_str("a GroupMembershipInfo struct")
5979            }
5980            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
5981                GroupMembershipInfo::internal_deserialize(map)
5982            }
5983        }
5984        deserializer.deserialize_struct("GroupMembershipInfo", GROUP_MEMBERSHIP_INFO_FIELDS, StructVisitor)
5985    }
5986}
5987
5988impl ::serde::ser::Serialize for GroupMembershipInfo {
5989    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5990        // struct serializer
5991        use serde::ser::SerializeStruct;
5992        let mut s = serializer.serialize_struct("GroupMembershipInfo", 5)?;
5993        self.internal_serialize::<S>(&mut s)?;
5994        s.end()
5995    }
5996}
5997
5998// struct extends MembershipInfo
5999impl From<GroupMembershipInfo> for MembershipInfo {
6000    fn from(subtype: GroupMembershipInfo) -> Self {
6001        Self {
6002            access_type: subtype.access_type,
6003            permissions: subtype.permissions,
6004            #[allow(deprecated)] initials: subtype.initials,
6005            is_inherited: subtype.is_inherited,
6006        }
6007    }
6008}
6009#[derive(Debug, Clone, PartialEq, Eq)]
6010#[non_exhaustive] // structs may have more fields added in the future.
6011pub struct InsufficientPlan {
6012    /// A message to tell the user to upgrade in order to support expected action.
6013    pub message: String,
6014    /// A URL to send the user to in order to obtain the account type they need, e.g. upgrading.
6015    /// Absent if there is no action the user can take to upgrade.
6016    pub upsell_url: Option<String>,
6017}
6018
6019impl InsufficientPlan {
6020    pub fn new(message: String) -> Self {
6021        InsufficientPlan {
6022            message,
6023            upsell_url: None,
6024        }
6025    }
6026
6027    pub fn with_upsell_url(mut self, value: String) -> Self {
6028        self.upsell_url = Some(value);
6029        self
6030    }
6031}
6032
6033const INSUFFICIENT_PLAN_FIELDS: &[&str] = &["message",
6034                                            "upsell_url"];
6035impl InsufficientPlan {
6036    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
6037        map: V,
6038    ) -> Result<InsufficientPlan, V::Error> {
6039        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
6040    }
6041
6042    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
6043        mut map: V,
6044        optional: bool,
6045    ) -> Result<Option<InsufficientPlan>, V::Error> {
6046        let mut field_message = None;
6047        let mut field_upsell_url = None;
6048        let mut nothing = true;
6049        while let Some(key) = map.next_key::<&str>()? {
6050            nothing = false;
6051            match key {
6052                "message" => {
6053                    if field_message.is_some() {
6054                        return Err(::serde::de::Error::duplicate_field("message"));
6055                    }
6056                    field_message = Some(map.next_value()?);
6057                }
6058                "upsell_url" => {
6059                    if field_upsell_url.is_some() {
6060                        return Err(::serde::de::Error::duplicate_field("upsell_url"));
6061                    }
6062                    field_upsell_url = Some(map.next_value()?);
6063                }
6064                _ => {
6065                    // unknown field allowed and ignored
6066                    map.next_value::<::serde_json::Value>()?;
6067                }
6068            }
6069        }
6070        if optional && nothing {
6071            return Ok(None);
6072        }
6073        let result = InsufficientPlan {
6074            message: field_message.ok_or_else(|| ::serde::de::Error::missing_field("message"))?,
6075            upsell_url: field_upsell_url.and_then(Option::flatten),
6076        };
6077        Ok(Some(result))
6078    }
6079
6080    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
6081        &self,
6082        s: &mut S::SerializeStruct,
6083    ) -> Result<(), S::Error> {
6084        use serde::ser::SerializeStruct;
6085        s.serialize_field("message", &self.message)?;
6086        if let Some(val) = &self.upsell_url {
6087            s.serialize_field("upsell_url", val)?;
6088        }
6089        Ok(())
6090    }
6091}
6092
6093impl<'de> ::serde::de::Deserialize<'de> for InsufficientPlan {
6094    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6095        // struct deserializer
6096        use serde::de::{MapAccess, Visitor};
6097        struct StructVisitor;
6098        impl<'de> Visitor<'de> for StructVisitor {
6099            type Value = InsufficientPlan;
6100            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6101                f.write_str("a InsufficientPlan struct")
6102            }
6103            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
6104                InsufficientPlan::internal_deserialize(map)
6105            }
6106        }
6107        deserializer.deserialize_struct("InsufficientPlan", INSUFFICIENT_PLAN_FIELDS, StructVisitor)
6108    }
6109}
6110
6111impl ::serde::ser::Serialize for InsufficientPlan {
6112    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6113        // struct serializer
6114        use serde::ser::SerializeStruct;
6115        let mut s = serializer.serialize_struct("InsufficientPlan", 2)?;
6116        self.internal_serialize::<S>(&mut s)?;
6117        s.end()
6118    }
6119}
6120
6121#[derive(Debug, Clone, PartialEq, Eq)]
6122#[non_exhaustive] // structs may have more fields added in the future.
6123pub struct InsufficientQuotaAmounts {
6124    /// The amount of space needed to add the item (the size of the item).
6125    pub space_needed: u64,
6126    /// The amount of extra space needed to add the item.
6127    pub space_shortage: u64,
6128    /// The amount of space left in the user's Dropbox, less than space_needed.
6129    pub space_left: u64,
6130}
6131
6132impl InsufficientQuotaAmounts {
6133    pub fn new(space_needed: u64, space_shortage: u64, space_left: u64) -> Self {
6134        InsufficientQuotaAmounts {
6135            space_needed,
6136            space_shortage,
6137            space_left,
6138        }
6139    }
6140}
6141
6142const INSUFFICIENT_QUOTA_AMOUNTS_FIELDS: &[&str] = &["space_needed",
6143                                                     "space_shortage",
6144                                                     "space_left"];
6145impl InsufficientQuotaAmounts {
6146    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
6147        map: V,
6148    ) -> Result<InsufficientQuotaAmounts, V::Error> {
6149        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
6150    }
6151
6152    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
6153        mut map: V,
6154        optional: bool,
6155    ) -> Result<Option<InsufficientQuotaAmounts>, V::Error> {
6156        let mut field_space_needed = None;
6157        let mut field_space_shortage = None;
6158        let mut field_space_left = None;
6159        let mut nothing = true;
6160        while let Some(key) = map.next_key::<&str>()? {
6161            nothing = false;
6162            match key {
6163                "space_needed" => {
6164                    if field_space_needed.is_some() {
6165                        return Err(::serde::de::Error::duplicate_field("space_needed"));
6166                    }
6167                    field_space_needed = Some(map.next_value()?);
6168                }
6169                "space_shortage" => {
6170                    if field_space_shortage.is_some() {
6171                        return Err(::serde::de::Error::duplicate_field("space_shortage"));
6172                    }
6173                    field_space_shortage = Some(map.next_value()?);
6174                }
6175                "space_left" => {
6176                    if field_space_left.is_some() {
6177                        return Err(::serde::de::Error::duplicate_field("space_left"));
6178                    }
6179                    field_space_left = Some(map.next_value()?);
6180                }
6181                _ => {
6182                    // unknown field allowed and ignored
6183                    map.next_value::<::serde_json::Value>()?;
6184                }
6185            }
6186        }
6187        if optional && nothing {
6188            return Ok(None);
6189        }
6190        let result = InsufficientQuotaAmounts {
6191            space_needed: field_space_needed.ok_or_else(|| ::serde::de::Error::missing_field("space_needed"))?,
6192            space_shortage: field_space_shortage.ok_or_else(|| ::serde::de::Error::missing_field("space_shortage"))?,
6193            space_left: field_space_left.ok_or_else(|| ::serde::de::Error::missing_field("space_left"))?,
6194        };
6195        Ok(Some(result))
6196    }
6197
6198    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
6199        &self,
6200        s: &mut S::SerializeStruct,
6201    ) -> Result<(), S::Error> {
6202        use serde::ser::SerializeStruct;
6203        s.serialize_field("space_needed", &self.space_needed)?;
6204        s.serialize_field("space_shortage", &self.space_shortage)?;
6205        s.serialize_field("space_left", &self.space_left)?;
6206        Ok(())
6207    }
6208}
6209
6210impl<'de> ::serde::de::Deserialize<'de> for InsufficientQuotaAmounts {
6211    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6212        // struct deserializer
6213        use serde::de::{MapAccess, Visitor};
6214        struct StructVisitor;
6215        impl<'de> Visitor<'de> for StructVisitor {
6216            type Value = InsufficientQuotaAmounts;
6217            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6218                f.write_str("a InsufficientQuotaAmounts struct")
6219            }
6220            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
6221                InsufficientQuotaAmounts::internal_deserialize(map)
6222            }
6223        }
6224        deserializer.deserialize_struct("InsufficientQuotaAmounts", INSUFFICIENT_QUOTA_AMOUNTS_FIELDS, StructVisitor)
6225    }
6226}
6227
6228impl ::serde::ser::Serialize for InsufficientQuotaAmounts {
6229    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6230        // struct serializer
6231        use serde::ser::SerializeStruct;
6232        let mut s = serializer.serialize_struct("InsufficientQuotaAmounts", 3)?;
6233        self.internal_serialize::<S>(&mut s)?;
6234        s.end()
6235    }
6236}
6237
6238/// Information about the recipient of a shared content invitation.
6239#[derive(Debug, Clone, PartialEq, Eq)]
6240#[non_exhaustive] // variants may be added in the future
6241pub enum InviteeInfo {
6242    /// Email address of invited user.
6243    Email(crate::types::common::EmailAddress),
6244    /// Catch-all used for unrecognized values returned from the server. Encountering this value
6245    /// typically indicates that this SDK version is out of date.
6246    Other,
6247}
6248
6249impl<'de> ::serde::de::Deserialize<'de> for InviteeInfo {
6250    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6251        // union deserializer
6252        use serde::de::{self, MapAccess, Visitor};
6253        struct EnumVisitor;
6254        impl<'de> Visitor<'de> for EnumVisitor {
6255            type Value = InviteeInfo;
6256            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6257                f.write_str("a InviteeInfo structure")
6258            }
6259            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
6260                let tag: &str = match map.next_key()? {
6261                    Some(".tag") => map.next_value()?,
6262                    _ => return Err(de::Error::missing_field(".tag"))
6263                };
6264                let value = match tag {
6265                    "email" => {
6266                        match map.next_key()? {
6267                            Some("email") => InviteeInfo::Email(map.next_value()?),
6268                            None => return Err(de::Error::missing_field("email")),
6269                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
6270                        }
6271                    }
6272                    _ => InviteeInfo::Other,
6273                };
6274                crate::eat_json_fields(&mut map)?;
6275                Ok(value)
6276            }
6277        }
6278        const VARIANTS: &[&str] = &["email",
6279                                    "other"];
6280        deserializer.deserialize_struct("InviteeInfo", VARIANTS, EnumVisitor)
6281    }
6282}
6283
6284impl ::serde::ser::Serialize for InviteeInfo {
6285    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6286        // union serializer
6287        use serde::ser::SerializeStruct;
6288        match self {
6289            InviteeInfo::Email(x) => {
6290                // primitive
6291                let mut s = serializer.serialize_struct("InviteeInfo", 2)?;
6292                s.serialize_field(".tag", "email")?;
6293                s.serialize_field("email", x)?;
6294                s.end()
6295            }
6296            InviteeInfo::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
6297        }
6298    }
6299}
6300
6301/// Information about an invited member of a shared content.
6302#[derive(Debug, Clone, PartialEq, Eq)]
6303#[non_exhaustive] // structs may have more fields added in the future.
6304pub struct InviteeMembershipInfo {
6305    /// The access type for this member. It contains inherited access type from parent folder, and
6306    /// acquired access type from this folder.
6307    pub access_type: AccessLevel,
6308    /// Recipient of the invitation.
6309    pub invitee: InviteeInfo,
6310    /// The permissions that requesting user has on this member. The set of permissions corresponds
6311    /// to the MemberActions in the request.
6312    pub permissions: Option<Vec<MemberPermission>>,
6313    /// Field is deprecated. Never set.
6314    #[deprecated]
6315    pub initials: Option<String>,
6316    /// True if the member has access on a parent folder.
6317    pub is_inherited: bool,
6318    /// The user this invitation is tied to, if available.
6319    pub user: Option<UserInfo>,
6320}
6321
6322impl InviteeMembershipInfo {
6323    pub fn new(access_type: AccessLevel, invitee: InviteeInfo) -> Self {
6324        InviteeMembershipInfo {
6325            access_type,
6326            invitee,
6327            permissions: None,
6328            #[allow(deprecated)] initials: None,
6329            is_inherited: false,
6330            user: None,
6331        }
6332    }
6333
6334    pub fn with_permissions(mut self, value: Vec<MemberPermission>) -> Self {
6335        self.permissions = Some(value);
6336        self
6337    }
6338
6339    #[deprecated]
6340    #[allow(deprecated)]
6341    pub fn with_initials(mut self, value: String) -> Self {
6342        self.initials = Some(value);
6343        self
6344    }
6345
6346    pub fn with_is_inherited(mut self, value: bool) -> Self {
6347        self.is_inherited = value;
6348        self
6349    }
6350
6351    pub fn with_user(mut self, value: UserInfo) -> Self {
6352        self.user = Some(value);
6353        self
6354    }
6355}
6356
6357const INVITEE_MEMBERSHIP_INFO_FIELDS: &[&str] = &["access_type",
6358                                                  "invitee",
6359                                                  "permissions",
6360                                                  "initials",
6361                                                  "is_inherited",
6362                                                  "user"];
6363impl InviteeMembershipInfo {
6364    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
6365        map: V,
6366    ) -> Result<InviteeMembershipInfo, V::Error> {
6367        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
6368    }
6369
6370    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
6371        mut map: V,
6372        optional: bool,
6373    ) -> Result<Option<InviteeMembershipInfo>, V::Error> {
6374        let mut field_access_type = None;
6375        let mut field_invitee = None;
6376        let mut field_permissions = None;
6377        let mut field_initials = None;
6378        let mut field_is_inherited = None;
6379        let mut field_user = None;
6380        let mut nothing = true;
6381        while let Some(key) = map.next_key::<&str>()? {
6382            nothing = false;
6383            match key {
6384                "access_type" => {
6385                    if field_access_type.is_some() {
6386                        return Err(::serde::de::Error::duplicate_field("access_type"));
6387                    }
6388                    field_access_type = Some(map.next_value()?);
6389                }
6390                "invitee" => {
6391                    if field_invitee.is_some() {
6392                        return Err(::serde::de::Error::duplicate_field("invitee"));
6393                    }
6394                    field_invitee = Some(map.next_value()?);
6395                }
6396                "permissions" => {
6397                    if field_permissions.is_some() {
6398                        return Err(::serde::de::Error::duplicate_field("permissions"));
6399                    }
6400                    field_permissions = Some(map.next_value()?);
6401                }
6402                "initials" => {
6403                    if field_initials.is_some() {
6404                        return Err(::serde::de::Error::duplicate_field("initials"));
6405                    }
6406                    field_initials = Some(map.next_value()?);
6407                }
6408                "is_inherited" => {
6409                    if field_is_inherited.is_some() {
6410                        return Err(::serde::de::Error::duplicate_field("is_inherited"));
6411                    }
6412                    field_is_inherited = Some(map.next_value()?);
6413                }
6414                "user" => {
6415                    if field_user.is_some() {
6416                        return Err(::serde::de::Error::duplicate_field("user"));
6417                    }
6418                    field_user = Some(map.next_value()?);
6419                }
6420                _ => {
6421                    // unknown field allowed and ignored
6422                    map.next_value::<::serde_json::Value>()?;
6423                }
6424            }
6425        }
6426        if optional && nothing {
6427            return Ok(None);
6428        }
6429        let result = InviteeMembershipInfo {
6430            access_type: field_access_type.ok_or_else(|| ::serde::de::Error::missing_field("access_type"))?,
6431            invitee: field_invitee.ok_or_else(|| ::serde::de::Error::missing_field("invitee"))?,
6432            permissions: field_permissions.and_then(Option::flatten),
6433            #[allow(deprecated)] initials: field_initials.and_then(Option::flatten),
6434            is_inherited: field_is_inherited.unwrap_or(false),
6435            user: field_user.and_then(Option::flatten),
6436        };
6437        Ok(Some(result))
6438    }
6439
6440    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
6441        &self,
6442        s: &mut S::SerializeStruct,
6443    ) -> Result<(), S::Error> {
6444        use serde::ser::SerializeStruct;
6445        s.serialize_field("access_type", &self.access_type)?;
6446        s.serialize_field("invitee", &self.invitee)?;
6447        if let Some(val) = &self.permissions {
6448            s.serialize_field("permissions", val)?;
6449        }
6450        #[allow(deprecated)]
6451        if let Some(val) = &self.initials {
6452            s.serialize_field("initials", val)?;
6453        }
6454        if self.is_inherited {
6455            s.serialize_field("is_inherited", &self.is_inherited)?;
6456        }
6457        if let Some(val) = &self.user {
6458            s.serialize_field("user", val)?;
6459        }
6460        Ok(())
6461    }
6462}
6463
6464impl<'de> ::serde::de::Deserialize<'de> for InviteeMembershipInfo {
6465    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6466        // struct deserializer
6467        use serde::de::{MapAccess, Visitor};
6468        struct StructVisitor;
6469        impl<'de> Visitor<'de> for StructVisitor {
6470            type Value = InviteeMembershipInfo;
6471            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6472                f.write_str("a InviteeMembershipInfo struct")
6473            }
6474            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
6475                InviteeMembershipInfo::internal_deserialize(map)
6476            }
6477        }
6478        deserializer.deserialize_struct("InviteeMembershipInfo", INVITEE_MEMBERSHIP_INFO_FIELDS, StructVisitor)
6479    }
6480}
6481
6482impl ::serde::ser::Serialize for InviteeMembershipInfo {
6483    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6484        // struct serializer
6485        use serde::ser::SerializeStruct;
6486        let mut s = serializer.serialize_struct("InviteeMembershipInfo", 6)?;
6487        self.internal_serialize::<S>(&mut s)?;
6488        s.end()
6489    }
6490}
6491
6492// struct extends MembershipInfo
6493impl From<InviteeMembershipInfo> for MembershipInfo {
6494    fn from(subtype: InviteeMembershipInfo) -> Self {
6495        Self {
6496            access_type: subtype.access_type,
6497            permissions: subtype.permissions,
6498            #[allow(deprecated)] initials: subtype.initials,
6499            is_inherited: subtype.is_inherited,
6500        }
6501    }
6502}
6503/// Error occurred while performing an asynchronous job from
6504/// [`unshare_folder()`](crate::sharing::unshare_folder) or
6505/// [`remove_folder_member()`](crate::sharing::remove_folder_member).
6506#[derive(Debug, Clone, PartialEq, Eq)]
6507#[non_exhaustive] // variants may be added in the future
6508pub enum JobError {
6509    /// Error occurred while performing [`unshare_folder()`](crate::sharing::unshare_folder) action.
6510    UnshareFolderError(UnshareFolderError),
6511    /// Error occurred while performing
6512    /// [`remove_folder_member()`](crate::sharing::remove_folder_member) action.
6513    RemoveFolderMemberError(RemoveFolderMemberError),
6514    /// Error occurred while performing
6515    /// [`relinquish_folder_membership()`](crate::sharing::relinquish_folder_membership) action.
6516    RelinquishFolderMembershipError(RelinquishFolderMembershipError),
6517    /// Catch-all used for unrecognized values returned from the server. Encountering this value
6518    /// typically indicates that this SDK version is out of date.
6519    Other,
6520}
6521
6522impl<'de> ::serde::de::Deserialize<'de> for JobError {
6523    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6524        // union deserializer
6525        use serde::de::{self, MapAccess, Visitor};
6526        struct EnumVisitor;
6527        impl<'de> Visitor<'de> for EnumVisitor {
6528            type Value = JobError;
6529            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6530                f.write_str("a JobError structure")
6531            }
6532            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
6533                let tag: &str = match map.next_key()? {
6534                    Some(".tag") => map.next_value()?,
6535                    _ => return Err(de::Error::missing_field(".tag"))
6536                };
6537                let value = match tag {
6538                    "unshare_folder_error" => {
6539                        match map.next_key()? {
6540                            Some("unshare_folder_error") => JobError::UnshareFolderError(map.next_value()?),
6541                            None => return Err(de::Error::missing_field("unshare_folder_error")),
6542                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
6543                        }
6544                    }
6545                    "remove_folder_member_error" => {
6546                        match map.next_key()? {
6547                            Some("remove_folder_member_error") => JobError::RemoveFolderMemberError(map.next_value()?),
6548                            None => return Err(de::Error::missing_field("remove_folder_member_error")),
6549                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
6550                        }
6551                    }
6552                    "relinquish_folder_membership_error" => {
6553                        match map.next_key()? {
6554                            Some("relinquish_folder_membership_error") => JobError::RelinquishFolderMembershipError(map.next_value()?),
6555                            None => return Err(de::Error::missing_field("relinquish_folder_membership_error")),
6556                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
6557                        }
6558                    }
6559                    _ => JobError::Other,
6560                };
6561                crate::eat_json_fields(&mut map)?;
6562                Ok(value)
6563            }
6564        }
6565        const VARIANTS: &[&str] = &["unshare_folder_error",
6566                                    "remove_folder_member_error",
6567                                    "relinquish_folder_membership_error",
6568                                    "other"];
6569        deserializer.deserialize_struct("JobError", VARIANTS, EnumVisitor)
6570    }
6571}
6572
6573impl ::serde::ser::Serialize for JobError {
6574    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6575        // union serializer
6576        use serde::ser::SerializeStruct;
6577        match self {
6578            JobError::UnshareFolderError(x) => {
6579                // union or polymporphic struct
6580                let mut s = serializer.serialize_struct("JobError", 2)?;
6581                s.serialize_field(".tag", "unshare_folder_error")?;
6582                s.serialize_field("unshare_folder_error", x)?;
6583                s.end()
6584            }
6585            JobError::RemoveFolderMemberError(x) => {
6586                // union or polymporphic struct
6587                let mut s = serializer.serialize_struct("JobError", 2)?;
6588                s.serialize_field(".tag", "remove_folder_member_error")?;
6589                s.serialize_field("remove_folder_member_error", x)?;
6590                s.end()
6591            }
6592            JobError::RelinquishFolderMembershipError(x) => {
6593                // union or polymporphic struct
6594                let mut s = serializer.serialize_struct("JobError", 2)?;
6595                s.serialize_field(".tag", "relinquish_folder_membership_error")?;
6596                s.serialize_field("relinquish_folder_membership_error", x)?;
6597                s.end()
6598            }
6599            JobError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
6600        }
6601    }
6602}
6603
6604impl ::std::error::Error for JobError {
6605    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
6606        match self {
6607            JobError::UnshareFolderError(inner) => Some(inner),
6608            JobError::RemoveFolderMemberError(inner) => Some(inner),
6609            JobError::RelinquishFolderMembershipError(inner) => Some(inner),
6610            _ => None,
6611        }
6612    }
6613}
6614
6615impl ::std::fmt::Display for JobError {
6616    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6617        match self {
6618            JobError::UnshareFolderError(inner) => write!(f, "JobError: {}", inner),
6619            JobError::RemoveFolderMemberError(inner) => write!(f, "JobError: {}", inner),
6620            JobError::RelinquishFolderMembershipError(inner) => write!(f, "JobError: {}", inner),
6621            _ => write!(f, "{:?}", *self),
6622        }
6623    }
6624}
6625
6626#[derive(Debug, Clone, PartialEq, Eq)]
6627pub enum JobStatus {
6628    /// The asynchronous job is still in progress.
6629    InProgress,
6630    /// The asynchronous job has finished.
6631    Complete,
6632    /// The asynchronous job returned an error.
6633    Failed(JobError),
6634}
6635
6636impl<'de> ::serde::de::Deserialize<'de> for JobStatus {
6637    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6638        // union deserializer
6639        use serde::de::{self, MapAccess, Visitor};
6640        struct EnumVisitor;
6641        impl<'de> Visitor<'de> for EnumVisitor {
6642            type Value = JobStatus;
6643            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6644                f.write_str("a JobStatus structure")
6645            }
6646            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
6647                let tag: &str = match map.next_key()? {
6648                    Some(".tag") => map.next_value()?,
6649                    _ => return Err(de::Error::missing_field(".tag"))
6650                };
6651                let value = match tag {
6652                    "in_progress" => JobStatus::InProgress,
6653                    "complete" => JobStatus::Complete,
6654                    "failed" => {
6655                        match map.next_key()? {
6656                            Some("failed") => JobStatus::Failed(map.next_value()?),
6657                            None => return Err(de::Error::missing_field("failed")),
6658                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
6659                        }
6660                    }
6661                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
6662                };
6663                crate::eat_json_fields(&mut map)?;
6664                Ok(value)
6665            }
6666        }
6667        const VARIANTS: &[&str] = &["in_progress",
6668                                    "complete",
6669                                    "failed"];
6670        deserializer.deserialize_struct("JobStatus", VARIANTS, EnumVisitor)
6671    }
6672}
6673
6674impl ::serde::ser::Serialize for JobStatus {
6675    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6676        // union serializer
6677        use serde::ser::SerializeStruct;
6678        match self {
6679            JobStatus::InProgress => {
6680                // unit
6681                let mut s = serializer.serialize_struct("JobStatus", 1)?;
6682                s.serialize_field(".tag", "in_progress")?;
6683                s.end()
6684            }
6685            JobStatus::Complete => {
6686                // unit
6687                let mut s = serializer.serialize_struct("JobStatus", 1)?;
6688                s.serialize_field(".tag", "complete")?;
6689                s.end()
6690            }
6691            JobStatus::Failed(x) => {
6692                // union or polymporphic struct
6693                let mut s = serializer.serialize_struct("JobStatus", 2)?;
6694                s.serialize_field(".tag", "failed")?;
6695                s.serialize_field("failed", x)?;
6696                s.end()
6697            }
6698        }
6699    }
6700}
6701
6702// union extends crate::types::dbx_async::PollResultBase
6703impl From<crate::types::dbx_async::PollResultBase> for JobStatus {
6704    fn from(parent: crate::types::dbx_async::PollResultBase) -> Self {
6705        match parent {
6706            crate::types::dbx_async::PollResultBase::InProgress => JobStatus::InProgress,
6707        }
6708    }
6709}
6710#[derive(Debug, Clone, PartialEq, Eq)]
6711#[non_exhaustive] // variants may be added in the future
6712pub enum LinkAccessLevel {
6713    /// Users who use the link can view and comment on the content.
6714    Viewer,
6715    /// Users who use the link can edit, view and comment on the content.
6716    Editor,
6717    /// Catch-all used for unrecognized values returned from the server. Encountering this value
6718    /// typically indicates that this SDK version is out of date.
6719    Other,
6720}
6721
6722impl<'de> ::serde::de::Deserialize<'de> for LinkAccessLevel {
6723    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6724        // union deserializer
6725        use serde::de::{self, MapAccess, Visitor};
6726        struct EnumVisitor;
6727        impl<'de> Visitor<'de> for EnumVisitor {
6728            type Value = LinkAccessLevel;
6729            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6730                f.write_str("a LinkAccessLevel structure")
6731            }
6732            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
6733                let tag: &str = match map.next_key()? {
6734                    Some(".tag") => map.next_value()?,
6735                    _ => return Err(de::Error::missing_field(".tag"))
6736                };
6737                let value = match tag {
6738                    "viewer" => LinkAccessLevel::Viewer,
6739                    "editor" => LinkAccessLevel::Editor,
6740                    _ => LinkAccessLevel::Other,
6741                };
6742                crate::eat_json_fields(&mut map)?;
6743                Ok(value)
6744            }
6745        }
6746        const VARIANTS: &[&str] = &["viewer",
6747                                    "editor",
6748                                    "other"];
6749        deserializer.deserialize_struct("LinkAccessLevel", VARIANTS, EnumVisitor)
6750    }
6751}
6752
6753impl ::serde::ser::Serialize for LinkAccessLevel {
6754    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6755        // union serializer
6756        use serde::ser::SerializeStruct;
6757        match self {
6758            LinkAccessLevel::Viewer => {
6759                // unit
6760                let mut s = serializer.serialize_struct("LinkAccessLevel", 1)?;
6761                s.serialize_field(".tag", "viewer")?;
6762                s.end()
6763            }
6764            LinkAccessLevel::Editor => {
6765                // unit
6766                let mut s = serializer.serialize_struct("LinkAccessLevel", 1)?;
6767                s.serialize_field(".tag", "editor")?;
6768                s.end()
6769            }
6770            LinkAccessLevel::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
6771        }
6772    }
6773}
6774
6775/// Actions that can be performed on a link.
6776#[derive(Debug, Clone, PartialEq, Eq)]
6777#[non_exhaustive] // variants may be added in the future
6778pub enum LinkAction {
6779    /// Change the access level of the link.
6780    ChangeAccessLevel,
6781    /// Change the audience of the link.
6782    ChangeAudience,
6783    /// Remove the expiry date of the link.
6784    RemoveExpiry,
6785    /// Remove the password of the link.
6786    RemovePassword,
6787    /// Create or modify the expiry date of the link.
6788    SetExpiry,
6789    /// Create or modify the password of the link.
6790    SetPassword,
6791    /// Catch-all used for unrecognized values returned from the server. Encountering this value
6792    /// typically indicates that this SDK version is out of date.
6793    Other,
6794}
6795
6796impl<'de> ::serde::de::Deserialize<'de> for LinkAction {
6797    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6798        // union deserializer
6799        use serde::de::{self, MapAccess, Visitor};
6800        struct EnumVisitor;
6801        impl<'de> Visitor<'de> for EnumVisitor {
6802            type Value = LinkAction;
6803            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6804                f.write_str("a LinkAction structure")
6805            }
6806            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
6807                let tag: &str = match map.next_key()? {
6808                    Some(".tag") => map.next_value()?,
6809                    _ => return Err(de::Error::missing_field(".tag"))
6810                };
6811                let value = match tag {
6812                    "change_access_level" => LinkAction::ChangeAccessLevel,
6813                    "change_audience" => LinkAction::ChangeAudience,
6814                    "remove_expiry" => LinkAction::RemoveExpiry,
6815                    "remove_password" => LinkAction::RemovePassword,
6816                    "set_expiry" => LinkAction::SetExpiry,
6817                    "set_password" => LinkAction::SetPassword,
6818                    _ => LinkAction::Other,
6819                };
6820                crate::eat_json_fields(&mut map)?;
6821                Ok(value)
6822            }
6823        }
6824        const VARIANTS: &[&str] = &["change_access_level",
6825                                    "change_audience",
6826                                    "remove_expiry",
6827                                    "remove_password",
6828                                    "set_expiry",
6829                                    "set_password",
6830                                    "other"];
6831        deserializer.deserialize_struct("LinkAction", VARIANTS, EnumVisitor)
6832    }
6833}
6834
6835impl ::serde::ser::Serialize for LinkAction {
6836    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6837        // union serializer
6838        use serde::ser::SerializeStruct;
6839        match self {
6840            LinkAction::ChangeAccessLevel => {
6841                // unit
6842                let mut s = serializer.serialize_struct("LinkAction", 1)?;
6843                s.serialize_field(".tag", "change_access_level")?;
6844                s.end()
6845            }
6846            LinkAction::ChangeAudience => {
6847                // unit
6848                let mut s = serializer.serialize_struct("LinkAction", 1)?;
6849                s.serialize_field(".tag", "change_audience")?;
6850                s.end()
6851            }
6852            LinkAction::RemoveExpiry => {
6853                // unit
6854                let mut s = serializer.serialize_struct("LinkAction", 1)?;
6855                s.serialize_field(".tag", "remove_expiry")?;
6856                s.end()
6857            }
6858            LinkAction::RemovePassword => {
6859                // unit
6860                let mut s = serializer.serialize_struct("LinkAction", 1)?;
6861                s.serialize_field(".tag", "remove_password")?;
6862                s.end()
6863            }
6864            LinkAction::SetExpiry => {
6865                // unit
6866                let mut s = serializer.serialize_struct("LinkAction", 1)?;
6867                s.serialize_field(".tag", "set_expiry")?;
6868                s.end()
6869            }
6870            LinkAction::SetPassword => {
6871                // unit
6872                let mut s = serializer.serialize_struct("LinkAction", 1)?;
6873                s.serialize_field(".tag", "set_password")?;
6874                s.end()
6875            }
6876            LinkAction::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
6877        }
6878    }
6879}
6880
6881#[derive(Debug, Clone, PartialEq, Eq)]
6882#[non_exhaustive] // variants may be added in the future
6883pub enum LinkAudience {
6884    /// Link is accessible by anyone.
6885    Public,
6886    /// Link is accessible only by team members.
6887    Team,
6888    /// The link can be used by no one. The link merely points the user to the content, and does not
6889    /// grant additional rights to the user. Members of the content who use this link can only
6890    /// access the content with their pre-existing access rights.
6891    NoOne,
6892    /// Field is deprecated. Use `require_password` instead. A link-specific password is required to
6893    /// access the link. Login is not required.
6894    #[deprecated]
6895    Password,
6896    /// Field is deprecated. Link is accessible only by members of the content.
6897    #[deprecated]
6898    Members,
6899    /// Catch-all used for unrecognized values returned from the server. Encountering this value
6900    /// typically indicates that this SDK version is out of date.
6901    Other,
6902}
6903
6904impl<'de> ::serde::de::Deserialize<'de> for LinkAudience {
6905    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6906        // union deserializer
6907        use serde::de::{self, MapAccess, Visitor};
6908        struct EnumVisitor;
6909        impl<'de> Visitor<'de> for EnumVisitor {
6910            type Value = LinkAudience;
6911            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6912                f.write_str("a LinkAudience structure")
6913            }
6914            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
6915                let tag: &str = match map.next_key()? {
6916                    Some(".tag") => map.next_value()?,
6917                    _ => return Err(de::Error::missing_field(".tag"))
6918                };
6919                let value = match tag {
6920                    "public" => LinkAudience::Public,
6921                    "team" => LinkAudience::Team,
6922                    "no_one" => LinkAudience::NoOne,
6923                    #[allow(deprecated)]
6924                    "password" => LinkAudience::Password,
6925                    #[allow(deprecated)]
6926                    "members" => LinkAudience::Members,
6927                    _ => LinkAudience::Other,
6928                };
6929                crate::eat_json_fields(&mut map)?;
6930                Ok(value)
6931            }
6932        }
6933        const VARIANTS: &[&str] = &["public",
6934                                    "team",
6935                                    "no_one",
6936                                    "password",
6937                                    "members",
6938                                    "other"];
6939        deserializer.deserialize_struct("LinkAudience", VARIANTS, EnumVisitor)
6940    }
6941}
6942
6943impl ::serde::ser::Serialize for LinkAudience {
6944    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6945        // union serializer
6946        use serde::ser::SerializeStruct;
6947        match self {
6948            LinkAudience::Public => {
6949                // unit
6950                let mut s = serializer.serialize_struct("LinkAudience", 1)?;
6951                s.serialize_field(".tag", "public")?;
6952                s.end()
6953            }
6954            LinkAudience::Team => {
6955                // unit
6956                let mut s = serializer.serialize_struct("LinkAudience", 1)?;
6957                s.serialize_field(".tag", "team")?;
6958                s.end()
6959            }
6960            LinkAudience::NoOne => {
6961                // unit
6962                let mut s = serializer.serialize_struct("LinkAudience", 1)?;
6963                s.serialize_field(".tag", "no_one")?;
6964                s.end()
6965            }
6966            #[allow(deprecated)]
6967            LinkAudience::Password => {
6968                // unit
6969                let mut s = serializer.serialize_struct("LinkAudience", 1)?;
6970                s.serialize_field(".tag", "password")?;
6971                s.end()
6972            }
6973            #[allow(deprecated)]
6974            LinkAudience::Members => {
6975                // unit
6976                let mut s = serializer.serialize_struct("LinkAudience", 1)?;
6977                s.serialize_field(".tag", "members")?;
6978                s.end()
6979            }
6980            LinkAudience::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
6981        }
6982    }
6983}
6984
6985/// check documentation for VisibilityPolicyDisallowedReason.
6986#[derive(Debug, Clone, PartialEq, Eq)]
6987#[non_exhaustive] // variants may be added in the future
6988pub enum LinkAudienceDisallowedReason {
6989    /// The user needs to delete and recreate the link to change the visibility policy.
6990    DeleteAndRecreate,
6991    /// The parent shared folder restricts sharing of links outside the shared folder. To change the
6992    /// visibility policy, remove the restriction from the parent shared folder.
6993    RestrictedBySharedFolder,
6994    /// The team policy prevents links being shared outside the team.
6995    RestrictedByTeam,
6996    /// The user needs to be on a team to set this policy.
6997    UserNotOnTeam,
6998    /// The user is a basic user or is on a limited team.
6999    UserAccountType,
7000    /// The user does not have permission.
7001    PermissionDenied,
7002    /// Catch-all used for unrecognized values returned from the server. Encountering this value
7003    /// typically indicates that this SDK version is out of date.
7004    Other,
7005}
7006
7007impl<'de> ::serde::de::Deserialize<'de> for LinkAudienceDisallowedReason {
7008    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
7009        // union deserializer
7010        use serde::de::{self, MapAccess, Visitor};
7011        struct EnumVisitor;
7012        impl<'de> Visitor<'de> for EnumVisitor {
7013            type Value = LinkAudienceDisallowedReason;
7014            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
7015                f.write_str("a LinkAudienceDisallowedReason structure")
7016            }
7017            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
7018                let tag: &str = match map.next_key()? {
7019                    Some(".tag") => map.next_value()?,
7020                    _ => return Err(de::Error::missing_field(".tag"))
7021                };
7022                let value = match tag {
7023                    "delete_and_recreate" => LinkAudienceDisallowedReason::DeleteAndRecreate,
7024                    "restricted_by_shared_folder" => LinkAudienceDisallowedReason::RestrictedBySharedFolder,
7025                    "restricted_by_team" => LinkAudienceDisallowedReason::RestrictedByTeam,
7026                    "user_not_on_team" => LinkAudienceDisallowedReason::UserNotOnTeam,
7027                    "user_account_type" => LinkAudienceDisallowedReason::UserAccountType,
7028                    "permission_denied" => LinkAudienceDisallowedReason::PermissionDenied,
7029                    _ => LinkAudienceDisallowedReason::Other,
7030                };
7031                crate::eat_json_fields(&mut map)?;
7032                Ok(value)
7033            }
7034        }
7035        const VARIANTS: &[&str] = &["delete_and_recreate",
7036                                    "restricted_by_shared_folder",
7037                                    "restricted_by_team",
7038                                    "user_not_on_team",
7039                                    "user_account_type",
7040                                    "permission_denied",
7041                                    "other"];
7042        deserializer.deserialize_struct("LinkAudienceDisallowedReason", VARIANTS, EnumVisitor)
7043    }
7044}
7045
7046impl ::serde::ser::Serialize for LinkAudienceDisallowedReason {
7047    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7048        // union serializer
7049        use serde::ser::SerializeStruct;
7050        match self {
7051            LinkAudienceDisallowedReason::DeleteAndRecreate => {
7052                // unit
7053                let mut s = serializer.serialize_struct("LinkAudienceDisallowedReason", 1)?;
7054                s.serialize_field(".tag", "delete_and_recreate")?;
7055                s.end()
7056            }
7057            LinkAudienceDisallowedReason::RestrictedBySharedFolder => {
7058                // unit
7059                let mut s = serializer.serialize_struct("LinkAudienceDisallowedReason", 1)?;
7060                s.serialize_field(".tag", "restricted_by_shared_folder")?;
7061                s.end()
7062            }
7063            LinkAudienceDisallowedReason::RestrictedByTeam => {
7064                // unit
7065                let mut s = serializer.serialize_struct("LinkAudienceDisallowedReason", 1)?;
7066                s.serialize_field(".tag", "restricted_by_team")?;
7067                s.end()
7068            }
7069            LinkAudienceDisallowedReason::UserNotOnTeam => {
7070                // unit
7071                let mut s = serializer.serialize_struct("LinkAudienceDisallowedReason", 1)?;
7072                s.serialize_field(".tag", "user_not_on_team")?;
7073                s.end()
7074            }
7075            LinkAudienceDisallowedReason::UserAccountType => {
7076                // unit
7077                let mut s = serializer.serialize_struct("LinkAudienceDisallowedReason", 1)?;
7078                s.serialize_field(".tag", "user_account_type")?;
7079                s.end()
7080            }
7081            LinkAudienceDisallowedReason::PermissionDenied => {
7082                // unit
7083                let mut s = serializer.serialize_struct("LinkAudienceDisallowedReason", 1)?;
7084                s.serialize_field(".tag", "permission_denied")?;
7085                s.end()
7086            }
7087            LinkAudienceDisallowedReason::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
7088        }
7089    }
7090}
7091
7092// union extends VisibilityPolicyDisallowedReason
7093impl From<VisibilityPolicyDisallowedReason> for LinkAudienceDisallowedReason {
7094    fn from(parent: VisibilityPolicyDisallowedReason) -> Self {
7095        match parent {
7096            VisibilityPolicyDisallowedReason::DeleteAndRecreate => LinkAudienceDisallowedReason::DeleteAndRecreate,
7097            VisibilityPolicyDisallowedReason::RestrictedBySharedFolder => LinkAudienceDisallowedReason::RestrictedBySharedFolder,
7098            VisibilityPolicyDisallowedReason::RestrictedByTeam => LinkAudienceDisallowedReason::RestrictedByTeam,
7099            VisibilityPolicyDisallowedReason::UserNotOnTeam => LinkAudienceDisallowedReason::UserNotOnTeam,
7100            VisibilityPolicyDisallowedReason::UserAccountType => LinkAudienceDisallowedReason::UserAccountType,
7101            VisibilityPolicyDisallowedReason::PermissionDenied => LinkAudienceDisallowedReason::PermissionDenied,
7102            VisibilityPolicyDisallowedReason::Other => LinkAudienceDisallowedReason::Other,
7103        }
7104    }
7105}
7106#[derive(Debug, Clone, PartialEq, Eq)]
7107#[non_exhaustive] // structs may have more fields added in the future.
7108pub struct LinkAudienceOption {
7109    /// Specifies who can access the link.
7110    pub audience: LinkAudience,
7111    /// Whether the user calling this API can select this audience option.
7112    pub allowed: bool,
7113    /// If `allowed` is `false`, this will provide the reason that the user is not permitted to set
7114    /// the visibility to this policy.
7115    pub disallowed_reason: Option<LinkAudienceDisallowedReason>,
7116}
7117
7118impl LinkAudienceOption {
7119    pub fn new(audience: LinkAudience, allowed: bool) -> Self {
7120        LinkAudienceOption {
7121            audience,
7122            allowed,
7123            disallowed_reason: None,
7124        }
7125    }
7126
7127    pub fn with_disallowed_reason(mut self, value: LinkAudienceDisallowedReason) -> Self {
7128        self.disallowed_reason = Some(value);
7129        self
7130    }
7131}
7132
7133const LINK_AUDIENCE_OPTION_FIELDS: &[&str] = &["audience",
7134                                               "allowed",
7135                                               "disallowed_reason"];
7136impl LinkAudienceOption {
7137    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
7138        map: V,
7139    ) -> Result<LinkAudienceOption, V::Error> {
7140        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
7141    }
7142
7143    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
7144        mut map: V,
7145        optional: bool,
7146    ) -> Result<Option<LinkAudienceOption>, V::Error> {
7147        let mut field_audience = None;
7148        let mut field_allowed = None;
7149        let mut field_disallowed_reason = None;
7150        let mut nothing = true;
7151        while let Some(key) = map.next_key::<&str>()? {
7152            nothing = false;
7153            match key {
7154                "audience" => {
7155                    if field_audience.is_some() {
7156                        return Err(::serde::de::Error::duplicate_field("audience"));
7157                    }
7158                    field_audience = Some(map.next_value()?);
7159                }
7160                "allowed" => {
7161                    if field_allowed.is_some() {
7162                        return Err(::serde::de::Error::duplicate_field("allowed"));
7163                    }
7164                    field_allowed = Some(map.next_value()?);
7165                }
7166                "disallowed_reason" => {
7167                    if field_disallowed_reason.is_some() {
7168                        return Err(::serde::de::Error::duplicate_field("disallowed_reason"));
7169                    }
7170                    field_disallowed_reason = Some(map.next_value()?);
7171                }
7172                _ => {
7173                    // unknown field allowed and ignored
7174                    map.next_value::<::serde_json::Value>()?;
7175                }
7176            }
7177        }
7178        if optional && nothing {
7179            return Ok(None);
7180        }
7181        let result = LinkAudienceOption {
7182            audience: field_audience.ok_or_else(|| ::serde::de::Error::missing_field("audience"))?,
7183            allowed: field_allowed.ok_or_else(|| ::serde::de::Error::missing_field("allowed"))?,
7184            disallowed_reason: field_disallowed_reason.and_then(Option::flatten),
7185        };
7186        Ok(Some(result))
7187    }
7188
7189    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
7190        &self,
7191        s: &mut S::SerializeStruct,
7192    ) -> Result<(), S::Error> {
7193        use serde::ser::SerializeStruct;
7194        s.serialize_field("audience", &self.audience)?;
7195        s.serialize_field("allowed", &self.allowed)?;
7196        if let Some(val) = &self.disallowed_reason {
7197            s.serialize_field("disallowed_reason", val)?;
7198        }
7199        Ok(())
7200    }
7201}
7202
7203impl<'de> ::serde::de::Deserialize<'de> for LinkAudienceOption {
7204    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
7205        // struct deserializer
7206        use serde::de::{MapAccess, Visitor};
7207        struct StructVisitor;
7208        impl<'de> Visitor<'de> for StructVisitor {
7209            type Value = LinkAudienceOption;
7210            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
7211                f.write_str("a LinkAudienceOption struct")
7212            }
7213            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
7214                LinkAudienceOption::internal_deserialize(map)
7215            }
7216        }
7217        deserializer.deserialize_struct("LinkAudienceOption", LINK_AUDIENCE_OPTION_FIELDS, StructVisitor)
7218    }
7219}
7220
7221impl ::serde::ser::Serialize for LinkAudienceOption {
7222    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7223        // struct serializer
7224        use serde::ser::SerializeStruct;
7225        let mut s = serializer.serialize_struct("LinkAudienceOption", 3)?;
7226        self.internal_serialize::<S>(&mut s)?;
7227        s.end()
7228    }
7229}
7230
7231#[derive(Debug, Clone, PartialEq, Eq)]
7232#[non_exhaustive] // variants may be added in the future
7233pub enum LinkExpiry {
7234    /// Remove the currently set expiry for the link.
7235    RemoveExpiry,
7236    /// Set a new expiry or change an existing expiry.
7237    SetExpiry(crate::types::common::DropboxTimestamp),
7238    /// Catch-all used for unrecognized values returned from the server. Encountering this value
7239    /// typically indicates that this SDK version is out of date.
7240    Other,
7241}
7242
7243impl<'de> ::serde::de::Deserialize<'de> for LinkExpiry {
7244    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
7245        // union deserializer
7246        use serde::de::{self, MapAccess, Visitor};
7247        struct EnumVisitor;
7248        impl<'de> Visitor<'de> for EnumVisitor {
7249            type Value = LinkExpiry;
7250            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
7251                f.write_str("a LinkExpiry structure")
7252            }
7253            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
7254                let tag: &str = match map.next_key()? {
7255                    Some(".tag") => map.next_value()?,
7256                    _ => return Err(de::Error::missing_field(".tag"))
7257                };
7258                let value = match tag {
7259                    "remove_expiry" => LinkExpiry::RemoveExpiry,
7260                    "set_expiry" => {
7261                        match map.next_key()? {
7262                            Some("set_expiry") => LinkExpiry::SetExpiry(map.next_value()?),
7263                            None => return Err(de::Error::missing_field("set_expiry")),
7264                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
7265                        }
7266                    }
7267                    _ => LinkExpiry::Other,
7268                };
7269                crate::eat_json_fields(&mut map)?;
7270                Ok(value)
7271            }
7272        }
7273        const VARIANTS: &[&str] = &["remove_expiry",
7274                                    "set_expiry",
7275                                    "other"];
7276        deserializer.deserialize_struct("LinkExpiry", VARIANTS, EnumVisitor)
7277    }
7278}
7279
7280impl ::serde::ser::Serialize for LinkExpiry {
7281    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7282        // union serializer
7283        use serde::ser::SerializeStruct;
7284        match self {
7285            LinkExpiry::RemoveExpiry => {
7286                // unit
7287                let mut s = serializer.serialize_struct("LinkExpiry", 1)?;
7288                s.serialize_field(".tag", "remove_expiry")?;
7289                s.end()
7290            }
7291            LinkExpiry::SetExpiry(x) => {
7292                // primitive
7293                let mut s = serializer.serialize_struct("LinkExpiry", 2)?;
7294                s.serialize_field(".tag", "set_expiry")?;
7295                s.serialize_field("set_expiry", x)?;
7296                s.end()
7297            }
7298            LinkExpiry::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
7299        }
7300    }
7301}
7302
7303/// Metadata for a shared link. This can be either a [`PathLinkMetadata`] or
7304/// [`CollectionLinkMetadata`].
7305#[derive(Debug, Clone, PartialEq, Eq)]
7306#[non_exhaustive] // variants may be added in the future
7307pub enum LinkMetadata {
7308    Path(PathLinkMetadata),
7309    Collection(CollectionLinkMetadata),
7310    /// Catch-all used for unrecognized values returned from the server. Encountering this value
7311    /// typically indicates that this SDK version is out of date.
7312    Other,
7313}
7314
7315impl<'de> ::serde::de::Deserialize<'de> for LinkMetadata {
7316    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
7317        // polymorphic struct deserializer
7318        use serde::de::{self, MapAccess, Visitor};
7319        struct EnumVisitor;
7320        impl<'de> Visitor<'de> for EnumVisitor {
7321            type Value = LinkMetadata;
7322            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
7323                f.write_str("a LinkMetadata structure")
7324            }
7325            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
7326                let tag = match map.next_key()? {
7327                    Some(".tag") => map.next_value()?,
7328                    _ => return Err(de::Error::missing_field(".tag"))
7329                };
7330                match tag {
7331                    "path" => Ok(LinkMetadata::Path(PathLinkMetadata::internal_deserialize(map)?)),
7332                    "collection" => Ok(LinkMetadata::Collection(CollectionLinkMetadata::internal_deserialize(map)?)),
7333                    _ => {
7334                        crate::eat_json_fields(&mut map)?;
7335                        Ok(LinkMetadata::Other)
7336                    }
7337                }
7338            }
7339        }
7340        const VARIANTS: &[&str] = &["path",
7341                                    "collection"];
7342        deserializer.deserialize_struct("LinkMetadata", VARIANTS, EnumVisitor)
7343    }
7344}
7345
7346impl ::serde::ser::Serialize for LinkMetadata {
7347    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7348        // polymorphic struct serializer
7349        use serde::ser::SerializeStruct;
7350        match self {
7351            LinkMetadata::Path(x) => {
7352                let mut s = serializer.serialize_struct("LinkMetadata", 5)?;
7353                s.serialize_field(".tag", "path")?;
7354                x.internal_serialize::<S>(&mut s)?;
7355                s.end()
7356            }
7357            LinkMetadata::Collection(x) => {
7358                let mut s = serializer.serialize_struct("LinkMetadata", 4)?;
7359                s.serialize_field(".tag", "collection")?;
7360                x.internal_serialize::<S>(&mut s)?;
7361                s.end()
7362            }
7363            LinkMetadata::Other => Err(::serde::ser::Error::custom("cannot serialize unknown variant"))
7364        }
7365    }
7366}
7367
7368#[derive(Debug, Clone, PartialEq, Eq)]
7369#[non_exhaustive] // variants may be added in the future
7370pub enum LinkPassword {
7371    /// Remove the currently set password for the link.
7372    RemovePassword,
7373    /// Set a new password or change an existing password.
7374    SetPassword(String),
7375    /// Catch-all used for unrecognized values returned from the server. Encountering this value
7376    /// typically indicates that this SDK version is out of date.
7377    Other,
7378}
7379
7380impl<'de> ::serde::de::Deserialize<'de> for LinkPassword {
7381    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
7382        // union deserializer
7383        use serde::de::{self, MapAccess, Visitor};
7384        struct EnumVisitor;
7385        impl<'de> Visitor<'de> for EnumVisitor {
7386            type Value = LinkPassword;
7387            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
7388                f.write_str("a LinkPassword structure")
7389            }
7390            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
7391                let tag: &str = match map.next_key()? {
7392                    Some(".tag") => map.next_value()?,
7393                    _ => return Err(de::Error::missing_field(".tag"))
7394                };
7395                let value = match tag {
7396                    "remove_password" => LinkPassword::RemovePassword,
7397                    "set_password" => {
7398                        match map.next_key()? {
7399                            Some("set_password") => LinkPassword::SetPassword(map.next_value()?),
7400                            None => return Err(de::Error::missing_field("set_password")),
7401                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
7402                        }
7403                    }
7404                    _ => LinkPassword::Other,
7405                };
7406                crate::eat_json_fields(&mut map)?;
7407                Ok(value)
7408            }
7409        }
7410        const VARIANTS: &[&str] = &["remove_password",
7411                                    "set_password",
7412                                    "other"];
7413        deserializer.deserialize_struct("LinkPassword", VARIANTS, EnumVisitor)
7414    }
7415}
7416
7417impl ::serde::ser::Serialize for LinkPassword {
7418    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7419        // union serializer
7420        use serde::ser::SerializeStruct;
7421        match self {
7422            LinkPassword::RemovePassword => {
7423                // unit
7424                let mut s = serializer.serialize_struct("LinkPassword", 1)?;
7425                s.serialize_field(".tag", "remove_password")?;
7426                s.end()
7427            }
7428            LinkPassword::SetPassword(x) => {
7429                // primitive
7430                let mut s = serializer.serialize_struct("LinkPassword", 2)?;
7431                s.serialize_field(".tag", "set_password")?;
7432                s.serialize_field("set_password", x)?;
7433                s.end()
7434            }
7435            LinkPassword::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
7436        }
7437    }
7438}
7439
7440/// Permissions for actions that can be performed on a link.
7441#[derive(Debug, Clone, PartialEq, Eq)]
7442#[non_exhaustive] // structs may have more fields added in the future.
7443pub struct LinkPermission {
7444    pub action: LinkAction,
7445    pub allow: bool,
7446    pub reason: Option<PermissionDeniedReason>,
7447}
7448
7449impl LinkPermission {
7450    pub fn new(action: LinkAction, allow: bool) -> Self {
7451        LinkPermission {
7452            action,
7453            allow,
7454            reason: None,
7455        }
7456    }
7457
7458    pub fn with_reason(mut self, value: PermissionDeniedReason) -> Self {
7459        self.reason = Some(value);
7460        self
7461    }
7462}
7463
7464const LINK_PERMISSION_FIELDS: &[&str] = &["action",
7465                                          "allow",
7466                                          "reason"];
7467impl LinkPermission {
7468    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
7469        map: V,
7470    ) -> Result<LinkPermission, V::Error> {
7471        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
7472    }
7473
7474    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
7475        mut map: V,
7476        optional: bool,
7477    ) -> Result<Option<LinkPermission>, V::Error> {
7478        let mut field_action = None;
7479        let mut field_allow = None;
7480        let mut field_reason = None;
7481        let mut nothing = true;
7482        while let Some(key) = map.next_key::<&str>()? {
7483            nothing = false;
7484            match key {
7485                "action" => {
7486                    if field_action.is_some() {
7487                        return Err(::serde::de::Error::duplicate_field("action"));
7488                    }
7489                    field_action = Some(map.next_value()?);
7490                }
7491                "allow" => {
7492                    if field_allow.is_some() {
7493                        return Err(::serde::de::Error::duplicate_field("allow"));
7494                    }
7495                    field_allow = Some(map.next_value()?);
7496                }
7497                "reason" => {
7498                    if field_reason.is_some() {
7499                        return Err(::serde::de::Error::duplicate_field("reason"));
7500                    }
7501                    field_reason = Some(map.next_value()?);
7502                }
7503                _ => {
7504                    // unknown field allowed and ignored
7505                    map.next_value::<::serde_json::Value>()?;
7506                }
7507            }
7508        }
7509        if optional && nothing {
7510            return Ok(None);
7511        }
7512        let result = LinkPermission {
7513            action: field_action.ok_or_else(|| ::serde::de::Error::missing_field("action"))?,
7514            allow: field_allow.ok_or_else(|| ::serde::de::Error::missing_field("allow"))?,
7515            reason: field_reason.and_then(Option::flatten),
7516        };
7517        Ok(Some(result))
7518    }
7519
7520    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
7521        &self,
7522        s: &mut S::SerializeStruct,
7523    ) -> Result<(), S::Error> {
7524        use serde::ser::SerializeStruct;
7525        s.serialize_field("action", &self.action)?;
7526        s.serialize_field("allow", &self.allow)?;
7527        if let Some(val) = &self.reason {
7528            s.serialize_field("reason", val)?;
7529        }
7530        Ok(())
7531    }
7532}
7533
7534impl<'de> ::serde::de::Deserialize<'de> for LinkPermission {
7535    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
7536        // struct deserializer
7537        use serde::de::{MapAccess, Visitor};
7538        struct StructVisitor;
7539        impl<'de> Visitor<'de> for StructVisitor {
7540            type Value = LinkPermission;
7541            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
7542                f.write_str("a LinkPermission struct")
7543            }
7544            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
7545                LinkPermission::internal_deserialize(map)
7546            }
7547        }
7548        deserializer.deserialize_struct("LinkPermission", LINK_PERMISSION_FIELDS, StructVisitor)
7549    }
7550}
7551
7552impl ::serde::ser::Serialize for LinkPermission {
7553    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7554        // struct serializer
7555        use serde::ser::SerializeStruct;
7556        let mut s = serializer.serialize_struct("LinkPermission", 3)?;
7557        self.internal_serialize::<S>(&mut s)?;
7558        s.end()
7559    }
7560}
7561
7562#[derive(Debug, Clone, PartialEq, Eq)]
7563#[non_exhaustive] // structs may have more fields added in the future.
7564pub struct LinkPermissions {
7565    /// Whether the caller can revoke the shared link.
7566    pub can_revoke: bool,
7567    /// A list of policies that the user might be able to set for the visibility.
7568    pub visibility_policies: Vec<VisibilityPolicy>,
7569    /// Whether the user can set the expiry settings of the link. This refers to the ability to
7570    /// create a new expiry and modify an existing expiry.
7571    pub can_set_expiry: bool,
7572    /// Whether the user can remove the expiry of the link.
7573    pub can_remove_expiry: bool,
7574    /// Whether the link can be downloaded or not.
7575    pub allow_download: bool,
7576    /// Whether the user can allow downloads via the link. This refers to the ability to remove a
7577    /// no-download restriction on the link.
7578    pub can_allow_download: bool,
7579    /// Whether the user can disallow downloads via the link. This refers to the ability to impose a
7580    /// no-download restriction on the link.
7581    pub can_disallow_download: bool,
7582    /// Field is deprecated. Whether comments are enabled for the linked file. This takes the team
7583    /// commenting policy into account.
7584    #[deprecated]
7585    pub allow_comments: bool,
7586    /// Field is deprecated. Whether the team has disabled commenting globally.
7587    #[deprecated]
7588    pub team_restricts_comments: bool,
7589    /// The current visibility of the link after considering the shared links policies of the the
7590    /// team (in case the link's owner is part of a team) and the shared folder (in case the linked
7591    /// file is part of a shared folder). This field is shown only if the caller has access to this
7592    /// info (the link's owner always has access to this data). For some links, an
7593    /// effective_audience value is returned instead.
7594    pub resolved_visibility: Option<ResolvedVisibility>,
7595    /// The shared link's requested visibility. This can be overridden by the team and shared folder
7596    /// policies. The final visibility, after considering these policies, can be found in
7597    /// `resolved_visibility`. This is shown only if the caller is the link's owner and
7598    /// resolved_visibility is returned instead of effective_audience.
7599    pub requested_visibility: Option<RequestedVisibility>,
7600    /// The failure reason for revoking the link. This field will only be present if the
7601    /// `can_revoke` is `false`.
7602    pub revoke_failure_reason: Option<SharedLinkAccessFailureReason>,
7603    /// The type of audience who can benefit from the access level specified by the
7604    /// `link_access_level` field.
7605    pub effective_audience: Option<LinkAudience>,
7606    /// The access level that the link will grant to its users. A link can grant additional rights
7607    /// to a user beyond their current access level. For example, if a user was invited as a viewer
7608    /// to a file, and then opens a link with `link_access_level` set to `editor`, then they will
7609    /// gain editor privileges. The `link_access_level` is a property of the link, and does not
7610    /// depend on who is calling this API. In particular, `link_access_level` does not take into
7611    /// account the API caller's current permissions to the content.
7612    pub link_access_level: Option<LinkAccessLevel>,
7613    /// A list of link audience options the user might be able to set as the new audience.
7614    pub audience_options: Option<Vec<LinkAudienceOption>>,
7615    /// Whether the user can set a password for the link.
7616    pub can_set_password: Option<bool>,
7617    /// Whether the user can remove the password of the link.
7618    pub can_remove_password: Option<bool>,
7619    /// Whether the user is required to provide a password to view the link.
7620    pub require_password: Option<bool>,
7621    /// Whether the user can use extended sharing controls, based on their account type.
7622    pub can_use_extended_sharing_controls: Option<bool>,
7623    /// Whether a user can save the content to their Dropbox account.
7624    pub can_sync: Option<bool>,
7625    /// Whether the user can request access to the content.
7626    pub can_request_access: Option<bool>,
7627    /// Whether the updated externally available shared link must have password set. Not provided if
7628    /// the link is not team owned.
7629    pub enforce_shared_link_password_policy: Option<crate::types::team_policies::EnforceLinkPasswordPolicy>,
7630    /// Existing owning team's policy for default number of days from today to link's expiration.
7631    /// Not provided if the link is not team owned.
7632    pub days_to_expire_policy: Option<crate::types::team_policies::DefaultLinkExpirationDaysPolicy>,
7633    /// When owning team's policy `change_shared_link_expiration_policy` is
7634    /// [`ChangeLinkExpirationPolicy::NotAllowed`], the updated externally available shared link
7635    /// expiration value cannot be less strict than `days_to_expire_policy`. In this case
7636    /// `days_to_expire_policy` is expected to be different from `none`. Not provided if the link is
7637    /// not team owned.
7638    pub change_shared_link_expiration_policy: Option<ChangeLinkExpirationPolicy>,
7639}
7640
7641impl LinkPermissions {
7642    pub fn new(
7643        can_revoke: bool,
7644        visibility_policies: Vec<VisibilityPolicy>,
7645        can_set_expiry: bool,
7646        can_remove_expiry: bool,
7647        allow_download: bool,
7648        can_allow_download: bool,
7649        can_disallow_download: bool,
7650        allow_comments: bool,
7651        team_restricts_comments: bool,
7652    ) -> Self {
7653        LinkPermissions {
7654            can_revoke,
7655            visibility_policies,
7656            can_set_expiry,
7657            can_remove_expiry,
7658            allow_download,
7659            can_allow_download,
7660            can_disallow_download,
7661            #[allow(deprecated)] allow_comments,
7662            #[allow(deprecated)] team_restricts_comments,
7663            resolved_visibility: None,
7664            requested_visibility: None,
7665            revoke_failure_reason: None,
7666            effective_audience: None,
7667            link_access_level: None,
7668            audience_options: None,
7669            can_set_password: None,
7670            can_remove_password: None,
7671            require_password: None,
7672            can_use_extended_sharing_controls: None,
7673            can_sync: None,
7674            can_request_access: None,
7675            enforce_shared_link_password_policy: None,
7676            days_to_expire_policy: None,
7677            change_shared_link_expiration_policy: None,
7678        }
7679    }
7680
7681    pub fn with_resolved_visibility(mut self, value: ResolvedVisibility) -> Self {
7682        self.resolved_visibility = Some(value);
7683        self
7684    }
7685
7686    pub fn with_requested_visibility(mut self, value: RequestedVisibility) -> Self {
7687        self.requested_visibility = Some(value);
7688        self
7689    }
7690
7691    pub fn with_revoke_failure_reason(mut self, value: SharedLinkAccessFailureReason) -> Self {
7692        self.revoke_failure_reason = Some(value);
7693        self
7694    }
7695
7696    pub fn with_effective_audience(mut self, value: LinkAudience) -> Self {
7697        self.effective_audience = Some(value);
7698        self
7699    }
7700
7701    pub fn with_link_access_level(mut self, value: LinkAccessLevel) -> Self {
7702        self.link_access_level = Some(value);
7703        self
7704    }
7705
7706    pub fn with_audience_options(mut self, value: Vec<LinkAudienceOption>) -> Self {
7707        self.audience_options = Some(value);
7708        self
7709    }
7710
7711    pub fn with_can_set_password(mut self, value: bool) -> Self {
7712        self.can_set_password = Some(value);
7713        self
7714    }
7715
7716    pub fn with_can_remove_password(mut self, value: bool) -> Self {
7717        self.can_remove_password = Some(value);
7718        self
7719    }
7720
7721    pub fn with_require_password(mut self, value: bool) -> Self {
7722        self.require_password = Some(value);
7723        self
7724    }
7725
7726    pub fn with_can_use_extended_sharing_controls(mut self, value: bool) -> Self {
7727        self.can_use_extended_sharing_controls = Some(value);
7728        self
7729    }
7730
7731    pub fn with_can_sync(mut self, value: bool) -> Self {
7732        self.can_sync = Some(value);
7733        self
7734    }
7735
7736    pub fn with_can_request_access(mut self, value: bool) -> Self {
7737        self.can_request_access = Some(value);
7738        self
7739    }
7740
7741    pub fn with_enforce_shared_link_password_policy(
7742        mut self,
7743        value: crate::types::team_policies::EnforceLinkPasswordPolicy,
7744    ) -> Self {
7745        self.enforce_shared_link_password_policy = Some(value);
7746        self
7747    }
7748
7749    pub fn with_days_to_expire_policy(
7750        mut self,
7751        value: crate::types::team_policies::DefaultLinkExpirationDaysPolicy,
7752    ) -> Self {
7753        self.days_to_expire_policy = Some(value);
7754        self
7755    }
7756
7757    pub fn with_change_shared_link_expiration_policy(
7758        mut self,
7759        value: ChangeLinkExpirationPolicy,
7760    ) -> Self {
7761        self.change_shared_link_expiration_policy = Some(value);
7762        self
7763    }
7764}
7765
7766const LINK_PERMISSIONS_FIELDS: &[&str] = &["can_revoke",
7767                                           "visibility_policies",
7768                                           "can_set_expiry",
7769                                           "can_remove_expiry",
7770                                           "allow_download",
7771                                           "can_allow_download",
7772                                           "can_disallow_download",
7773                                           "allow_comments",
7774                                           "team_restricts_comments",
7775                                           "resolved_visibility",
7776                                           "requested_visibility",
7777                                           "revoke_failure_reason",
7778                                           "effective_audience",
7779                                           "link_access_level",
7780                                           "audience_options",
7781                                           "can_set_password",
7782                                           "can_remove_password",
7783                                           "require_password",
7784                                           "can_use_extended_sharing_controls",
7785                                           "can_sync",
7786                                           "can_request_access",
7787                                           "enforce_shared_link_password_policy",
7788                                           "days_to_expire_policy",
7789                                           "change_shared_link_expiration_policy"];
7790impl LinkPermissions {
7791    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
7792        map: V,
7793    ) -> Result<LinkPermissions, V::Error> {
7794        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
7795    }
7796
7797    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
7798        mut map: V,
7799        optional: bool,
7800    ) -> Result<Option<LinkPermissions>, V::Error> {
7801        let mut field_can_revoke = None;
7802        let mut field_visibility_policies = None;
7803        let mut field_can_set_expiry = None;
7804        let mut field_can_remove_expiry = None;
7805        let mut field_allow_download = None;
7806        let mut field_can_allow_download = None;
7807        let mut field_can_disallow_download = None;
7808        let mut field_allow_comments = None;
7809        let mut field_team_restricts_comments = None;
7810        let mut field_resolved_visibility = None;
7811        let mut field_requested_visibility = None;
7812        let mut field_revoke_failure_reason = None;
7813        let mut field_effective_audience = None;
7814        let mut field_link_access_level = None;
7815        let mut field_audience_options = None;
7816        let mut field_can_set_password = None;
7817        let mut field_can_remove_password = None;
7818        let mut field_require_password = None;
7819        let mut field_can_use_extended_sharing_controls = None;
7820        let mut field_can_sync = None;
7821        let mut field_can_request_access = None;
7822        let mut field_enforce_shared_link_password_policy = None;
7823        let mut field_days_to_expire_policy = None;
7824        let mut field_change_shared_link_expiration_policy = None;
7825        let mut nothing = true;
7826        while let Some(key) = map.next_key::<&str>()? {
7827            nothing = false;
7828            match key {
7829                "can_revoke" => {
7830                    if field_can_revoke.is_some() {
7831                        return Err(::serde::de::Error::duplicate_field("can_revoke"));
7832                    }
7833                    field_can_revoke = Some(map.next_value()?);
7834                }
7835                "visibility_policies" => {
7836                    if field_visibility_policies.is_some() {
7837                        return Err(::serde::de::Error::duplicate_field("visibility_policies"));
7838                    }
7839                    field_visibility_policies = Some(map.next_value()?);
7840                }
7841                "can_set_expiry" => {
7842                    if field_can_set_expiry.is_some() {
7843                        return Err(::serde::de::Error::duplicate_field("can_set_expiry"));
7844                    }
7845                    field_can_set_expiry = Some(map.next_value()?);
7846                }
7847                "can_remove_expiry" => {
7848                    if field_can_remove_expiry.is_some() {
7849                        return Err(::serde::de::Error::duplicate_field("can_remove_expiry"));
7850                    }
7851                    field_can_remove_expiry = Some(map.next_value()?);
7852                }
7853                "allow_download" => {
7854                    if field_allow_download.is_some() {
7855                        return Err(::serde::de::Error::duplicate_field("allow_download"));
7856                    }
7857                    field_allow_download = Some(map.next_value()?);
7858                }
7859                "can_allow_download" => {
7860                    if field_can_allow_download.is_some() {
7861                        return Err(::serde::de::Error::duplicate_field("can_allow_download"));
7862                    }
7863                    field_can_allow_download = Some(map.next_value()?);
7864                }
7865                "can_disallow_download" => {
7866                    if field_can_disallow_download.is_some() {
7867                        return Err(::serde::de::Error::duplicate_field("can_disallow_download"));
7868                    }
7869                    field_can_disallow_download = Some(map.next_value()?);
7870                }
7871                "allow_comments" => {
7872                    if field_allow_comments.is_some() {
7873                        return Err(::serde::de::Error::duplicate_field("allow_comments"));
7874                    }
7875                    field_allow_comments = Some(map.next_value()?);
7876                }
7877                "team_restricts_comments" => {
7878                    if field_team_restricts_comments.is_some() {
7879                        return Err(::serde::de::Error::duplicate_field("team_restricts_comments"));
7880                    }
7881                    field_team_restricts_comments = Some(map.next_value()?);
7882                }
7883                "resolved_visibility" => {
7884                    if field_resolved_visibility.is_some() {
7885                        return Err(::serde::de::Error::duplicate_field("resolved_visibility"));
7886                    }
7887                    field_resolved_visibility = Some(map.next_value()?);
7888                }
7889                "requested_visibility" => {
7890                    if field_requested_visibility.is_some() {
7891                        return Err(::serde::de::Error::duplicate_field("requested_visibility"));
7892                    }
7893                    field_requested_visibility = Some(map.next_value()?);
7894                }
7895                "revoke_failure_reason" => {
7896                    if field_revoke_failure_reason.is_some() {
7897                        return Err(::serde::de::Error::duplicate_field("revoke_failure_reason"));
7898                    }
7899                    field_revoke_failure_reason = Some(map.next_value()?);
7900                }
7901                "effective_audience" => {
7902                    if field_effective_audience.is_some() {
7903                        return Err(::serde::de::Error::duplicate_field("effective_audience"));
7904                    }
7905                    field_effective_audience = Some(map.next_value()?);
7906                }
7907                "link_access_level" => {
7908                    if field_link_access_level.is_some() {
7909                        return Err(::serde::de::Error::duplicate_field("link_access_level"));
7910                    }
7911                    field_link_access_level = Some(map.next_value()?);
7912                }
7913                "audience_options" => {
7914                    if field_audience_options.is_some() {
7915                        return Err(::serde::de::Error::duplicate_field("audience_options"));
7916                    }
7917                    field_audience_options = Some(map.next_value()?);
7918                }
7919                "can_set_password" => {
7920                    if field_can_set_password.is_some() {
7921                        return Err(::serde::de::Error::duplicate_field("can_set_password"));
7922                    }
7923                    field_can_set_password = Some(map.next_value()?);
7924                }
7925                "can_remove_password" => {
7926                    if field_can_remove_password.is_some() {
7927                        return Err(::serde::de::Error::duplicate_field("can_remove_password"));
7928                    }
7929                    field_can_remove_password = Some(map.next_value()?);
7930                }
7931                "require_password" => {
7932                    if field_require_password.is_some() {
7933                        return Err(::serde::de::Error::duplicate_field("require_password"));
7934                    }
7935                    field_require_password = Some(map.next_value()?);
7936                }
7937                "can_use_extended_sharing_controls" => {
7938                    if field_can_use_extended_sharing_controls.is_some() {
7939                        return Err(::serde::de::Error::duplicate_field("can_use_extended_sharing_controls"));
7940                    }
7941                    field_can_use_extended_sharing_controls = Some(map.next_value()?);
7942                }
7943                "can_sync" => {
7944                    if field_can_sync.is_some() {
7945                        return Err(::serde::de::Error::duplicate_field("can_sync"));
7946                    }
7947                    field_can_sync = Some(map.next_value()?);
7948                }
7949                "can_request_access" => {
7950                    if field_can_request_access.is_some() {
7951                        return Err(::serde::de::Error::duplicate_field("can_request_access"));
7952                    }
7953                    field_can_request_access = Some(map.next_value()?);
7954                }
7955                "enforce_shared_link_password_policy" => {
7956                    if field_enforce_shared_link_password_policy.is_some() {
7957                        return Err(::serde::de::Error::duplicate_field("enforce_shared_link_password_policy"));
7958                    }
7959                    field_enforce_shared_link_password_policy = Some(map.next_value()?);
7960                }
7961                "days_to_expire_policy" => {
7962                    if field_days_to_expire_policy.is_some() {
7963                        return Err(::serde::de::Error::duplicate_field("days_to_expire_policy"));
7964                    }
7965                    field_days_to_expire_policy = Some(map.next_value()?);
7966                }
7967                "change_shared_link_expiration_policy" => {
7968                    if field_change_shared_link_expiration_policy.is_some() {
7969                        return Err(::serde::de::Error::duplicate_field("change_shared_link_expiration_policy"));
7970                    }
7971                    field_change_shared_link_expiration_policy = Some(map.next_value()?);
7972                }
7973                _ => {
7974                    // unknown field allowed and ignored
7975                    map.next_value::<::serde_json::Value>()?;
7976                }
7977            }
7978        }
7979        if optional && nothing {
7980            return Ok(None);
7981        }
7982        let result = LinkPermissions {
7983            can_revoke: field_can_revoke.ok_or_else(|| ::serde::de::Error::missing_field("can_revoke"))?,
7984            visibility_policies: field_visibility_policies.ok_or_else(|| ::serde::de::Error::missing_field("visibility_policies"))?,
7985            can_set_expiry: field_can_set_expiry.ok_or_else(|| ::serde::de::Error::missing_field("can_set_expiry"))?,
7986            can_remove_expiry: field_can_remove_expiry.ok_or_else(|| ::serde::de::Error::missing_field("can_remove_expiry"))?,
7987            allow_download: field_allow_download.ok_or_else(|| ::serde::de::Error::missing_field("allow_download"))?,
7988            can_allow_download: field_can_allow_download.ok_or_else(|| ::serde::de::Error::missing_field("can_allow_download"))?,
7989            can_disallow_download: field_can_disallow_download.ok_or_else(|| ::serde::de::Error::missing_field("can_disallow_download"))?,
7990            #[allow(deprecated)] allow_comments: field_allow_comments.ok_or_else(|| ::serde::de::Error::missing_field("allow_comments"))?,
7991            #[allow(deprecated)] team_restricts_comments: field_team_restricts_comments.ok_or_else(|| ::serde::de::Error::missing_field("team_restricts_comments"))?,
7992            resolved_visibility: field_resolved_visibility.and_then(Option::flatten),
7993            requested_visibility: field_requested_visibility.and_then(Option::flatten),
7994            revoke_failure_reason: field_revoke_failure_reason.and_then(Option::flatten),
7995            effective_audience: field_effective_audience.and_then(Option::flatten),
7996            link_access_level: field_link_access_level.and_then(Option::flatten),
7997            audience_options: field_audience_options.and_then(Option::flatten),
7998            can_set_password: field_can_set_password.and_then(Option::flatten),
7999            can_remove_password: field_can_remove_password.and_then(Option::flatten),
8000            require_password: field_require_password.and_then(Option::flatten),
8001            can_use_extended_sharing_controls: field_can_use_extended_sharing_controls.and_then(Option::flatten),
8002            can_sync: field_can_sync.and_then(Option::flatten),
8003            can_request_access: field_can_request_access.and_then(Option::flatten),
8004            enforce_shared_link_password_policy: field_enforce_shared_link_password_policy.and_then(Option::flatten),
8005            days_to_expire_policy: field_days_to_expire_policy.and_then(Option::flatten),
8006            change_shared_link_expiration_policy: field_change_shared_link_expiration_policy.and_then(Option::flatten),
8007        };
8008        Ok(Some(result))
8009    }
8010
8011    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
8012        &self,
8013        s: &mut S::SerializeStruct,
8014    ) -> Result<(), S::Error> {
8015        use serde::ser::SerializeStruct;
8016        s.serialize_field("can_revoke", &self.can_revoke)?;
8017        s.serialize_field("visibility_policies", &self.visibility_policies)?;
8018        s.serialize_field("can_set_expiry", &self.can_set_expiry)?;
8019        s.serialize_field("can_remove_expiry", &self.can_remove_expiry)?;
8020        s.serialize_field("allow_download", &self.allow_download)?;
8021        s.serialize_field("can_allow_download", &self.can_allow_download)?;
8022        s.serialize_field("can_disallow_download", &self.can_disallow_download)?;
8023        #[allow(deprecated)]
8024        s.serialize_field("allow_comments", &self.allow_comments)?;
8025        #[allow(deprecated)]
8026        s.serialize_field("team_restricts_comments", &self.team_restricts_comments)?;
8027        if let Some(val) = &self.resolved_visibility {
8028            s.serialize_field("resolved_visibility", val)?;
8029        }
8030        if let Some(val) = &self.requested_visibility {
8031            s.serialize_field("requested_visibility", val)?;
8032        }
8033        if let Some(val) = &self.revoke_failure_reason {
8034            s.serialize_field("revoke_failure_reason", val)?;
8035        }
8036        if let Some(val) = &self.effective_audience {
8037            s.serialize_field("effective_audience", val)?;
8038        }
8039        if let Some(val) = &self.link_access_level {
8040            s.serialize_field("link_access_level", val)?;
8041        }
8042        if let Some(val) = &self.audience_options {
8043            s.serialize_field("audience_options", val)?;
8044        }
8045        if let Some(val) = &self.can_set_password {
8046            s.serialize_field("can_set_password", val)?;
8047        }
8048        if let Some(val) = &self.can_remove_password {
8049            s.serialize_field("can_remove_password", val)?;
8050        }
8051        if let Some(val) = &self.require_password {
8052            s.serialize_field("require_password", val)?;
8053        }
8054        if let Some(val) = &self.can_use_extended_sharing_controls {
8055            s.serialize_field("can_use_extended_sharing_controls", val)?;
8056        }
8057        if let Some(val) = &self.can_sync {
8058            s.serialize_field("can_sync", val)?;
8059        }
8060        if let Some(val) = &self.can_request_access {
8061            s.serialize_field("can_request_access", val)?;
8062        }
8063        if let Some(val) = &self.enforce_shared_link_password_policy {
8064            s.serialize_field("enforce_shared_link_password_policy", val)?;
8065        }
8066        if let Some(val) = &self.days_to_expire_policy {
8067            s.serialize_field("days_to_expire_policy", val)?;
8068        }
8069        if let Some(val) = &self.change_shared_link_expiration_policy {
8070            s.serialize_field("change_shared_link_expiration_policy", val)?;
8071        }
8072        Ok(())
8073    }
8074}
8075
8076impl<'de> ::serde::de::Deserialize<'de> for LinkPermissions {
8077    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8078        // struct deserializer
8079        use serde::de::{MapAccess, Visitor};
8080        struct StructVisitor;
8081        impl<'de> Visitor<'de> for StructVisitor {
8082            type Value = LinkPermissions;
8083            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8084                f.write_str("a LinkPermissions struct")
8085            }
8086            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
8087                LinkPermissions::internal_deserialize(map)
8088            }
8089        }
8090        deserializer.deserialize_struct("LinkPermissions", LINK_PERMISSIONS_FIELDS, StructVisitor)
8091    }
8092}
8093
8094impl ::serde::ser::Serialize for LinkPermissions {
8095    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8096        // struct serializer
8097        use serde::ser::SerializeStruct;
8098        let mut s = serializer.serialize_struct("LinkPermissions", 24)?;
8099        self.internal_serialize::<S>(&mut s)?;
8100        s.end()
8101    }
8102}
8103
8104/// Settings that apply to a link.
8105#[derive(Debug, Clone, PartialEq, Eq, Default)]
8106#[non_exhaustive] // structs may have more fields added in the future.
8107pub struct LinkSettings {
8108    /// The access level on the link for this file. Currently, it only accepts 'viewer' and
8109    /// 'viewer_no_comment'.
8110    pub access_level: Option<AccessLevel>,
8111    /// The type of audience on the link for this file.
8112    pub audience: Option<LinkAudience>,
8113    /// An expiry timestamp to set on a link.
8114    pub expiry: Option<LinkExpiry>,
8115    /// The password for the link.
8116    pub password: Option<LinkPassword>,
8117}
8118
8119impl LinkSettings {
8120    pub fn with_access_level(mut self, value: AccessLevel) -> Self {
8121        self.access_level = Some(value);
8122        self
8123    }
8124
8125    pub fn with_audience(mut self, value: LinkAudience) -> Self {
8126        self.audience = Some(value);
8127        self
8128    }
8129
8130    pub fn with_expiry(mut self, value: LinkExpiry) -> Self {
8131        self.expiry = Some(value);
8132        self
8133    }
8134
8135    pub fn with_password(mut self, value: LinkPassword) -> Self {
8136        self.password = Some(value);
8137        self
8138    }
8139}
8140
8141const LINK_SETTINGS_FIELDS: &[&str] = &["access_level",
8142                                        "audience",
8143                                        "expiry",
8144                                        "password"];
8145impl LinkSettings {
8146    // no _opt deserializer
8147    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
8148        mut map: V,
8149    ) -> Result<LinkSettings, V::Error> {
8150        let mut field_access_level = None;
8151        let mut field_audience = None;
8152        let mut field_expiry = None;
8153        let mut field_password = None;
8154        while let Some(key) = map.next_key::<&str>()? {
8155            match key {
8156                "access_level" => {
8157                    if field_access_level.is_some() {
8158                        return Err(::serde::de::Error::duplicate_field("access_level"));
8159                    }
8160                    field_access_level = Some(map.next_value()?);
8161                }
8162                "audience" => {
8163                    if field_audience.is_some() {
8164                        return Err(::serde::de::Error::duplicate_field("audience"));
8165                    }
8166                    field_audience = Some(map.next_value()?);
8167                }
8168                "expiry" => {
8169                    if field_expiry.is_some() {
8170                        return Err(::serde::de::Error::duplicate_field("expiry"));
8171                    }
8172                    field_expiry = Some(map.next_value()?);
8173                }
8174                "password" => {
8175                    if field_password.is_some() {
8176                        return Err(::serde::de::Error::duplicate_field("password"));
8177                    }
8178                    field_password = Some(map.next_value()?);
8179                }
8180                _ => {
8181                    // unknown field allowed and ignored
8182                    map.next_value::<::serde_json::Value>()?;
8183                }
8184            }
8185        }
8186        let result = LinkSettings {
8187            access_level: field_access_level.and_then(Option::flatten),
8188            audience: field_audience.and_then(Option::flatten),
8189            expiry: field_expiry.and_then(Option::flatten),
8190            password: field_password.and_then(Option::flatten),
8191        };
8192        Ok(result)
8193    }
8194
8195    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
8196        &self,
8197        s: &mut S::SerializeStruct,
8198    ) -> Result<(), S::Error> {
8199        use serde::ser::SerializeStruct;
8200        if let Some(val) = &self.access_level {
8201            s.serialize_field("access_level", val)?;
8202        }
8203        if let Some(val) = &self.audience {
8204            s.serialize_field("audience", val)?;
8205        }
8206        if let Some(val) = &self.expiry {
8207            s.serialize_field("expiry", val)?;
8208        }
8209        if let Some(val) = &self.password {
8210            s.serialize_field("password", val)?;
8211        }
8212        Ok(())
8213    }
8214}
8215
8216impl<'de> ::serde::de::Deserialize<'de> for LinkSettings {
8217    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8218        // struct deserializer
8219        use serde::de::{MapAccess, Visitor};
8220        struct StructVisitor;
8221        impl<'de> Visitor<'de> for StructVisitor {
8222            type Value = LinkSettings;
8223            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8224                f.write_str("a LinkSettings struct")
8225            }
8226            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
8227                LinkSettings::internal_deserialize(map)
8228            }
8229        }
8230        deserializer.deserialize_struct("LinkSettings", LINK_SETTINGS_FIELDS, StructVisitor)
8231    }
8232}
8233
8234impl ::serde::ser::Serialize for LinkSettings {
8235    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8236        // struct serializer
8237        use serde::ser::SerializeStruct;
8238        let mut s = serializer.serialize_struct("LinkSettings", 4)?;
8239        self.internal_serialize::<S>(&mut s)?;
8240        s.end()
8241    }
8242}
8243
8244/// Arguments for [`list_file_members()`](crate::sharing::list_file_members).
8245#[derive(Debug, Clone, PartialEq, Eq)]
8246#[non_exhaustive] // structs may have more fields added in the future.
8247pub struct ListFileMembersArg {
8248    /// The file for which you want to see members.
8249    pub file: PathOrId,
8250    /// The actions for which to return permissions on a member.
8251    pub actions: Option<Vec<MemberAction>>,
8252    /// Whether to include members who only have access from a parent shared folder.
8253    pub include_inherited: bool,
8254    /// Number of members to return max per query. Defaults to 100 if no limit is specified.
8255    pub limit: u32,
8256}
8257
8258impl ListFileMembersArg {
8259    pub fn new(file: PathOrId) -> Self {
8260        ListFileMembersArg {
8261            file,
8262            actions: None,
8263            include_inherited: true,
8264            limit: 100,
8265        }
8266    }
8267
8268    pub fn with_actions(mut self, value: Vec<MemberAction>) -> Self {
8269        self.actions = Some(value);
8270        self
8271    }
8272
8273    pub fn with_include_inherited(mut self, value: bool) -> Self {
8274        self.include_inherited = value;
8275        self
8276    }
8277
8278    pub fn with_limit(mut self, value: u32) -> Self {
8279        self.limit = value;
8280        self
8281    }
8282}
8283
8284const LIST_FILE_MEMBERS_ARG_FIELDS: &[&str] = &["file",
8285                                                "actions",
8286                                                "include_inherited",
8287                                                "limit"];
8288impl ListFileMembersArg {
8289    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
8290        map: V,
8291    ) -> Result<ListFileMembersArg, V::Error> {
8292        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
8293    }
8294
8295    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
8296        mut map: V,
8297        optional: bool,
8298    ) -> Result<Option<ListFileMembersArg>, V::Error> {
8299        let mut field_file = None;
8300        let mut field_actions = None;
8301        let mut field_include_inherited = None;
8302        let mut field_limit = None;
8303        let mut nothing = true;
8304        while let Some(key) = map.next_key::<&str>()? {
8305            nothing = false;
8306            match key {
8307                "file" => {
8308                    if field_file.is_some() {
8309                        return Err(::serde::de::Error::duplicate_field("file"));
8310                    }
8311                    field_file = Some(map.next_value()?);
8312                }
8313                "actions" => {
8314                    if field_actions.is_some() {
8315                        return Err(::serde::de::Error::duplicate_field("actions"));
8316                    }
8317                    field_actions = Some(map.next_value()?);
8318                }
8319                "include_inherited" => {
8320                    if field_include_inherited.is_some() {
8321                        return Err(::serde::de::Error::duplicate_field("include_inherited"));
8322                    }
8323                    field_include_inherited = Some(map.next_value()?);
8324                }
8325                "limit" => {
8326                    if field_limit.is_some() {
8327                        return Err(::serde::de::Error::duplicate_field("limit"));
8328                    }
8329                    field_limit = Some(map.next_value()?);
8330                }
8331                _ => {
8332                    // unknown field allowed and ignored
8333                    map.next_value::<::serde_json::Value>()?;
8334                }
8335            }
8336        }
8337        if optional && nothing {
8338            return Ok(None);
8339        }
8340        let result = ListFileMembersArg {
8341            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
8342            actions: field_actions.and_then(Option::flatten),
8343            include_inherited: field_include_inherited.unwrap_or(true),
8344            limit: field_limit.unwrap_or(100),
8345        };
8346        Ok(Some(result))
8347    }
8348
8349    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
8350        &self,
8351        s: &mut S::SerializeStruct,
8352    ) -> Result<(), S::Error> {
8353        use serde::ser::SerializeStruct;
8354        s.serialize_field("file", &self.file)?;
8355        if let Some(val) = &self.actions {
8356            s.serialize_field("actions", val)?;
8357        }
8358        if !self.include_inherited {
8359            s.serialize_field("include_inherited", &self.include_inherited)?;
8360        }
8361        if self.limit != 100 {
8362            s.serialize_field("limit", &self.limit)?;
8363        }
8364        Ok(())
8365    }
8366}
8367
8368impl<'de> ::serde::de::Deserialize<'de> for ListFileMembersArg {
8369    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8370        // struct deserializer
8371        use serde::de::{MapAccess, Visitor};
8372        struct StructVisitor;
8373        impl<'de> Visitor<'de> for StructVisitor {
8374            type Value = ListFileMembersArg;
8375            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8376                f.write_str("a ListFileMembersArg struct")
8377            }
8378            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
8379                ListFileMembersArg::internal_deserialize(map)
8380            }
8381        }
8382        deserializer.deserialize_struct("ListFileMembersArg", LIST_FILE_MEMBERS_ARG_FIELDS, StructVisitor)
8383    }
8384}
8385
8386impl ::serde::ser::Serialize for ListFileMembersArg {
8387    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8388        // struct serializer
8389        use serde::ser::SerializeStruct;
8390        let mut s = serializer.serialize_struct("ListFileMembersArg", 4)?;
8391        self.internal_serialize::<S>(&mut s)?;
8392        s.end()
8393    }
8394}
8395
8396/// Arguments for [`list_file_members_batch()`](crate::sharing::list_file_members_batch).
8397#[derive(Debug, Clone, PartialEq, Eq)]
8398#[non_exhaustive] // structs may have more fields added in the future.
8399pub struct ListFileMembersBatchArg {
8400    /// Files for which to return members.
8401    pub files: Vec<PathOrId>,
8402    /// Number of members to return max per query. Defaults to 1000 if no limit is specified.
8403    pub limit: u32,
8404}
8405
8406impl ListFileMembersBatchArg {
8407    pub fn new(files: Vec<PathOrId>) -> Self {
8408        ListFileMembersBatchArg {
8409            files,
8410            limit: 1000,
8411        }
8412    }
8413
8414    pub fn with_limit(mut self, value: u32) -> Self {
8415        self.limit = value;
8416        self
8417    }
8418}
8419
8420const LIST_FILE_MEMBERS_BATCH_ARG_FIELDS: &[&str] = &["files",
8421                                                      "limit"];
8422impl ListFileMembersBatchArg {
8423    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
8424        map: V,
8425    ) -> Result<ListFileMembersBatchArg, V::Error> {
8426        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
8427    }
8428
8429    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
8430        mut map: V,
8431        optional: bool,
8432    ) -> Result<Option<ListFileMembersBatchArg>, V::Error> {
8433        let mut field_files = None;
8434        let mut field_limit = None;
8435        let mut nothing = true;
8436        while let Some(key) = map.next_key::<&str>()? {
8437            nothing = false;
8438            match key {
8439                "files" => {
8440                    if field_files.is_some() {
8441                        return Err(::serde::de::Error::duplicate_field("files"));
8442                    }
8443                    field_files = Some(map.next_value()?);
8444                }
8445                "limit" => {
8446                    if field_limit.is_some() {
8447                        return Err(::serde::de::Error::duplicate_field("limit"));
8448                    }
8449                    field_limit = Some(map.next_value()?);
8450                }
8451                _ => {
8452                    // unknown field allowed and ignored
8453                    map.next_value::<::serde_json::Value>()?;
8454                }
8455            }
8456        }
8457        if optional && nothing {
8458            return Ok(None);
8459        }
8460        let result = ListFileMembersBatchArg {
8461            files: field_files.ok_or_else(|| ::serde::de::Error::missing_field("files"))?,
8462            limit: field_limit.unwrap_or(1000),
8463        };
8464        Ok(Some(result))
8465    }
8466
8467    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
8468        &self,
8469        s: &mut S::SerializeStruct,
8470    ) -> Result<(), S::Error> {
8471        use serde::ser::SerializeStruct;
8472        s.serialize_field("files", &self.files)?;
8473        if self.limit != 1000 {
8474            s.serialize_field("limit", &self.limit)?;
8475        }
8476        Ok(())
8477    }
8478}
8479
8480impl<'de> ::serde::de::Deserialize<'de> for ListFileMembersBatchArg {
8481    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8482        // struct deserializer
8483        use serde::de::{MapAccess, Visitor};
8484        struct StructVisitor;
8485        impl<'de> Visitor<'de> for StructVisitor {
8486            type Value = ListFileMembersBatchArg;
8487            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8488                f.write_str("a ListFileMembersBatchArg struct")
8489            }
8490            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
8491                ListFileMembersBatchArg::internal_deserialize(map)
8492            }
8493        }
8494        deserializer.deserialize_struct("ListFileMembersBatchArg", LIST_FILE_MEMBERS_BATCH_ARG_FIELDS, StructVisitor)
8495    }
8496}
8497
8498impl ::serde::ser::Serialize for ListFileMembersBatchArg {
8499    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8500        // struct serializer
8501        use serde::ser::SerializeStruct;
8502        let mut s = serializer.serialize_struct("ListFileMembersBatchArg", 2)?;
8503        self.internal_serialize::<S>(&mut s)?;
8504        s.end()
8505    }
8506}
8507
8508/// Per-file result for [`list_file_members_batch()`](crate::sharing::list_file_members_batch).
8509#[derive(Debug, Clone, PartialEq, Eq)]
8510#[non_exhaustive] // structs may have more fields added in the future.
8511pub struct ListFileMembersBatchResult {
8512    /// This is the input file identifier, whether an ID or a path.
8513    pub file: PathOrId,
8514    /// The result for this particular file.
8515    pub result: ListFileMembersIndividualResult,
8516}
8517
8518impl ListFileMembersBatchResult {
8519    pub fn new(file: PathOrId, result: ListFileMembersIndividualResult) -> Self {
8520        ListFileMembersBatchResult {
8521            file,
8522            result,
8523        }
8524    }
8525}
8526
8527const LIST_FILE_MEMBERS_BATCH_RESULT_FIELDS: &[&str] = &["file",
8528                                                         "result"];
8529impl ListFileMembersBatchResult {
8530    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
8531        map: V,
8532    ) -> Result<ListFileMembersBatchResult, V::Error> {
8533        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
8534    }
8535
8536    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
8537        mut map: V,
8538        optional: bool,
8539    ) -> Result<Option<ListFileMembersBatchResult>, V::Error> {
8540        let mut field_file = None;
8541        let mut field_result = None;
8542        let mut nothing = true;
8543        while let Some(key) = map.next_key::<&str>()? {
8544            nothing = false;
8545            match key {
8546                "file" => {
8547                    if field_file.is_some() {
8548                        return Err(::serde::de::Error::duplicate_field("file"));
8549                    }
8550                    field_file = Some(map.next_value()?);
8551                }
8552                "result" => {
8553                    if field_result.is_some() {
8554                        return Err(::serde::de::Error::duplicate_field("result"));
8555                    }
8556                    field_result = Some(map.next_value()?);
8557                }
8558                _ => {
8559                    // unknown field allowed and ignored
8560                    map.next_value::<::serde_json::Value>()?;
8561                }
8562            }
8563        }
8564        if optional && nothing {
8565            return Ok(None);
8566        }
8567        let result = ListFileMembersBatchResult {
8568            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
8569            result: field_result.ok_or_else(|| ::serde::de::Error::missing_field("result"))?,
8570        };
8571        Ok(Some(result))
8572    }
8573
8574    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
8575        &self,
8576        s: &mut S::SerializeStruct,
8577    ) -> Result<(), S::Error> {
8578        use serde::ser::SerializeStruct;
8579        s.serialize_field("file", &self.file)?;
8580        s.serialize_field("result", &self.result)?;
8581        Ok(())
8582    }
8583}
8584
8585impl<'de> ::serde::de::Deserialize<'de> for ListFileMembersBatchResult {
8586    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8587        // struct deserializer
8588        use serde::de::{MapAccess, Visitor};
8589        struct StructVisitor;
8590        impl<'de> Visitor<'de> for StructVisitor {
8591            type Value = ListFileMembersBatchResult;
8592            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8593                f.write_str("a ListFileMembersBatchResult struct")
8594            }
8595            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
8596                ListFileMembersBatchResult::internal_deserialize(map)
8597            }
8598        }
8599        deserializer.deserialize_struct("ListFileMembersBatchResult", LIST_FILE_MEMBERS_BATCH_RESULT_FIELDS, StructVisitor)
8600    }
8601}
8602
8603impl ::serde::ser::Serialize for ListFileMembersBatchResult {
8604    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8605        // struct serializer
8606        use serde::ser::SerializeStruct;
8607        let mut s = serializer.serialize_struct("ListFileMembersBatchResult", 2)?;
8608        self.internal_serialize::<S>(&mut s)?;
8609        s.end()
8610    }
8611}
8612
8613/// Arguments for [`list_file_members_continue()`](crate::sharing::list_file_members_continue).
8614#[derive(Debug, Clone, PartialEq, Eq)]
8615#[non_exhaustive] // structs may have more fields added in the future.
8616pub struct ListFileMembersContinueArg {
8617    /// The cursor returned by your last call to
8618    /// [`list_file_members()`](crate::sharing::list_file_members),
8619    /// [`list_file_members_continue()`](crate::sharing::list_file_members_continue), or
8620    /// [`list_file_members_batch()`](crate::sharing::list_file_members_batch).
8621    pub cursor: String,
8622}
8623
8624impl ListFileMembersContinueArg {
8625    pub fn new(cursor: String) -> Self {
8626        ListFileMembersContinueArg {
8627            cursor,
8628        }
8629    }
8630}
8631
8632const LIST_FILE_MEMBERS_CONTINUE_ARG_FIELDS: &[&str] = &["cursor"];
8633impl ListFileMembersContinueArg {
8634    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
8635        map: V,
8636    ) -> Result<ListFileMembersContinueArg, V::Error> {
8637        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
8638    }
8639
8640    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
8641        mut map: V,
8642        optional: bool,
8643    ) -> Result<Option<ListFileMembersContinueArg>, V::Error> {
8644        let mut field_cursor = None;
8645        let mut nothing = true;
8646        while let Some(key) = map.next_key::<&str>()? {
8647            nothing = false;
8648            match key {
8649                "cursor" => {
8650                    if field_cursor.is_some() {
8651                        return Err(::serde::de::Error::duplicate_field("cursor"));
8652                    }
8653                    field_cursor = Some(map.next_value()?);
8654                }
8655                _ => {
8656                    // unknown field allowed and ignored
8657                    map.next_value::<::serde_json::Value>()?;
8658                }
8659            }
8660        }
8661        if optional && nothing {
8662            return Ok(None);
8663        }
8664        let result = ListFileMembersContinueArg {
8665            cursor: field_cursor.ok_or_else(|| ::serde::de::Error::missing_field("cursor"))?,
8666        };
8667        Ok(Some(result))
8668    }
8669
8670    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
8671        &self,
8672        s: &mut S::SerializeStruct,
8673    ) -> Result<(), S::Error> {
8674        use serde::ser::SerializeStruct;
8675        s.serialize_field("cursor", &self.cursor)?;
8676        Ok(())
8677    }
8678}
8679
8680impl<'de> ::serde::de::Deserialize<'de> for ListFileMembersContinueArg {
8681    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8682        // struct deserializer
8683        use serde::de::{MapAccess, Visitor};
8684        struct StructVisitor;
8685        impl<'de> Visitor<'de> for StructVisitor {
8686            type Value = ListFileMembersContinueArg;
8687            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8688                f.write_str("a ListFileMembersContinueArg struct")
8689            }
8690            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
8691                ListFileMembersContinueArg::internal_deserialize(map)
8692            }
8693        }
8694        deserializer.deserialize_struct("ListFileMembersContinueArg", LIST_FILE_MEMBERS_CONTINUE_ARG_FIELDS, StructVisitor)
8695    }
8696}
8697
8698impl ::serde::ser::Serialize for ListFileMembersContinueArg {
8699    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8700        // struct serializer
8701        use serde::ser::SerializeStruct;
8702        let mut s = serializer.serialize_struct("ListFileMembersContinueArg", 1)?;
8703        self.internal_serialize::<S>(&mut s)?;
8704        s.end()
8705    }
8706}
8707
8708/// Error for [`list_file_members_continue()`](crate::sharing::list_file_members_continue).
8709#[derive(Debug, Clone, PartialEq, Eq)]
8710#[non_exhaustive] // variants may be added in the future
8711pub enum ListFileMembersContinueError {
8712    UserError(SharingUserError),
8713    AccessError(SharingFileAccessError),
8714    /// [`ListFileMembersContinueArg::cursor`](ListFileMembersContinueArg) is invalid.
8715    InvalidCursor,
8716    /// Catch-all used for unrecognized values returned from the server. Encountering this value
8717    /// typically indicates that this SDK version is out of date.
8718    Other,
8719}
8720
8721impl<'de> ::serde::de::Deserialize<'de> for ListFileMembersContinueError {
8722    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8723        // union deserializer
8724        use serde::de::{self, MapAccess, Visitor};
8725        struct EnumVisitor;
8726        impl<'de> Visitor<'de> for EnumVisitor {
8727            type Value = ListFileMembersContinueError;
8728            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8729                f.write_str("a ListFileMembersContinueError structure")
8730            }
8731            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
8732                let tag: &str = match map.next_key()? {
8733                    Some(".tag") => map.next_value()?,
8734                    _ => return Err(de::Error::missing_field(".tag"))
8735                };
8736                let value = match tag {
8737                    "user_error" => {
8738                        match map.next_key()? {
8739                            Some("user_error") => ListFileMembersContinueError::UserError(map.next_value()?),
8740                            None => return Err(de::Error::missing_field("user_error")),
8741                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
8742                        }
8743                    }
8744                    "access_error" => {
8745                        match map.next_key()? {
8746                            Some("access_error") => ListFileMembersContinueError::AccessError(map.next_value()?),
8747                            None => return Err(de::Error::missing_field("access_error")),
8748                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
8749                        }
8750                    }
8751                    "invalid_cursor" => ListFileMembersContinueError::InvalidCursor,
8752                    _ => ListFileMembersContinueError::Other,
8753                };
8754                crate::eat_json_fields(&mut map)?;
8755                Ok(value)
8756            }
8757        }
8758        const VARIANTS: &[&str] = &["user_error",
8759                                    "access_error",
8760                                    "invalid_cursor",
8761                                    "other"];
8762        deserializer.deserialize_struct("ListFileMembersContinueError", VARIANTS, EnumVisitor)
8763    }
8764}
8765
8766impl ::serde::ser::Serialize for ListFileMembersContinueError {
8767    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8768        // union serializer
8769        use serde::ser::SerializeStruct;
8770        match self {
8771            ListFileMembersContinueError::UserError(x) => {
8772                // union or polymporphic struct
8773                let mut s = serializer.serialize_struct("ListFileMembersContinueError", 2)?;
8774                s.serialize_field(".tag", "user_error")?;
8775                s.serialize_field("user_error", x)?;
8776                s.end()
8777            }
8778            ListFileMembersContinueError::AccessError(x) => {
8779                // union or polymporphic struct
8780                let mut s = serializer.serialize_struct("ListFileMembersContinueError", 2)?;
8781                s.serialize_field(".tag", "access_error")?;
8782                s.serialize_field("access_error", x)?;
8783                s.end()
8784            }
8785            ListFileMembersContinueError::InvalidCursor => {
8786                // unit
8787                let mut s = serializer.serialize_struct("ListFileMembersContinueError", 1)?;
8788                s.serialize_field(".tag", "invalid_cursor")?;
8789                s.end()
8790            }
8791            ListFileMembersContinueError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
8792        }
8793    }
8794}
8795
8796impl ::std::error::Error for ListFileMembersContinueError {
8797    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
8798        match self {
8799            ListFileMembersContinueError::UserError(inner) => Some(inner),
8800            ListFileMembersContinueError::AccessError(inner) => Some(inner),
8801            _ => None,
8802        }
8803    }
8804}
8805
8806impl ::std::fmt::Display for ListFileMembersContinueError {
8807    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8808        match self {
8809            ListFileMembersContinueError::UserError(inner) => write!(f, "ListFileMembersContinueError: {}", inner),
8810            ListFileMembersContinueError::AccessError(inner) => write!(f, "ListFileMembersContinueError: {}", inner),
8811            _ => write!(f, "{:?}", *self),
8812        }
8813    }
8814}
8815
8816#[derive(Debug, Clone, PartialEq, Eq)]
8817#[non_exhaustive] // structs may have more fields added in the future.
8818pub struct ListFileMembersCountResult {
8819    /// A list of members on this file.
8820    pub members: SharedFileMembers,
8821    /// The number of members on this file. This does not include inherited members.
8822    pub member_count: u32,
8823}
8824
8825impl ListFileMembersCountResult {
8826    pub fn new(members: SharedFileMembers, member_count: u32) -> Self {
8827        ListFileMembersCountResult {
8828            members,
8829            member_count,
8830        }
8831    }
8832}
8833
8834const LIST_FILE_MEMBERS_COUNT_RESULT_FIELDS: &[&str] = &["members",
8835                                                         "member_count"];
8836impl ListFileMembersCountResult {
8837    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
8838        map: V,
8839    ) -> Result<ListFileMembersCountResult, V::Error> {
8840        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
8841    }
8842
8843    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
8844        mut map: V,
8845        optional: bool,
8846    ) -> Result<Option<ListFileMembersCountResult>, V::Error> {
8847        let mut field_members = None;
8848        let mut field_member_count = None;
8849        let mut nothing = true;
8850        while let Some(key) = map.next_key::<&str>()? {
8851            nothing = false;
8852            match key {
8853                "members" => {
8854                    if field_members.is_some() {
8855                        return Err(::serde::de::Error::duplicate_field("members"));
8856                    }
8857                    field_members = Some(map.next_value()?);
8858                }
8859                "member_count" => {
8860                    if field_member_count.is_some() {
8861                        return Err(::serde::de::Error::duplicate_field("member_count"));
8862                    }
8863                    field_member_count = Some(map.next_value()?);
8864                }
8865                _ => {
8866                    // unknown field allowed and ignored
8867                    map.next_value::<::serde_json::Value>()?;
8868                }
8869            }
8870        }
8871        if optional && nothing {
8872            return Ok(None);
8873        }
8874        let result = ListFileMembersCountResult {
8875            members: field_members.ok_or_else(|| ::serde::de::Error::missing_field("members"))?,
8876            member_count: field_member_count.ok_or_else(|| ::serde::de::Error::missing_field("member_count"))?,
8877        };
8878        Ok(Some(result))
8879    }
8880
8881    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
8882        &self,
8883        s: &mut S::SerializeStruct,
8884    ) -> Result<(), S::Error> {
8885        use serde::ser::SerializeStruct;
8886        s.serialize_field("members", &self.members)?;
8887        s.serialize_field("member_count", &self.member_count)?;
8888        Ok(())
8889    }
8890}
8891
8892impl<'de> ::serde::de::Deserialize<'de> for ListFileMembersCountResult {
8893    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8894        // struct deserializer
8895        use serde::de::{MapAccess, Visitor};
8896        struct StructVisitor;
8897        impl<'de> Visitor<'de> for StructVisitor {
8898            type Value = ListFileMembersCountResult;
8899            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8900                f.write_str("a ListFileMembersCountResult struct")
8901            }
8902            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
8903                ListFileMembersCountResult::internal_deserialize(map)
8904            }
8905        }
8906        deserializer.deserialize_struct("ListFileMembersCountResult", LIST_FILE_MEMBERS_COUNT_RESULT_FIELDS, StructVisitor)
8907    }
8908}
8909
8910impl ::serde::ser::Serialize for ListFileMembersCountResult {
8911    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8912        // struct serializer
8913        use serde::ser::SerializeStruct;
8914        let mut s = serializer.serialize_struct("ListFileMembersCountResult", 2)?;
8915        self.internal_serialize::<S>(&mut s)?;
8916        s.end()
8917    }
8918}
8919
8920/// Error for [`list_file_members()`](crate::sharing::list_file_members).
8921#[derive(Debug, Clone, PartialEq, Eq)]
8922#[non_exhaustive] // variants may be added in the future
8923pub enum ListFileMembersError {
8924    UserError(SharingUserError),
8925    AccessError(SharingFileAccessError),
8926    /// Catch-all used for unrecognized values returned from the server. Encountering this value
8927    /// typically indicates that this SDK version is out of date.
8928    Other,
8929}
8930
8931impl<'de> ::serde::de::Deserialize<'de> for ListFileMembersError {
8932    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8933        // union deserializer
8934        use serde::de::{self, MapAccess, Visitor};
8935        struct EnumVisitor;
8936        impl<'de> Visitor<'de> for EnumVisitor {
8937            type Value = ListFileMembersError;
8938            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8939                f.write_str("a ListFileMembersError structure")
8940            }
8941            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
8942                let tag: &str = match map.next_key()? {
8943                    Some(".tag") => map.next_value()?,
8944                    _ => return Err(de::Error::missing_field(".tag"))
8945                };
8946                let value = match tag {
8947                    "user_error" => {
8948                        match map.next_key()? {
8949                            Some("user_error") => ListFileMembersError::UserError(map.next_value()?),
8950                            None => return Err(de::Error::missing_field("user_error")),
8951                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
8952                        }
8953                    }
8954                    "access_error" => {
8955                        match map.next_key()? {
8956                            Some("access_error") => ListFileMembersError::AccessError(map.next_value()?),
8957                            None => return Err(de::Error::missing_field("access_error")),
8958                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
8959                        }
8960                    }
8961                    _ => ListFileMembersError::Other,
8962                };
8963                crate::eat_json_fields(&mut map)?;
8964                Ok(value)
8965            }
8966        }
8967        const VARIANTS: &[&str] = &["user_error",
8968                                    "access_error",
8969                                    "other"];
8970        deserializer.deserialize_struct("ListFileMembersError", VARIANTS, EnumVisitor)
8971    }
8972}
8973
8974impl ::serde::ser::Serialize for ListFileMembersError {
8975    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8976        // union serializer
8977        use serde::ser::SerializeStruct;
8978        match self {
8979            ListFileMembersError::UserError(x) => {
8980                // union or polymporphic struct
8981                let mut s = serializer.serialize_struct("ListFileMembersError", 2)?;
8982                s.serialize_field(".tag", "user_error")?;
8983                s.serialize_field("user_error", x)?;
8984                s.end()
8985            }
8986            ListFileMembersError::AccessError(x) => {
8987                // union or polymporphic struct
8988                let mut s = serializer.serialize_struct("ListFileMembersError", 2)?;
8989                s.serialize_field(".tag", "access_error")?;
8990                s.serialize_field("access_error", x)?;
8991                s.end()
8992            }
8993            ListFileMembersError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
8994        }
8995    }
8996}
8997
8998impl ::std::error::Error for ListFileMembersError {
8999    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
9000        match self {
9001            ListFileMembersError::UserError(inner) => Some(inner),
9002            ListFileMembersError::AccessError(inner) => Some(inner),
9003            _ => None,
9004        }
9005    }
9006}
9007
9008impl ::std::fmt::Display for ListFileMembersError {
9009    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9010        match self {
9011            ListFileMembersError::UserError(inner) => write!(f, "ListFileMembersError: {}", inner),
9012            ListFileMembersError::AccessError(inner) => write!(f, "ListFileMembersError: {}", inner),
9013            _ => write!(f, "{:?}", *self),
9014        }
9015    }
9016}
9017
9018#[derive(Debug, Clone, PartialEq, Eq)]
9019#[non_exhaustive] // variants may be added in the future
9020pub enum ListFileMembersIndividualResult {
9021    /// The results of the query for this file if it was successful.
9022    Result(ListFileMembersCountResult),
9023    /// The result of the query for this file if it was an error.
9024    AccessError(SharingFileAccessError),
9025    /// Catch-all used for unrecognized values returned from the server. Encountering this value
9026    /// typically indicates that this SDK version is out of date.
9027    Other,
9028}
9029
9030impl<'de> ::serde::de::Deserialize<'de> for ListFileMembersIndividualResult {
9031    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9032        // union deserializer
9033        use serde::de::{self, MapAccess, Visitor};
9034        struct EnumVisitor;
9035        impl<'de> Visitor<'de> for EnumVisitor {
9036            type Value = ListFileMembersIndividualResult;
9037            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9038                f.write_str("a ListFileMembersIndividualResult structure")
9039            }
9040            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
9041                let tag: &str = match map.next_key()? {
9042                    Some(".tag") => map.next_value()?,
9043                    _ => return Err(de::Error::missing_field(".tag"))
9044                };
9045                let value = match tag {
9046                    "result" => ListFileMembersIndividualResult::Result(ListFileMembersCountResult::internal_deserialize(&mut map)?),
9047                    "access_error" => {
9048                        match map.next_key()? {
9049                            Some("access_error") => ListFileMembersIndividualResult::AccessError(map.next_value()?),
9050                            None => return Err(de::Error::missing_field("access_error")),
9051                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
9052                        }
9053                    }
9054                    _ => ListFileMembersIndividualResult::Other,
9055                };
9056                crate::eat_json_fields(&mut map)?;
9057                Ok(value)
9058            }
9059        }
9060        const VARIANTS: &[&str] = &["result",
9061                                    "access_error",
9062                                    "other"];
9063        deserializer.deserialize_struct("ListFileMembersIndividualResult", VARIANTS, EnumVisitor)
9064    }
9065}
9066
9067impl ::serde::ser::Serialize for ListFileMembersIndividualResult {
9068    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9069        // union serializer
9070        use serde::ser::SerializeStruct;
9071        match self {
9072            ListFileMembersIndividualResult::Result(x) => {
9073                // struct
9074                let mut s = serializer.serialize_struct("ListFileMembersIndividualResult", 3)?;
9075                s.serialize_field(".tag", "result")?;
9076                x.internal_serialize::<S>(&mut s)?;
9077                s.end()
9078            }
9079            ListFileMembersIndividualResult::AccessError(x) => {
9080                // union or polymporphic struct
9081                let mut s = serializer.serialize_struct("ListFileMembersIndividualResult", 2)?;
9082                s.serialize_field(".tag", "access_error")?;
9083                s.serialize_field("access_error", x)?;
9084                s.end()
9085            }
9086            ListFileMembersIndividualResult::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
9087        }
9088    }
9089}
9090
9091/// Arguments for [`list_received_files()`](crate::sharing::list_received_files).
9092#[derive(Debug, Clone, PartialEq, Eq)]
9093#[non_exhaustive] // structs may have more fields added in the future.
9094pub struct ListFilesArg {
9095    /// Number of files to return max per query. Defaults to 100 if no limit is specified.
9096    pub limit: u32,
9097    /// A list of `FileAction`s corresponding to `FilePermission`s that should appear in the
9098    /// response's [`SharedFileMetadata::permissions`](SharedFileMetadata) field describing the
9099    /// actions the authenticated user can perform on the file.
9100    pub actions: Option<Vec<FileAction>>,
9101}
9102
9103impl Default for ListFilesArg {
9104    fn default() -> Self {
9105        ListFilesArg {
9106            limit: 100,
9107            actions: None,
9108        }
9109    }
9110}
9111
9112impl ListFilesArg {
9113    pub fn with_limit(mut self, value: u32) -> Self {
9114        self.limit = value;
9115        self
9116    }
9117
9118    pub fn with_actions(mut self, value: Vec<FileAction>) -> Self {
9119        self.actions = Some(value);
9120        self
9121    }
9122}
9123
9124const LIST_FILES_ARG_FIELDS: &[&str] = &["limit",
9125                                         "actions"];
9126impl ListFilesArg {
9127    // no _opt deserializer
9128    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
9129        mut map: V,
9130    ) -> Result<ListFilesArg, V::Error> {
9131        let mut field_limit = None;
9132        let mut field_actions = None;
9133        while let Some(key) = map.next_key::<&str>()? {
9134            match key {
9135                "limit" => {
9136                    if field_limit.is_some() {
9137                        return Err(::serde::de::Error::duplicate_field("limit"));
9138                    }
9139                    field_limit = Some(map.next_value()?);
9140                }
9141                "actions" => {
9142                    if field_actions.is_some() {
9143                        return Err(::serde::de::Error::duplicate_field("actions"));
9144                    }
9145                    field_actions = Some(map.next_value()?);
9146                }
9147                _ => {
9148                    // unknown field allowed and ignored
9149                    map.next_value::<::serde_json::Value>()?;
9150                }
9151            }
9152        }
9153        let result = ListFilesArg {
9154            limit: field_limit.unwrap_or(100),
9155            actions: field_actions.and_then(Option::flatten),
9156        };
9157        Ok(result)
9158    }
9159
9160    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
9161        &self,
9162        s: &mut S::SerializeStruct,
9163    ) -> Result<(), S::Error> {
9164        use serde::ser::SerializeStruct;
9165        if self.limit != 100 {
9166            s.serialize_field("limit", &self.limit)?;
9167        }
9168        if let Some(val) = &self.actions {
9169            s.serialize_field("actions", val)?;
9170        }
9171        Ok(())
9172    }
9173}
9174
9175impl<'de> ::serde::de::Deserialize<'de> for ListFilesArg {
9176    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9177        // struct deserializer
9178        use serde::de::{MapAccess, Visitor};
9179        struct StructVisitor;
9180        impl<'de> Visitor<'de> for StructVisitor {
9181            type Value = ListFilesArg;
9182            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9183                f.write_str("a ListFilesArg struct")
9184            }
9185            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
9186                ListFilesArg::internal_deserialize(map)
9187            }
9188        }
9189        deserializer.deserialize_struct("ListFilesArg", LIST_FILES_ARG_FIELDS, StructVisitor)
9190    }
9191}
9192
9193impl ::serde::ser::Serialize for ListFilesArg {
9194    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9195        // struct serializer
9196        use serde::ser::SerializeStruct;
9197        let mut s = serializer.serialize_struct("ListFilesArg", 2)?;
9198        self.internal_serialize::<S>(&mut s)?;
9199        s.end()
9200    }
9201}
9202
9203/// Arguments for [`list_received_files_continue()`](crate::sharing::list_received_files_continue).
9204#[derive(Debug, Clone, PartialEq, Eq)]
9205#[non_exhaustive] // structs may have more fields added in the future.
9206pub struct ListFilesContinueArg {
9207    /// Cursor in [`ListFilesResult::cursor`](ListFilesResult).
9208    pub cursor: String,
9209}
9210
9211impl ListFilesContinueArg {
9212    pub fn new(cursor: String) -> Self {
9213        ListFilesContinueArg {
9214            cursor,
9215        }
9216    }
9217}
9218
9219const LIST_FILES_CONTINUE_ARG_FIELDS: &[&str] = &["cursor"];
9220impl ListFilesContinueArg {
9221    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
9222        map: V,
9223    ) -> Result<ListFilesContinueArg, V::Error> {
9224        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
9225    }
9226
9227    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
9228        mut map: V,
9229        optional: bool,
9230    ) -> Result<Option<ListFilesContinueArg>, V::Error> {
9231        let mut field_cursor = None;
9232        let mut nothing = true;
9233        while let Some(key) = map.next_key::<&str>()? {
9234            nothing = false;
9235            match key {
9236                "cursor" => {
9237                    if field_cursor.is_some() {
9238                        return Err(::serde::de::Error::duplicate_field("cursor"));
9239                    }
9240                    field_cursor = Some(map.next_value()?);
9241                }
9242                _ => {
9243                    // unknown field allowed and ignored
9244                    map.next_value::<::serde_json::Value>()?;
9245                }
9246            }
9247        }
9248        if optional && nothing {
9249            return Ok(None);
9250        }
9251        let result = ListFilesContinueArg {
9252            cursor: field_cursor.ok_or_else(|| ::serde::de::Error::missing_field("cursor"))?,
9253        };
9254        Ok(Some(result))
9255    }
9256
9257    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
9258        &self,
9259        s: &mut S::SerializeStruct,
9260    ) -> Result<(), S::Error> {
9261        use serde::ser::SerializeStruct;
9262        s.serialize_field("cursor", &self.cursor)?;
9263        Ok(())
9264    }
9265}
9266
9267impl<'de> ::serde::de::Deserialize<'de> for ListFilesContinueArg {
9268    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9269        // struct deserializer
9270        use serde::de::{MapAccess, Visitor};
9271        struct StructVisitor;
9272        impl<'de> Visitor<'de> for StructVisitor {
9273            type Value = ListFilesContinueArg;
9274            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9275                f.write_str("a ListFilesContinueArg struct")
9276            }
9277            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
9278                ListFilesContinueArg::internal_deserialize(map)
9279            }
9280        }
9281        deserializer.deserialize_struct("ListFilesContinueArg", LIST_FILES_CONTINUE_ARG_FIELDS, StructVisitor)
9282    }
9283}
9284
9285impl ::serde::ser::Serialize for ListFilesContinueArg {
9286    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9287        // struct serializer
9288        use serde::ser::SerializeStruct;
9289        let mut s = serializer.serialize_struct("ListFilesContinueArg", 1)?;
9290        self.internal_serialize::<S>(&mut s)?;
9291        s.end()
9292    }
9293}
9294
9295/// Error results for
9296/// [`list_received_files_continue()`](crate::sharing::list_received_files_continue).
9297#[derive(Debug, Clone, PartialEq, Eq)]
9298#[non_exhaustive] // variants may be added in the future
9299pub enum ListFilesContinueError {
9300    /// User account had a problem.
9301    UserError(SharingUserError),
9302    /// [`ListFilesContinueArg::cursor`](ListFilesContinueArg) is invalid.
9303    InvalidCursor,
9304    /// Catch-all used for unrecognized values returned from the server. Encountering this value
9305    /// typically indicates that this SDK version is out of date.
9306    Other,
9307}
9308
9309impl<'de> ::serde::de::Deserialize<'de> for ListFilesContinueError {
9310    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9311        // union deserializer
9312        use serde::de::{self, MapAccess, Visitor};
9313        struct EnumVisitor;
9314        impl<'de> Visitor<'de> for EnumVisitor {
9315            type Value = ListFilesContinueError;
9316            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9317                f.write_str("a ListFilesContinueError structure")
9318            }
9319            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
9320                let tag: &str = match map.next_key()? {
9321                    Some(".tag") => map.next_value()?,
9322                    _ => return Err(de::Error::missing_field(".tag"))
9323                };
9324                let value = match tag {
9325                    "user_error" => {
9326                        match map.next_key()? {
9327                            Some("user_error") => ListFilesContinueError::UserError(map.next_value()?),
9328                            None => return Err(de::Error::missing_field("user_error")),
9329                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
9330                        }
9331                    }
9332                    "invalid_cursor" => ListFilesContinueError::InvalidCursor,
9333                    _ => ListFilesContinueError::Other,
9334                };
9335                crate::eat_json_fields(&mut map)?;
9336                Ok(value)
9337            }
9338        }
9339        const VARIANTS: &[&str] = &["user_error",
9340                                    "invalid_cursor",
9341                                    "other"];
9342        deserializer.deserialize_struct("ListFilesContinueError", VARIANTS, EnumVisitor)
9343    }
9344}
9345
9346impl ::serde::ser::Serialize for ListFilesContinueError {
9347    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9348        // union serializer
9349        use serde::ser::SerializeStruct;
9350        match self {
9351            ListFilesContinueError::UserError(x) => {
9352                // union or polymporphic struct
9353                let mut s = serializer.serialize_struct("ListFilesContinueError", 2)?;
9354                s.serialize_field(".tag", "user_error")?;
9355                s.serialize_field("user_error", x)?;
9356                s.end()
9357            }
9358            ListFilesContinueError::InvalidCursor => {
9359                // unit
9360                let mut s = serializer.serialize_struct("ListFilesContinueError", 1)?;
9361                s.serialize_field(".tag", "invalid_cursor")?;
9362                s.end()
9363            }
9364            ListFilesContinueError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
9365        }
9366    }
9367}
9368
9369impl ::std::error::Error for ListFilesContinueError {
9370    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
9371        match self {
9372            ListFilesContinueError::UserError(inner) => Some(inner),
9373            _ => None,
9374        }
9375    }
9376}
9377
9378impl ::std::fmt::Display for ListFilesContinueError {
9379    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9380        match self {
9381            ListFilesContinueError::UserError(inner) => write!(f, "User account had a problem: {}", inner),
9382            _ => write!(f, "{:?}", *self),
9383        }
9384    }
9385}
9386
9387/// Success results for [`list_received_files()`](crate::sharing::list_received_files).
9388#[derive(Debug, Clone, PartialEq, Eq)]
9389#[non_exhaustive] // structs may have more fields added in the future.
9390pub struct ListFilesResult {
9391    /// Information about the files shared with current user.
9392    pub entries: Vec<SharedFileMetadata>,
9393    /// Cursor used to obtain additional shared files.
9394    pub cursor: Option<String>,
9395}
9396
9397impl ListFilesResult {
9398    pub fn new(entries: Vec<SharedFileMetadata>) -> Self {
9399        ListFilesResult {
9400            entries,
9401            cursor: None,
9402        }
9403    }
9404
9405    pub fn with_cursor(mut self, value: String) -> Self {
9406        self.cursor = Some(value);
9407        self
9408    }
9409}
9410
9411const LIST_FILES_RESULT_FIELDS: &[&str] = &["entries",
9412                                            "cursor"];
9413impl ListFilesResult {
9414    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
9415        map: V,
9416    ) -> Result<ListFilesResult, V::Error> {
9417        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
9418    }
9419
9420    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
9421        mut map: V,
9422        optional: bool,
9423    ) -> Result<Option<ListFilesResult>, V::Error> {
9424        let mut field_entries = None;
9425        let mut field_cursor = None;
9426        let mut nothing = true;
9427        while let Some(key) = map.next_key::<&str>()? {
9428            nothing = false;
9429            match key {
9430                "entries" => {
9431                    if field_entries.is_some() {
9432                        return Err(::serde::de::Error::duplicate_field("entries"));
9433                    }
9434                    field_entries = Some(map.next_value()?);
9435                }
9436                "cursor" => {
9437                    if field_cursor.is_some() {
9438                        return Err(::serde::de::Error::duplicate_field("cursor"));
9439                    }
9440                    field_cursor = Some(map.next_value()?);
9441                }
9442                _ => {
9443                    // unknown field allowed and ignored
9444                    map.next_value::<::serde_json::Value>()?;
9445                }
9446            }
9447        }
9448        if optional && nothing {
9449            return Ok(None);
9450        }
9451        let result = ListFilesResult {
9452            entries: field_entries.ok_or_else(|| ::serde::de::Error::missing_field("entries"))?,
9453            cursor: field_cursor.and_then(Option::flatten),
9454        };
9455        Ok(Some(result))
9456    }
9457
9458    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
9459        &self,
9460        s: &mut S::SerializeStruct,
9461    ) -> Result<(), S::Error> {
9462        use serde::ser::SerializeStruct;
9463        s.serialize_field("entries", &self.entries)?;
9464        if let Some(val) = &self.cursor {
9465            s.serialize_field("cursor", val)?;
9466        }
9467        Ok(())
9468    }
9469}
9470
9471impl<'de> ::serde::de::Deserialize<'de> for ListFilesResult {
9472    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9473        // struct deserializer
9474        use serde::de::{MapAccess, Visitor};
9475        struct StructVisitor;
9476        impl<'de> Visitor<'de> for StructVisitor {
9477            type Value = ListFilesResult;
9478            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9479                f.write_str("a ListFilesResult struct")
9480            }
9481            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
9482                ListFilesResult::internal_deserialize(map)
9483            }
9484        }
9485        deserializer.deserialize_struct("ListFilesResult", LIST_FILES_RESULT_FIELDS, StructVisitor)
9486    }
9487}
9488
9489impl ::serde::ser::Serialize for ListFilesResult {
9490    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9491        // struct serializer
9492        use serde::ser::SerializeStruct;
9493        let mut s = serializer.serialize_struct("ListFilesResult", 2)?;
9494        self.internal_serialize::<S>(&mut s)?;
9495        s.end()
9496    }
9497}
9498
9499#[derive(Debug, Clone, PartialEq, Eq)]
9500#[non_exhaustive] // structs may have more fields added in the future.
9501pub struct ListFolderMembersArgs {
9502    /// The ID for the shared folder. When path is provided, the folder ID will be extracted from
9503    /// the path instead.
9504    pub shared_folder_id: crate::types::common::SharedFolderId,
9505    /// This is a list indicating whether each returned member will include a boolean value
9506    /// [`MemberPermission::allow`](MemberPermission) that describes whether the current user can
9507    /// perform the MemberAction on the member.
9508    pub actions: Option<Vec<MemberAction>>,
9509    /// The maximum number of results that include members, groups and invitees to return per
9510    /// request.
9511    pub limit: u32,
9512    /// Optional path to get inherited members. When omitted, uses shared_folder_id to return direct
9513    /// members. When provided, extracts folder ID from this path and returns users who have access
9514    /// through parent shared folder.
9515    pub path: Option<String>,
9516}
9517
9518impl ListFolderMembersArgs {
9519    pub fn new(shared_folder_id: crate::types::common::SharedFolderId) -> Self {
9520        ListFolderMembersArgs {
9521            shared_folder_id,
9522            actions: None,
9523            limit: 1000,
9524            path: None,
9525        }
9526    }
9527
9528    pub fn with_actions(mut self, value: Vec<MemberAction>) -> Self {
9529        self.actions = Some(value);
9530        self
9531    }
9532
9533    pub fn with_limit(mut self, value: u32) -> Self {
9534        self.limit = value;
9535        self
9536    }
9537
9538    pub fn with_path(mut self, value: String) -> Self {
9539        self.path = Some(value);
9540        self
9541    }
9542}
9543
9544const LIST_FOLDER_MEMBERS_ARGS_FIELDS: &[&str] = &["shared_folder_id",
9545                                                   "actions",
9546                                                   "limit",
9547                                                   "path"];
9548impl ListFolderMembersArgs {
9549    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
9550        map: V,
9551    ) -> Result<ListFolderMembersArgs, V::Error> {
9552        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
9553    }
9554
9555    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
9556        mut map: V,
9557        optional: bool,
9558    ) -> Result<Option<ListFolderMembersArgs>, V::Error> {
9559        let mut field_shared_folder_id = None;
9560        let mut field_actions = None;
9561        let mut field_limit = None;
9562        let mut field_path = None;
9563        let mut nothing = true;
9564        while let Some(key) = map.next_key::<&str>()? {
9565            nothing = false;
9566            match key {
9567                "shared_folder_id" => {
9568                    if field_shared_folder_id.is_some() {
9569                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
9570                    }
9571                    field_shared_folder_id = Some(map.next_value()?);
9572                }
9573                "actions" => {
9574                    if field_actions.is_some() {
9575                        return Err(::serde::de::Error::duplicate_field("actions"));
9576                    }
9577                    field_actions = Some(map.next_value()?);
9578                }
9579                "limit" => {
9580                    if field_limit.is_some() {
9581                        return Err(::serde::de::Error::duplicate_field("limit"));
9582                    }
9583                    field_limit = Some(map.next_value()?);
9584                }
9585                "path" => {
9586                    if field_path.is_some() {
9587                        return Err(::serde::de::Error::duplicate_field("path"));
9588                    }
9589                    field_path = Some(map.next_value()?);
9590                }
9591                _ => {
9592                    // unknown field allowed and ignored
9593                    map.next_value::<::serde_json::Value>()?;
9594                }
9595            }
9596        }
9597        if optional && nothing {
9598            return Ok(None);
9599        }
9600        let result = ListFolderMembersArgs {
9601            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
9602            actions: field_actions.and_then(Option::flatten),
9603            limit: field_limit.unwrap_or(1000),
9604            path: field_path.and_then(Option::flatten),
9605        };
9606        Ok(Some(result))
9607    }
9608
9609    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
9610        &self,
9611        s: &mut S::SerializeStruct,
9612    ) -> Result<(), S::Error> {
9613        use serde::ser::SerializeStruct;
9614        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
9615        if let Some(val) = &self.actions {
9616            s.serialize_field("actions", val)?;
9617        }
9618        if self.limit != 1000 {
9619            s.serialize_field("limit", &self.limit)?;
9620        }
9621        if let Some(val) = &self.path {
9622            s.serialize_field("path", val)?;
9623        }
9624        Ok(())
9625    }
9626}
9627
9628impl<'de> ::serde::de::Deserialize<'de> for ListFolderMembersArgs {
9629    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9630        // struct deserializer
9631        use serde::de::{MapAccess, Visitor};
9632        struct StructVisitor;
9633        impl<'de> Visitor<'de> for StructVisitor {
9634            type Value = ListFolderMembersArgs;
9635            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9636                f.write_str("a ListFolderMembersArgs struct")
9637            }
9638            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
9639                ListFolderMembersArgs::internal_deserialize(map)
9640            }
9641        }
9642        deserializer.deserialize_struct("ListFolderMembersArgs", LIST_FOLDER_MEMBERS_ARGS_FIELDS, StructVisitor)
9643    }
9644}
9645
9646impl ::serde::ser::Serialize for ListFolderMembersArgs {
9647    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9648        // struct serializer
9649        use serde::ser::SerializeStruct;
9650        let mut s = serializer.serialize_struct("ListFolderMembersArgs", 4)?;
9651        self.internal_serialize::<S>(&mut s)?;
9652        s.end()
9653    }
9654}
9655
9656// struct extends ListFolderMembersCursorArg
9657impl From<ListFolderMembersArgs> for ListFolderMembersCursorArg {
9658    fn from(subtype: ListFolderMembersArgs) -> Self {
9659        Self {
9660            actions: subtype.actions,
9661            limit: subtype.limit,
9662        }
9663    }
9664}
9665#[derive(Debug, Clone, PartialEq, Eq)]
9666#[non_exhaustive] // structs may have more fields added in the future.
9667pub struct ListFolderMembersContinueArg {
9668    /// The cursor returned by your last call to
9669    /// [`list_folder_members()`](crate::sharing::list_folder_members) or
9670    /// [`list_folder_members_continue()`](crate::sharing::list_folder_members_continue).
9671    pub cursor: String,
9672}
9673
9674impl ListFolderMembersContinueArg {
9675    pub fn new(cursor: String) -> Self {
9676        ListFolderMembersContinueArg {
9677            cursor,
9678        }
9679    }
9680}
9681
9682const LIST_FOLDER_MEMBERS_CONTINUE_ARG_FIELDS: &[&str] = &["cursor"];
9683impl ListFolderMembersContinueArg {
9684    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
9685        map: V,
9686    ) -> Result<ListFolderMembersContinueArg, V::Error> {
9687        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
9688    }
9689
9690    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
9691        mut map: V,
9692        optional: bool,
9693    ) -> Result<Option<ListFolderMembersContinueArg>, V::Error> {
9694        let mut field_cursor = None;
9695        let mut nothing = true;
9696        while let Some(key) = map.next_key::<&str>()? {
9697            nothing = false;
9698            match key {
9699                "cursor" => {
9700                    if field_cursor.is_some() {
9701                        return Err(::serde::de::Error::duplicate_field("cursor"));
9702                    }
9703                    field_cursor = Some(map.next_value()?);
9704                }
9705                _ => {
9706                    // unknown field allowed and ignored
9707                    map.next_value::<::serde_json::Value>()?;
9708                }
9709            }
9710        }
9711        if optional && nothing {
9712            return Ok(None);
9713        }
9714        let result = ListFolderMembersContinueArg {
9715            cursor: field_cursor.ok_or_else(|| ::serde::de::Error::missing_field("cursor"))?,
9716        };
9717        Ok(Some(result))
9718    }
9719
9720    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
9721        &self,
9722        s: &mut S::SerializeStruct,
9723    ) -> Result<(), S::Error> {
9724        use serde::ser::SerializeStruct;
9725        s.serialize_field("cursor", &self.cursor)?;
9726        Ok(())
9727    }
9728}
9729
9730impl<'de> ::serde::de::Deserialize<'de> for ListFolderMembersContinueArg {
9731    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9732        // struct deserializer
9733        use serde::de::{MapAccess, Visitor};
9734        struct StructVisitor;
9735        impl<'de> Visitor<'de> for StructVisitor {
9736            type Value = ListFolderMembersContinueArg;
9737            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9738                f.write_str("a ListFolderMembersContinueArg struct")
9739            }
9740            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
9741                ListFolderMembersContinueArg::internal_deserialize(map)
9742            }
9743        }
9744        deserializer.deserialize_struct("ListFolderMembersContinueArg", LIST_FOLDER_MEMBERS_CONTINUE_ARG_FIELDS, StructVisitor)
9745    }
9746}
9747
9748impl ::serde::ser::Serialize for ListFolderMembersContinueArg {
9749    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9750        // struct serializer
9751        use serde::ser::SerializeStruct;
9752        let mut s = serializer.serialize_struct("ListFolderMembersContinueArg", 1)?;
9753        self.internal_serialize::<S>(&mut s)?;
9754        s.end()
9755    }
9756}
9757
9758#[derive(Debug, Clone, PartialEq, Eq)]
9759#[non_exhaustive] // variants may be added in the future
9760pub enum ListFolderMembersContinueError {
9761    AccessError(SharedFolderAccessError),
9762    /// [`ListFolderMembersContinueArg::cursor`](ListFolderMembersContinueArg) is invalid.
9763    InvalidCursor,
9764    /// Catch-all used for unrecognized values returned from the server. Encountering this value
9765    /// typically indicates that this SDK version is out of date.
9766    Other,
9767}
9768
9769impl<'de> ::serde::de::Deserialize<'de> for ListFolderMembersContinueError {
9770    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9771        // union deserializer
9772        use serde::de::{self, MapAccess, Visitor};
9773        struct EnumVisitor;
9774        impl<'de> Visitor<'de> for EnumVisitor {
9775            type Value = ListFolderMembersContinueError;
9776            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9777                f.write_str("a ListFolderMembersContinueError structure")
9778            }
9779            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
9780                let tag: &str = match map.next_key()? {
9781                    Some(".tag") => map.next_value()?,
9782                    _ => return Err(de::Error::missing_field(".tag"))
9783                };
9784                let value = match tag {
9785                    "access_error" => {
9786                        match map.next_key()? {
9787                            Some("access_error") => ListFolderMembersContinueError::AccessError(map.next_value()?),
9788                            None => return Err(de::Error::missing_field("access_error")),
9789                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
9790                        }
9791                    }
9792                    "invalid_cursor" => ListFolderMembersContinueError::InvalidCursor,
9793                    _ => ListFolderMembersContinueError::Other,
9794                };
9795                crate::eat_json_fields(&mut map)?;
9796                Ok(value)
9797            }
9798        }
9799        const VARIANTS: &[&str] = &["access_error",
9800                                    "invalid_cursor",
9801                                    "other"];
9802        deserializer.deserialize_struct("ListFolderMembersContinueError", VARIANTS, EnumVisitor)
9803    }
9804}
9805
9806impl ::serde::ser::Serialize for ListFolderMembersContinueError {
9807    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9808        // union serializer
9809        use serde::ser::SerializeStruct;
9810        match self {
9811            ListFolderMembersContinueError::AccessError(x) => {
9812                // union or polymporphic struct
9813                let mut s = serializer.serialize_struct("ListFolderMembersContinueError", 2)?;
9814                s.serialize_field(".tag", "access_error")?;
9815                s.serialize_field("access_error", x)?;
9816                s.end()
9817            }
9818            ListFolderMembersContinueError::InvalidCursor => {
9819                // unit
9820                let mut s = serializer.serialize_struct("ListFolderMembersContinueError", 1)?;
9821                s.serialize_field(".tag", "invalid_cursor")?;
9822                s.end()
9823            }
9824            ListFolderMembersContinueError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
9825        }
9826    }
9827}
9828
9829impl ::std::error::Error for ListFolderMembersContinueError {
9830    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
9831        match self {
9832            ListFolderMembersContinueError::AccessError(inner) => Some(inner),
9833            _ => None,
9834        }
9835    }
9836}
9837
9838impl ::std::fmt::Display for ListFolderMembersContinueError {
9839    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9840        match self {
9841            ListFolderMembersContinueError::AccessError(inner) => write!(f, "ListFolderMembersContinueError: {}", inner),
9842            _ => write!(f, "{:?}", *self),
9843        }
9844    }
9845}
9846
9847#[derive(Debug, Clone, PartialEq, Eq)]
9848#[non_exhaustive] // structs may have more fields added in the future.
9849pub struct ListFolderMembersCursorArg {
9850    /// This is a list indicating whether each returned member will include a boolean value
9851    /// [`MemberPermission::allow`](MemberPermission) that describes whether the current user can
9852    /// perform the MemberAction on the member.
9853    pub actions: Option<Vec<MemberAction>>,
9854    /// The maximum number of results that include members, groups and invitees to return per
9855    /// request.
9856    pub limit: u32,
9857}
9858
9859impl Default for ListFolderMembersCursorArg {
9860    fn default() -> Self {
9861        ListFolderMembersCursorArg {
9862            actions: None,
9863            limit: 1000,
9864        }
9865    }
9866}
9867
9868impl ListFolderMembersCursorArg {
9869    pub fn with_actions(mut self, value: Vec<MemberAction>) -> Self {
9870        self.actions = Some(value);
9871        self
9872    }
9873
9874    pub fn with_limit(mut self, value: u32) -> Self {
9875        self.limit = value;
9876        self
9877    }
9878}
9879
9880const LIST_FOLDER_MEMBERS_CURSOR_ARG_FIELDS: &[&str] = &["actions",
9881                                                         "limit"];
9882impl ListFolderMembersCursorArg {
9883    // no _opt deserializer
9884    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
9885        mut map: V,
9886    ) -> Result<ListFolderMembersCursorArg, V::Error> {
9887        let mut field_actions = None;
9888        let mut field_limit = None;
9889        while let Some(key) = map.next_key::<&str>()? {
9890            match key {
9891                "actions" => {
9892                    if field_actions.is_some() {
9893                        return Err(::serde::de::Error::duplicate_field("actions"));
9894                    }
9895                    field_actions = Some(map.next_value()?);
9896                }
9897                "limit" => {
9898                    if field_limit.is_some() {
9899                        return Err(::serde::de::Error::duplicate_field("limit"));
9900                    }
9901                    field_limit = Some(map.next_value()?);
9902                }
9903                _ => {
9904                    // unknown field allowed and ignored
9905                    map.next_value::<::serde_json::Value>()?;
9906                }
9907            }
9908        }
9909        let result = ListFolderMembersCursorArg {
9910            actions: field_actions.and_then(Option::flatten),
9911            limit: field_limit.unwrap_or(1000),
9912        };
9913        Ok(result)
9914    }
9915
9916    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
9917        &self,
9918        s: &mut S::SerializeStruct,
9919    ) -> Result<(), S::Error> {
9920        use serde::ser::SerializeStruct;
9921        if let Some(val) = &self.actions {
9922            s.serialize_field("actions", val)?;
9923        }
9924        if self.limit != 1000 {
9925            s.serialize_field("limit", &self.limit)?;
9926        }
9927        Ok(())
9928    }
9929}
9930
9931impl<'de> ::serde::de::Deserialize<'de> for ListFolderMembersCursorArg {
9932    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9933        // struct deserializer
9934        use serde::de::{MapAccess, Visitor};
9935        struct StructVisitor;
9936        impl<'de> Visitor<'de> for StructVisitor {
9937            type Value = ListFolderMembersCursorArg;
9938            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9939                f.write_str("a ListFolderMembersCursorArg struct")
9940            }
9941            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
9942                ListFolderMembersCursorArg::internal_deserialize(map)
9943            }
9944        }
9945        deserializer.deserialize_struct("ListFolderMembersCursorArg", LIST_FOLDER_MEMBERS_CURSOR_ARG_FIELDS, StructVisitor)
9946    }
9947}
9948
9949impl ::serde::ser::Serialize for ListFolderMembersCursorArg {
9950    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9951        // struct serializer
9952        use serde::ser::SerializeStruct;
9953        let mut s = serializer.serialize_struct("ListFolderMembersCursorArg", 2)?;
9954        self.internal_serialize::<S>(&mut s)?;
9955        s.end()
9956    }
9957}
9958
9959#[derive(Debug, Clone, PartialEq, Eq)]
9960#[non_exhaustive] // structs may have more fields added in the future.
9961pub struct ListFoldersArgs {
9962    /// The maximum number of results to return per request.
9963    pub limit: u32,
9964    /// A list of `FolderAction`s corresponding to `FolderPermission`s that should appear in the
9965    /// response's [`SharedFolderMetadata::permissions`](SharedFolderMetadata) field describing the
9966    /// actions the authenticated user can perform on the folder.
9967    pub actions: Option<Vec<FolderAction>>,
9968}
9969
9970impl Default for ListFoldersArgs {
9971    fn default() -> Self {
9972        ListFoldersArgs {
9973            limit: 1000,
9974            actions: None,
9975        }
9976    }
9977}
9978
9979impl ListFoldersArgs {
9980    pub fn with_limit(mut self, value: u32) -> Self {
9981        self.limit = value;
9982        self
9983    }
9984
9985    pub fn with_actions(mut self, value: Vec<FolderAction>) -> Self {
9986        self.actions = Some(value);
9987        self
9988    }
9989}
9990
9991const LIST_FOLDERS_ARGS_FIELDS: &[&str] = &["limit",
9992                                            "actions"];
9993impl ListFoldersArgs {
9994    // no _opt deserializer
9995    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
9996        mut map: V,
9997    ) -> Result<ListFoldersArgs, V::Error> {
9998        let mut field_limit = None;
9999        let mut field_actions = None;
10000        while let Some(key) = map.next_key::<&str>()? {
10001            match key {
10002                "limit" => {
10003                    if field_limit.is_some() {
10004                        return Err(::serde::de::Error::duplicate_field("limit"));
10005                    }
10006                    field_limit = Some(map.next_value()?);
10007                }
10008                "actions" => {
10009                    if field_actions.is_some() {
10010                        return Err(::serde::de::Error::duplicate_field("actions"));
10011                    }
10012                    field_actions = Some(map.next_value()?);
10013                }
10014                _ => {
10015                    // unknown field allowed and ignored
10016                    map.next_value::<::serde_json::Value>()?;
10017                }
10018            }
10019        }
10020        let result = ListFoldersArgs {
10021            limit: field_limit.unwrap_or(1000),
10022            actions: field_actions.and_then(Option::flatten),
10023        };
10024        Ok(result)
10025    }
10026
10027    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
10028        &self,
10029        s: &mut S::SerializeStruct,
10030    ) -> Result<(), S::Error> {
10031        use serde::ser::SerializeStruct;
10032        if self.limit != 1000 {
10033            s.serialize_field("limit", &self.limit)?;
10034        }
10035        if let Some(val) = &self.actions {
10036            s.serialize_field("actions", val)?;
10037        }
10038        Ok(())
10039    }
10040}
10041
10042impl<'de> ::serde::de::Deserialize<'de> for ListFoldersArgs {
10043    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10044        // struct deserializer
10045        use serde::de::{MapAccess, Visitor};
10046        struct StructVisitor;
10047        impl<'de> Visitor<'de> for StructVisitor {
10048            type Value = ListFoldersArgs;
10049            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10050                f.write_str("a ListFoldersArgs struct")
10051            }
10052            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
10053                ListFoldersArgs::internal_deserialize(map)
10054            }
10055        }
10056        deserializer.deserialize_struct("ListFoldersArgs", LIST_FOLDERS_ARGS_FIELDS, StructVisitor)
10057    }
10058}
10059
10060impl ::serde::ser::Serialize for ListFoldersArgs {
10061    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10062        // struct serializer
10063        use serde::ser::SerializeStruct;
10064        let mut s = serializer.serialize_struct("ListFoldersArgs", 2)?;
10065        self.internal_serialize::<S>(&mut s)?;
10066        s.end()
10067    }
10068}
10069
10070#[derive(Debug, Clone, PartialEq, Eq)]
10071#[non_exhaustive] // structs may have more fields added in the future.
10072pub struct ListFoldersContinueArg {
10073    /// The cursor returned by the previous API call specified in the endpoint description.
10074    pub cursor: String,
10075}
10076
10077impl ListFoldersContinueArg {
10078    pub fn new(cursor: String) -> Self {
10079        ListFoldersContinueArg {
10080            cursor,
10081        }
10082    }
10083}
10084
10085const LIST_FOLDERS_CONTINUE_ARG_FIELDS: &[&str] = &["cursor"];
10086impl ListFoldersContinueArg {
10087    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
10088        map: V,
10089    ) -> Result<ListFoldersContinueArg, V::Error> {
10090        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
10091    }
10092
10093    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
10094        mut map: V,
10095        optional: bool,
10096    ) -> Result<Option<ListFoldersContinueArg>, V::Error> {
10097        let mut field_cursor = None;
10098        let mut nothing = true;
10099        while let Some(key) = map.next_key::<&str>()? {
10100            nothing = false;
10101            match key {
10102                "cursor" => {
10103                    if field_cursor.is_some() {
10104                        return Err(::serde::de::Error::duplicate_field("cursor"));
10105                    }
10106                    field_cursor = Some(map.next_value()?);
10107                }
10108                _ => {
10109                    // unknown field allowed and ignored
10110                    map.next_value::<::serde_json::Value>()?;
10111                }
10112            }
10113        }
10114        if optional && nothing {
10115            return Ok(None);
10116        }
10117        let result = ListFoldersContinueArg {
10118            cursor: field_cursor.ok_or_else(|| ::serde::de::Error::missing_field("cursor"))?,
10119        };
10120        Ok(Some(result))
10121    }
10122
10123    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
10124        &self,
10125        s: &mut S::SerializeStruct,
10126    ) -> Result<(), S::Error> {
10127        use serde::ser::SerializeStruct;
10128        s.serialize_field("cursor", &self.cursor)?;
10129        Ok(())
10130    }
10131}
10132
10133impl<'de> ::serde::de::Deserialize<'de> for ListFoldersContinueArg {
10134    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10135        // struct deserializer
10136        use serde::de::{MapAccess, Visitor};
10137        struct StructVisitor;
10138        impl<'de> Visitor<'de> for StructVisitor {
10139            type Value = ListFoldersContinueArg;
10140            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10141                f.write_str("a ListFoldersContinueArg struct")
10142            }
10143            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
10144                ListFoldersContinueArg::internal_deserialize(map)
10145            }
10146        }
10147        deserializer.deserialize_struct("ListFoldersContinueArg", LIST_FOLDERS_CONTINUE_ARG_FIELDS, StructVisitor)
10148    }
10149}
10150
10151impl ::serde::ser::Serialize for ListFoldersContinueArg {
10152    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10153        // struct serializer
10154        use serde::ser::SerializeStruct;
10155        let mut s = serializer.serialize_struct("ListFoldersContinueArg", 1)?;
10156        self.internal_serialize::<S>(&mut s)?;
10157        s.end()
10158    }
10159}
10160
10161#[derive(Debug, Clone, PartialEq, Eq)]
10162#[non_exhaustive] // variants may be added in the future
10163pub enum ListFoldersContinueError {
10164    /// [`ListFoldersContinueArg::cursor`](ListFoldersContinueArg) is invalid.
10165    InvalidCursor,
10166    /// Catch-all used for unrecognized values returned from the server. Encountering this value
10167    /// typically indicates that this SDK version is out of date.
10168    Other,
10169}
10170
10171impl<'de> ::serde::de::Deserialize<'de> for ListFoldersContinueError {
10172    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10173        // union deserializer
10174        use serde::de::{self, MapAccess, Visitor};
10175        struct EnumVisitor;
10176        impl<'de> Visitor<'de> for EnumVisitor {
10177            type Value = ListFoldersContinueError;
10178            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10179                f.write_str("a ListFoldersContinueError structure")
10180            }
10181            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
10182                let tag: &str = match map.next_key()? {
10183                    Some(".tag") => map.next_value()?,
10184                    _ => return Err(de::Error::missing_field(".tag"))
10185                };
10186                let value = match tag {
10187                    "invalid_cursor" => ListFoldersContinueError::InvalidCursor,
10188                    _ => ListFoldersContinueError::Other,
10189                };
10190                crate::eat_json_fields(&mut map)?;
10191                Ok(value)
10192            }
10193        }
10194        const VARIANTS: &[&str] = &["invalid_cursor",
10195                                    "other"];
10196        deserializer.deserialize_struct("ListFoldersContinueError", VARIANTS, EnumVisitor)
10197    }
10198}
10199
10200impl ::serde::ser::Serialize for ListFoldersContinueError {
10201    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10202        // union serializer
10203        use serde::ser::SerializeStruct;
10204        match self {
10205            ListFoldersContinueError::InvalidCursor => {
10206                // unit
10207                let mut s = serializer.serialize_struct("ListFoldersContinueError", 1)?;
10208                s.serialize_field(".tag", "invalid_cursor")?;
10209                s.end()
10210            }
10211            ListFoldersContinueError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
10212        }
10213    }
10214}
10215
10216impl ::std::error::Error for ListFoldersContinueError {
10217}
10218
10219impl ::std::fmt::Display for ListFoldersContinueError {
10220    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10221        write!(f, "{:?}", *self)
10222    }
10223}
10224
10225/// Result for [`list_folders()`](crate::sharing::list_folders) or
10226/// [`list_mountable_folders()`](crate::sharing::list_mountable_folders), depending on which
10227/// endpoint was requested. Unmounted shared folders can be identified by the absence of
10228/// [`SharedFolderMetadata::path_lower`](SharedFolderMetadata).
10229#[derive(Debug, Clone, PartialEq, Eq)]
10230#[non_exhaustive] // structs may have more fields added in the future.
10231pub struct ListFoldersResult {
10232    /// List of all shared folders the authenticated user has access to.
10233    pub entries: Vec<SharedFolderMetadata>,
10234    /// Present if there are additional shared folders that have not been returned yet. Pass the
10235    /// cursor into the corresponding continue endpoint (either
10236    /// [`list_folders_continue()`](crate::sharing::list_folders_continue) or
10237    /// [`list_mountable_folders_continue()`](crate::sharing::list_mountable_folders_continue)) to
10238    /// list additional folders.
10239    pub cursor: Option<String>,
10240}
10241
10242impl ListFoldersResult {
10243    pub fn new(entries: Vec<SharedFolderMetadata>) -> Self {
10244        ListFoldersResult {
10245            entries,
10246            cursor: None,
10247        }
10248    }
10249
10250    pub fn with_cursor(mut self, value: String) -> Self {
10251        self.cursor = Some(value);
10252        self
10253    }
10254}
10255
10256const LIST_FOLDERS_RESULT_FIELDS: &[&str] = &["entries",
10257                                              "cursor"];
10258impl ListFoldersResult {
10259    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
10260        map: V,
10261    ) -> Result<ListFoldersResult, V::Error> {
10262        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
10263    }
10264
10265    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
10266        mut map: V,
10267        optional: bool,
10268    ) -> Result<Option<ListFoldersResult>, V::Error> {
10269        let mut field_entries = None;
10270        let mut field_cursor = None;
10271        let mut nothing = true;
10272        while let Some(key) = map.next_key::<&str>()? {
10273            nothing = false;
10274            match key {
10275                "entries" => {
10276                    if field_entries.is_some() {
10277                        return Err(::serde::de::Error::duplicate_field("entries"));
10278                    }
10279                    field_entries = Some(map.next_value()?);
10280                }
10281                "cursor" => {
10282                    if field_cursor.is_some() {
10283                        return Err(::serde::de::Error::duplicate_field("cursor"));
10284                    }
10285                    field_cursor = Some(map.next_value()?);
10286                }
10287                _ => {
10288                    // unknown field allowed and ignored
10289                    map.next_value::<::serde_json::Value>()?;
10290                }
10291            }
10292        }
10293        if optional && nothing {
10294            return Ok(None);
10295        }
10296        let result = ListFoldersResult {
10297            entries: field_entries.ok_or_else(|| ::serde::de::Error::missing_field("entries"))?,
10298            cursor: field_cursor.and_then(Option::flatten),
10299        };
10300        Ok(Some(result))
10301    }
10302
10303    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
10304        &self,
10305        s: &mut S::SerializeStruct,
10306    ) -> Result<(), S::Error> {
10307        use serde::ser::SerializeStruct;
10308        s.serialize_field("entries", &self.entries)?;
10309        if let Some(val) = &self.cursor {
10310            s.serialize_field("cursor", val)?;
10311        }
10312        Ok(())
10313    }
10314}
10315
10316impl<'de> ::serde::de::Deserialize<'de> for ListFoldersResult {
10317    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10318        // struct deserializer
10319        use serde::de::{MapAccess, Visitor};
10320        struct StructVisitor;
10321        impl<'de> Visitor<'de> for StructVisitor {
10322            type Value = ListFoldersResult;
10323            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10324                f.write_str("a ListFoldersResult struct")
10325            }
10326            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
10327                ListFoldersResult::internal_deserialize(map)
10328            }
10329        }
10330        deserializer.deserialize_struct("ListFoldersResult", LIST_FOLDERS_RESULT_FIELDS, StructVisitor)
10331    }
10332}
10333
10334impl ::serde::ser::Serialize for ListFoldersResult {
10335    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10336        // struct serializer
10337        use serde::ser::SerializeStruct;
10338        let mut s = serializer.serialize_struct("ListFoldersResult", 2)?;
10339        self.internal_serialize::<S>(&mut s)?;
10340        s.end()
10341    }
10342}
10343
10344#[derive(Debug, Clone, PartialEq, Eq, Default)]
10345#[non_exhaustive] // structs may have more fields added in the future.
10346pub struct ListSharedLinksArg {
10347    /// See [`list_shared_links()`](crate::sharing::list_shared_links) description.
10348    pub path: Option<ReadPath>,
10349    /// The cursor returned by your last call to
10350    /// [`list_shared_links()`](crate::sharing::list_shared_links).
10351    pub cursor: Option<String>,
10352    /// See [`list_shared_links()`](crate::sharing::list_shared_links) description.
10353    pub direct_only: Option<bool>,
10354}
10355
10356impl ListSharedLinksArg {
10357    pub fn with_path(mut self, value: ReadPath) -> Self {
10358        self.path = Some(value);
10359        self
10360    }
10361
10362    pub fn with_cursor(mut self, value: String) -> Self {
10363        self.cursor = Some(value);
10364        self
10365    }
10366
10367    pub fn with_direct_only(mut self, value: bool) -> Self {
10368        self.direct_only = Some(value);
10369        self
10370    }
10371}
10372
10373const LIST_SHARED_LINKS_ARG_FIELDS: &[&str] = &["path",
10374                                                "cursor",
10375                                                "direct_only"];
10376impl ListSharedLinksArg {
10377    // no _opt deserializer
10378    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
10379        mut map: V,
10380    ) -> Result<ListSharedLinksArg, V::Error> {
10381        let mut field_path = None;
10382        let mut field_cursor = None;
10383        let mut field_direct_only = None;
10384        while let Some(key) = map.next_key::<&str>()? {
10385            match key {
10386                "path" => {
10387                    if field_path.is_some() {
10388                        return Err(::serde::de::Error::duplicate_field("path"));
10389                    }
10390                    field_path = Some(map.next_value()?);
10391                }
10392                "cursor" => {
10393                    if field_cursor.is_some() {
10394                        return Err(::serde::de::Error::duplicate_field("cursor"));
10395                    }
10396                    field_cursor = Some(map.next_value()?);
10397                }
10398                "direct_only" => {
10399                    if field_direct_only.is_some() {
10400                        return Err(::serde::de::Error::duplicate_field("direct_only"));
10401                    }
10402                    field_direct_only = Some(map.next_value()?);
10403                }
10404                _ => {
10405                    // unknown field allowed and ignored
10406                    map.next_value::<::serde_json::Value>()?;
10407                }
10408            }
10409        }
10410        let result = ListSharedLinksArg {
10411            path: field_path.and_then(Option::flatten),
10412            cursor: field_cursor.and_then(Option::flatten),
10413            direct_only: field_direct_only.and_then(Option::flatten),
10414        };
10415        Ok(result)
10416    }
10417
10418    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
10419        &self,
10420        s: &mut S::SerializeStruct,
10421    ) -> Result<(), S::Error> {
10422        use serde::ser::SerializeStruct;
10423        if let Some(val) = &self.path {
10424            s.serialize_field("path", val)?;
10425        }
10426        if let Some(val) = &self.cursor {
10427            s.serialize_field("cursor", val)?;
10428        }
10429        if let Some(val) = &self.direct_only {
10430            s.serialize_field("direct_only", val)?;
10431        }
10432        Ok(())
10433    }
10434}
10435
10436impl<'de> ::serde::de::Deserialize<'de> for ListSharedLinksArg {
10437    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10438        // struct deserializer
10439        use serde::de::{MapAccess, Visitor};
10440        struct StructVisitor;
10441        impl<'de> Visitor<'de> for StructVisitor {
10442            type Value = ListSharedLinksArg;
10443            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10444                f.write_str("a ListSharedLinksArg struct")
10445            }
10446            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
10447                ListSharedLinksArg::internal_deserialize(map)
10448            }
10449        }
10450        deserializer.deserialize_struct("ListSharedLinksArg", LIST_SHARED_LINKS_ARG_FIELDS, StructVisitor)
10451    }
10452}
10453
10454impl ::serde::ser::Serialize for ListSharedLinksArg {
10455    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10456        // struct serializer
10457        use serde::ser::SerializeStruct;
10458        let mut s = serializer.serialize_struct("ListSharedLinksArg", 3)?;
10459        self.internal_serialize::<S>(&mut s)?;
10460        s.end()
10461    }
10462}
10463
10464#[derive(Debug, Clone, PartialEq, Eq)]
10465#[non_exhaustive] // variants may be added in the future
10466pub enum ListSharedLinksError {
10467    Path(crate::types::files::LookupError),
10468    /// Indicates that the cursor has been invalidated. Call
10469    /// [`list_shared_links()`](crate::sharing::list_shared_links) to obtain a new cursor.
10470    Reset,
10471    /// Catch-all used for unrecognized values returned from the server. Encountering this value
10472    /// typically indicates that this SDK version is out of date.
10473    Other,
10474}
10475
10476impl<'de> ::serde::de::Deserialize<'de> for ListSharedLinksError {
10477    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10478        // union deserializer
10479        use serde::de::{self, MapAccess, Visitor};
10480        struct EnumVisitor;
10481        impl<'de> Visitor<'de> for EnumVisitor {
10482            type Value = ListSharedLinksError;
10483            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10484                f.write_str("a ListSharedLinksError structure")
10485            }
10486            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
10487                let tag: &str = match map.next_key()? {
10488                    Some(".tag") => map.next_value()?,
10489                    _ => return Err(de::Error::missing_field(".tag"))
10490                };
10491                let value = match tag {
10492                    "path" => {
10493                        match map.next_key()? {
10494                            Some("path") => ListSharedLinksError::Path(map.next_value()?),
10495                            None => return Err(de::Error::missing_field("path")),
10496                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
10497                        }
10498                    }
10499                    "reset" => ListSharedLinksError::Reset,
10500                    _ => ListSharedLinksError::Other,
10501                };
10502                crate::eat_json_fields(&mut map)?;
10503                Ok(value)
10504            }
10505        }
10506        const VARIANTS: &[&str] = &["path",
10507                                    "reset",
10508                                    "other"];
10509        deserializer.deserialize_struct("ListSharedLinksError", VARIANTS, EnumVisitor)
10510    }
10511}
10512
10513impl ::serde::ser::Serialize for ListSharedLinksError {
10514    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10515        // union serializer
10516        use serde::ser::SerializeStruct;
10517        match self {
10518            ListSharedLinksError::Path(x) => {
10519                // union or polymporphic struct
10520                let mut s = serializer.serialize_struct("ListSharedLinksError", 2)?;
10521                s.serialize_field(".tag", "path")?;
10522                s.serialize_field("path", x)?;
10523                s.end()
10524            }
10525            ListSharedLinksError::Reset => {
10526                // unit
10527                let mut s = serializer.serialize_struct("ListSharedLinksError", 1)?;
10528                s.serialize_field(".tag", "reset")?;
10529                s.end()
10530            }
10531            ListSharedLinksError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
10532        }
10533    }
10534}
10535
10536impl ::std::error::Error for ListSharedLinksError {
10537    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
10538        match self {
10539            ListSharedLinksError::Path(inner) => Some(inner),
10540            _ => None,
10541        }
10542    }
10543}
10544
10545impl ::std::fmt::Display for ListSharedLinksError {
10546    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10547        match self {
10548            ListSharedLinksError::Path(inner) => write!(f, "ListSharedLinksError: {}", inner),
10549            _ => write!(f, "{:?}", *self),
10550        }
10551    }
10552}
10553
10554#[derive(Debug, Clone, PartialEq, Eq)]
10555#[non_exhaustive] // structs may have more fields added in the future.
10556pub struct ListSharedLinksResult {
10557    /// Shared links applicable to the path argument.
10558    pub links: Vec<SharedLinkMetadata>,
10559    /// Is true if there are additional shared links that have not been returned yet. Pass the
10560    /// cursor into [`list_shared_links()`](crate::sharing::list_shared_links) to retrieve them.
10561    pub has_more: bool,
10562    /// Pass the cursor into [`list_shared_links()`](crate::sharing::list_shared_links) to obtain
10563    /// the additional links. Cursor is returned only if no path is given.
10564    pub cursor: Option<String>,
10565}
10566
10567impl ListSharedLinksResult {
10568    pub fn new(links: Vec<SharedLinkMetadata>, has_more: bool) -> Self {
10569        ListSharedLinksResult {
10570            links,
10571            has_more,
10572            cursor: None,
10573        }
10574    }
10575
10576    pub fn with_cursor(mut self, value: String) -> Self {
10577        self.cursor = Some(value);
10578        self
10579    }
10580}
10581
10582const LIST_SHARED_LINKS_RESULT_FIELDS: &[&str] = &["links",
10583                                                   "has_more",
10584                                                   "cursor"];
10585impl ListSharedLinksResult {
10586    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
10587        map: V,
10588    ) -> Result<ListSharedLinksResult, V::Error> {
10589        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
10590    }
10591
10592    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
10593        mut map: V,
10594        optional: bool,
10595    ) -> Result<Option<ListSharedLinksResult>, V::Error> {
10596        let mut field_links = None;
10597        let mut field_has_more = None;
10598        let mut field_cursor = None;
10599        let mut nothing = true;
10600        while let Some(key) = map.next_key::<&str>()? {
10601            nothing = false;
10602            match key {
10603                "links" => {
10604                    if field_links.is_some() {
10605                        return Err(::serde::de::Error::duplicate_field("links"));
10606                    }
10607                    field_links = Some(map.next_value()?);
10608                }
10609                "has_more" => {
10610                    if field_has_more.is_some() {
10611                        return Err(::serde::de::Error::duplicate_field("has_more"));
10612                    }
10613                    field_has_more = Some(map.next_value()?);
10614                }
10615                "cursor" => {
10616                    if field_cursor.is_some() {
10617                        return Err(::serde::de::Error::duplicate_field("cursor"));
10618                    }
10619                    field_cursor = Some(map.next_value()?);
10620                }
10621                _ => {
10622                    // unknown field allowed and ignored
10623                    map.next_value::<::serde_json::Value>()?;
10624                }
10625            }
10626        }
10627        if optional && nothing {
10628            return Ok(None);
10629        }
10630        let result = ListSharedLinksResult {
10631            links: field_links.ok_or_else(|| ::serde::de::Error::missing_field("links"))?,
10632            has_more: field_has_more.ok_or_else(|| ::serde::de::Error::missing_field("has_more"))?,
10633            cursor: field_cursor.and_then(Option::flatten),
10634        };
10635        Ok(Some(result))
10636    }
10637
10638    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
10639        &self,
10640        s: &mut S::SerializeStruct,
10641    ) -> Result<(), S::Error> {
10642        use serde::ser::SerializeStruct;
10643        s.serialize_field("links", &self.links)?;
10644        s.serialize_field("has_more", &self.has_more)?;
10645        if let Some(val) = &self.cursor {
10646            s.serialize_field("cursor", val)?;
10647        }
10648        Ok(())
10649    }
10650}
10651
10652impl<'de> ::serde::de::Deserialize<'de> for ListSharedLinksResult {
10653    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10654        // struct deserializer
10655        use serde::de::{MapAccess, Visitor};
10656        struct StructVisitor;
10657        impl<'de> Visitor<'de> for StructVisitor {
10658            type Value = ListSharedLinksResult;
10659            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10660                f.write_str("a ListSharedLinksResult struct")
10661            }
10662            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
10663                ListSharedLinksResult::internal_deserialize(map)
10664            }
10665        }
10666        deserializer.deserialize_struct("ListSharedLinksResult", LIST_SHARED_LINKS_RESULT_FIELDS, StructVisitor)
10667    }
10668}
10669
10670impl ::serde::ser::Serialize for ListSharedLinksResult {
10671    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10672        // struct serializer
10673        use serde::ser::SerializeStruct;
10674        let mut s = serializer.serialize_struct("ListSharedLinksResult", 3)?;
10675        self.internal_serialize::<S>(&mut s)?;
10676        s.end()
10677    }
10678}
10679
10680/// Contains information about a member's access level to content after an operation.
10681#[derive(Debug, Clone, PartialEq, Eq, Default)]
10682#[non_exhaustive] // structs may have more fields added in the future.
10683pub struct MemberAccessLevelResult {
10684    /// The member still has this level of access to the content through a parent folder.
10685    pub access_level: Option<AccessLevel>,
10686    /// A localized string with additional information about why the user has this access level to
10687    /// the content.
10688    pub warning: Option<String>,
10689    /// The parent folders that a member has access to. The field is present if the user has access
10690    /// to the first parent folder where the member gains access.
10691    pub access_details: Option<Vec<ParentFolderAccessInfo>>,
10692}
10693
10694impl MemberAccessLevelResult {
10695    pub fn with_access_level(mut self, value: AccessLevel) -> Self {
10696        self.access_level = Some(value);
10697        self
10698    }
10699
10700    pub fn with_warning(mut self, value: String) -> Self {
10701        self.warning = Some(value);
10702        self
10703    }
10704
10705    pub fn with_access_details(mut self, value: Vec<ParentFolderAccessInfo>) -> Self {
10706        self.access_details = Some(value);
10707        self
10708    }
10709}
10710
10711const MEMBER_ACCESS_LEVEL_RESULT_FIELDS: &[&str] = &["access_level",
10712                                                     "warning",
10713                                                     "access_details"];
10714impl MemberAccessLevelResult {
10715    // no _opt deserializer
10716    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
10717        mut map: V,
10718    ) -> Result<MemberAccessLevelResult, V::Error> {
10719        let mut field_access_level = None;
10720        let mut field_warning = None;
10721        let mut field_access_details = None;
10722        while let Some(key) = map.next_key::<&str>()? {
10723            match key {
10724                "access_level" => {
10725                    if field_access_level.is_some() {
10726                        return Err(::serde::de::Error::duplicate_field("access_level"));
10727                    }
10728                    field_access_level = Some(map.next_value()?);
10729                }
10730                "warning" => {
10731                    if field_warning.is_some() {
10732                        return Err(::serde::de::Error::duplicate_field("warning"));
10733                    }
10734                    field_warning = Some(map.next_value()?);
10735                }
10736                "access_details" => {
10737                    if field_access_details.is_some() {
10738                        return Err(::serde::de::Error::duplicate_field("access_details"));
10739                    }
10740                    field_access_details = Some(map.next_value()?);
10741                }
10742                _ => {
10743                    // unknown field allowed and ignored
10744                    map.next_value::<::serde_json::Value>()?;
10745                }
10746            }
10747        }
10748        let result = MemberAccessLevelResult {
10749            access_level: field_access_level.and_then(Option::flatten),
10750            warning: field_warning.and_then(Option::flatten),
10751            access_details: field_access_details.and_then(Option::flatten),
10752        };
10753        Ok(result)
10754    }
10755
10756    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
10757        &self,
10758        s: &mut S::SerializeStruct,
10759    ) -> Result<(), S::Error> {
10760        use serde::ser::SerializeStruct;
10761        if let Some(val) = &self.access_level {
10762            s.serialize_field("access_level", val)?;
10763        }
10764        if let Some(val) = &self.warning {
10765            s.serialize_field("warning", val)?;
10766        }
10767        if let Some(val) = &self.access_details {
10768            s.serialize_field("access_details", val)?;
10769        }
10770        Ok(())
10771    }
10772}
10773
10774impl<'de> ::serde::de::Deserialize<'de> for MemberAccessLevelResult {
10775    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10776        // struct deserializer
10777        use serde::de::{MapAccess, Visitor};
10778        struct StructVisitor;
10779        impl<'de> Visitor<'de> for StructVisitor {
10780            type Value = MemberAccessLevelResult;
10781            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10782                f.write_str("a MemberAccessLevelResult struct")
10783            }
10784            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
10785                MemberAccessLevelResult::internal_deserialize(map)
10786            }
10787        }
10788        deserializer.deserialize_struct("MemberAccessLevelResult", MEMBER_ACCESS_LEVEL_RESULT_FIELDS, StructVisitor)
10789    }
10790}
10791
10792impl ::serde::ser::Serialize for MemberAccessLevelResult {
10793    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10794        // struct serializer
10795        use serde::ser::SerializeStruct;
10796        let mut s = serializer.serialize_struct("MemberAccessLevelResult", 3)?;
10797        self.internal_serialize::<S>(&mut s)?;
10798        s.end()
10799    }
10800}
10801
10802/// Actions that may be taken on members of a shared folder.
10803#[derive(Debug, Clone, PartialEq, Eq)]
10804#[non_exhaustive] // variants may be added in the future
10805pub enum MemberAction {
10806    /// Allow the member to keep a copy of the folder when removing.
10807    LeaveACopy,
10808    /// Make the member an editor of the folder.
10809    MakeEditor,
10810    /// Make the member an owner of the folder.
10811    MakeOwner,
10812    /// Make the member a viewer of the folder.
10813    MakeViewer,
10814    /// Make the member a viewer of the folder without commenting permissions.
10815    MakeViewerNoComment,
10816    /// Remove the member from the folder.
10817    Remove,
10818    /// Catch-all used for unrecognized values returned from the server. Encountering this value
10819    /// typically indicates that this SDK version is out of date.
10820    Other,
10821}
10822
10823impl<'de> ::serde::de::Deserialize<'de> for MemberAction {
10824    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10825        // union deserializer
10826        use serde::de::{self, MapAccess, Visitor};
10827        struct EnumVisitor;
10828        impl<'de> Visitor<'de> for EnumVisitor {
10829            type Value = MemberAction;
10830            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10831                f.write_str("a MemberAction structure")
10832            }
10833            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
10834                let tag: &str = match map.next_key()? {
10835                    Some(".tag") => map.next_value()?,
10836                    _ => return Err(de::Error::missing_field(".tag"))
10837                };
10838                let value = match tag {
10839                    "leave_a_copy" => MemberAction::LeaveACopy,
10840                    "make_editor" => MemberAction::MakeEditor,
10841                    "make_owner" => MemberAction::MakeOwner,
10842                    "make_viewer" => MemberAction::MakeViewer,
10843                    "make_viewer_no_comment" => MemberAction::MakeViewerNoComment,
10844                    "remove" => MemberAction::Remove,
10845                    _ => MemberAction::Other,
10846                };
10847                crate::eat_json_fields(&mut map)?;
10848                Ok(value)
10849            }
10850        }
10851        const VARIANTS: &[&str] = &["leave_a_copy",
10852                                    "make_editor",
10853                                    "make_owner",
10854                                    "make_viewer",
10855                                    "make_viewer_no_comment",
10856                                    "remove",
10857                                    "other"];
10858        deserializer.deserialize_struct("MemberAction", VARIANTS, EnumVisitor)
10859    }
10860}
10861
10862impl ::serde::ser::Serialize for MemberAction {
10863    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10864        // union serializer
10865        use serde::ser::SerializeStruct;
10866        match self {
10867            MemberAction::LeaveACopy => {
10868                // unit
10869                let mut s = serializer.serialize_struct("MemberAction", 1)?;
10870                s.serialize_field(".tag", "leave_a_copy")?;
10871                s.end()
10872            }
10873            MemberAction::MakeEditor => {
10874                // unit
10875                let mut s = serializer.serialize_struct("MemberAction", 1)?;
10876                s.serialize_field(".tag", "make_editor")?;
10877                s.end()
10878            }
10879            MemberAction::MakeOwner => {
10880                // unit
10881                let mut s = serializer.serialize_struct("MemberAction", 1)?;
10882                s.serialize_field(".tag", "make_owner")?;
10883                s.end()
10884            }
10885            MemberAction::MakeViewer => {
10886                // unit
10887                let mut s = serializer.serialize_struct("MemberAction", 1)?;
10888                s.serialize_field(".tag", "make_viewer")?;
10889                s.end()
10890            }
10891            MemberAction::MakeViewerNoComment => {
10892                // unit
10893                let mut s = serializer.serialize_struct("MemberAction", 1)?;
10894                s.serialize_field(".tag", "make_viewer_no_comment")?;
10895                s.end()
10896            }
10897            MemberAction::Remove => {
10898                // unit
10899                let mut s = serializer.serialize_struct("MemberAction", 1)?;
10900                s.serialize_field(".tag", "remove")?;
10901                s.end()
10902            }
10903            MemberAction::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
10904        }
10905    }
10906}
10907
10908/// Whether the user is allowed to take the action on the associated member.
10909#[derive(Debug, Clone, PartialEq, Eq)]
10910#[non_exhaustive] // structs may have more fields added in the future.
10911pub struct MemberPermission {
10912    /// The action that the user may wish to take on the member.
10913    pub action: MemberAction,
10914    /// True if the user is allowed to take the action.
10915    pub allow: bool,
10916    /// The reason why the user is denied the permission. Not present if the action is allowed.
10917    pub reason: Option<PermissionDeniedReason>,
10918}
10919
10920impl MemberPermission {
10921    pub fn new(action: MemberAction, allow: bool) -> Self {
10922        MemberPermission {
10923            action,
10924            allow,
10925            reason: None,
10926        }
10927    }
10928
10929    pub fn with_reason(mut self, value: PermissionDeniedReason) -> Self {
10930        self.reason = Some(value);
10931        self
10932    }
10933}
10934
10935const MEMBER_PERMISSION_FIELDS: &[&str] = &["action",
10936                                            "allow",
10937                                            "reason"];
10938impl MemberPermission {
10939    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
10940        map: V,
10941    ) -> Result<MemberPermission, V::Error> {
10942        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
10943    }
10944
10945    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
10946        mut map: V,
10947        optional: bool,
10948    ) -> Result<Option<MemberPermission>, V::Error> {
10949        let mut field_action = None;
10950        let mut field_allow = None;
10951        let mut field_reason = None;
10952        let mut nothing = true;
10953        while let Some(key) = map.next_key::<&str>()? {
10954            nothing = false;
10955            match key {
10956                "action" => {
10957                    if field_action.is_some() {
10958                        return Err(::serde::de::Error::duplicate_field("action"));
10959                    }
10960                    field_action = Some(map.next_value()?);
10961                }
10962                "allow" => {
10963                    if field_allow.is_some() {
10964                        return Err(::serde::de::Error::duplicate_field("allow"));
10965                    }
10966                    field_allow = Some(map.next_value()?);
10967                }
10968                "reason" => {
10969                    if field_reason.is_some() {
10970                        return Err(::serde::de::Error::duplicate_field("reason"));
10971                    }
10972                    field_reason = Some(map.next_value()?);
10973                }
10974                _ => {
10975                    // unknown field allowed and ignored
10976                    map.next_value::<::serde_json::Value>()?;
10977                }
10978            }
10979        }
10980        if optional && nothing {
10981            return Ok(None);
10982        }
10983        let result = MemberPermission {
10984            action: field_action.ok_or_else(|| ::serde::de::Error::missing_field("action"))?,
10985            allow: field_allow.ok_or_else(|| ::serde::de::Error::missing_field("allow"))?,
10986            reason: field_reason.and_then(Option::flatten),
10987        };
10988        Ok(Some(result))
10989    }
10990
10991    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
10992        &self,
10993        s: &mut S::SerializeStruct,
10994    ) -> Result<(), S::Error> {
10995        use serde::ser::SerializeStruct;
10996        s.serialize_field("action", &self.action)?;
10997        s.serialize_field("allow", &self.allow)?;
10998        if let Some(val) = &self.reason {
10999            s.serialize_field("reason", val)?;
11000        }
11001        Ok(())
11002    }
11003}
11004
11005impl<'de> ::serde::de::Deserialize<'de> for MemberPermission {
11006    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
11007        // struct deserializer
11008        use serde::de::{MapAccess, Visitor};
11009        struct StructVisitor;
11010        impl<'de> Visitor<'de> for StructVisitor {
11011            type Value = MemberPermission;
11012            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11013                f.write_str("a MemberPermission struct")
11014            }
11015            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
11016                MemberPermission::internal_deserialize(map)
11017            }
11018        }
11019        deserializer.deserialize_struct("MemberPermission", MEMBER_PERMISSION_FIELDS, StructVisitor)
11020    }
11021}
11022
11023impl ::serde::ser::Serialize for MemberPermission {
11024    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
11025        // struct serializer
11026        use serde::ser::SerializeStruct;
11027        let mut s = serializer.serialize_struct("MemberPermission", 3)?;
11028        self.internal_serialize::<S>(&mut s)?;
11029        s.end()
11030    }
11031}
11032
11033/// Policy governing who can be a member of a shared folder. Only applicable to folders owned by a
11034/// user on a team.
11035#[derive(Debug, Clone, PartialEq, Eq)]
11036#[non_exhaustive] // variants may be added in the future
11037pub enum MemberPolicy {
11038    /// Only a teammate can become a member.
11039    Team,
11040    /// Anyone can become a member.
11041    Anyone,
11042    /// Only a teammate and approved people can become a member.
11043    TeamAndApproved,
11044    /// Catch-all used for unrecognized values returned from the server. Encountering this value
11045    /// typically indicates that this SDK version is out of date.
11046    Other,
11047}
11048
11049impl<'de> ::serde::de::Deserialize<'de> for MemberPolicy {
11050    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
11051        // union deserializer
11052        use serde::de::{self, MapAccess, Visitor};
11053        struct EnumVisitor;
11054        impl<'de> Visitor<'de> for EnumVisitor {
11055            type Value = MemberPolicy;
11056            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11057                f.write_str("a MemberPolicy structure")
11058            }
11059            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
11060                let tag: &str = match map.next_key()? {
11061                    Some(".tag") => map.next_value()?,
11062                    _ => return Err(de::Error::missing_field(".tag"))
11063                };
11064                let value = match tag {
11065                    "team" => MemberPolicy::Team,
11066                    "anyone" => MemberPolicy::Anyone,
11067                    "team_and_approved" => MemberPolicy::TeamAndApproved,
11068                    _ => MemberPolicy::Other,
11069                };
11070                crate::eat_json_fields(&mut map)?;
11071                Ok(value)
11072            }
11073        }
11074        const VARIANTS: &[&str] = &["team",
11075                                    "anyone",
11076                                    "team_and_approved",
11077                                    "other"];
11078        deserializer.deserialize_struct("MemberPolicy", VARIANTS, EnumVisitor)
11079    }
11080}
11081
11082impl ::serde::ser::Serialize for MemberPolicy {
11083    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
11084        // union serializer
11085        use serde::ser::SerializeStruct;
11086        match self {
11087            MemberPolicy::Team => {
11088                // unit
11089                let mut s = serializer.serialize_struct("MemberPolicy", 1)?;
11090                s.serialize_field(".tag", "team")?;
11091                s.end()
11092            }
11093            MemberPolicy::Anyone => {
11094                // unit
11095                let mut s = serializer.serialize_struct("MemberPolicy", 1)?;
11096                s.serialize_field(".tag", "anyone")?;
11097                s.end()
11098            }
11099            MemberPolicy::TeamAndApproved => {
11100                // unit
11101                let mut s = serializer.serialize_struct("MemberPolicy", 1)?;
11102                s.serialize_field(".tag", "team_and_approved")?;
11103                s.end()
11104            }
11105            MemberPolicy::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
11106        }
11107    }
11108}
11109
11110/// Includes different ways to identify a member of a shared folder.
11111#[derive(Debug, Clone, PartialEq, Eq)]
11112#[non_exhaustive] // variants may be added in the future
11113pub enum MemberSelector {
11114    /// Dropbox account, team member, or group ID of member.
11115    DropboxId(DropboxId),
11116    /// Email address of member.
11117    Email(crate::types::common::EmailAddress),
11118    /// Catch-all used for unrecognized values returned from the server. Encountering this value
11119    /// typically indicates that this SDK version is out of date.
11120    Other,
11121}
11122
11123impl<'de> ::serde::de::Deserialize<'de> for MemberSelector {
11124    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
11125        // union deserializer
11126        use serde::de::{self, MapAccess, Visitor};
11127        struct EnumVisitor;
11128        impl<'de> Visitor<'de> for EnumVisitor {
11129            type Value = MemberSelector;
11130            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11131                f.write_str("a MemberSelector structure")
11132            }
11133            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
11134                let tag: &str = match map.next_key()? {
11135                    Some(".tag") => map.next_value()?,
11136                    _ => return Err(de::Error::missing_field(".tag"))
11137                };
11138                let value = match tag {
11139                    "dropbox_id" => {
11140                        match map.next_key()? {
11141                            Some("dropbox_id") => MemberSelector::DropboxId(map.next_value()?),
11142                            None => return Err(de::Error::missing_field("dropbox_id")),
11143                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
11144                        }
11145                    }
11146                    "email" => {
11147                        match map.next_key()? {
11148                            Some("email") => MemberSelector::Email(map.next_value()?),
11149                            None => return Err(de::Error::missing_field("email")),
11150                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
11151                        }
11152                    }
11153                    _ => MemberSelector::Other,
11154                };
11155                crate::eat_json_fields(&mut map)?;
11156                Ok(value)
11157            }
11158        }
11159        const VARIANTS: &[&str] = &["dropbox_id",
11160                                    "email",
11161                                    "other"];
11162        deserializer.deserialize_struct("MemberSelector", VARIANTS, EnumVisitor)
11163    }
11164}
11165
11166impl ::serde::ser::Serialize for MemberSelector {
11167    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
11168        // union serializer
11169        use serde::ser::SerializeStruct;
11170        match self {
11171            MemberSelector::DropboxId(x) => {
11172                // primitive
11173                let mut s = serializer.serialize_struct("MemberSelector", 2)?;
11174                s.serialize_field(".tag", "dropbox_id")?;
11175                s.serialize_field("dropbox_id", x)?;
11176                s.end()
11177            }
11178            MemberSelector::Email(x) => {
11179                // primitive
11180                let mut s = serializer.serialize_struct("MemberSelector", 2)?;
11181                s.serialize_field(".tag", "email")?;
11182                s.serialize_field("email", x)?;
11183                s.end()
11184            }
11185            MemberSelector::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
11186        }
11187    }
11188}
11189
11190/// The information about a member of the shared content.
11191#[derive(Debug, Clone, PartialEq, Eq)]
11192#[non_exhaustive] // structs may have more fields added in the future.
11193pub struct MembershipInfo {
11194    /// The access type for this member. It contains inherited access type from parent folder, and
11195    /// acquired access type from this folder.
11196    pub access_type: AccessLevel,
11197    /// The permissions that requesting user has on this member. The set of permissions corresponds
11198    /// to the MemberActions in the request.
11199    pub permissions: Option<Vec<MemberPermission>>,
11200    /// Field is deprecated. Never set.
11201    #[deprecated]
11202    pub initials: Option<String>,
11203    /// True if the member has access on a parent folder.
11204    pub is_inherited: bool,
11205}
11206
11207impl MembershipInfo {
11208    pub fn new(access_type: AccessLevel) -> Self {
11209        MembershipInfo {
11210            access_type,
11211            permissions: None,
11212            #[allow(deprecated)] initials: None,
11213            is_inherited: false,
11214        }
11215    }
11216
11217    pub fn with_permissions(mut self, value: Vec<MemberPermission>) -> Self {
11218        self.permissions = Some(value);
11219        self
11220    }
11221
11222    #[deprecated]
11223    #[allow(deprecated)]
11224    pub fn with_initials(mut self, value: String) -> Self {
11225        self.initials = Some(value);
11226        self
11227    }
11228
11229    pub fn with_is_inherited(mut self, value: bool) -> Self {
11230        self.is_inherited = value;
11231        self
11232    }
11233}
11234
11235const MEMBERSHIP_INFO_FIELDS: &[&str] = &["access_type",
11236                                          "permissions",
11237                                          "initials",
11238                                          "is_inherited"];
11239impl MembershipInfo {
11240    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
11241        map: V,
11242    ) -> Result<MembershipInfo, V::Error> {
11243        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
11244    }
11245
11246    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
11247        mut map: V,
11248        optional: bool,
11249    ) -> Result<Option<MembershipInfo>, V::Error> {
11250        let mut field_access_type = None;
11251        let mut field_permissions = None;
11252        let mut field_initials = None;
11253        let mut field_is_inherited = None;
11254        let mut nothing = true;
11255        while let Some(key) = map.next_key::<&str>()? {
11256            nothing = false;
11257            match key {
11258                "access_type" => {
11259                    if field_access_type.is_some() {
11260                        return Err(::serde::de::Error::duplicate_field("access_type"));
11261                    }
11262                    field_access_type = Some(map.next_value()?);
11263                }
11264                "permissions" => {
11265                    if field_permissions.is_some() {
11266                        return Err(::serde::de::Error::duplicate_field("permissions"));
11267                    }
11268                    field_permissions = Some(map.next_value()?);
11269                }
11270                "initials" => {
11271                    if field_initials.is_some() {
11272                        return Err(::serde::de::Error::duplicate_field("initials"));
11273                    }
11274                    field_initials = Some(map.next_value()?);
11275                }
11276                "is_inherited" => {
11277                    if field_is_inherited.is_some() {
11278                        return Err(::serde::de::Error::duplicate_field("is_inherited"));
11279                    }
11280                    field_is_inherited = Some(map.next_value()?);
11281                }
11282                _ => {
11283                    // unknown field allowed and ignored
11284                    map.next_value::<::serde_json::Value>()?;
11285                }
11286            }
11287        }
11288        if optional && nothing {
11289            return Ok(None);
11290        }
11291        let result = MembershipInfo {
11292            access_type: field_access_type.ok_or_else(|| ::serde::de::Error::missing_field("access_type"))?,
11293            permissions: field_permissions.and_then(Option::flatten),
11294            #[allow(deprecated)] initials: field_initials.and_then(Option::flatten),
11295            is_inherited: field_is_inherited.unwrap_or(false),
11296        };
11297        Ok(Some(result))
11298    }
11299
11300    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
11301        &self,
11302        s: &mut S::SerializeStruct,
11303    ) -> Result<(), S::Error> {
11304        use serde::ser::SerializeStruct;
11305        s.serialize_field("access_type", &self.access_type)?;
11306        if let Some(val) = &self.permissions {
11307            s.serialize_field("permissions", val)?;
11308        }
11309        #[allow(deprecated)]
11310        if let Some(val) = &self.initials {
11311            s.serialize_field("initials", val)?;
11312        }
11313        if self.is_inherited {
11314            s.serialize_field("is_inherited", &self.is_inherited)?;
11315        }
11316        Ok(())
11317    }
11318}
11319
11320impl<'de> ::serde::de::Deserialize<'de> for MembershipInfo {
11321    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
11322        // struct deserializer
11323        use serde::de::{MapAccess, Visitor};
11324        struct StructVisitor;
11325        impl<'de> Visitor<'de> for StructVisitor {
11326            type Value = MembershipInfo;
11327            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11328                f.write_str("a MembershipInfo struct")
11329            }
11330            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
11331                MembershipInfo::internal_deserialize(map)
11332            }
11333        }
11334        deserializer.deserialize_struct("MembershipInfo", MEMBERSHIP_INFO_FIELDS, StructVisitor)
11335    }
11336}
11337
11338impl ::serde::ser::Serialize for MembershipInfo {
11339    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
11340        // struct serializer
11341        use serde::ser::SerializeStruct;
11342        let mut s = serializer.serialize_struct("MembershipInfo", 4)?;
11343        self.internal_serialize::<S>(&mut s)?;
11344        s.end()
11345    }
11346}
11347
11348#[derive(Debug, Clone, PartialEq, Eq)]
11349#[non_exhaustive] // structs may have more fields added in the future.
11350pub struct ModifySharedLinkSettingsArgs {
11351    /// URL of the shared link to change its settings.
11352    pub url: String,
11353    /// Set of settings for the shared link.
11354    pub settings: SharedLinkSettings,
11355    /// If set to true, removes the expiration of the shared link.
11356    pub remove_expiration: bool,
11357}
11358
11359impl ModifySharedLinkSettingsArgs {
11360    pub fn new(url: String, settings: SharedLinkSettings) -> Self {
11361        ModifySharedLinkSettingsArgs {
11362            url,
11363            settings,
11364            remove_expiration: false,
11365        }
11366    }
11367
11368    pub fn with_remove_expiration(mut self, value: bool) -> Self {
11369        self.remove_expiration = value;
11370        self
11371    }
11372}
11373
11374const MODIFY_SHARED_LINK_SETTINGS_ARGS_FIELDS: &[&str] = &["url",
11375                                                           "settings",
11376                                                           "remove_expiration"];
11377impl ModifySharedLinkSettingsArgs {
11378    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
11379        map: V,
11380    ) -> Result<ModifySharedLinkSettingsArgs, V::Error> {
11381        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
11382    }
11383
11384    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
11385        mut map: V,
11386        optional: bool,
11387    ) -> Result<Option<ModifySharedLinkSettingsArgs>, V::Error> {
11388        let mut field_url = None;
11389        let mut field_settings = None;
11390        let mut field_remove_expiration = None;
11391        let mut nothing = true;
11392        while let Some(key) = map.next_key::<&str>()? {
11393            nothing = false;
11394            match key {
11395                "url" => {
11396                    if field_url.is_some() {
11397                        return Err(::serde::de::Error::duplicate_field("url"));
11398                    }
11399                    field_url = Some(map.next_value()?);
11400                }
11401                "settings" => {
11402                    if field_settings.is_some() {
11403                        return Err(::serde::de::Error::duplicate_field("settings"));
11404                    }
11405                    field_settings = Some(map.next_value()?);
11406                }
11407                "remove_expiration" => {
11408                    if field_remove_expiration.is_some() {
11409                        return Err(::serde::de::Error::duplicate_field("remove_expiration"));
11410                    }
11411                    field_remove_expiration = Some(map.next_value()?);
11412                }
11413                _ => {
11414                    // unknown field allowed and ignored
11415                    map.next_value::<::serde_json::Value>()?;
11416                }
11417            }
11418        }
11419        if optional && nothing {
11420            return Ok(None);
11421        }
11422        let result = ModifySharedLinkSettingsArgs {
11423            url: field_url.ok_or_else(|| ::serde::de::Error::missing_field("url"))?,
11424            settings: field_settings.ok_or_else(|| ::serde::de::Error::missing_field("settings"))?,
11425            remove_expiration: field_remove_expiration.unwrap_or(false),
11426        };
11427        Ok(Some(result))
11428    }
11429
11430    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
11431        &self,
11432        s: &mut S::SerializeStruct,
11433    ) -> Result<(), S::Error> {
11434        use serde::ser::SerializeStruct;
11435        s.serialize_field("url", &self.url)?;
11436        s.serialize_field("settings", &self.settings)?;
11437        if self.remove_expiration {
11438            s.serialize_field("remove_expiration", &self.remove_expiration)?;
11439        }
11440        Ok(())
11441    }
11442}
11443
11444impl<'de> ::serde::de::Deserialize<'de> for ModifySharedLinkSettingsArgs {
11445    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
11446        // struct deserializer
11447        use serde::de::{MapAccess, Visitor};
11448        struct StructVisitor;
11449        impl<'de> Visitor<'de> for StructVisitor {
11450            type Value = ModifySharedLinkSettingsArgs;
11451            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11452                f.write_str("a ModifySharedLinkSettingsArgs struct")
11453            }
11454            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
11455                ModifySharedLinkSettingsArgs::internal_deserialize(map)
11456            }
11457        }
11458        deserializer.deserialize_struct("ModifySharedLinkSettingsArgs", MODIFY_SHARED_LINK_SETTINGS_ARGS_FIELDS, StructVisitor)
11459    }
11460}
11461
11462impl ::serde::ser::Serialize for ModifySharedLinkSettingsArgs {
11463    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
11464        // struct serializer
11465        use serde::ser::SerializeStruct;
11466        let mut s = serializer.serialize_struct("ModifySharedLinkSettingsArgs", 3)?;
11467        self.internal_serialize::<S>(&mut s)?;
11468        s.end()
11469    }
11470}
11471
11472#[derive(Debug, Clone, PartialEq, Eq)]
11473#[non_exhaustive] // variants may be added in the future
11474pub enum ModifySharedLinkSettingsError {
11475    /// The shared link wasn't found.
11476    SharedLinkNotFound,
11477    /// The caller is not allowed to access this shared link.
11478    SharedLinkAccessDenied,
11479    /// This type of link is not supported; use [`files::export()`](crate::files::export) instead.
11480    UnsupportedLinkType,
11481    /// Private shared links do not support `path` or `link_password` parameter fields.
11482    UnsupportedParameterField,
11483    /// There is an error with the given settings.
11484    SettingsError(SharedLinkSettingsError),
11485    /// This user's email address is not verified. This functionality is only available on accounts
11486    /// with a verified email address. Users can verify their email address
11487    /// [here](https://www.dropbox.com/help/317).
11488    EmailNotVerified,
11489    /// Catch-all used for unrecognized values returned from the server. Encountering this value
11490    /// typically indicates that this SDK version is out of date.
11491    Other,
11492}
11493
11494impl<'de> ::serde::de::Deserialize<'de> for ModifySharedLinkSettingsError {
11495    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
11496        // union deserializer
11497        use serde::de::{self, MapAccess, Visitor};
11498        struct EnumVisitor;
11499        impl<'de> Visitor<'de> for EnumVisitor {
11500            type Value = ModifySharedLinkSettingsError;
11501            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11502                f.write_str("a ModifySharedLinkSettingsError structure")
11503            }
11504            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
11505                let tag: &str = match map.next_key()? {
11506                    Some(".tag") => map.next_value()?,
11507                    _ => return Err(de::Error::missing_field(".tag"))
11508                };
11509                let value = match tag {
11510                    "shared_link_not_found" => ModifySharedLinkSettingsError::SharedLinkNotFound,
11511                    "shared_link_access_denied" => ModifySharedLinkSettingsError::SharedLinkAccessDenied,
11512                    "unsupported_link_type" => ModifySharedLinkSettingsError::UnsupportedLinkType,
11513                    "unsupported_parameter_field" => ModifySharedLinkSettingsError::UnsupportedParameterField,
11514                    "settings_error" => {
11515                        match map.next_key()? {
11516                            Some("settings_error") => ModifySharedLinkSettingsError::SettingsError(map.next_value()?),
11517                            None => return Err(de::Error::missing_field("settings_error")),
11518                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
11519                        }
11520                    }
11521                    "email_not_verified" => ModifySharedLinkSettingsError::EmailNotVerified,
11522                    _ => ModifySharedLinkSettingsError::Other,
11523                };
11524                crate::eat_json_fields(&mut map)?;
11525                Ok(value)
11526            }
11527        }
11528        const VARIANTS: &[&str] = &["shared_link_not_found",
11529                                    "shared_link_access_denied",
11530                                    "unsupported_link_type",
11531                                    "unsupported_parameter_field",
11532                                    "other",
11533                                    "settings_error",
11534                                    "email_not_verified"];
11535        deserializer.deserialize_struct("ModifySharedLinkSettingsError", VARIANTS, EnumVisitor)
11536    }
11537}
11538
11539impl ::serde::ser::Serialize for ModifySharedLinkSettingsError {
11540    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
11541        // union serializer
11542        use serde::ser::SerializeStruct;
11543        match self {
11544            ModifySharedLinkSettingsError::SharedLinkNotFound => {
11545                // unit
11546                let mut s = serializer.serialize_struct("ModifySharedLinkSettingsError", 1)?;
11547                s.serialize_field(".tag", "shared_link_not_found")?;
11548                s.end()
11549            }
11550            ModifySharedLinkSettingsError::SharedLinkAccessDenied => {
11551                // unit
11552                let mut s = serializer.serialize_struct("ModifySharedLinkSettingsError", 1)?;
11553                s.serialize_field(".tag", "shared_link_access_denied")?;
11554                s.end()
11555            }
11556            ModifySharedLinkSettingsError::UnsupportedLinkType => {
11557                // unit
11558                let mut s = serializer.serialize_struct("ModifySharedLinkSettingsError", 1)?;
11559                s.serialize_field(".tag", "unsupported_link_type")?;
11560                s.end()
11561            }
11562            ModifySharedLinkSettingsError::UnsupportedParameterField => {
11563                // unit
11564                let mut s = serializer.serialize_struct("ModifySharedLinkSettingsError", 1)?;
11565                s.serialize_field(".tag", "unsupported_parameter_field")?;
11566                s.end()
11567            }
11568            ModifySharedLinkSettingsError::SettingsError(x) => {
11569                // union or polymporphic struct
11570                let mut s = serializer.serialize_struct("ModifySharedLinkSettingsError", 2)?;
11571                s.serialize_field(".tag", "settings_error")?;
11572                s.serialize_field("settings_error", x)?;
11573                s.end()
11574            }
11575            ModifySharedLinkSettingsError::EmailNotVerified => {
11576                // unit
11577                let mut s = serializer.serialize_struct("ModifySharedLinkSettingsError", 1)?;
11578                s.serialize_field(".tag", "email_not_verified")?;
11579                s.end()
11580            }
11581            ModifySharedLinkSettingsError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
11582        }
11583    }
11584}
11585
11586impl ::std::error::Error for ModifySharedLinkSettingsError {
11587    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
11588        match self {
11589            ModifySharedLinkSettingsError::SettingsError(inner) => Some(inner),
11590            _ => None,
11591        }
11592    }
11593}
11594
11595impl ::std::fmt::Display for ModifySharedLinkSettingsError {
11596    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11597        match self {
11598            ModifySharedLinkSettingsError::SharedLinkNotFound => f.write_str("The shared link wasn't found."),
11599            ModifySharedLinkSettingsError::SharedLinkAccessDenied => f.write_str("The caller is not allowed to access this shared link."),
11600            ModifySharedLinkSettingsError::UnsupportedParameterField => f.write_str("Private shared links do not support `path` or `link_password` parameter fields."),
11601            ModifySharedLinkSettingsError::SettingsError(inner) => write!(f, "There is an error with the given settings: {}", inner),
11602            _ => write!(f, "{:?}", *self),
11603        }
11604    }
11605}
11606
11607// union extends SharedLinkError
11608impl From<SharedLinkError> for ModifySharedLinkSettingsError {
11609    fn from(parent: SharedLinkError) -> Self {
11610        match parent {
11611            SharedLinkError::SharedLinkNotFound => ModifySharedLinkSettingsError::SharedLinkNotFound,
11612            SharedLinkError::SharedLinkAccessDenied => ModifySharedLinkSettingsError::SharedLinkAccessDenied,
11613            SharedLinkError::UnsupportedLinkType => ModifySharedLinkSettingsError::UnsupportedLinkType,
11614            SharedLinkError::UnsupportedParameterField => ModifySharedLinkSettingsError::UnsupportedParameterField,
11615            SharedLinkError::Other => ModifySharedLinkSettingsError::Other,
11616        }
11617    }
11618}
11619#[derive(Debug, Clone, PartialEq, Eq)]
11620#[non_exhaustive] // structs may have more fields added in the future.
11621pub struct MountFolderArg {
11622    /// The ID of the shared folder to mount.
11623    pub shared_folder_id: crate::types::common::SharedFolderId,
11624}
11625
11626impl MountFolderArg {
11627    pub fn new(shared_folder_id: crate::types::common::SharedFolderId) -> Self {
11628        MountFolderArg {
11629            shared_folder_id,
11630        }
11631    }
11632}
11633
11634const MOUNT_FOLDER_ARG_FIELDS: &[&str] = &["shared_folder_id"];
11635impl MountFolderArg {
11636    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
11637        map: V,
11638    ) -> Result<MountFolderArg, V::Error> {
11639        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
11640    }
11641
11642    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
11643        mut map: V,
11644        optional: bool,
11645    ) -> Result<Option<MountFolderArg>, V::Error> {
11646        let mut field_shared_folder_id = None;
11647        let mut nothing = true;
11648        while let Some(key) = map.next_key::<&str>()? {
11649            nothing = false;
11650            match key {
11651                "shared_folder_id" => {
11652                    if field_shared_folder_id.is_some() {
11653                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
11654                    }
11655                    field_shared_folder_id = Some(map.next_value()?);
11656                }
11657                _ => {
11658                    // unknown field allowed and ignored
11659                    map.next_value::<::serde_json::Value>()?;
11660                }
11661            }
11662        }
11663        if optional && nothing {
11664            return Ok(None);
11665        }
11666        let result = MountFolderArg {
11667            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
11668        };
11669        Ok(Some(result))
11670    }
11671
11672    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
11673        &self,
11674        s: &mut S::SerializeStruct,
11675    ) -> Result<(), S::Error> {
11676        use serde::ser::SerializeStruct;
11677        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
11678        Ok(())
11679    }
11680}
11681
11682impl<'de> ::serde::de::Deserialize<'de> for MountFolderArg {
11683    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
11684        // struct deserializer
11685        use serde::de::{MapAccess, Visitor};
11686        struct StructVisitor;
11687        impl<'de> Visitor<'de> for StructVisitor {
11688            type Value = MountFolderArg;
11689            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11690                f.write_str("a MountFolderArg struct")
11691            }
11692            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
11693                MountFolderArg::internal_deserialize(map)
11694            }
11695        }
11696        deserializer.deserialize_struct("MountFolderArg", MOUNT_FOLDER_ARG_FIELDS, StructVisitor)
11697    }
11698}
11699
11700impl ::serde::ser::Serialize for MountFolderArg {
11701    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
11702        // struct serializer
11703        use serde::ser::SerializeStruct;
11704        let mut s = serializer.serialize_struct("MountFolderArg", 1)?;
11705        self.internal_serialize::<S>(&mut s)?;
11706        s.end()
11707    }
11708}
11709
11710#[derive(Debug, Clone, PartialEq, Eq)]
11711#[non_exhaustive] // variants may be added in the future
11712pub enum MountFolderError {
11713    AccessError(SharedFolderAccessError),
11714    /// Mounting would cause a shared folder to be inside another, which is disallowed.
11715    InsideSharedFolder,
11716    /// The current user does not have enough space to mount the shared folder.
11717    InsufficientQuota(InsufficientQuotaAmounts),
11718    /// The shared folder is already mounted.
11719    AlreadyMounted,
11720    /// The current user does not have permission to perform this action.
11721    NoPermission,
11722    /// The shared folder is not mountable. One example where this can occur is when the shared
11723    /// folder belongs within a team folder in the user's Dropbox.
11724    NotMountable,
11725    /// The shared folder is not mountable by directly call APIs, instead the automounter is
11726    /// responsible for mounting it.
11727    MustAutomount,
11728    /// Catch-all used for unrecognized values returned from the server. Encountering this value
11729    /// typically indicates that this SDK version is out of date.
11730    Other,
11731}
11732
11733impl<'de> ::serde::de::Deserialize<'de> for MountFolderError {
11734    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
11735        // union deserializer
11736        use serde::de::{self, MapAccess, Visitor};
11737        struct EnumVisitor;
11738        impl<'de> Visitor<'de> for EnumVisitor {
11739            type Value = MountFolderError;
11740            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11741                f.write_str("a MountFolderError structure")
11742            }
11743            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
11744                let tag: &str = match map.next_key()? {
11745                    Some(".tag") => map.next_value()?,
11746                    _ => return Err(de::Error::missing_field(".tag"))
11747                };
11748                let value = match tag {
11749                    "access_error" => {
11750                        match map.next_key()? {
11751                            Some("access_error") => MountFolderError::AccessError(map.next_value()?),
11752                            None => return Err(de::Error::missing_field("access_error")),
11753                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
11754                        }
11755                    }
11756                    "inside_shared_folder" => MountFolderError::InsideSharedFolder,
11757                    "insufficient_quota" => MountFolderError::InsufficientQuota(InsufficientQuotaAmounts::internal_deserialize(&mut map)?),
11758                    "already_mounted" => MountFolderError::AlreadyMounted,
11759                    "no_permission" => MountFolderError::NoPermission,
11760                    "not_mountable" => MountFolderError::NotMountable,
11761                    "must_automount" => MountFolderError::MustAutomount,
11762                    _ => MountFolderError::Other,
11763                };
11764                crate::eat_json_fields(&mut map)?;
11765                Ok(value)
11766            }
11767        }
11768        const VARIANTS: &[&str] = &["access_error",
11769                                    "inside_shared_folder",
11770                                    "insufficient_quota",
11771                                    "already_mounted",
11772                                    "no_permission",
11773                                    "not_mountable",
11774                                    "must_automount",
11775                                    "other"];
11776        deserializer.deserialize_struct("MountFolderError", VARIANTS, EnumVisitor)
11777    }
11778}
11779
11780impl ::serde::ser::Serialize for MountFolderError {
11781    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
11782        // union serializer
11783        use serde::ser::SerializeStruct;
11784        match self {
11785            MountFolderError::AccessError(x) => {
11786                // union or polymporphic struct
11787                let mut s = serializer.serialize_struct("MountFolderError", 2)?;
11788                s.serialize_field(".tag", "access_error")?;
11789                s.serialize_field("access_error", x)?;
11790                s.end()
11791            }
11792            MountFolderError::InsideSharedFolder => {
11793                // unit
11794                let mut s = serializer.serialize_struct("MountFolderError", 1)?;
11795                s.serialize_field(".tag", "inside_shared_folder")?;
11796                s.end()
11797            }
11798            MountFolderError::InsufficientQuota(x) => {
11799                // struct
11800                let mut s = serializer.serialize_struct("MountFolderError", 4)?;
11801                s.serialize_field(".tag", "insufficient_quota")?;
11802                x.internal_serialize::<S>(&mut s)?;
11803                s.end()
11804            }
11805            MountFolderError::AlreadyMounted => {
11806                // unit
11807                let mut s = serializer.serialize_struct("MountFolderError", 1)?;
11808                s.serialize_field(".tag", "already_mounted")?;
11809                s.end()
11810            }
11811            MountFolderError::NoPermission => {
11812                // unit
11813                let mut s = serializer.serialize_struct("MountFolderError", 1)?;
11814                s.serialize_field(".tag", "no_permission")?;
11815                s.end()
11816            }
11817            MountFolderError::NotMountable => {
11818                // unit
11819                let mut s = serializer.serialize_struct("MountFolderError", 1)?;
11820                s.serialize_field(".tag", "not_mountable")?;
11821                s.end()
11822            }
11823            MountFolderError::MustAutomount => {
11824                // unit
11825                let mut s = serializer.serialize_struct("MountFolderError", 1)?;
11826                s.serialize_field(".tag", "must_automount")?;
11827                s.end()
11828            }
11829            MountFolderError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
11830        }
11831    }
11832}
11833
11834impl ::std::error::Error for MountFolderError {
11835    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
11836        match self {
11837            MountFolderError::AccessError(inner) => Some(inner),
11838            _ => None,
11839        }
11840    }
11841}
11842
11843impl ::std::fmt::Display for MountFolderError {
11844    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11845        match self {
11846            MountFolderError::AccessError(inner) => write!(f, "MountFolderError: {}", inner),
11847            MountFolderError::InsideSharedFolder => f.write_str("Mounting would cause a shared folder to be inside another, which is disallowed."),
11848            MountFolderError::InsufficientQuota(inner) => write!(f, "The current user does not have enough space to mount the shared folder: {:?}", inner),
11849            MountFolderError::AlreadyMounted => f.write_str("The shared folder is already mounted."),
11850            MountFolderError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
11851            MountFolderError::NotMountable => f.write_str("The shared folder is not mountable. One example where this can occur is when the shared folder belongs within a team folder in the user's Dropbox."),
11852            MountFolderError::MustAutomount => f.write_str("The shared folder is not mountable by directly call APIs, instead the automounter is responsible for mounting it."),
11853            _ => write!(f, "{:?}", *self),
11854        }
11855    }
11856}
11857
11858/// Contains information about a parent folder that a member has access to.
11859#[derive(Debug, Clone, PartialEq, Eq)]
11860#[non_exhaustive] // structs may have more fields added in the future.
11861pub struct ParentFolderAccessInfo {
11862    /// Display name for the folder.
11863    pub folder_name: String,
11864    /// The identifier of the parent shared folder.
11865    pub shared_folder_id: crate::types::common::SharedFolderId,
11866    /// The user's permissions for the parent shared folder.
11867    pub permissions: Vec<MemberPermission>,
11868    /// The full path to the parent shared folder relative to the acting user's root.
11869    pub path: String,
11870}
11871
11872impl ParentFolderAccessInfo {
11873    pub fn new(
11874        folder_name: String,
11875        shared_folder_id: crate::types::common::SharedFolderId,
11876        permissions: Vec<MemberPermission>,
11877        path: String,
11878    ) -> Self {
11879        ParentFolderAccessInfo {
11880            folder_name,
11881            shared_folder_id,
11882            permissions,
11883            path,
11884        }
11885    }
11886}
11887
11888const PARENT_FOLDER_ACCESS_INFO_FIELDS: &[&str] = &["folder_name",
11889                                                    "shared_folder_id",
11890                                                    "permissions",
11891                                                    "path"];
11892impl ParentFolderAccessInfo {
11893    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
11894        map: V,
11895    ) -> Result<ParentFolderAccessInfo, V::Error> {
11896        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
11897    }
11898
11899    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
11900        mut map: V,
11901        optional: bool,
11902    ) -> Result<Option<ParentFolderAccessInfo>, V::Error> {
11903        let mut field_folder_name = None;
11904        let mut field_shared_folder_id = None;
11905        let mut field_permissions = None;
11906        let mut field_path = None;
11907        let mut nothing = true;
11908        while let Some(key) = map.next_key::<&str>()? {
11909            nothing = false;
11910            match key {
11911                "folder_name" => {
11912                    if field_folder_name.is_some() {
11913                        return Err(::serde::de::Error::duplicate_field("folder_name"));
11914                    }
11915                    field_folder_name = Some(map.next_value()?);
11916                }
11917                "shared_folder_id" => {
11918                    if field_shared_folder_id.is_some() {
11919                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
11920                    }
11921                    field_shared_folder_id = Some(map.next_value()?);
11922                }
11923                "permissions" => {
11924                    if field_permissions.is_some() {
11925                        return Err(::serde::de::Error::duplicate_field("permissions"));
11926                    }
11927                    field_permissions = Some(map.next_value()?);
11928                }
11929                "path" => {
11930                    if field_path.is_some() {
11931                        return Err(::serde::de::Error::duplicate_field("path"));
11932                    }
11933                    field_path = Some(map.next_value()?);
11934                }
11935                _ => {
11936                    // unknown field allowed and ignored
11937                    map.next_value::<::serde_json::Value>()?;
11938                }
11939            }
11940        }
11941        if optional && nothing {
11942            return Ok(None);
11943        }
11944        let result = ParentFolderAccessInfo {
11945            folder_name: field_folder_name.ok_or_else(|| ::serde::de::Error::missing_field("folder_name"))?,
11946            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
11947            permissions: field_permissions.ok_or_else(|| ::serde::de::Error::missing_field("permissions"))?,
11948            path: field_path.ok_or_else(|| ::serde::de::Error::missing_field("path"))?,
11949        };
11950        Ok(Some(result))
11951    }
11952
11953    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
11954        &self,
11955        s: &mut S::SerializeStruct,
11956    ) -> Result<(), S::Error> {
11957        use serde::ser::SerializeStruct;
11958        s.serialize_field("folder_name", &self.folder_name)?;
11959        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
11960        s.serialize_field("permissions", &self.permissions)?;
11961        s.serialize_field("path", &self.path)?;
11962        Ok(())
11963    }
11964}
11965
11966impl<'de> ::serde::de::Deserialize<'de> for ParentFolderAccessInfo {
11967    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
11968        // struct deserializer
11969        use serde::de::{MapAccess, Visitor};
11970        struct StructVisitor;
11971        impl<'de> Visitor<'de> for StructVisitor {
11972            type Value = ParentFolderAccessInfo;
11973            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11974                f.write_str("a ParentFolderAccessInfo struct")
11975            }
11976            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
11977                ParentFolderAccessInfo::internal_deserialize(map)
11978            }
11979        }
11980        deserializer.deserialize_struct("ParentFolderAccessInfo", PARENT_FOLDER_ACCESS_INFO_FIELDS, StructVisitor)
11981    }
11982}
11983
11984impl ::serde::ser::Serialize for ParentFolderAccessInfo {
11985    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
11986        // struct serializer
11987        use serde::ser::SerializeStruct;
11988        let mut s = serializer.serialize_struct("ParentFolderAccessInfo", 4)?;
11989        self.internal_serialize::<S>(&mut s)?;
11990        s.end()
11991    }
11992}
11993
11994/// Metadata for a path-based shared link.
11995#[derive(Debug, Clone, PartialEq, Eq)]
11996#[non_exhaustive] // structs may have more fields added in the future.
11997pub struct PathLinkMetadata {
11998    /// URL of the shared link.
11999    pub url: String,
12000    /// Who can access the link.
12001    pub visibility: Visibility,
12002    /// Path in user's Dropbox.
12003    pub path: String,
12004    /// Expiration time, if set. By default the link won't expire.
12005    pub expires: Option<crate::types::common::DropboxTimestamp>,
12006}
12007
12008impl PathLinkMetadata {
12009    pub fn new(url: String, visibility: Visibility, path: String) -> Self {
12010        PathLinkMetadata {
12011            url,
12012            visibility,
12013            path,
12014            expires: None,
12015        }
12016    }
12017
12018    pub fn with_expires(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
12019        self.expires = Some(value);
12020        self
12021    }
12022}
12023
12024const PATH_LINK_METADATA_FIELDS: &[&str] = &["url",
12025                                             "visibility",
12026                                             "path",
12027                                             "expires"];
12028impl PathLinkMetadata {
12029    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
12030        map: V,
12031    ) -> Result<PathLinkMetadata, V::Error> {
12032        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
12033    }
12034
12035    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
12036        mut map: V,
12037        optional: bool,
12038    ) -> Result<Option<PathLinkMetadata>, V::Error> {
12039        let mut field_url = None;
12040        let mut field_visibility = None;
12041        let mut field_path = None;
12042        let mut field_expires = None;
12043        let mut nothing = true;
12044        while let Some(key) = map.next_key::<&str>()? {
12045            nothing = false;
12046            match key {
12047                "url" => {
12048                    if field_url.is_some() {
12049                        return Err(::serde::de::Error::duplicate_field("url"));
12050                    }
12051                    field_url = Some(map.next_value()?);
12052                }
12053                "visibility" => {
12054                    if field_visibility.is_some() {
12055                        return Err(::serde::de::Error::duplicate_field("visibility"));
12056                    }
12057                    field_visibility = Some(map.next_value()?);
12058                }
12059                "path" => {
12060                    if field_path.is_some() {
12061                        return Err(::serde::de::Error::duplicate_field("path"));
12062                    }
12063                    field_path = Some(map.next_value()?);
12064                }
12065                "expires" => {
12066                    if field_expires.is_some() {
12067                        return Err(::serde::de::Error::duplicate_field("expires"));
12068                    }
12069                    field_expires = Some(map.next_value()?);
12070                }
12071                _ => {
12072                    // unknown field allowed and ignored
12073                    map.next_value::<::serde_json::Value>()?;
12074                }
12075            }
12076        }
12077        if optional && nothing {
12078            return Ok(None);
12079        }
12080        let result = PathLinkMetadata {
12081            url: field_url.ok_or_else(|| ::serde::de::Error::missing_field("url"))?,
12082            visibility: field_visibility.ok_or_else(|| ::serde::de::Error::missing_field("visibility"))?,
12083            path: field_path.ok_or_else(|| ::serde::de::Error::missing_field("path"))?,
12084            expires: field_expires.and_then(Option::flatten),
12085        };
12086        Ok(Some(result))
12087    }
12088
12089    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
12090        &self,
12091        s: &mut S::SerializeStruct,
12092    ) -> Result<(), S::Error> {
12093        use serde::ser::SerializeStruct;
12094        s.serialize_field("url", &self.url)?;
12095        s.serialize_field("visibility", &self.visibility)?;
12096        s.serialize_field("path", &self.path)?;
12097        if let Some(val) = &self.expires {
12098            s.serialize_field("expires", val)?;
12099        }
12100        Ok(())
12101    }
12102}
12103
12104impl<'de> ::serde::de::Deserialize<'de> for PathLinkMetadata {
12105    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12106        // struct deserializer
12107        use serde::de::{MapAccess, Visitor};
12108        struct StructVisitor;
12109        impl<'de> Visitor<'de> for StructVisitor {
12110            type Value = PathLinkMetadata;
12111            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12112                f.write_str("a PathLinkMetadata struct")
12113            }
12114            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
12115                PathLinkMetadata::internal_deserialize(map)
12116            }
12117        }
12118        deserializer.deserialize_struct("PathLinkMetadata", PATH_LINK_METADATA_FIELDS, StructVisitor)
12119    }
12120}
12121
12122impl ::serde::ser::Serialize for PathLinkMetadata {
12123    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12124        // struct serializer
12125        use serde::ser::SerializeStruct;
12126        let mut s = serializer.serialize_struct("PathLinkMetadata", 4)?;
12127        self.internal_serialize::<S>(&mut s)?;
12128        s.end()
12129    }
12130}
12131
12132// struct extends polymorphic struct LinkMetadata
12133impl From<PathLinkMetadata> for LinkMetadata {
12134    fn from(subtype: PathLinkMetadata) -> Self {
12135        LinkMetadata::Path(subtype)
12136    }
12137}
12138/// Flag to indicate pending upload default (for linking to not-yet-existing paths).
12139#[derive(Debug, Clone, PartialEq, Eq)]
12140pub enum PendingUploadMode {
12141    /// Assume pending uploads are files.
12142    File,
12143    /// Assume pending uploads are folders.
12144    Folder,
12145}
12146
12147impl<'de> ::serde::de::Deserialize<'de> for PendingUploadMode {
12148    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12149        // union deserializer
12150        use serde::de::{self, MapAccess, Visitor};
12151        struct EnumVisitor;
12152        impl<'de> Visitor<'de> for EnumVisitor {
12153            type Value = PendingUploadMode;
12154            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12155                f.write_str("a PendingUploadMode structure")
12156            }
12157            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
12158                let tag: &str = match map.next_key()? {
12159                    Some(".tag") => map.next_value()?,
12160                    _ => return Err(de::Error::missing_field(".tag"))
12161                };
12162                let value = match tag {
12163                    "file" => PendingUploadMode::File,
12164                    "folder" => PendingUploadMode::Folder,
12165                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
12166                };
12167                crate::eat_json_fields(&mut map)?;
12168                Ok(value)
12169            }
12170        }
12171        const VARIANTS: &[&str] = &["file",
12172                                    "folder"];
12173        deserializer.deserialize_struct("PendingUploadMode", VARIANTS, EnumVisitor)
12174    }
12175}
12176
12177impl ::serde::ser::Serialize for PendingUploadMode {
12178    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12179        // union serializer
12180        use serde::ser::SerializeStruct;
12181        match self {
12182            PendingUploadMode::File => {
12183                // unit
12184                let mut s = serializer.serialize_struct("PendingUploadMode", 1)?;
12185                s.serialize_field(".tag", "file")?;
12186                s.end()
12187            }
12188            PendingUploadMode::Folder => {
12189                // unit
12190                let mut s = serializer.serialize_struct("PendingUploadMode", 1)?;
12191                s.serialize_field(".tag", "folder")?;
12192                s.end()
12193            }
12194        }
12195    }
12196}
12197
12198/// Possible reasons the user is denied a permission.
12199#[derive(Debug, Clone, PartialEq, Eq)]
12200#[non_exhaustive] // variants may be added in the future
12201pub enum PermissionDeniedReason {
12202    /// User is not on the same team as the folder owner.
12203    UserNotSameTeamAsOwner,
12204    /// User is prohibited by the owner from taking the action.
12205    UserNotAllowedByOwner,
12206    /// Target is indirectly a member of the folder, for example by being part of a group.
12207    TargetIsIndirectMember,
12208    /// Target is the owner of the folder.
12209    TargetIsOwner,
12210    /// Target is the user itself.
12211    TargetIsSelf,
12212    /// Target is not an active member of the team.
12213    TargetNotActive,
12214    /// Folder is team folder for a limited team.
12215    FolderIsLimitedTeamFolder,
12216    /// The content owner needs to be on a Dropbox team to perform this action.
12217    OwnerNotOnTeam,
12218    /// The user does not have permission to perform this action on the link.
12219    PermissionDenied,
12220    /// The user's team policy prevents performing this action on the link.
12221    RestrictedByTeam,
12222    /// The user's account type does not support this action.
12223    UserAccountType,
12224    /// The user needs to be on a Dropbox team to perform this action.
12225    UserNotOnTeam,
12226    /// Folder is inside of another shared folder.
12227    FolderIsInsideSharedFolder,
12228    /// Policy cannot be changed due to restrictions from parent folder.
12229    RestrictedByParentFolder,
12230    InsufficientPlan(InsufficientPlan),
12231    /// Catch-all used for unrecognized values returned from the server. Encountering this value
12232    /// typically indicates that this SDK version is out of date.
12233    Other,
12234}
12235
12236impl<'de> ::serde::de::Deserialize<'de> for PermissionDeniedReason {
12237    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12238        // union deserializer
12239        use serde::de::{self, MapAccess, Visitor};
12240        struct EnumVisitor;
12241        impl<'de> Visitor<'de> for EnumVisitor {
12242            type Value = PermissionDeniedReason;
12243            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12244                f.write_str("a PermissionDeniedReason structure")
12245            }
12246            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
12247                let tag: &str = match map.next_key()? {
12248                    Some(".tag") => map.next_value()?,
12249                    _ => return Err(de::Error::missing_field(".tag"))
12250                };
12251                let value = match tag {
12252                    "user_not_same_team_as_owner" => PermissionDeniedReason::UserNotSameTeamAsOwner,
12253                    "user_not_allowed_by_owner" => PermissionDeniedReason::UserNotAllowedByOwner,
12254                    "target_is_indirect_member" => PermissionDeniedReason::TargetIsIndirectMember,
12255                    "target_is_owner" => PermissionDeniedReason::TargetIsOwner,
12256                    "target_is_self" => PermissionDeniedReason::TargetIsSelf,
12257                    "target_not_active" => PermissionDeniedReason::TargetNotActive,
12258                    "folder_is_limited_team_folder" => PermissionDeniedReason::FolderIsLimitedTeamFolder,
12259                    "owner_not_on_team" => PermissionDeniedReason::OwnerNotOnTeam,
12260                    "permission_denied" => PermissionDeniedReason::PermissionDenied,
12261                    "restricted_by_team" => PermissionDeniedReason::RestrictedByTeam,
12262                    "user_account_type" => PermissionDeniedReason::UserAccountType,
12263                    "user_not_on_team" => PermissionDeniedReason::UserNotOnTeam,
12264                    "folder_is_inside_shared_folder" => PermissionDeniedReason::FolderIsInsideSharedFolder,
12265                    "restricted_by_parent_folder" => PermissionDeniedReason::RestrictedByParentFolder,
12266                    "insufficient_plan" => PermissionDeniedReason::InsufficientPlan(InsufficientPlan::internal_deserialize(&mut map)?),
12267                    _ => PermissionDeniedReason::Other,
12268                };
12269                crate::eat_json_fields(&mut map)?;
12270                Ok(value)
12271            }
12272        }
12273        const VARIANTS: &[&str] = &["user_not_same_team_as_owner",
12274                                    "user_not_allowed_by_owner",
12275                                    "target_is_indirect_member",
12276                                    "target_is_owner",
12277                                    "target_is_self",
12278                                    "target_not_active",
12279                                    "folder_is_limited_team_folder",
12280                                    "owner_not_on_team",
12281                                    "permission_denied",
12282                                    "restricted_by_team",
12283                                    "user_account_type",
12284                                    "user_not_on_team",
12285                                    "folder_is_inside_shared_folder",
12286                                    "restricted_by_parent_folder",
12287                                    "insufficient_plan",
12288                                    "other"];
12289        deserializer.deserialize_struct("PermissionDeniedReason", VARIANTS, EnumVisitor)
12290    }
12291}
12292
12293impl ::serde::ser::Serialize for PermissionDeniedReason {
12294    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12295        // union serializer
12296        use serde::ser::SerializeStruct;
12297        match self {
12298            PermissionDeniedReason::UserNotSameTeamAsOwner => {
12299                // unit
12300                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12301                s.serialize_field(".tag", "user_not_same_team_as_owner")?;
12302                s.end()
12303            }
12304            PermissionDeniedReason::UserNotAllowedByOwner => {
12305                // unit
12306                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12307                s.serialize_field(".tag", "user_not_allowed_by_owner")?;
12308                s.end()
12309            }
12310            PermissionDeniedReason::TargetIsIndirectMember => {
12311                // unit
12312                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12313                s.serialize_field(".tag", "target_is_indirect_member")?;
12314                s.end()
12315            }
12316            PermissionDeniedReason::TargetIsOwner => {
12317                // unit
12318                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12319                s.serialize_field(".tag", "target_is_owner")?;
12320                s.end()
12321            }
12322            PermissionDeniedReason::TargetIsSelf => {
12323                // unit
12324                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12325                s.serialize_field(".tag", "target_is_self")?;
12326                s.end()
12327            }
12328            PermissionDeniedReason::TargetNotActive => {
12329                // unit
12330                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12331                s.serialize_field(".tag", "target_not_active")?;
12332                s.end()
12333            }
12334            PermissionDeniedReason::FolderIsLimitedTeamFolder => {
12335                // unit
12336                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12337                s.serialize_field(".tag", "folder_is_limited_team_folder")?;
12338                s.end()
12339            }
12340            PermissionDeniedReason::OwnerNotOnTeam => {
12341                // unit
12342                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12343                s.serialize_field(".tag", "owner_not_on_team")?;
12344                s.end()
12345            }
12346            PermissionDeniedReason::PermissionDenied => {
12347                // unit
12348                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12349                s.serialize_field(".tag", "permission_denied")?;
12350                s.end()
12351            }
12352            PermissionDeniedReason::RestrictedByTeam => {
12353                // unit
12354                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12355                s.serialize_field(".tag", "restricted_by_team")?;
12356                s.end()
12357            }
12358            PermissionDeniedReason::UserAccountType => {
12359                // unit
12360                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12361                s.serialize_field(".tag", "user_account_type")?;
12362                s.end()
12363            }
12364            PermissionDeniedReason::UserNotOnTeam => {
12365                // unit
12366                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12367                s.serialize_field(".tag", "user_not_on_team")?;
12368                s.end()
12369            }
12370            PermissionDeniedReason::FolderIsInsideSharedFolder => {
12371                // unit
12372                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12373                s.serialize_field(".tag", "folder_is_inside_shared_folder")?;
12374                s.end()
12375            }
12376            PermissionDeniedReason::RestrictedByParentFolder => {
12377                // unit
12378                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12379                s.serialize_field(".tag", "restricted_by_parent_folder")?;
12380                s.end()
12381            }
12382            PermissionDeniedReason::InsufficientPlan(x) => {
12383                // struct
12384                let mut s = serializer.serialize_struct("PermissionDeniedReason", 3)?;
12385                s.serialize_field(".tag", "insufficient_plan")?;
12386                x.internal_serialize::<S>(&mut s)?;
12387                s.end()
12388            }
12389            PermissionDeniedReason::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
12390        }
12391    }
12392}
12393
12394/// Removes all self-removable access from a file or folder. For folders: always relinquishes
12395/// without keeping a local copy (leave_a_copy=false behavior). If you need control over keeping
12396/// folder contents, use the relinquish_folder_membership endpoint instead.
12397#[derive(Debug, Clone, PartialEq, Eq)]
12398#[non_exhaustive] // structs may have more fields added in the future.
12399pub struct RelinquishAccessArg {
12400    /// The id for the file or folder.
12401    pub file_id: String,
12402}
12403
12404impl RelinquishAccessArg {
12405    pub fn new(file_id: String) -> Self {
12406        RelinquishAccessArg {
12407            file_id,
12408        }
12409    }
12410}
12411
12412const RELINQUISH_ACCESS_ARG_FIELDS: &[&str] = &["file_id"];
12413impl RelinquishAccessArg {
12414    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
12415        map: V,
12416    ) -> Result<RelinquishAccessArg, V::Error> {
12417        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
12418    }
12419
12420    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
12421        mut map: V,
12422        optional: bool,
12423    ) -> Result<Option<RelinquishAccessArg>, V::Error> {
12424        let mut field_file_id = None;
12425        let mut nothing = true;
12426        while let Some(key) = map.next_key::<&str>()? {
12427            nothing = false;
12428            match key {
12429                "file_id" => {
12430                    if field_file_id.is_some() {
12431                        return Err(::serde::de::Error::duplicate_field("file_id"));
12432                    }
12433                    field_file_id = Some(map.next_value()?);
12434                }
12435                _ => {
12436                    // unknown field allowed and ignored
12437                    map.next_value::<::serde_json::Value>()?;
12438                }
12439            }
12440        }
12441        if optional && nothing {
12442            return Ok(None);
12443        }
12444        let result = RelinquishAccessArg {
12445            file_id: field_file_id.ok_or_else(|| ::serde::de::Error::missing_field("file_id"))?,
12446        };
12447        Ok(Some(result))
12448    }
12449
12450    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
12451        &self,
12452        s: &mut S::SerializeStruct,
12453    ) -> Result<(), S::Error> {
12454        use serde::ser::SerializeStruct;
12455        s.serialize_field("file_id", &self.file_id)?;
12456        Ok(())
12457    }
12458}
12459
12460impl<'de> ::serde::de::Deserialize<'de> for RelinquishAccessArg {
12461    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12462        // struct deserializer
12463        use serde::de::{MapAccess, Visitor};
12464        struct StructVisitor;
12465        impl<'de> Visitor<'de> for StructVisitor {
12466            type Value = RelinquishAccessArg;
12467            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12468                f.write_str("a RelinquishAccessArg struct")
12469            }
12470            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
12471                RelinquishAccessArg::internal_deserialize(map)
12472            }
12473        }
12474        deserializer.deserialize_struct("RelinquishAccessArg", RELINQUISH_ACCESS_ARG_FIELDS, StructVisitor)
12475    }
12476}
12477
12478impl ::serde::ser::Serialize for RelinquishAccessArg {
12479    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12480        // struct serializer
12481        use serde::ser::SerializeStruct;
12482        let mut s = serializer.serialize_struct("RelinquishAccessArg", 1)?;
12483        self.internal_serialize::<S>(&mut s)?;
12484        s.end()
12485    }
12486}
12487
12488/// Error result for the relinquish_access endpoint.
12489#[derive(Debug, Clone, PartialEq, Eq)]
12490#[non_exhaustive] // variants may be added in the future
12491pub enum RelinquishAccessError {
12492    /// File or folder not found or has been deleted.
12493    InvalidFileId,
12494    /// Caller's email address is not verified.
12495    EmailUnverified,
12496    /// User is the owner of the file/folder.
12497    Owner,
12498    /// User has only non-removable access — inherited from a parent folder or via group membership.
12499    /// Either way, relinquish_access cannot remove the caller's access from this surface; the
12500    /// caller must take action on the source of the access (e.g. leave the parent shared folder, or
12501    /// be removed from the group).
12502    NoExplicitAccess,
12503    /// Team folder restrictions apply.
12504    TeamFolder,
12505    /// Caller does not have permission to perform this action. Generic fallback.
12506    NoPermission,
12507    /// Catch-all used for unrecognized values returned from the server. Encountering this value
12508    /// typically indicates that this SDK version is out of date.
12509    Other,
12510}
12511
12512impl<'de> ::serde::de::Deserialize<'de> for RelinquishAccessError {
12513    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12514        // union deserializer
12515        use serde::de::{self, MapAccess, Visitor};
12516        struct EnumVisitor;
12517        impl<'de> Visitor<'de> for EnumVisitor {
12518            type Value = RelinquishAccessError;
12519            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12520                f.write_str("a RelinquishAccessError structure")
12521            }
12522            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
12523                let tag: &str = match map.next_key()? {
12524                    Some(".tag") => map.next_value()?,
12525                    _ => return Err(de::Error::missing_field(".tag"))
12526                };
12527                let value = match tag {
12528                    "invalid_file_id" => RelinquishAccessError::InvalidFileId,
12529                    "email_unverified" => RelinquishAccessError::EmailUnverified,
12530                    "owner" => RelinquishAccessError::Owner,
12531                    "no_explicit_access" => RelinquishAccessError::NoExplicitAccess,
12532                    "team_folder" => RelinquishAccessError::TeamFolder,
12533                    "no_permission" => RelinquishAccessError::NoPermission,
12534                    _ => RelinquishAccessError::Other,
12535                };
12536                crate::eat_json_fields(&mut map)?;
12537                Ok(value)
12538            }
12539        }
12540        const VARIANTS: &[&str] = &["invalid_file_id",
12541                                    "email_unverified",
12542                                    "owner",
12543                                    "no_explicit_access",
12544                                    "team_folder",
12545                                    "no_permission",
12546                                    "other"];
12547        deserializer.deserialize_struct("RelinquishAccessError", VARIANTS, EnumVisitor)
12548    }
12549}
12550
12551impl ::serde::ser::Serialize for RelinquishAccessError {
12552    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12553        // union serializer
12554        use serde::ser::SerializeStruct;
12555        match self {
12556            RelinquishAccessError::InvalidFileId => {
12557                // unit
12558                let mut s = serializer.serialize_struct("RelinquishAccessError", 1)?;
12559                s.serialize_field(".tag", "invalid_file_id")?;
12560                s.end()
12561            }
12562            RelinquishAccessError::EmailUnverified => {
12563                // unit
12564                let mut s = serializer.serialize_struct("RelinquishAccessError", 1)?;
12565                s.serialize_field(".tag", "email_unverified")?;
12566                s.end()
12567            }
12568            RelinquishAccessError::Owner => {
12569                // unit
12570                let mut s = serializer.serialize_struct("RelinquishAccessError", 1)?;
12571                s.serialize_field(".tag", "owner")?;
12572                s.end()
12573            }
12574            RelinquishAccessError::NoExplicitAccess => {
12575                // unit
12576                let mut s = serializer.serialize_struct("RelinquishAccessError", 1)?;
12577                s.serialize_field(".tag", "no_explicit_access")?;
12578                s.end()
12579            }
12580            RelinquishAccessError::TeamFolder => {
12581                // unit
12582                let mut s = serializer.serialize_struct("RelinquishAccessError", 1)?;
12583                s.serialize_field(".tag", "team_folder")?;
12584                s.end()
12585            }
12586            RelinquishAccessError::NoPermission => {
12587                // unit
12588                let mut s = serializer.serialize_struct("RelinquishAccessError", 1)?;
12589                s.serialize_field(".tag", "no_permission")?;
12590                s.end()
12591            }
12592            RelinquishAccessError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
12593        }
12594    }
12595}
12596
12597impl ::std::error::Error for RelinquishAccessError {
12598}
12599
12600impl ::std::fmt::Display for RelinquishAccessError {
12601    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12602        match self {
12603            RelinquishAccessError::InvalidFileId => f.write_str("File or folder not found or has been deleted."),
12604            RelinquishAccessError::EmailUnverified => f.write_str("Caller's email address is not verified."),
12605            RelinquishAccessError::Owner => f.write_str("User is the owner of the file/folder."),
12606            RelinquishAccessError::NoExplicitAccess => f.write_str("User has only non-removable access — inherited from a parent folder or via group membership. Either way, relinquish_access cannot remove the caller's access from this surface; the caller must take action on the source of the access (e.g. leave the parent shared folder, or be removed from the group)."),
12607            RelinquishAccessError::TeamFolder => f.write_str("Team folder restrictions apply."),
12608            RelinquishAccessError::NoPermission => f.write_str("Caller does not have permission to perform this action. Generic fallback."),
12609            _ => write!(f, "{:?}", *self),
12610        }
12611    }
12612}
12613
12614/// Returns an empty response for the relinquish_access endpoint.
12615#[derive(Debug, Clone, PartialEq, Eq, Default)]
12616#[non_exhaustive] // structs may have more fields added in the future.
12617pub struct RelinquishAccessResult {
12618}
12619
12620const RELINQUISH_ACCESS_RESULT_FIELDS: &[&str] = &[];
12621impl RelinquishAccessResult {
12622    // no _opt deserializer
12623    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
12624        mut map: V,
12625    ) -> Result<RelinquishAccessResult, V::Error> {
12626        // ignore any fields found; none are presently recognized
12627        crate::eat_json_fields(&mut map)?;
12628        Ok(RelinquishAccessResult {})
12629    }
12630}
12631
12632impl<'de> ::serde::de::Deserialize<'de> for RelinquishAccessResult {
12633    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12634        // struct deserializer
12635        use serde::de::{MapAccess, Visitor};
12636        struct StructVisitor;
12637        impl<'de> Visitor<'de> for StructVisitor {
12638            type Value = RelinquishAccessResult;
12639            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12640                f.write_str("a RelinquishAccessResult struct")
12641            }
12642            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
12643                RelinquishAccessResult::internal_deserialize(map)
12644            }
12645        }
12646        deserializer.deserialize_struct("RelinquishAccessResult", RELINQUISH_ACCESS_RESULT_FIELDS, StructVisitor)
12647    }
12648}
12649
12650impl ::serde::ser::Serialize for RelinquishAccessResult {
12651    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12652        // struct serializer
12653        use serde::ser::SerializeStruct;
12654        serializer.serialize_struct("RelinquishAccessResult", 0)?.end()
12655    }
12656}
12657
12658#[derive(Debug, Clone, PartialEq, Eq)]
12659#[non_exhaustive] // structs may have more fields added in the future.
12660pub struct RelinquishFileMembershipArg {
12661    /// The path or id for the file.
12662    pub file: PathOrId,
12663}
12664
12665impl RelinquishFileMembershipArg {
12666    pub fn new(file: PathOrId) -> Self {
12667        RelinquishFileMembershipArg {
12668            file,
12669        }
12670    }
12671}
12672
12673const RELINQUISH_FILE_MEMBERSHIP_ARG_FIELDS: &[&str] = &["file"];
12674impl RelinquishFileMembershipArg {
12675    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
12676        map: V,
12677    ) -> Result<RelinquishFileMembershipArg, V::Error> {
12678        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
12679    }
12680
12681    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
12682        mut map: V,
12683        optional: bool,
12684    ) -> Result<Option<RelinquishFileMembershipArg>, V::Error> {
12685        let mut field_file = None;
12686        let mut nothing = true;
12687        while let Some(key) = map.next_key::<&str>()? {
12688            nothing = false;
12689            match key {
12690                "file" => {
12691                    if field_file.is_some() {
12692                        return Err(::serde::de::Error::duplicate_field("file"));
12693                    }
12694                    field_file = Some(map.next_value()?);
12695                }
12696                _ => {
12697                    // unknown field allowed and ignored
12698                    map.next_value::<::serde_json::Value>()?;
12699                }
12700            }
12701        }
12702        if optional && nothing {
12703            return Ok(None);
12704        }
12705        let result = RelinquishFileMembershipArg {
12706            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
12707        };
12708        Ok(Some(result))
12709    }
12710
12711    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
12712        &self,
12713        s: &mut S::SerializeStruct,
12714    ) -> Result<(), S::Error> {
12715        use serde::ser::SerializeStruct;
12716        s.serialize_field("file", &self.file)?;
12717        Ok(())
12718    }
12719}
12720
12721impl<'de> ::serde::de::Deserialize<'de> for RelinquishFileMembershipArg {
12722    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12723        // struct deserializer
12724        use serde::de::{MapAccess, Visitor};
12725        struct StructVisitor;
12726        impl<'de> Visitor<'de> for StructVisitor {
12727            type Value = RelinquishFileMembershipArg;
12728            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12729                f.write_str("a RelinquishFileMembershipArg struct")
12730            }
12731            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
12732                RelinquishFileMembershipArg::internal_deserialize(map)
12733            }
12734        }
12735        deserializer.deserialize_struct("RelinquishFileMembershipArg", RELINQUISH_FILE_MEMBERSHIP_ARG_FIELDS, StructVisitor)
12736    }
12737}
12738
12739impl ::serde::ser::Serialize for RelinquishFileMembershipArg {
12740    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12741        // struct serializer
12742        use serde::ser::SerializeStruct;
12743        let mut s = serializer.serialize_struct("RelinquishFileMembershipArg", 1)?;
12744        self.internal_serialize::<S>(&mut s)?;
12745        s.end()
12746    }
12747}
12748
12749#[derive(Debug, Clone, PartialEq, Eq)]
12750#[non_exhaustive] // variants may be added in the future
12751pub enum RelinquishFileMembershipError {
12752    AccessError(SharingFileAccessError),
12753    /// The current user has access to the shared file via a group.  You can't relinquish membership
12754    /// to a file shared via groups.
12755    GroupAccess,
12756    /// The current user does not have permission to perform this action.
12757    NoPermission,
12758    /// Catch-all used for unrecognized values returned from the server. Encountering this value
12759    /// typically indicates that this SDK version is out of date.
12760    Other,
12761}
12762
12763impl<'de> ::serde::de::Deserialize<'de> for RelinquishFileMembershipError {
12764    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12765        // union deserializer
12766        use serde::de::{self, MapAccess, Visitor};
12767        struct EnumVisitor;
12768        impl<'de> Visitor<'de> for EnumVisitor {
12769            type Value = RelinquishFileMembershipError;
12770            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12771                f.write_str("a RelinquishFileMembershipError structure")
12772            }
12773            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
12774                let tag: &str = match map.next_key()? {
12775                    Some(".tag") => map.next_value()?,
12776                    _ => return Err(de::Error::missing_field(".tag"))
12777                };
12778                let value = match tag {
12779                    "access_error" => {
12780                        match map.next_key()? {
12781                            Some("access_error") => RelinquishFileMembershipError::AccessError(map.next_value()?),
12782                            None => return Err(de::Error::missing_field("access_error")),
12783                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
12784                        }
12785                    }
12786                    "group_access" => RelinquishFileMembershipError::GroupAccess,
12787                    "no_permission" => RelinquishFileMembershipError::NoPermission,
12788                    _ => RelinquishFileMembershipError::Other,
12789                };
12790                crate::eat_json_fields(&mut map)?;
12791                Ok(value)
12792            }
12793        }
12794        const VARIANTS: &[&str] = &["access_error",
12795                                    "group_access",
12796                                    "no_permission",
12797                                    "other"];
12798        deserializer.deserialize_struct("RelinquishFileMembershipError", VARIANTS, EnumVisitor)
12799    }
12800}
12801
12802impl ::serde::ser::Serialize for RelinquishFileMembershipError {
12803    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12804        // union serializer
12805        use serde::ser::SerializeStruct;
12806        match self {
12807            RelinquishFileMembershipError::AccessError(x) => {
12808                // union or polymporphic struct
12809                let mut s = serializer.serialize_struct("RelinquishFileMembershipError", 2)?;
12810                s.serialize_field(".tag", "access_error")?;
12811                s.serialize_field("access_error", x)?;
12812                s.end()
12813            }
12814            RelinquishFileMembershipError::GroupAccess => {
12815                // unit
12816                let mut s = serializer.serialize_struct("RelinquishFileMembershipError", 1)?;
12817                s.serialize_field(".tag", "group_access")?;
12818                s.end()
12819            }
12820            RelinquishFileMembershipError::NoPermission => {
12821                // unit
12822                let mut s = serializer.serialize_struct("RelinquishFileMembershipError", 1)?;
12823                s.serialize_field(".tag", "no_permission")?;
12824                s.end()
12825            }
12826            RelinquishFileMembershipError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
12827        }
12828    }
12829}
12830
12831impl ::std::error::Error for RelinquishFileMembershipError {
12832    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
12833        match self {
12834            RelinquishFileMembershipError::AccessError(inner) => Some(inner),
12835            _ => None,
12836        }
12837    }
12838}
12839
12840impl ::std::fmt::Display for RelinquishFileMembershipError {
12841    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12842        match self {
12843            RelinquishFileMembershipError::AccessError(inner) => write!(f, "RelinquishFileMembershipError: {}", inner),
12844            RelinquishFileMembershipError::GroupAccess => f.write_str("The current user has access to the shared file via a group.  You can't relinquish membership to a file shared via groups."),
12845            RelinquishFileMembershipError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
12846            _ => write!(f, "{:?}", *self),
12847        }
12848    }
12849}
12850
12851#[derive(Debug, Clone, PartialEq, Eq)]
12852#[non_exhaustive] // structs may have more fields added in the future.
12853pub struct RelinquishFolderMembershipArg {
12854    /// The ID for the shared folder.
12855    pub shared_folder_id: crate::types::common::SharedFolderId,
12856    /// Keep a copy of the folder's contents upon relinquishing membership. This must be set to
12857    /// false when the folder is within a team folder or another shared folder.
12858    pub leave_a_copy: bool,
12859}
12860
12861impl RelinquishFolderMembershipArg {
12862    pub fn new(shared_folder_id: crate::types::common::SharedFolderId) -> Self {
12863        RelinquishFolderMembershipArg {
12864            shared_folder_id,
12865            leave_a_copy: false,
12866        }
12867    }
12868
12869    pub fn with_leave_a_copy(mut self, value: bool) -> Self {
12870        self.leave_a_copy = value;
12871        self
12872    }
12873}
12874
12875const RELINQUISH_FOLDER_MEMBERSHIP_ARG_FIELDS: &[&str] = &["shared_folder_id",
12876                                                           "leave_a_copy"];
12877impl RelinquishFolderMembershipArg {
12878    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
12879        map: V,
12880    ) -> Result<RelinquishFolderMembershipArg, V::Error> {
12881        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
12882    }
12883
12884    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
12885        mut map: V,
12886        optional: bool,
12887    ) -> Result<Option<RelinquishFolderMembershipArg>, V::Error> {
12888        let mut field_shared_folder_id = None;
12889        let mut field_leave_a_copy = None;
12890        let mut nothing = true;
12891        while let Some(key) = map.next_key::<&str>()? {
12892            nothing = false;
12893            match key {
12894                "shared_folder_id" => {
12895                    if field_shared_folder_id.is_some() {
12896                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
12897                    }
12898                    field_shared_folder_id = Some(map.next_value()?);
12899                }
12900                "leave_a_copy" => {
12901                    if field_leave_a_copy.is_some() {
12902                        return Err(::serde::de::Error::duplicate_field("leave_a_copy"));
12903                    }
12904                    field_leave_a_copy = Some(map.next_value()?);
12905                }
12906                _ => {
12907                    // unknown field allowed and ignored
12908                    map.next_value::<::serde_json::Value>()?;
12909                }
12910            }
12911        }
12912        if optional && nothing {
12913            return Ok(None);
12914        }
12915        let result = RelinquishFolderMembershipArg {
12916            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
12917            leave_a_copy: field_leave_a_copy.unwrap_or(false),
12918        };
12919        Ok(Some(result))
12920    }
12921
12922    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
12923        &self,
12924        s: &mut S::SerializeStruct,
12925    ) -> Result<(), S::Error> {
12926        use serde::ser::SerializeStruct;
12927        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
12928        if self.leave_a_copy {
12929            s.serialize_field("leave_a_copy", &self.leave_a_copy)?;
12930        }
12931        Ok(())
12932    }
12933}
12934
12935impl<'de> ::serde::de::Deserialize<'de> for RelinquishFolderMembershipArg {
12936    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12937        // struct deserializer
12938        use serde::de::{MapAccess, Visitor};
12939        struct StructVisitor;
12940        impl<'de> Visitor<'de> for StructVisitor {
12941            type Value = RelinquishFolderMembershipArg;
12942            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12943                f.write_str("a RelinquishFolderMembershipArg struct")
12944            }
12945            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
12946                RelinquishFolderMembershipArg::internal_deserialize(map)
12947            }
12948        }
12949        deserializer.deserialize_struct("RelinquishFolderMembershipArg", RELINQUISH_FOLDER_MEMBERSHIP_ARG_FIELDS, StructVisitor)
12950    }
12951}
12952
12953impl ::serde::ser::Serialize for RelinquishFolderMembershipArg {
12954    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12955        // struct serializer
12956        use serde::ser::SerializeStruct;
12957        let mut s = serializer.serialize_struct("RelinquishFolderMembershipArg", 2)?;
12958        self.internal_serialize::<S>(&mut s)?;
12959        s.end()
12960    }
12961}
12962
12963#[derive(Debug, Clone, PartialEq, Eq)]
12964#[non_exhaustive] // variants may be added in the future
12965pub enum RelinquishFolderMembershipError {
12966    AccessError(SharedFolderAccessError),
12967    /// The current user is the owner of the shared folder. Owners cannot relinquish membership to
12968    /// their own folders. Try unsharing or transferring ownership first.
12969    FolderOwner,
12970    /// The shared folder is currently mounted.  Unmount the shared folder before relinquishing
12971    /// membership.
12972    Mounted,
12973    /// The current user has access to the shared folder via a group.  You can't relinquish
12974    /// membership to folders shared via groups.
12975    GroupAccess,
12976    /// This action cannot be performed on a team shared folder.
12977    TeamFolder,
12978    /// The current user does not have permission to perform this action.
12979    NoPermission,
12980    /// The current user only has inherited access to the shared folder.  You can't relinquish
12981    /// inherited membership to folders.
12982    NoExplicitAccess,
12983    /// Catch-all used for unrecognized values returned from the server. Encountering this value
12984    /// typically indicates that this SDK version is out of date.
12985    Other,
12986}
12987
12988impl<'de> ::serde::de::Deserialize<'de> for RelinquishFolderMembershipError {
12989    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12990        // union deserializer
12991        use serde::de::{self, MapAccess, Visitor};
12992        struct EnumVisitor;
12993        impl<'de> Visitor<'de> for EnumVisitor {
12994            type Value = RelinquishFolderMembershipError;
12995            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12996                f.write_str("a RelinquishFolderMembershipError structure")
12997            }
12998            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
12999                let tag: &str = match map.next_key()? {
13000                    Some(".tag") => map.next_value()?,
13001                    _ => return Err(de::Error::missing_field(".tag"))
13002                };
13003                let value = match tag {
13004                    "access_error" => {
13005                        match map.next_key()? {
13006                            Some("access_error") => RelinquishFolderMembershipError::AccessError(map.next_value()?),
13007                            None => return Err(de::Error::missing_field("access_error")),
13008                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
13009                        }
13010                    }
13011                    "folder_owner" => RelinquishFolderMembershipError::FolderOwner,
13012                    "mounted" => RelinquishFolderMembershipError::Mounted,
13013                    "group_access" => RelinquishFolderMembershipError::GroupAccess,
13014                    "team_folder" => RelinquishFolderMembershipError::TeamFolder,
13015                    "no_permission" => RelinquishFolderMembershipError::NoPermission,
13016                    "no_explicit_access" => RelinquishFolderMembershipError::NoExplicitAccess,
13017                    _ => RelinquishFolderMembershipError::Other,
13018                };
13019                crate::eat_json_fields(&mut map)?;
13020                Ok(value)
13021            }
13022        }
13023        const VARIANTS: &[&str] = &["access_error",
13024                                    "folder_owner",
13025                                    "mounted",
13026                                    "group_access",
13027                                    "team_folder",
13028                                    "no_permission",
13029                                    "no_explicit_access",
13030                                    "other"];
13031        deserializer.deserialize_struct("RelinquishFolderMembershipError", VARIANTS, EnumVisitor)
13032    }
13033}
13034
13035impl ::serde::ser::Serialize for RelinquishFolderMembershipError {
13036    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13037        // union serializer
13038        use serde::ser::SerializeStruct;
13039        match self {
13040            RelinquishFolderMembershipError::AccessError(x) => {
13041                // union or polymporphic struct
13042                let mut s = serializer.serialize_struct("RelinquishFolderMembershipError", 2)?;
13043                s.serialize_field(".tag", "access_error")?;
13044                s.serialize_field("access_error", x)?;
13045                s.end()
13046            }
13047            RelinquishFolderMembershipError::FolderOwner => {
13048                // unit
13049                let mut s = serializer.serialize_struct("RelinquishFolderMembershipError", 1)?;
13050                s.serialize_field(".tag", "folder_owner")?;
13051                s.end()
13052            }
13053            RelinquishFolderMembershipError::Mounted => {
13054                // unit
13055                let mut s = serializer.serialize_struct("RelinquishFolderMembershipError", 1)?;
13056                s.serialize_field(".tag", "mounted")?;
13057                s.end()
13058            }
13059            RelinquishFolderMembershipError::GroupAccess => {
13060                // unit
13061                let mut s = serializer.serialize_struct("RelinquishFolderMembershipError", 1)?;
13062                s.serialize_field(".tag", "group_access")?;
13063                s.end()
13064            }
13065            RelinquishFolderMembershipError::TeamFolder => {
13066                // unit
13067                let mut s = serializer.serialize_struct("RelinquishFolderMembershipError", 1)?;
13068                s.serialize_field(".tag", "team_folder")?;
13069                s.end()
13070            }
13071            RelinquishFolderMembershipError::NoPermission => {
13072                // unit
13073                let mut s = serializer.serialize_struct("RelinquishFolderMembershipError", 1)?;
13074                s.serialize_field(".tag", "no_permission")?;
13075                s.end()
13076            }
13077            RelinquishFolderMembershipError::NoExplicitAccess => {
13078                // unit
13079                let mut s = serializer.serialize_struct("RelinquishFolderMembershipError", 1)?;
13080                s.serialize_field(".tag", "no_explicit_access")?;
13081                s.end()
13082            }
13083            RelinquishFolderMembershipError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
13084        }
13085    }
13086}
13087
13088impl ::std::error::Error for RelinquishFolderMembershipError {
13089    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
13090        match self {
13091            RelinquishFolderMembershipError::AccessError(inner) => Some(inner),
13092            _ => None,
13093        }
13094    }
13095}
13096
13097impl ::std::fmt::Display for RelinquishFolderMembershipError {
13098    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13099        match self {
13100            RelinquishFolderMembershipError::AccessError(inner) => write!(f, "RelinquishFolderMembershipError: {}", inner),
13101            RelinquishFolderMembershipError::FolderOwner => f.write_str("The current user is the owner of the shared folder. Owners cannot relinquish membership to their own folders. Try unsharing or transferring ownership first."),
13102            RelinquishFolderMembershipError::Mounted => f.write_str("The shared folder is currently mounted.  Unmount the shared folder before relinquishing membership."),
13103            RelinquishFolderMembershipError::GroupAccess => f.write_str("The current user has access to the shared folder via a group.  You can't relinquish membership to folders shared via groups."),
13104            RelinquishFolderMembershipError::TeamFolder => f.write_str("This action cannot be performed on a team shared folder."),
13105            RelinquishFolderMembershipError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
13106            RelinquishFolderMembershipError::NoExplicitAccess => f.write_str("The current user only has inherited access to the shared folder.  You can't relinquish inherited membership to folders."),
13107            _ => write!(f, "{:?}", *self),
13108        }
13109    }
13110}
13111
13112/// Arguments for [`remove_file_member_2()`](crate::sharing::remove_file_member_2).
13113#[derive(Debug, Clone, PartialEq, Eq)]
13114#[non_exhaustive] // structs may have more fields added in the future.
13115pub struct RemoveFileMemberArg {
13116    /// File from which to remove members.
13117    pub file: PathOrId,
13118    /// Member to remove from this file. Note that even if an email is specified, it may result in
13119    /// the removal of a user (not an invitee) if the user's main account corresponds to that email
13120    /// address.
13121    pub member: MemberSelector,
13122}
13123
13124impl RemoveFileMemberArg {
13125    pub fn new(file: PathOrId, member: MemberSelector) -> Self {
13126        RemoveFileMemberArg {
13127            file,
13128            member,
13129        }
13130    }
13131}
13132
13133const REMOVE_FILE_MEMBER_ARG_FIELDS: &[&str] = &["file",
13134                                                 "member"];
13135impl RemoveFileMemberArg {
13136    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
13137        map: V,
13138    ) -> Result<RemoveFileMemberArg, V::Error> {
13139        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
13140    }
13141
13142    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
13143        mut map: V,
13144        optional: bool,
13145    ) -> Result<Option<RemoveFileMemberArg>, V::Error> {
13146        let mut field_file = None;
13147        let mut field_member = None;
13148        let mut nothing = true;
13149        while let Some(key) = map.next_key::<&str>()? {
13150            nothing = false;
13151            match key {
13152                "file" => {
13153                    if field_file.is_some() {
13154                        return Err(::serde::de::Error::duplicate_field("file"));
13155                    }
13156                    field_file = Some(map.next_value()?);
13157                }
13158                "member" => {
13159                    if field_member.is_some() {
13160                        return Err(::serde::de::Error::duplicate_field("member"));
13161                    }
13162                    field_member = Some(map.next_value()?);
13163                }
13164                _ => {
13165                    // unknown field allowed and ignored
13166                    map.next_value::<::serde_json::Value>()?;
13167                }
13168            }
13169        }
13170        if optional && nothing {
13171            return Ok(None);
13172        }
13173        let result = RemoveFileMemberArg {
13174            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
13175            member: field_member.ok_or_else(|| ::serde::de::Error::missing_field("member"))?,
13176        };
13177        Ok(Some(result))
13178    }
13179
13180    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
13181        &self,
13182        s: &mut S::SerializeStruct,
13183    ) -> Result<(), S::Error> {
13184        use serde::ser::SerializeStruct;
13185        s.serialize_field("file", &self.file)?;
13186        s.serialize_field("member", &self.member)?;
13187        Ok(())
13188    }
13189}
13190
13191impl<'de> ::serde::de::Deserialize<'de> for RemoveFileMemberArg {
13192    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
13193        // struct deserializer
13194        use serde::de::{MapAccess, Visitor};
13195        struct StructVisitor;
13196        impl<'de> Visitor<'de> for StructVisitor {
13197            type Value = RemoveFileMemberArg;
13198            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13199                f.write_str("a RemoveFileMemberArg struct")
13200            }
13201            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
13202                RemoveFileMemberArg::internal_deserialize(map)
13203            }
13204        }
13205        deserializer.deserialize_struct("RemoveFileMemberArg", REMOVE_FILE_MEMBER_ARG_FIELDS, StructVisitor)
13206    }
13207}
13208
13209impl ::serde::ser::Serialize for RemoveFileMemberArg {
13210    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13211        // struct serializer
13212        use serde::ser::SerializeStruct;
13213        let mut s = serializer.serialize_struct("RemoveFileMemberArg", 2)?;
13214        self.internal_serialize::<S>(&mut s)?;
13215        s.end()
13216    }
13217}
13218
13219/// Errors for [`remove_file_member_2()`](crate::sharing::remove_file_member_2).
13220#[derive(Debug, Clone, PartialEq, Eq)]
13221#[non_exhaustive] // variants may be added in the future
13222pub enum RemoveFileMemberError {
13223    UserError(SharingUserError),
13224    AccessError(SharingFileAccessError),
13225    /// This member does not have explicit access to the file and therefore cannot be removed. The
13226    /// return value is the access that a user might have to the file from a parent folder.
13227    NoExplicitAccess(MemberAccessLevelResult),
13228    /// Catch-all used for unrecognized values returned from the server. Encountering this value
13229    /// typically indicates that this SDK version is out of date.
13230    Other,
13231}
13232
13233impl<'de> ::serde::de::Deserialize<'de> for RemoveFileMemberError {
13234    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
13235        // union deserializer
13236        use serde::de::{self, MapAccess, Visitor};
13237        struct EnumVisitor;
13238        impl<'de> Visitor<'de> for EnumVisitor {
13239            type Value = RemoveFileMemberError;
13240            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13241                f.write_str("a RemoveFileMemberError structure")
13242            }
13243            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
13244                let tag: &str = match map.next_key()? {
13245                    Some(".tag") => map.next_value()?,
13246                    _ => return Err(de::Error::missing_field(".tag"))
13247                };
13248                let value = match tag {
13249                    "user_error" => {
13250                        match map.next_key()? {
13251                            Some("user_error") => RemoveFileMemberError::UserError(map.next_value()?),
13252                            None => return Err(de::Error::missing_field("user_error")),
13253                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
13254                        }
13255                    }
13256                    "access_error" => {
13257                        match map.next_key()? {
13258                            Some("access_error") => RemoveFileMemberError::AccessError(map.next_value()?),
13259                            None => return Err(de::Error::missing_field("access_error")),
13260                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
13261                        }
13262                    }
13263                    "no_explicit_access" => RemoveFileMemberError::NoExplicitAccess(MemberAccessLevelResult::internal_deserialize(&mut map)?),
13264                    _ => RemoveFileMemberError::Other,
13265                };
13266                crate::eat_json_fields(&mut map)?;
13267                Ok(value)
13268            }
13269        }
13270        const VARIANTS: &[&str] = &["user_error",
13271                                    "access_error",
13272                                    "no_explicit_access",
13273                                    "other"];
13274        deserializer.deserialize_struct("RemoveFileMemberError", VARIANTS, EnumVisitor)
13275    }
13276}
13277
13278impl ::serde::ser::Serialize for RemoveFileMemberError {
13279    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13280        // union serializer
13281        use serde::ser::SerializeStruct;
13282        match self {
13283            RemoveFileMemberError::UserError(x) => {
13284                // union or polymporphic struct
13285                let mut s = serializer.serialize_struct("RemoveFileMemberError", 2)?;
13286                s.serialize_field(".tag", "user_error")?;
13287                s.serialize_field("user_error", x)?;
13288                s.end()
13289            }
13290            RemoveFileMemberError::AccessError(x) => {
13291                // union or polymporphic struct
13292                let mut s = serializer.serialize_struct("RemoveFileMemberError", 2)?;
13293                s.serialize_field(".tag", "access_error")?;
13294                s.serialize_field("access_error", x)?;
13295                s.end()
13296            }
13297            RemoveFileMemberError::NoExplicitAccess(x) => {
13298                // struct
13299                let mut s = serializer.serialize_struct("RemoveFileMemberError", 4)?;
13300                s.serialize_field(".tag", "no_explicit_access")?;
13301                x.internal_serialize::<S>(&mut s)?;
13302                s.end()
13303            }
13304            RemoveFileMemberError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
13305        }
13306    }
13307}
13308
13309impl ::std::error::Error for RemoveFileMemberError {
13310    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
13311        match self {
13312            RemoveFileMemberError::UserError(inner) => Some(inner),
13313            RemoveFileMemberError::AccessError(inner) => Some(inner),
13314            _ => None,
13315        }
13316    }
13317}
13318
13319impl ::std::fmt::Display for RemoveFileMemberError {
13320    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13321        match self {
13322            RemoveFileMemberError::UserError(inner) => write!(f, "RemoveFileMemberError: {}", inner),
13323            RemoveFileMemberError::AccessError(inner) => write!(f, "RemoveFileMemberError: {}", inner),
13324            RemoveFileMemberError::NoExplicitAccess(inner) => write!(f, "This member does not have explicit access to the file and therefore cannot be removed. The return value is the access that a user might have to the file from a parent folder: {:?}", inner),
13325            _ => write!(f, "{:?}", *self),
13326        }
13327    }
13328}
13329
13330#[derive(Debug, Clone, PartialEq, Eq)]
13331#[non_exhaustive] // structs may have more fields added in the future.
13332pub struct RemoveFolderMemberArg {
13333    /// The ID for the shared folder.
13334    pub shared_folder_id: crate::types::common::SharedFolderId,
13335    /// The member to remove from the folder.
13336    pub member: MemberSelector,
13337    /// If true, the removed user will keep their copy of the folder after it's unshared, assuming
13338    /// it was mounted. Otherwise, it will be removed from their Dropbox. This must be set to false
13339    /// when removing a group, or when the folder is within a team folder or another shared folder.
13340    pub leave_a_copy: bool,
13341}
13342
13343impl RemoveFolderMemberArg {
13344    pub fn new(
13345        shared_folder_id: crate::types::common::SharedFolderId,
13346        member: MemberSelector,
13347        leave_a_copy: bool,
13348    ) -> Self {
13349        RemoveFolderMemberArg {
13350            shared_folder_id,
13351            member,
13352            leave_a_copy,
13353        }
13354    }
13355}
13356
13357const REMOVE_FOLDER_MEMBER_ARG_FIELDS: &[&str] = &["shared_folder_id",
13358                                                   "member",
13359                                                   "leave_a_copy"];
13360impl RemoveFolderMemberArg {
13361    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
13362        map: V,
13363    ) -> Result<RemoveFolderMemberArg, V::Error> {
13364        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
13365    }
13366
13367    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
13368        mut map: V,
13369        optional: bool,
13370    ) -> Result<Option<RemoveFolderMemberArg>, V::Error> {
13371        let mut field_shared_folder_id = None;
13372        let mut field_member = None;
13373        let mut field_leave_a_copy = None;
13374        let mut nothing = true;
13375        while let Some(key) = map.next_key::<&str>()? {
13376            nothing = false;
13377            match key {
13378                "shared_folder_id" => {
13379                    if field_shared_folder_id.is_some() {
13380                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
13381                    }
13382                    field_shared_folder_id = Some(map.next_value()?);
13383                }
13384                "member" => {
13385                    if field_member.is_some() {
13386                        return Err(::serde::de::Error::duplicate_field("member"));
13387                    }
13388                    field_member = Some(map.next_value()?);
13389                }
13390                "leave_a_copy" => {
13391                    if field_leave_a_copy.is_some() {
13392                        return Err(::serde::de::Error::duplicate_field("leave_a_copy"));
13393                    }
13394                    field_leave_a_copy = Some(map.next_value()?);
13395                }
13396                _ => {
13397                    // unknown field allowed and ignored
13398                    map.next_value::<::serde_json::Value>()?;
13399                }
13400            }
13401        }
13402        if optional && nothing {
13403            return Ok(None);
13404        }
13405        let result = RemoveFolderMemberArg {
13406            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
13407            member: field_member.ok_or_else(|| ::serde::de::Error::missing_field("member"))?,
13408            leave_a_copy: field_leave_a_copy.ok_or_else(|| ::serde::de::Error::missing_field("leave_a_copy"))?,
13409        };
13410        Ok(Some(result))
13411    }
13412
13413    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
13414        &self,
13415        s: &mut S::SerializeStruct,
13416    ) -> Result<(), S::Error> {
13417        use serde::ser::SerializeStruct;
13418        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
13419        s.serialize_field("member", &self.member)?;
13420        s.serialize_field("leave_a_copy", &self.leave_a_copy)?;
13421        Ok(())
13422    }
13423}
13424
13425impl<'de> ::serde::de::Deserialize<'de> for RemoveFolderMemberArg {
13426    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
13427        // struct deserializer
13428        use serde::de::{MapAccess, Visitor};
13429        struct StructVisitor;
13430        impl<'de> Visitor<'de> for StructVisitor {
13431            type Value = RemoveFolderMemberArg;
13432            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13433                f.write_str("a RemoveFolderMemberArg struct")
13434            }
13435            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
13436                RemoveFolderMemberArg::internal_deserialize(map)
13437            }
13438        }
13439        deserializer.deserialize_struct("RemoveFolderMemberArg", REMOVE_FOLDER_MEMBER_ARG_FIELDS, StructVisitor)
13440    }
13441}
13442
13443impl ::serde::ser::Serialize for RemoveFolderMemberArg {
13444    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13445        // struct serializer
13446        use serde::ser::SerializeStruct;
13447        let mut s = serializer.serialize_struct("RemoveFolderMemberArg", 3)?;
13448        self.internal_serialize::<S>(&mut s)?;
13449        s.end()
13450    }
13451}
13452
13453#[derive(Debug, Clone, PartialEq, Eq)]
13454#[non_exhaustive] // variants may be added in the future
13455pub enum RemoveFolderMemberError {
13456    AccessError(SharedFolderAccessError),
13457    MemberError(SharedFolderMemberError),
13458    /// The target user is the owner of the shared folder. You can't remove this user until
13459    /// ownership has been transferred to another member.
13460    FolderOwner,
13461    /// The target user has access to the shared folder via a group.
13462    GroupAccess,
13463    /// This action cannot be performed on a team shared folder.
13464    TeamFolder,
13465    /// The current user does not have permission to perform this action.
13466    NoPermission,
13467    /// This shared folder has too many files for leaving a copy. You can still remove this user
13468    /// without leaving a copy.
13469    TooManyFiles,
13470    /// Catch-all used for unrecognized values returned from the server. Encountering this value
13471    /// typically indicates that this SDK version is out of date.
13472    Other,
13473}
13474
13475impl<'de> ::serde::de::Deserialize<'de> for RemoveFolderMemberError {
13476    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
13477        // union deserializer
13478        use serde::de::{self, MapAccess, Visitor};
13479        struct EnumVisitor;
13480        impl<'de> Visitor<'de> for EnumVisitor {
13481            type Value = RemoveFolderMemberError;
13482            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13483                f.write_str("a RemoveFolderMemberError structure")
13484            }
13485            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
13486                let tag: &str = match map.next_key()? {
13487                    Some(".tag") => map.next_value()?,
13488                    _ => return Err(de::Error::missing_field(".tag"))
13489                };
13490                let value = match tag {
13491                    "access_error" => {
13492                        match map.next_key()? {
13493                            Some("access_error") => RemoveFolderMemberError::AccessError(map.next_value()?),
13494                            None => return Err(de::Error::missing_field("access_error")),
13495                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
13496                        }
13497                    }
13498                    "member_error" => {
13499                        match map.next_key()? {
13500                            Some("member_error") => RemoveFolderMemberError::MemberError(map.next_value()?),
13501                            None => return Err(de::Error::missing_field("member_error")),
13502                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
13503                        }
13504                    }
13505                    "folder_owner" => RemoveFolderMemberError::FolderOwner,
13506                    "group_access" => RemoveFolderMemberError::GroupAccess,
13507                    "team_folder" => RemoveFolderMemberError::TeamFolder,
13508                    "no_permission" => RemoveFolderMemberError::NoPermission,
13509                    "too_many_files" => RemoveFolderMemberError::TooManyFiles,
13510                    _ => RemoveFolderMemberError::Other,
13511                };
13512                crate::eat_json_fields(&mut map)?;
13513                Ok(value)
13514            }
13515        }
13516        const VARIANTS: &[&str] = &["access_error",
13517                                    "member_error",
13518                                    "folder_owner",
13519                                    "group_access",
13520                                    "team_folder",
13521                                    "no_permission",
13522                                    "too_many_files",
13523                                    "other"];
13524        deserializer.deserialize_struct("RemoveFolderMemberError", VARIANTS, EnumVisitor)
13525    }
13526}
13527
13528impl ::serde::ser::Serialize for RemoveFolderMemberError {
13529    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13530        // union serializer
13531        use serde::ser::SerializeStruct;
13532        match self {
13533            RemoveFolderMemberError::AccessError(x) => {
13534                // union or polymporphic struct
13535                let mut s = serializer.serialize_struct("RemoveFolderMemberError", 2)?;
13536                s.serialize_field(".tag", "access_error")?;
13537                s.serialize_field("access_error", x)?;
13538                s.end()
13539            }
13540            RemoveFolderMemberError::MemberError(x) => {
13541                // union or polymporphic struct
13542                let mut s = serializer.serialize_struct("RemoveFolderMemberError", 2)?;
13543                s.serialize_field(".tag", "member_error")?;
13544                s.serialize_field("member_error", x)?;
13545                s.end()
13546            }
13547            RemoveFolderMemberError::FolderOwner => {
13548                // unit
13549                let mut s = serializer.serialize_struct("RemoveFolderMemberError", 1)?;
13550                s.serialize_field(".tag", "folder_owner")?;
13551                s.end()
13552            }
13553            RemoveFolderMemberError::GroupAccess => {
13554                // unit
13555                let mut s = serializer.serialize_struct("RemoveFolderMemberError", 1)?;
13556                s.serialize_field(".tag", "group_access")?;
13557                s.end()
13558            }
13559            RemoveFolderMemberError::TeamFolder => {
13560                // unit
13561                let mut s = serializer.serialize_struct("RemoveFolderMemberError", 1)?;
13562                s.serialize_field(".tag", "team_folder")?;
13563                s.end()
13564            }
13565            RemoveFolderMemberError::NoPermission => {
13566                // unit
13567                let mut s = serializer.serialize_struct("RemoveFolderMemberError", 1)?;
13568                s.serialize_field(".tag", "no_permission")?;
13569                s.end()
13570            }
13571            RemoveFolderMemberError::TooManyFiles => {
13572                // unit
13573                let mut s = serializer.serialize_struct("RemoveFolderMemberError", 1)?;
13574                s.serialize_field(".tag", "too_many_files")?;
13575                s.end()
13576            }
13577            RemoveFolderMemberError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
13578        }
13579    }
13580}
13581
13582impl ::std::error::Error for RemoveFolderMemberError {
13583    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
13584        match self {
13585            RemoveFolderMemberError::AccessError(inner) => Some(inner),
13586            RemoveFolderMemberError::MemberError(inner) => Some(inner),
13587            _ => None,
13588        }
13589    }
13590}
13591
13592impl ::std::fmt::Display for RemoveFolderMemberError {
13593    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13594        match self {
13595            RemoveFolderMemberError::AccessError(inner) => write!(f, "RemoveFolderMemberError: {}", inner),
13596            RemoveFolderMemberError::MemberError(inner) => write!(f, "RemoveFolderMemberError: {}", inner),
13597            RemoveFolderMemberError::FolderOwner => f.write_str("The target user is the owner of the shared folder. You can't remove this user until ownership has been transferred to another member."),
13598            RemoveFolderMemberError::GroupAccess => f.write_str("The target user has access to the shared folder via a group."),
13599            RemoveFolderMemberError::TeamFolder => f.write_str("This action cannot be performed on a team shared folder."),
13600            RemoveFolderMemberError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
13601            RemoveFolderMemberError::TooManyFiles => f.write_str("This shared folder has too many files for leaving a copy. You can still remove this user without leaving a copy."),
13602            _ => write!(f, "{:?}", *self),
13603        }
13604    }
13605}
13606
13607#[derive(Debug, Clone, PartialEq, Eq)]
13608pub enum RemoveMemberJobStatus {
13609    /// The asynchronous job is still in progress.
13610    InProgress,
13611    /// Removing the folder member has finished. The value is information about whether the member
13612    /// has another form of access.
13613    Complete(MemberAccessLevelResult),
13614    Failed(RemoveFolderMemberError),
13615}
13616
13617impl<'de> ::serde::de::Deserialize<'de> for RemoveMemberJobStatus {
13618    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
13619        // union deserializer
13620        use serde::de::{self, MapAccess, Visitor};
13621        struct EnumVisitor;
13622        impl<'de> Visitor<'de> for EnumVisitor {
13623            type Value = RemoveMemberJobStatus;
13624            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13625                f.write_str("a RemoveMemberJobStatus structure")
13626            }
13627            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
13628                let tag: &str = match map.next_key()? {
13629                    Some(".tag") => map.next_value()?,
13630                    _ => return Err(de::Error::missing_field(".tag"))
13631                };
13632                let value = match tag {
13633                    "in_progress" => RemoveMemberJobStatus::InProgress,
13634                    "complete" => RemoveMemberJobStatus::Complete(MemberAccessLevelResult::internal_deserialize(&mut map)?),
13635                    "failed" => {
13636                        match map.next_key()? {
13637                            Some("failed") => RemoveMemberJobStatus::Failed(map.next_value()?),
13638                            None => return Err(de::Error::missing_field("failed")),
13639                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
13640                        }
13641                    }
13642                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
13643                };
13644                crate::eat_json_fields(&mut map)?;
13645                Ok(value)
13646            }
13647        }
13648        const VARIANTS: &[&str] = &["in_progress",
13649                                    "complete",
13650                                    "failed"];
13651        deserializer.deserialize_struct("RemoveMemberJobStatus", VARIANTS, EnumVisitor)
13652    }
13653}
13654
13655impl ::serde::ser::Serialize for RemoveMemberJobStatus {
13656    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13657        // union serializer
13658        use serde::ser::SerializeStruct;
13659        match self {
13660            RemoveMemberJobStatus::InProgress => {
13661                // unit
13662                let mut s = serializer.serialize_struct("RemoveMemberJobStatus", 1)?;
13663                s.serialize_field(".tag", "in_progress")?;
13664                s.end()
13665            }
13666            RemoveMemberJobStatus::Complete(x) => {
13667                // struct
13668                let mut s = serializer.serialize_struct("RemoveMemberJobStatus", 4)?;
13669                s.serialize_field(".tag", "complete")?;
13670                x.internal_serialize::<S>(&mut s)?;
13671                s.end()
13672            }
13673            RemoveMemberJobStatus::Failed(x) => {
13674                // union or polymporphic struct
13675                let mut s = serializer.serialize_struct("RemoveMemberJobStatus", 2)?;
13676                s.serialize_field(".tag", "failed")?;
13677                s.serialize_field("failed", x)?;
13678                s.end()
13679            }
13680        }
13681    }
13682}
13683
13684// union extends crate::types::dbx_async::PollResultBase
13685impl From<crate::types::dbx_async::PollResultBase> for RemoveMemberJobStatus {
13686    fn from(parent: crate::types::dbx_async::PollResultBase) -> Self {
13687        match parent {
13688            crate::types::dbx_async::PollResultBase::InProgress => RemoveMemberJobStatus::InProgress,
13689        }
13690    }
13691}
13692#[derive(Debug, Clone, PartialEq, Eq)]
13693#[non_exhaustive] // variants may be added in the future
13694pub enum RequestedLinkAccessLevel {
13695    /// Users who use the link can view and comment on the content.
13696    Viewer,
13697    /// Users who use the link can edit, view and comment on the content. Note not all file types
13698    /// support edit links yet.
13699    Editor,
13700    /// Request for the maximum access level you can set the link to.
13701    Max,
13702    /// Request for the default access level the user has set.
13703    Default,
13704    /// Catch-all used for unrecognized values returned from the server. Encountering this value
13705    /// typically indicates that this SDK version is out of date.
13706    Other,
13707}
13708
13709impl<'de> ::serde::de::Deserialize<'de> for RequestedLinkAccessLevel {
13710    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
13711        // union deserializer
13712        use serde::de::{self, MapAccess, Visitor};
13713        struct EnumVisitor;
13714        impl<'de> Visitor<'de> for EnumVisitor {
13715            type Value = RequestedLinkAccessLevel;
13716            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13717                f.write_str("a RequestedLinkAccessLevel structure")
13718            }
13719            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
13720                let tag: &str = match map.next_key()? {
13721                    Some(".tag") => map.next_value()?,
13722                    _ => return Err(de::Error::missing_field(".tag"))
13723                };
13724                let value = match tag {
13725                    "viewer" => RequestedLinkAccessLevel::Viewer,
13726                    "editor" => RequestedLinkAccessLevel::Editor,
13727                    "max" => RequestedLinkAccessLevel::Max,
13728                    "default" => RequestedLinkAccessLevel::Default,
13729                    _ => RequestedLinkAccessLevel::Other,
13730                };
13731                crate::eat_json_fields(&mut map)?;
13732                Ok(value)
13733            }
13734        }
13735        const VARIANTS: &[&str] = &["viewer",
13736                                    "editor",
13737                                    "max",
13738                                    "default",
13739                                    "other"];
13740        deserializer.deserialize_struct("RequestedLinkAccessLevel", VARIANTS, EnumVisitor)
13741    }
13742}
13743
13744impl ::serde::ser::Serialize for RequestedLinkAccessLevel {
13745    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13746        // union serializer
13747        use serde::ser::SerializeStruct;
13748        match self {
13749            RequestedLinkAccessLevel::Viewer => {
13750                // unit
13751                let mut s = serializer.serialize_struct("RequestedLinkAccessLevel", 1)?;
13752                s.serialize_field(".tag", "viewer")?;
13753                s.end()
13754            }
13755            RequestedLinkAccessLevel::Editor => {
13756                // unit
13757                let mut s = serializer.serialize_struct("RequestedLinkAccessLevel", 1)?;
13758                s.serialize_field(".tag", "editor")?;
13759                s.end()
13760            }
13761            RequestedLinkAccessLevel::Max => {
13762                // unit
13763                let mut s = serializer.serialize_struct("RequestedLinkAccessLevel", 1)?;
13764                s.serialize_field(".tag", "max")?;
13765                s.end()
13766            }
13767            RequestedLinkAccessLevel::Default => {
13768                // unit
13769                let mut s = serializer.serialize_struct("RequestedLinkAccessLevel", 1)?;
13770                s.serialize_field(".tag", "default")?;
13771                s.end()
13772            }
13773            RequestedLinkAccessLevel::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
13774        }
13775    }
13776}
13777
13778/// The access permission that can be requested by the caller for the shared link. Note that the
13779/// final resolved visibility of the shared link takes into account other aspects, such as team and
13780/// shared folder settings. Check the [`ResolvedVisibility`] for more info on the possible resolved
13781/// visibility values of shared links.
13782#[derive(Debug, Clone, PartialEq, Eq)]
13783pub enum RequestedVisibility {
13784    /// Anyone who has received the link can access it. No login required.
13785    Public,
13786    /// Only members of the same team can access the link. Login is required.
13787    TeamOnly,
13788    /// A link-specific password is required to access the link. Login is not required.
13789    Password,
13790}
13791
13792impl<'de> ::serde::de::Deserialize<'de> for RequestedVisibility {
13793    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
13794        // union deserializer
13795        use serde::de::{self, MapAccess, Visitor};
13796        struct EnumVisitor;
13797        impl<'de> Visitor<'de> for EnumVisitor {
13798            type Value = RequestedVisibility;
13799            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13800                f.write_str("a RequestedVisibility structure")
13801            }
13802            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
13803                let tag: &str = match map.next_key()? {
13804                    Some(".tag") => map.next_value()?,
13805                    _ => return Err(de::Error::missing_field(".tag"))
13806                };
13807                let value = match tag {
13808                    "public" => RequestedVisibility::Public,
13809                    "team_only" => RequestedVisibility::TeamOnly,
13810                    "password" => RequestedVisibility::Password,
13811                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
13812                };
13813                crate::eat_json_fields(&mut map)?;
13814                Ok(value)
13815            }
13816        }
13817        const VARIANTS: &[&str] = &["public",
13818                                    "team_only",
13819                                    "password"];
13820        deserializer.deserialize_struct("RequestedVisibility", VARIANTS, EnumVisitor)
13821    }
13822}
13823
13824impl ::serde::ser::Serialize for RequestedVisibility {
13825    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13826        // union serializer
13827        use serde::ser::SerializeStruct;
13828        match self {
13829            RequestedVisibility::Public => {
13830                // unit
13831                let mut s = serializer.serialize_struct("RequestedVisibility", 1)?;
13832                s.serialize_field(".tag", "public")?;
13833                s.end()
13834            }
13835            RequestedVisibility::TeamOnly => {
13836                // unit
13837                let mut s = serializer.serialize_struct("RequestedVisibility", 1)?;
13838                s.serialize_field(".tag", "team_only")?;
13839                s.end()
13840            }
13841            RequestedVisibility::Password => {
13842                // unit
13843                let mut s = serializer.serialize_struct("RequestedVisibility", 1)?;
13844                s.serialize_field(".tag", "password")?;
13845                s.end()
13846            }
13847        }
13848    }
13849}
13850
13851/// The actual access permissions values of shared links after taking into account user preferences
13852/// and the team and shared folder settings. Check the [`RequestedVisibility`] for more info on the
13853/// possible visibility values that can be set by the shared link's owner.
13854#[derive(Debug, Clone, PartialEq, Eq)]
13855#[non_exhaustive] // variants may be added in the future
13856pub enum ResolvedVisibility {
13857    /// Anyone who has received the link can access it. No login required.
13858    Public,
13859    /// Only members of the same team can access the link. Login is required.
13860    TeamOnly,
13861    /// A link-specific password is required to access the link. Login is not required.
13862    Password,
13863    /// Only members of the same team who have the link-specific password can access the link. Login
13864    /// is required.
13865    TeamAndPassword,
13866    /// Only members of the shared folder containing the linked file can access the link. Login is
13867    /// required.
13868    SharedFolderOnly,
13869    /// The link merely points the user to the content, and does not grant any additional rights.
13870    /// Existing members of the content who use this link can only access the content with their
13871    /// pre-existing access rights. Either on the file directly, or inherited from a parent folder.
13872    NoOne,
13873    /// Only the current user can view this link.
13874    OnlyYou,
13875    /// Catch-all used for unrecognized values returned from the server. Encountering this value
13876    /// typically indicates that this SDK version is out of date.
13877    Other,
13878}
13879
13880impl<'de> ::serde::de::Deserialize<'de> for ResolvedVisibility {
13881    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
13882        // union deserializer
13883        use serde::de::{self, MapAccess, Visitor};
13884        struct EnumVisitor;
13885        impl<'de> Visitor<'de> for EnumVisitor {
13886            type Value = ResolvedVisibility;
13887            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13888                f.write_str("a ResolvedVisibility structure")
13889            }
13890            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
13891                let tag: &str = match map.next_key()? {
13892                    Some(".tag") => map.next_value()?,
13893                    _ => return Err(de::Error::missing_field(".tag"))
13894                };
13895                let value = match tag {
13896                    "public" => ResolvedVisibility::Public,
13897                    "team_only" => ResolvedVisibility::TeamOnly,
13898                    "password" => ResolvedVisibility::Password,
13899                    "team_and_password" => ResolvedVisibility::TeamAndPassword,
13900                    "shared_folder_only" => ResolvedVisibility::SharedFolderOnly,
13901                    "no_one" => ResolvedVisibility::NoOne,
13902                    "only_you" => ResolvedVisibility::OnlyYou,
13903                    _ => ResolvedVisibility::Other,
13904                };
13905                crate::eat_json_fields(&mut map)?;
13906                Ok(value)
13907            }
13908        }
13909        const VARIANTS: &[&str] = &["public",
13910                                    "team_only",
13911                                    "password",
13912                                    "team_and_password",
13913                                    "shared_folder_only",
13914                                    "no_one",
13915                                    "only_you",
13916                                    "other"];
13917        deserializer.deserialize_struct("ResolvedVisibility", VARIANTS, EnumVisitor)
13918    }
13919}
13920
13921impl ::serde::ser::Serialize for ResolvedVisibility {
13922    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13923        // union serializer
13924        use serde::ser::SerializeStruct;
13925        match self {
13926            ResolvedVisibility::Public => {
13927                // unit
13928                let mut s = serializer.serialize_struct("ResolvedVisibility", 1)?;
13929                s.serialize_field(".tag", "public")?;
13930                s.end()
13931            }
13932            ResolvedVisibility::TeamOnly => {
13933                // unit
13934                let mut s = serializer.serialize_struct("ResolvedVisibility", 1)?;
13935                s.serialize_field(".tag", "team_only")?;
13936                s.end()
13937            }
13938            ResolvedVisibility::Password => {
13939                // unit
13940                let mut s = serializer.serialize_struct("ResolvedVisibility", 1)?;
13941                s.serialize_field(".tag", "password")?;
13942                s.end()
13943            }
13944            ResolvedVisibility::TeamAndPassword => {
13945                // unit
13946                let mut s = serializer.serialize_struct("ResolvedVisibility", 1)?;
13947                s.serialize_field(".tag", "team_and_password")?;
13948                s.end()
13949            }
13950            ResolvedVisibility::SharedFolderOnly => {
13951                // unit
13952                let mut s = serializer.serialize_struct("ResolvedVisibility", 1)?;
13953                s.serialize_field(".tag", "shared_folder_only")?;
13954                s.end()
13955            }
13956            ResolvedVisibility::NoOne => {
13957                // unit
13958                let mut s = serializer.serialize_struct("ResolvedVisibility", 1)?;
13959                s.serialize_field(".tag", "no_one")?;
13960                s.end()
13961            }
13962            ResolvedVisibility::OnlyYou => {
13963                // unit
13964                let mut s = serializer.serialize_struct("ResolvedVisibility", 1)?;
13965                s.serialize_field(".tag", "only_you")?;
13966                s.end()
13967            }
13968            ResolvedVisibility::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
13969        }
13970    }
13971}
13972
13973// union extends RequestedVisibility
13974impl From<RequestedVisibility> for ResolvedVisibility {
13975    fn from(parent: RequestedVisibility) -> Self {
13976        match parent {
13977            RequestedVisibility::Public => ResolvedVisibility::Public,
13978            RequestedVisibility::TeamOnly => ResolvedVisibility::TeamOnly,
13979            RequestedVisibility::Password => ResolvedVisibility::Password,
13980        }
13981    }
13982}
13983#[derive(Debug, Clone, PartialEq, Eq)]
13984#[non_exhaustive] // structs may have more fields added in the future.
13985pub struct RevokeSharedLinkArg {
13986    /// URL of the shared link.
13987    pub url: String,
13988}
13989
13990impl RevokeSharedLinkArg {
13991    pub fn new(url: String) -> Self {
13992        RevokeSharedLinkArg {
13993            url,
13994        }
13995    }
13996}
13997
13998const REVOKE_SHARED_LINK_ARG_FIELDS: &[&str] = &["url"];
13999impl RevokeSharedLinkArg {
14000    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
14001        map: V,
14002    ) -> Result<RevokeSharedLinkArg, V::Error> {
14003        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
14004    }
14005
14006    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
14007        mut map: V,
14008        optional: bool,
14009    ) -> Result<Option<RevokeSharedLinkArg>, V::Error> {
14010        let mut field_url = None;
14011        let mut nothing = true;
14012        while let Some(key) = map.next_key::<&str>()? {
14013            nothing = false;
14014            match key {
14015                "url" => {
14016                    if field_url.is_some() {
14017                        return Err(::serde::de::Error::duplicate_field("url"));
14018                    }
14019                    field_url = Some(map.next_value()?);
14020                }
14021                _ => {
14022                    // unknown field allowed and ignored
14023                    map.next_value::<::serde_json::Value>()?;
14024                }
14025            }
14026        }
14027        if optional && nothing {
14028            return Ok(None);
14029        }
14030        let result = RevokeSharedLinkArg {
14031            url: field_url.ok_or_else(|| ::serde::de::Error::missing_field("url"))?,
14032        };
14033        Ok(Some(result))
14034    }
14035
14036    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
14037        &self,
14038        s: &mut S::SerializeStruct,
14039    ) -> Result<(), S::Error> {
14040        use serde::ser::SerializeStruct;
14041        s.serialize_field("url", &self.url)?;
14042        Ok(())
14043    }
14044}
14045
14046impl<'de> ::serde::de::Deserialize<'de> for RevokeSharedLinkArg {
14047    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
14048        // struct deserializer
14049        use serde::de::{MapAccess, Visitor};
14050        struct StructVisitor;
14051        impl<'de> Visitor<'de> for StructVisitor {
14052            type Value = RevokeSharedLinkArg;
14053            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14054                f.write_str("a RevokeSharedLinkArg struct")
14055            }
14056            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
14057                RevokeSharedLinkArg::internal_deserialize(map)
14058            }
14059        }
14060        deserializer.deserialize_struct("RevokeSharedLinkArg", REVOKE_SHARED_LINK_ARG_FIELDS, StructVisitor)
14061    }
14062}
14063
14064impl ::serde::ser::Serialize for RevokeSharedLinkArg {
14065    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
14066        // struct serializer
14067        use serde::ser::SerializeStruct;
14068        let mut s = serializer.serialize_struct("RevokeSharedLinkArg", 1)?;
14069        self.internal_serialize::<S>(&mut s)?;
14070        s.end()
14071    }
14072}
14073
14074#[derive(Debug, Clone, PartialEq, Eq)]
14075#[non_exhaustive] // variants may be added in the future
14076pub enum RevokeSharedLinkError {
14077    /// The shared link wasn't found.
14078    SharedLinkNotFound,
14079    /// The caller is not allowed to access this shared link.
14080    SharedLinkAccessDenied,
14081    /// This type of link is not supported; use [`files::export()`](crate::files::export) instead.
14082    UnsupportedLinkType,
14083    /// Private shared links do not support `path` or `link_password` parameter fields.
14084    UnsupportedParameterField,
14085    /// Shared link is malformed.
14086    SharedLinkMalformed,
14087    /// Catch-all used for unrecognized values returned from the server. Encountering this value
14088    /// typically indicates that this SDK version is out of date.
14089    Other,
14090}
14091
14092impl<'de> ::serde::de::Deserialize<'de> for RevokeSharedLinkError {
14093    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
14094        // union deserializer
14095        use serde::de::{self, MapAccess, Visitor};
14096        struct EnumVisitor;
14097        impl<'de> Visitor<'de> for EnumVisitor {
14098            type Value = RevokeSharedLinkError;
14099            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14100                f.write_str("a RevokeSharedLinkError structure")
14101            }
14102            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
14103                let tag: &str = match map.next_key()? {
14104                    Some(".tag") => map.next_value()?,
14105                    _ => return Err(de::Error::missing_field(".tag"))
14106                };
14107                let value = match tag {
14108                    "shared_link_not_found" => RevokeSharedLinkError::SharedLinkNotFound,
14109                    "shared_link_access_denied" => RevokeSharedLinkError::SharedLinkAccessDenied,
14110                    "unsupported_link_type" => RevokeSharedLinkError::UnsupportedLinkType,
14111                    "unsupported_parameter_field" => RevokeSharedLinkError::UnsupportedParameterField,
14112                    "shared_link_malformed" => RevokeSharedLinkError::SharedLinkMalformed,
14113                    _ => RevokeSharedLinkError::Other,
14114                };
14115                crate::eat_json_fields(&mut map)?;
14116                Ok(value)
14117            }
14118        }
14119        const VARIANTS: &[&str] = &["shared_link_not_found",
14120                                    "shared_link_access_denied",
14121                                    "unsupported_link_type",
14122                                    "unsupported_parameter_field",
14123                                    "other",
14124                                    "shared_link_malformed"];
14125        deserializer.deserialize_struct("RevokeSharedLinkError", VARIANTS, EnumVisitor)
14126    }
14127}
14128
14129impl ::serde::ser::Serialize for RevokeSharedLinkError {
14130    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
14131        // union serializer
14132        use serde::ser::SerializeStruct;
14133        match self {
14134            RevokeSharedLinkError::SharedLinkNotFound => {
14135                // unit
14136                let mut s = serializer.serialize_struct("RevokeSharedLinkError", 1)?;
14137                s.serialize_field(".tag", "shared_link_not_found")?;
14138                s.end()
14139            }
14140            RevokeSharedLinkError::SharedLinkAccessDenied => {
14141                // unit
14142                let mut s = serializer.serialize_struct("RevokeSharedLinkError", 1)?;
14143                s.serialize_field(".tag", "shared_link_access_denied")?;
14144                s.end()
14145            }
14146            RevokeSharedLinkError::UnsupportedLinkType => {
14147                // unit
14148                let mut s = serializer.serialize_struct("RevokeSharedLinkError", 1)?;
14149                s.serialize_field(".tag", "unsupported_link_type")?;
14150                s.end()
14151            }
14152            RevokeSharedLinkError::UnsupportedParameterField => {
14153                // unit
14154                let mut s = serializer.serialize_struct("RevokeSharedLinkError", 1)?;
14155                s.serialize_field(".tag", "unsupported_parameter_field")?;
14156                s.end()
14157            }
14158            RevokeSharedLinkError::SharedLinkMalformed => {
14159                // unit
14160                let mut s = serializer.serialize_struct("RevokeSharedLinkError", 1)?;
14161                s.serialize_field(".tag", "shared_link_malformed")?;
14162                s.end()
14163            }
14164            RevokeSharedLinkError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
14165        }
14166    }
14167}
14168
14169impl ::std::error::Error for RevokeSharedLinkError {
14170}
14171
14172impl ::std::fmt::Display for RevokeSharedLinkError {
14173    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14174        match self {
14175            RevokeSharedLinkError::SharedLinkNotFound => f.write_str("The shared link wasn't found."),
14176            RevokeSharedLinkError::SharedLinkAccessDenied => f.write_str("The caller is not allowed to access this shared link."),
14177            RevokeSharedLinkError::UnsupportedParameterField => f.write_str("Private shared links do not support `path` or `link_password` parameter fields."),
14178            RevokeSharedLinkError::SharedLinkMalformed => f.write_str("Shared link is malformed."),
14179            _ => write!(f, "{:?}", *self),
14180        }
14181    }
14182}
14183
14184// union extends SharedLinkError
14185impl From<SharedLinkError> for RevokeSharedLinkError {
14186    fn from(parent: SharedLinkError) -> Self {
14187        match parent {
14188            SharedLinkError::SharedLinkNotFound => RevokeSharedLinkError::SharedLinkNotFound,
14189            SharedLinkError::SharedLinkAccessDenied => RevokeSharedLinkError::SharedLinkAccessDenied,
14190            SharedLinkError::UnsupportedLinkType => RevokeSharedLinkError::UnsupportedLinkType,
14191            SharedLinkError::UnsupportedParameterField => RevokeSharedLinkError::UnsupportedParameterField,
14192            SharedLinkError::Other => RevokeSharedLinkError::Other,
14193        }
14194    }
14195}
14196#[derive(Debug, Clone, PartialEq, Eq)]
14197#[non_exhaustive] // structs may have more fields added in the future.
14198pub struct SetAccessInheritanceArg {
14199    /// The ID for the shared folder.
14200    pub shared_folder_id: crate::types::common::SharedFolderId,
14201    /// The access inheritance settings for the folder.
14202    pub access_inheritance: AccessInheritance,
14203}
14204
14205impl SetAccessInheritanceArg {
14206    pub fn new(shared_folder_id: crate::types::common::SharedFolderId) -> Self {
14207        SetAccessInheritanceArg {
14208            shared_folder_id,
14209            access_inheritance: AccessInheritance::Inherit,
14210        }
14211    }
14212
14213    pub fn with_access_inheritance(mut self, value: AccessInheritance) -> Self {
14214        self.access_inheritance = value;
14215        self
14216    }
14217}
14218
14219const SET_ACCESS_INHERITANCE_ARG_FIELDS: &[&str] = &["shared_folder_id",
14220                                                     "access_inheritance"];
14221impl SetAccessInheritanceArg {
14222    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
14223        map: V,
14224    ) -> Result<SetAccessInheritanceArg, V::Error> {
14225        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
14226    }
14227
14228    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
14229        mut map: V,
14230        optional: bool,
14231    ) -> Result<Option<SetAccessInheritanceArg>, V::Error> {
14232        let mut field_shared_folder_id = None;
14233        let mut field_access_inheritance = None;
14234        let mut nothing = true;
14235        while let Some(key) = map.next_key::<&str>()? {
14236            nothing = false;
14237            match key {
14238                "shared_folder_id" => {
14239                    if field_shared_folder_id.is_some() {
14240                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
14241                    }
14242                    field_shared_folder_id = Some(map.next_value()?);
14243                }
14244                "access_inheritance" => {
14245                    if field_access_inheritance.is_some() {
14246                        return Err(::serde::de::Error::duplicate_field("access_inheritance"));
14247                    }
14248                    field_access_inheritance = Some(map.next_value()?);
14249                }
14250                _ => {
14251                    // unknown field allowed and ignored
14252                    map.next_value::<::serde_json::Value>()?;
14253                }
14254            }
14255        }
14256        if optional && nothing {
14257            return Ok(None);
14258        }
14259        let result = SetAccessInheritanceArg {
14260            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
14261            access_inheritance: field_access_inheritance.unwrap_or(AccessInheritance::Inherit),
14262        };
14263        Ok(Some(result))
14264    }
14265
14266    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
14267        &self,
14268        s: &mut S::SerializeStruct,
14269    ) -> Result<(), S::Error> {
14270        use serde::ser::SerializeStruct;
14271        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
14272        if self.access_inheritance != AccessInheritance::Inherit {
14273            s.serialize_field("access_inheritance", &self.access_inheritance)?;
14274        }
14275        Ok(())
14276    }
14277}
14278
14279impl<'de> ::serde::de::Deserialize<'de> for SetAccessInheritanceArg {
14280    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
14281        // struct deserializer
14282        use serde::de::{MapAccess, Visitor};
14283        struct StructVisitor;
14284        impl<'de> Visitor<'de> for StructVisitor {
14285            type Value = SetAccessInheritanceArg;
14286            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14287                f.write_str("a SetAccessInheritanceArg struct")
14288            }
14289            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
14290                SetAccessInheritanceArg::internal_deserialize(map)
14291            }
14292        }
14293        deserializer.deserialize_struct("SetAccessInheritanceArg", SET_ACCESS_INHERITANCE_ARG_FIELDS, StructVisitor)
14294    }
14295}
14296
14297impl ::serde::ser::Serialize for SetAccessInheritanceArg {
14298    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
14299        // struct serializer
14300        use serde::ser::SerializeStruct;
14301        let mut s = serializer.serialize_struct("SetAccessInheritanceArg", 2)?;
14302        self.internal_serialize::<S>(&mut s)?;
14303        s.end()
14304    }
14305}
14306
14307#[derive(Debug, Clone, PartialEq, Eq)]
14308#[non_exhaustive] // variants may be added in the future
14309pub enum SetAccessInheritanceError {
14310    /// Unable to access shared folder.
14311    AccessError(SharedFolderAccessError),
14312    /// The current user does not have permission to perform this action.
14313    NoPermission,
14314    /// Catch-all used for unrecognized values returned from the server. Encountering this value
14315    /// typically indicates that this SDK version is out of date.
14316    Other,
14317}
14318
14319impl<'de> ::serde::de::Deserialize<'de> for SetAccessInheritanceError {
14320    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
14321        // union deserializer
14322        use serde::de::{self, MapAccess, Visitor};
14323        struct EnumVisitor;
14324        impl<'de> Visitor<'de> for EnumVisitor {
14325            type Value = SetAccessInheritanceError;
14326            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14327                f.write_str("a SetAccessInheritanceError structure")
14328            }
14329            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
14330                let tag: &str = match map.next_key()? {
14331                    Some(".tag") => map.next_value()?,
14332                    _ => return Err(de::Error::missing_field(".tag"))
14333                };
14334                let value = match tag {
14335                    "access_error" => {
14336                        match map.next_key()? {
14337                            Some("access_error") => SetAccessInheritanceError::AccessError(map.next_value()?),
14338                            None => return Err(de::Error::missing_field("access_error")),
14339                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
14340                        }
14341                    }
14342                    "no_permission" => SetAccessInheritanceError::NoPermission,
14343                    _ => SetAccessInheritanceError::Other,
14344                };
14345                crate::eat_json_fields(&mut map)?;
14346                Ok(value)
14347            }
14348        }
14349        const VARIANTS: &[&str] = &["access_error",
14350                                    "no_permission",
14351                                    "other"];
14352        deserializer.deserialize_struct("SetAccessInheritanceError", VARIANTS, EnumVisitor)
14353    }
14354}
14355
14356impl ::serde::ser::Serialize for SetAccessInheritanceError {
14357    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
14358        // union serializer
14359        use serde::ser::SerializeStruct;
14360        match self {
14361            SetAccessInheritanceError::AccessError(x) => {
14362                // union or polymporphic struct
14363                let mut s = serializer.serialize_struct("SetAccessInheritanceError", 2)?;
14364                s.serialize_field(".tag", "access_error")?;
14365                s.serialize_field("access_error", x)?;
14366                s.end()
14367            }
14368            SetAccessInheritanceError::NoPermission => {
14369                // unit
14370                let mut s = serializer.serialize_struct("SetAccessInheritanceError", 1)?;
14371                s.serialize_field(".tag", "no_permission")?;
14372                s.end()
14373            }
14374            SetAccessInheritanceError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
14375        }
14376    }
14377}
14378
14379impl ::std::error::Error for SetAccessInheritanceError {
14380    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
14381        match self {
14382            SetAccessInheritanceError::AccessError(inner) => Some(inner),
14383            _ => None,
14384        }
14385    }
14386}
14387
14388impl ::std::fmt::Display for SetAccessInheritanceError {
14389    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14390        match self {
14391            SetAccessInheritanceError::AccessError(inner) => write!(f, "Unable to access shared folder: {}", inner),
14392            SetAccessInheritanceError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
14393            _ => write!(f, "{:?}", *self),
14394        }
14395    }
14396}
14397
14398#[derive(Debug, Clone, PartialEq, Eq)]
14399#[non_exhaustive] // structs may have more fields added in the future.
14400pub struct ShareFolderArg {
14401    /// The path or the file id to the folder to share. If it does not exist, then a new one is
14402    /// created.
14403    pub path: crate::types::files::WritePathOrId,
14404    /// Who can add and remove members of this shared folder.
14405    pub acl_update_policy: Option<AclUpdatePolicy>,
14406    /// Whether to force the share to happen asynchronously.
14407    pub force_async: bool,
14408    /// Who can be a member of this shared folder. Only applicable if the current user is on a team.
14409    pub member_policy: Option<MemberPolicy>,
14410    /// The policy to apply to shared links created for content inside this shared folder.  The
14411    /// current user must be on a team to set this policy to [`SharedLinkPolicy::Members`].
14412    pub shared_link_policy: Option<SharedLinkPolicy>,
14413    /// Who can enable/disable viewer info for this shared folder.
14414    pub viewer_info_policy: Option<ViewerInfoPolicy>,
14415    /// The access inheritance settings for the folder.
14416    pub access_inheritance: AccessInheritance,
14417    /// A list of `FolderAction`s corresponding to `FolderPermission`s that should appear in the
14418    /// response's [`SharedFolderMetadata::permissions`](SharedFolderMetadata) field describing the
14419    /// actions the authenticated user can perform on the folder.
14420    pub actions: Option<Vec<FolderAction>>,
14421    /// Settings on the link for this folder.
14422    pub link_settings: Option<LinkSettings>,
14423}
14424
14425impl ShareFolderArg {
14426    pub fn new(path: crate::types::files::WritePathOrId) -> Self {
14427        ShareFolderArg {
14428            path,
14429            acl_update_policy: None,
14430            force_async: false,
14431            member_policy: None,
14432            shared_link_policy: None,
14433            viewer_info_policy: None,
14434            access_inheritance: AccessInheritance::Inherit,
14435            actions: None,
14436            link_settings: None,
14437        }
14438    }
14439
14440    pub fn with_acl_update_policy(mut self, value: AclUpdatePolicy) -> Self {
14441        self.acl_update_policy = Some(value);
14442        self
14443    }
14444
14445    pub fn with_force_async(mut self, value: bool) -> Self {
14446        self.force_async = value;
14447        self
14448    }
14449
14450    pub fn with_member_policy(mut self, value: MemberPolicy) -> Self {
14451        self.member_policy = Some(value);
14452        self
14453    }
14454
14455    pub fn with_shared_link_policy(mut self, value: SharedLinkPolicy) -> Self {
14456        self.shared_link_policy = Some(value);
14457        self
14458    }
14459
14460    pub fn with_viewer_info_policy(mut self, value: ViewerInfoPolicy) -> Self {
14461        self.viewer_info_policy = Some(value);
14462        self
14463    }
14464
14465    pub fn with_access_inheritance(mut self, value: AccessInheritance) -> Self {
14466        self.access_inheritance = value;
14467        self
14468    }
14469
14470    pub fn with_actions(mut self, value: Vec<FolderAction>) -> Self {
14471        self.actions = Some(value);
14472        self
14473    }
14474
14475    pub fn with_link_settings(mut self, value: LinkSettings) -> Self {
14476        self.link_settings = Some(value);
14477        self
14478    }
14479}
14480
14481const SHARE_FOLDER_ARG_FIELDS: &[&str] = &["path",
14482                                           "acl_update_policy",
14483                                           "force_async",
14484                                           "member_policy",
14485                                           "shared_link_policy",
14486                                           "viewer_info_policy",
14487                                           "access_inheritance",
14488                                           "actions",
14489                                           "link_settings"];
14490impl ShareFolderArg {
14491    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
14492        map: V,
14493    ) -> Result<ShareFolderArg, V::Error> {
14494        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
14495    }
14496
14497    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
14498        mut map: V,
14499        optional: bool,
14500    ) -> Result<Option<ShareFolderArg>, V::Error> {
14501        let mut field_path = None;
14502        let mut field_acl_update_policy = None;
14503        let mut field_force_async = None;
14504        let mut field_member_policy = None;
14505        let mut field_shared_link_policy = None;
14506        let mut field_viewer_info_policy = None;
14507        let mut field_access_inheritance = None;
14508        let mut field_actions = None;
14509        let mut field_link_settings = None;
14510        let mut nothing = true;
14511        while let Some(key) = map.next_key::<&str>()? {
14512            nothing = false;
14513            match key {
14514                "path" => {
14515                    if field_path.is_some() {
14516                        return Err(::serde::de::Error::duplicate_field("path"));
14517                    }
14518                    field_path = Some(map.next_value()?);
14519                }
14520                "acl_update_policy" => {
14521                    if field_acl_update_policy.is_some() {
14522                        return Err(::serde::de::Error::duplicate_field("acl_update_policy"));
14523                    }
14524                    field_acl_update_policy = Some(map.next_value()?);
14525                }
14526                "force_async" => {
14527                    if field_force_async.is_some() {
14528                        return Err(::serde::de::Error::duplicate_field("force_async"));
14529                    }
14530                    field_force_async = Some(map.next_value()?);
14531                }
14532                "member_policy" => {
14533                    if field_member_policy.is_some() {
14534                        return Err(::serde::de::Error::duplicate_field("member_policy"));
14535                    }
14536                    field_member_policy = Some(map.next_value()?);
14537                }
14538                "shared_link_policy" => {
14539                    if field_shared_link_policy.is_some() {
14540                        return Err(::serde::de::Error::duplicate_field("shared_link_policy"));
14541                    }
14542                    field_shared_link_policy = Some(map.next_value()?);
14543                }
14544                "viewer_info_policy" => {
14545                    if field_viewer_info_policy.is_some() {
14546                        return Err(::serde::de::Error::duplicate_field("viewer_info_policy"));
14547                    }
14548                    field_viewer_info_policy = Some(map.next_value()?);
14549                }
14550                "access_inheritance" => {
14551                    if field_access_inheritance.is_some() {
14552                        return Err(::serde::de::Error::duplicate_field("access_inheritance"));
14553                    }
14554                    field_access_inheritance = Some(map.next_value()?);
14555                }
14556                "actions" => {
14557                    if field_actions.is_some() {
14558                        return Err(::serde::de::Error::duplicate_field("actions"));
14559                    }
14560                    field_actions = Some(map.next_value()?);
14561                }
14562                "link_settings" => {
14563                    if field_link_settings.is_some() {
14564                        return Err(::serde::de::Error::duplicate_field("link_settings"));
14565                    }
14566                    field_link_settings = Some(map.next_value()?);
14567                }
14568                _ => {
14569                    // unknown field allowed and ignored
14570                    map.next_value::<::serde_json::Value>()?;
14571                }
14572            }
14573        }
14574        if optional && nothing {
14575            return Ok(None);
14576        }
14577        let result = ShareFolderArg {
14578            path: field_path.ok_or_else(|| ::serde::de::Error::missing_field("path"))?,
14579            acl_update_policy: field_acl_update_policy.and_then(Option::flatten),
14580            force_async: field_force_async.unwrap_or(false),
14581            member_policy: field_member_policy.and_then(Option::flatten),
14582            shared_link_policy: field_shared_link_policy.and_then(Option::flatten),
14583            viewer_info_policy: field_viewer_info_policy.and_then(Option::flatten),
14584            access_inheritance: field_access_inheritance.unwrap_or(AccessInheritance::Inherit),
14585            actions: field_actions.and_then(Option::flatten),
14586            link_settings: field_link_settings.and_then(Option::flatten),
14587        };
14588        Ok(Some(result))
14589    }
14590
14591    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
14592        &self,
14593        s: &mut S::SerializeStruct,
14594    ) -> Result<(), S::Error> {
14595        use serde::ser::SerializeStruct;
14596        s.serialize_field("path", &self.path)?;
14597        if let Some(val) = &self.acl_update_policy {
14598            s.serialize_field("acl_update_policy", val)?;
14599        }
14600        if self.force_async {
14601            s.serialize_field("force_async", &self.force_async)?;
14602        }
14603        if let Some(val) = &self.member_policy {
14604            s.serialize_field("member_policy", val)?;
14605        }
14606        if let Some(val) = &self.shared_link_policy {
14607            s.serialize_field("shared_link_policy", val)?;
14608        }
14609        if let Some(val) = &self.viewer_info_policy {
14610            s.serialize_field("viewer_info_policy", val)?;
14611        }
14612        if self.access_inheritance != AccessInheritance::Inherit {
14613            s.serialize_field("access_inheritance", &self.access_inheritance)?;
14614        }
14615        if let Some(val) = &self.actions {
14616            s.serialize_field("actions", val)?;
14617        }
14618        if let Some(val) = &self.link_settings {
14619            s.serialize_field("link_settings", val)?;
14620        }
14621        Ok(())
14622    }
14623}
14624
14625impl<'de> ::serde::de::Deserialize<'de> for ShareFolderArg {
14626    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
14627        // struct deserializer
14628        use serde::de::{MapAccess, Visitor};
14629        struct StructVisitor;
14630        impl<'de> Visitor<'de> for StructVisitor {
14631            type Value = ShareFolderArg;
14632            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14633                f.write_str("a ShareFolderArg struct")
14634            }
14635            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
14636                ShareFolderArg::internal_deserialize(map)
14637            }
14638        }
14639        deserializer.deserialize_struct("ShareFolderArg", SHARE_FOLDER_ARG_FIELDS, StructVisitor)
14640    }
14641}
14642
14643impl ::serde::ser::Serialize for ShareFolderArg {
14644    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
14645        // struct serializer
14646        use serde::ser::SerializeStruct;
14647        let mut s = serializer.serialize_struct("ShareFolderArg", 9)?;
14648        self.internal_serialize::<S>(&mut s)?;
14649        s.end()
14650    }
14651}
14652
14653// struct extends ShareFolderArgBase
14654impl From<ShareFolderArg> for ShareFolderArgBase {
14655    fn from(subtype: ShareFolderArg) -> Self {
14656        Self {
14657            path: subtype.path,
14658            acl_update_policy: subtype.acl_update_policy,
14659            force_async: subtype.force_async,
14660            member_policy: subtype.member_policy,
14661            shared_link_policy: subtype.shared_link_policy,
14662            viewer_info_policy: subtype.viewer_info_policy,
14663            access_inheritance: subtype.access_inheritance,
14664        }
14665    }
14666}
14667#[derive(Debug, Clone, PartialEq, Eq)]
14668#[non_exhaustive] // structs may have more fields added in the future.
14669pub struct ShareFolderArgBase {
14670    /// The path or the file id to the folder to share. If it does not exist, then a new one is
14671    /// created.
14672    pub path: crate::types::files::WritePathOrId,
14673    /// Who can add and remove members of this shared folder.
14674    pub acl_update_policy: Option<AclUpdatePolicy>,
14675    /// Whether to force the share to happen asynchronously.
14676    pub force_async: bool,
14677    /// Who can be a member of this shared folder. Only applicable if the current user is on a team.
14678    pub member_policy: Option<MemberPolicy>,
14679    /// The policy to apply to shared links created for content inside this shared folder.  The
14680    /// current user must be on a team to set this policy to [`SharedLinkPolicy::Members`].
14681    pub shared_link_policy: Option<SharedLinkPolicy>,
14682    /// Who can enable/disable viewer info for this shared folder.
14683    pub viewer_info_policy: Option<ViewerInfoPolicy>,
14684    /// The access inheritance settings for the folder.
14685    pub access_inheritance: AccessInheritance,
14686}
14687
14688impl ShareFolderArgBase {
14689    pub fn new(path: crate::types::files::WritePathOrId) -> Self {
14690        ShareFolderArgBase {
14691            path,
14692            acl_update_policy: None,
14693            force_async: false,
14694            member_policy: None,
14695            shared_link_policy: None,
14696            viewer_info_policy: None,
14697            access_inheritance: AccessInheritance::Inherit,
14698        }
14699    }
14700
14701    pub fn with_acl_update_policy(mut self, value: AclUpdatePolicy) -> Self {
14702        self.acl_update_policy = Some(value);
14703        self
14704    }
14705
14706    pub fn with_force_async(mut self, value: bool) -> Self {
14707        self.force_async = value;
14708        self
14709    }
14710
14711    pub fn with_member_policy(mut self, value: MemberPolicy) -> Self {
14712        self.member_policy = Some(value);
14713        self
14714    }
14715
14716    pub fn with_shared_link_policy(mut self, value: SharedLinkPolicy) -> Self {
14717        self.shared_link_policy = Some(value);
14718        self
14719    }
14720
14721    pub fn with_viewer_info_policy(mut self, value: ViewerInfoPolicy) -> Self {
14722        self.viewer_info_policy = Some(value);
14723        self
14724    }
14725
14726    pub fn with_access_inheritance(mut self, value: AccessInheritance) -> Self {
14727        self.access_inheritance = value;
14728        self
14729    }
14730}
14731
14732const SHARE_FOLDER_ARG_BASE_FIELDS: &[&str] = &["path",
14733                                                "acl_update_policy",
14734                                                "force_async",
14735                                                "member_policy",
14736                                                "shared_link_policy",
14737                                                "viewer_info_policy",
14738                                                "access_inheritance"];
14739impl ShareFolderArgBase {
14740    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
14741        map: V,
14742    ) -> Result<ShareFolderArgBase, V::Error> {
14743        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
14744    }
14745
14746    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
14747        mut map: V,
14748        optional: bool,
14749    ) -> Result<Option<ShareFolderArgBase>, V::Error> {
14750        let mut field_path = None;
14751        let mut field_acl_update_policy = None;
14752        let mut field_force_async = None;
14753        let mut field_member_policy = None;
14754        let mut field_shared_link_policy = None;
14755        let mut field_viewer_info_policy = None;
14756        let mut field_access_inheritance = None;
14757        let mut nothing = true;
14758        while let Some(key) = map.next_key::<&str>()? {
14759            nothing = false;
14760            match key {
14761                "path" => {
14762                    if field_path.is_some() {
14763                        return Err(::serde::de::Error::duplicate_field("path"));
14764                    }
14765                    field_path = Some(map.next_value()?);
14766                }
14767                "acl_update_policy" => {
14768                    if field_acl_update_policy.is_some() {
14769                        return Err(::serde::de::Error::duplicate_field("acl_update_policy"));
14770                    }
14771                    field_acl_update_policy = Some(map.next_value()?);
14772                }
14773                "force_async" => {
14774                    if field_force_async.is_some() {
14775                        return Err(::serde::de::Error::duplicate_field("force_async"));
14776                    }
14777                    field_force_async = Some(map.next_value()?);
14778                }
14779                "member_policy" => {
14780                    if field_member_policy.is_some() {
14781                        return Err(::serde::de::Error::duplicate_field("member_policy"));
14782                    }
14783                    field_member_policy = Some(map.next_value()?);
14784                }
14785                "shared_link_policy" => {
14786                    if field_shared_link_policy.is_some() {
14787                        return Err(::serde::de::Error::duplicate_field("shared_link_policy"));
14788                    }
14789                    field_shared_link_policy = Some(map.next_value()?);
14790                }
14791                "viewer_info_policy" => {
14792                    if field_viewer_info_policy.is_some() {
14793                        return Err(::serde::de::Error::duplicate_field("viewer_info_policy"));
14794                    }
14795                    field_viewer_info_policy = Some(map.next_value()?);
14796                }
14797                "access_inheritance" => {
14798                    if field_access_inheritance.is_some() {
14799                        return Err(::serde::de::Error::duplicate_field("access_inheritance"));
14800                    }
14801                    field_access_inheritance = Some(map.next_value()?);
14802                }
14803                _ => {
14804                    // unknown field allowed and ignored
14805                    map.next_value::<::serde_json::Value>()?;
14806                }
14807            }
14808        }
14809        if optional && nothing {
14810            return Ok(None);
14811        }
14812        let result = ShareFolderArgBase {
14813            path: field_path.ok_or_else(|| ::serde::de::Error::missing_field("path"))?,
14814            acl_update_policy: field_acl_update_policy.and_then(Option::flatten),
14815            force_async: field_force_async.unwrap_or(false),
14816            member_policy: field_member_policy.and_then(Option::flatten),
14817            shared_link_policy: field_shared_link_policy.and_then(Option::flatten),
14818            viewer_info_policy: field_viewer_info_policy.and_then(Option::flatten),
14819            access_inheritance: field_access_inheritance.unwrap_or(AccessInheritance::Inherit),
14820        };
14821        Ok(Some(result))
14822    }
14823
14824    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
14825        &self,
14826        s: &mut S::SerializeStruct,
14827    ) -> Result<(), S::Error> {
14828        use serde::ser::SerializeStruct;
14829        s.serialize_field("path", &self.path)?;
14830        if let Some(val) = &self.acl_update_policy {
14831            s.serialize_field("acl_update_policy", val)?;
14832        }
14833        if self.force_async {
14834            s.serialize_field("force_async", &self.force_async)?;
14835        }
14836        if let Some(val) = &self.member_policy {
14837            s.serialize_field("member_policy", val)?;
14838        }
14839        if let Some(val) = &self.shared_link_policy {
14840            s.serialize_field("shared_link_policy", val)?;
14841        }
14842        if let Some(val) = &self.viewer_info_policy {
14843            s.serialize_field("viewer_info_policy", val)?;
14844        }
14845        if self.access_inheritance != AccessInheritance::Inherit {
14846            s.serialize_field("access_inheritance", &self.access_inheritance)?;
14847        }
14848        Ok(())
14849    }
14850}
14851
14852impl<'de> ::serde::de::Deserialize<'de> for ShareFolderArgBase {
14853    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
14854        // struct deserializer
14855        use serde::de::{MapAccess, Visitor};
14856        struct StructVisitor;
14857        impl<'de> Visitor<'de> for StructVisitor {
14858            type Value = ShareFolderArgBase;
14859            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14860                f.write_str("a ShareFolderArgBase struct")
14861            }
14862            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
14863                ShareFolderArgBase::internal_deserialize(map)
14864            }
14865        }
14866        deserializer.deserialize_struct("ShareFolderArgBase", SHARE_FOLDER_ARG_BASE_FIELDS, StructVisitor)
14867    }
14868}
14869
14870impl ::serde::ser::Serialize for ShareFolderArgBase {
14871    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
14872        // struct serializer
14873        use serde::ser::SerializeStruct;
14874        let mut s = serializer.serialize_struct("ShareFolderArgBase", 7)?;
14875        self.internal_serialize::<S>(&mut s)?;
14876        s.end()
14877    }
14878}
14879
14880#[derive(Debug, Clone, PartialEq, Eq)]
14881#[non_exhaustive] // variants may be added in the future
14882pub enum ShareFolderError {
14883    /// This user's email address is not verified. This functionality is only available on accounts
14884    /// with a verified email address. Users can verify their email address
14885    /// [here](https://www.dropbox.com/help/317).
14886    EmailUnverified,
14887    /// [`ShareFolderArg::path`](ShareFolderArg) is invalid.
14888    BadPath(SharePathError),
14889    /// Team policy or group sharing settings are more restrictive than
14890    /// [`ShareFolderArg::member_policy`](ShareFolderArg).
14891    TeamPolicyDisallowsMemberPolicy,
14892    /// The current user's account is not allowed to select the specified
14893    /// [`ShareFolderArg::shared_link_policy`](ShareFolderArg).
14894    DisallowedSharedLinkPolicy,
14895    /// The current user does not have permission to perform this action.
14896    NoPermission,
14897    /// Catch-all used for unrecognized values returned from the server. Encountering this value
14898    /// typically indicates that this SDK version is out of date.
14899    Other,
14900}
14901
14902impl<'de> ::serde::de::Deserialize<'de> for ShareFolderError {
14903    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
14904        // union deserializer
14905        use serde::de::{self, MapAccess, Visitor};
14906        struct EnumVisitor;
14907        impl<'de> Visitor<'de> for EnumVisitor {
14908            type Value = ShareFolderError;
14909            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14910                f.write_str("a ShareFolderError structure")
14911            }
14912            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
14913                let tag: &str = match map.next_key()? {
14914                    Some(".tag") => map.next_value()?,
14915                    _ => return Err(de::Error::missing_field(".tag"))
14916                };
14917                let value = match tag {
14918                    "email_unverified" => ShareFolderError::EmailUnverified,
14919                    "bad_path" => {
14920                        match map.next_key()? {
14921                            Some("bad_path") => ShareFolderError::BadPath(map.next_value()?),
14922                            None => return Err(de::Error::missing_field("bad_path")),
14923                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
14924                        }
14925                    }
14926                    "team_policy_disallows_member_policy" => ShareFolderError::TeamPolicyDisallowsMemberPolicy,
14927                    "disallowed_shared_link_policy" => ShareFolderError::DisallowedSharedLinkPolicy,
14928                    "no_permission" => ShareFolderError::NoPermission,
14929                    _ => ShareFolderError::Other,
14930                };
14931                crate::eat_json_fields(&mut map)?;
14932                Ok(value)
14933            }
14934        }
14935        const VARIANTS: &[&str] = &["email_unverified",
14936                                    "bad_path",
14937                                    "team_policy_disallows_member_policy",
14938                                    "disallowed_shared_link_policy",
14939                                    "other",
14940                                    "no_permission"];
14941        deserializer.deserialize_struct("ShareFolderError", VARIANTS, EnumVisitor)
14942    }
14943}
14944
14945impl ::serde::ser::Serialize for ShareFolderError {
14946    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
14947        // union serializer
14948        use serde::ser::SerializeStruct;
14949        match self {
14950            ShareFolderError::EmailUnverified => {
14951                // unit
14952                let mut s = serializer.serialize_struct("ShareFolderError", 1)?;
14953                s.serialize_field(".tag", "email_unverified")?;
14954                s.end()
14955            }
14956            ShareFolderError::BadPath(x) => {
14957                // union or polymporphic struct
14958                let mut s = serializer.serialize_struct("ShareFolderError", 2)?;
14959                s.serialize_field(".tag", "bad_path")?;
14960                s.serialize_field("bad_path", x)?;
14961                s.end()
14962            }
14963            ShareFolderError::TeamPolicyDisallowsMemberPolicy => {
14964                // unit
14965                let mut s = serializer.serialize_struct("ShareFolderError", 1)?;
14966                s.serialize_field(".tag", "team_policy_disallows_member_policy")?;
14967                s.end()
14968            }
14969            ShareFolderError::DisallowedSharedLinkPolicy => {
14970                // unit
14971                let mut s = serializer.serialize_struct("ShareFolderError", 1)?;
14972                s.serialize_field(".tag", "disallowed_shared_link_policy")?;
14973                s.end()
14974            }
14975            ShareFolderError::NoPermission => {
14976                // unit
14977                let mut s = serializer.serialize_struct("ShareFolderError", 1)?;
14978                s.serialize_field(".tag", "no_permission")?;
14979                s.end()
14980            }
14981            ShareFolderError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
14982        }
14983    }
14984}
14985
14986impl ::std::error::Error for ShareFolderError {
14987    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
14988        match self {
14989            ShareFolderError::BadPath(inner) => Some(inner),
14990            _ => None,
14991        }
14992    }
14993}
14994
14995impl ::std::fmt::Display for ShareFolderError {
14996    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14997        match self {
14998            ShareFolderError::BadPath(inner) => write!(f, "ShareFolderError: {}", inner),
14999            ShareFolderError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
15000            _ => write!(f, "{:?}", *self),
15001        }
15002    }
15003}
15004
15005// union extends ShareFolderErrorBase
15006impl From<ShareFolderErrorBase> for ShareFolderError {
15007    fn from(parent: ShareFolderErrorBase) -> Self {
15008        match parent {
15009            ShareFolderErrorBase::EmailUnverified => ShareFolderError::EmailUnverified,
15010            ShareFolderErrorBase::BadPath(x) => ShareFolderError::BadPath(x),
15011            ShareFolderErrorBase::TeamPolicyDisallowsMemberPolicy => ShareFolderError::TeamPolicyDisallowsMemberPolicy,
15012            ShareFolderErrorBase::DisallowedSharedLinkPolicy => ShareFolderError::DisallowedSharedLinkPolicy,
15013            ShareFolderErrorBase::Other => ShareFolderError::Other,
15014        }
15015    }
15016}
15017#[derive(Debug, Clone, PartialEq, Eq)]
15018#[non_exhaustive] // variants may be added in the future
15019pub enum ShareFolderErrorBase {
15020    /// This user's email address is not verified. This functionality is only available on accounts
15021    /// with a verified email address. Users can verify their email address
15022    /// [here](https://www.dropbox.com/help/317).
15023    EmailUnverified,
15024    /// [`ShareFolderArg::path`](ShareFolderArg) is invalid.
15025    BadPath(SharePathError),
15026    /// Team policy or group sharing settings are more restrictive than
15027    /// [`ShareFolderArg::member_policy`](ShareFolderArg).
15028    TeamPolicyDisallowsMemberPolicy,
15029    /// The current user's account is not allowed to select the specified
15030    /// [`ShareFolderArg::shared_link_policy`](ShareFolderArg).
15031    DisallowedSharedLinkPolicy,
15032    /// Catch-all used for unrecognized values returned from the server. Encountering this value
15033    /// typically indicates that this SDK version is out of date.
15034    Other,
15035}
15036
15037impl<'de> ::serde::de::Deserialize<'de> for ShareFolderErrorBase {
15038    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
15039        // union deserializer
15040        use serde::de::{self, MapAccess, Visitor};
15041        struct EnumVisitor;
15042        impl<'de> Visitor<'de> for EnumVisitor {
15043            type Value = ShareFolderErrorBase;
15044            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
15045                f.write_str("a ShareFolderErrorBase structure")
15046            }
15047            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
15048                let tag: &str = match map.next_key()? {
15049                    Some(".tag") => map.next_value()?,
15050                    _ => return Err(de::Error::missing_field(".tag"))
15051                };
15052                let value = match tag {
15053                    "email_unverified" => ShareFolderErrorBase::EmailUnverified,
15054                    "bad_path" => {
15055                        match map.next_key()? {
15056                            Some("bad_path") => ShareFolderErrorBase::BadPath(map.next_value()?),
15057                            None => return Err(de::Error::missing_field("bad_path")),
15058                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
15059                        }
15060                    }
15061                    "team_policy_disallows_member_policy" => ShareFolderErrorBase::TeamPolicyDisallowsMemberPolicy,
15062                    "disallowed_shared_link_policy" => ShareFolderErrorBase::DisallowedSharedLinkPolicy,
15063                    _ => ShareFolderErrorBase::Other,
15064                };
15065                crate::eat_json_fields(&mut map)?;
15066                Ok(value)
15067            }
15068        }
15069        const VARIANTS: &[&str] = &["email_unverified",
15070                                    "bad_path",
15071                                    "team_policy_disallows_member_policy",
15072                                    "disallowed_shared_link_policy",
15073                                    "other"];
15074        deserializer.deserialize_struct("ShareFolderErrorBase", VARIANTS, EnumVisitor)
15075    }
15076}
15077
15078impl ::serde::ser::Serialize for ShareFolderErrorBase {
15079    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
15080        // union serializer
15081        use serde::ser::SerializeStruct;
15082        match self {
15083            ShareFolderErrorBase::EmailUnverified => {
15084                // unit
15085                let mut s = serializer.serialize_struct("ShareFolderErrorBase", 1)?;
15086                s.serialize_field(".tag", "email_unverified")?;
15087                s.end()
15088            }
15089            ShareFolderErrorBase::BadPath(x) => {
15090                // union or polymporphic struct
15091                let mut s = serializer.serialize_struct("ShareFolderErrorBase", 2)?;
15092                s.serialize_field(".tag", "bad_path")?;
15093                s.serialize_field("bad_path", x)?;
15094                s.end()
15095            }
15096            ShareFolderErrorBase::TeamPolicyDisallowsMemberPolicy => {
15097                // unit
15098                let mut s = serializer.serialize_struct("ShareFolderErrorBase", 1)?;
15099                s.serialize_field(".tag", "team_policy_disallows_member_policy")?;
15100                s.end()
15101            }
15102            ShareFolderErrorBase::DisallowedSharedLinkPolicy => {
15103                // unit
15104                let mut s = serializer.serialize_struct("ShareFolderErrorBase", 1)?;
15105                s.serialize_field(".tag", "disallowed_shared_link_policy")?;
15106                s.end()
15107            }
15108            ShareFolderErrorBase::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
15109        }
15110    }
15111}
15112
15113#[derive(Debug, Clone, PartialEq, Eq)]
15114#[non_exhaustive] // variants may be added in the future
15115pub enum ShareFolderErrorBaseV2 {
15116    /// This user's email address is not verified. This functionality is only available on accounts
15117    /// with a verified email address. Users can verify their email address
15118    /// [here](https://www.dropbox.com/help/317).
15119    EmailUnverified,
15120    /// Team policy or group sharing settings are more restrictive than
15121    /// [`ShareFolderArg::member_policy`](ShareFolderArg).
15122    TeamPolicyDisallowsMemberPolicy,
15123    /// The current user's account is not allowed to select the specified
15124    /// [`ShareFolderArg::shared_link_policy`](ShareFolderArg).
15125    DisallowedSharedLinkPolicy,
15126    /// Catch-all used for unrecognized values returned from the server. Encountering this value
15127    /// typically indicates that this SDK version is out of date.
15128    Other,
15129}
15130
15131impl<'de> ::serde::de::Deserialize<'de> for ShareFolderErrorBaseV2 {
15132    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
15133        // union deserializer
15134        use serde::de::{self, MapAccess, Visitor};
15135        struct EnumVisitor;
15136        impl<'de> Visitor<'de> for EnumVisitor {
15137            type Value = ShareFolderErrorBaseV2;
15138            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
15139                f.write_str("a ShareFolderErrorBaseV2 structure")
15140            }
15141            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
15142                let tag: &str = match map.next_key()? {
15143                    Some(".tag") => map.next_value()?,
15144                    _ => return Err(de::Error::missing_field(".tag"))
15145                };
15146                let value = match tag {
15147                    "email_unverified" => ShareFolderErrorBaseV2::EmailUnverified,
15148                    "team_policy_disallows_member_policy" => ShareFolderErrorBaseV2::TeamPolicyDisallowsMemberPolicy,
15149                    "disallowed_shared_link_policy" => ShareFolderErrorBaseV2::DisallowedSharedLinkPolicy,
15150                    _ => ShareFolderErrorBaseV2::Other,
15151                };
15152                crate::eat_json_fields(&mut map)?;
15153                Ok(value)
15154            }
15155        }
15156        const VARIANTS: &[&str] = &["email_unverified",
15157                                    "team_policy_disallows_member_policy",
15158                                    "disallowed_shared_link_policy",
15159                                    "other"];
15160        deserializer.deserialize_struct("ShareFolderErrorBaseV2", VARIANTS, EnumVisitor)
15161    }
15162}
15163
15164impl ::serde::ser::Serialize for ShareFolderErrorBaseV2 {
15165    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
15166        // union serializer
15167        use serde::ser::SerializeStruct;
15168        match self {
15169            ShareFolderErrorBaseV2::EmailUnverified => {
15170                // unit
15171                let mut s = serializer.serialize_struct("ShareFolderErrorBaseV2", 1)?;
15172                s.serialize_field(".tag", "email_unverified")?;
15173                s.end()
15174            }
15175            ShareFolderErrorBaseV2::TeamPolicyDisallowsMemberPolicy => {
15176                // unit
15177                let mut s = serializer.serialize_struct("ShareFolderErrorBaseV2", 1)?;
15178                s.serialize_field(".tag", "team_policy_disallows_member_policy")?;
15179                s.end()
15180            }
15181            ShareFolderErrorBaseV2::DisallowedSharedLinkPolicy => {
15182                // unit
15183                let mut s = serializer.serialize_struct("ShareFolderErrorBaseV2", 1)?;
15184                s.serialize_field(".tag", "disallowed_shared_link_policy")?;
15185                s.end()
15186            }
15187            ShareFolderErrorBaseV2::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
15188        }
15189    }
15190}
15191
15192#[derive(Debug, Clone, PartialEq, Eq)]
15193#[non_exhaustive] // variants may be added in the future
15194pub enum ShareFolderErrorV2 {
15195    /// This user's email address is not verified. This functionality is only available on accounts
15196    /// with a verified email address. Users can verify their email address
15197    /// [here](https://www.dropbox.com/help/317).
15198    EmailUnverified,
15199    /// Team policy or group sharing settings are more restrictive than
15200    /// [`ShareFolderArg::member_policy`](ShareFolderArg).
15201    TeamPolicyDisallowsMemberPolicy,
15202    /// The current user's account is not allowed to select the specified
15203    /// [`ShareFolderArg::shared_link_policy`](ShareFolderArg).
15204    DisallowedSharedLinkPolicy,
15205    /// The current user does not have permission to perform this action.
15206    NoPermission,
15207    /// Catch-all used for unrecognized values returned from the server. Encountering this value
15208    /// typically indicates that this SDK version is out of date.
15209    Other,
15210}
15211
15212impl<'de> ::serde::de::Deserialize<'de> for ShareFolderErrorV2 {
15213    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
15214        // union deserializer
15215        use serde::de::{self, MapAccess, Visitor};
15216        struct EnumVisitor;
15217        impl<'de> Visitor<'de> for EnumVisitor {
15218            type Value = ShareFolderErrorV2;
15219            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
15220                f.write_str("a ShareFolderErrorV2 structure")
15221            }
15222            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
15223                let tag: &str = match map.next_key()? {
15224                    Some(".tag") => map.next_value()?,
15225                    _ => return Err(de::Error::missing_field(".tag"))
15226                };
15227                let value = match tag {
15228                    "email_unverified" => ShareFolderErrorV2::EmailUnverified,
15229                    "team_policy_disallows_member_policy" => ShareFolderErrorV2::TeamPolicyDisallowsMemberPolicy,
15230                    "disallowed_shared_link_policy" => ShareFolderErrorV2::DisallowedSharedLinkPolicy,
15231                    "no_permission" => ShareFolderErrorV2::NoPermission,
15232                    _ => ShareFolderErrorV2::Other,
15233                };
15234                crate::eat_json_fields(&mut map)?;
15235                Ok(value)
15236            }
15237        }
15238        const VARIANTS: &[&str] = &["email_unverified",
15239                                    "team_policy_disallows_member_policy",
15240                                    "disallowed_shared_link_policy",
15241                                    "other",
15242                                    "no_permission"];
15243        deserializer.deserialize_struct("ShareFolderErrorV2", VARIANTS, EnumVisitor)
15244    }
15245}
15246
15247impl ::serde::ser::Serialize for ShareFolderErrorV2 {
15248    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
15249        // union serializer
15250        use serde::ser::SerializeStruct;
15251        match self {
15252            ShareFolderErrorV2::EmailUnverified => {
15253                // unit
15254                let mut s = serializer.serialize_struct("ShareFolderErrorV2", 1)?;
15255                s.serialize_field(".tag", "email_unverified")?;
15256                s.end()
15257            }
15258            ShareFolderErrorV2::TeamPolicyDisallowsMemberPolicy => {
15259                // unit
15260                let mut s = serializer.serialize_struct("ShareFolderErrorV2", 1)?;
15261                s.serialize_field(".tag", "team_policy_disallows_member_policy")?;
15262                s.end()
15263            }
15264            ShareFolderErrorV2::DisallowedSharedLinkPolicy => {
15265                // unit
15266                let mut s = serializer.serialize_struct("ShareFolderErrorV2", 1)?;
15267                s.serialize_field(".tag", "disallowed_shared_link_policy")?;
15268                s.end()
15269            }
15270            ShareFolderErrorV2::NoPermission => {
15271                // unit
15272                let mut s = serializer.serialize_struct("ShareFolderErrorV2", 1)?;
15273                s.serialize_field(".tag", "no_permission")?;
15274                s.end()
15275            }
15276            ShareFolderErrorV2::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
15277        }
15278    }
15279}
15280
15281// union extends ShareFolderErrorBaseV2
15282impl From<ShareFolderErrorBaseV2> for ShareFolderErrorV2 {
15283    fn from(parent: ShareFolderErrorBaseV2) -> Self {
15284        match parent {
15285            ShareFolderErrorBaseV2::EmailUnverified => ShareFolderErrorV2::EmailUnverified,
15286            ShareFolderErrorBaseV2::TeamPolicyDisallowsMemberPolicy => ShareFolderErrorV2::TeamPolicyDisallowsMemberPolicy,
15287            ShareFolderErrorBaseV2::DisallowedSharedLinkPolicy => ShareFolderErrorV2::DisallowedSharedLinkPolicy,
15288            ShareFolderErrorBaseV2::Other => ShareFolderErrorV2::Other,
15289        }
15290    }
15291}
15292#[derive(Debug, Clone, PartialEq, Eq)]
15293pub enum ShareFolderJobStatus {
15294    /// The asynchronous job is still in progress.
15295    InProgress,
15296    /// The share job has finished. The value is the metadata for the folder.
15297    Complete(SharedFolderMetadata),
15298    Failed(ShareFolderError),
15299}
15300
15301impl<'de> ::serde::de::Deserialize<'de> for ShareFolderJobStatus {
15302    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
15303        // union deserializer
15304        use serde::de::{self, MapAccess, Visitor};
15305        struct EnumVisitor;
15306        impl<'de> Visitor<'de> for EnumVisitor {
15307            type Value = ShareFolderJobStatus;
15308            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
15309                f.write_str("a ShareFolderJobStatus structure")
15310            }
15311            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
15312                let tag: &str = match map.next_key()? {
15313                    Some(".tag") => map.next_value()?,
15314                    _ => return Err(de::Error::missing_field(".tag"))
15315                };
15316                let value = match tag {
15317                    "in_progress" => ShareFolderJobStatus::InProgress,
15318                    "complete" => ShareFolderJobStatus::Complete(SharedFolderMetadata::internal_deserialize(&mut map)?),
15319                    "failed" => {
15320                        match map.next_key()? {
15321                            Some("failed") => ShareFolderJobStatus::Failed(map.next_value()?),
15322                            None => return Err(de::Error::missing_field("failed")),
15323                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
15324                        }
15325                    }
15326                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
15327                };
15328                crate::eat_json_fields(&mut map)?;
15329                Ok(value)
15330            }
15331        }
15332        const VARIANTS: &[&str] = &["in_progress",
15333                                    "complete",
15334                                    "failed"];
15335        deserializer.deserialize_struct("ShareFolderJobStatus", VARIANTS, EnumVisitor)
15336    }
15337}
15338
15339impl ::serde::ser::Serialize for ShareFolderJobStatus {
15340    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
15341        // union serializer
15342        use serde::ser::SerializeStruct;
15343        match self {
15344            ShareFolderJobStatus::InProgress => {
15345                // unit
15346                let mut s = serializer.serialize_struct("ShareFolderJobStatus", 1)?;
15347                s.serialize_field(".tag", "in_progress")?;
15348                s.end()
15349            }
15350            ShareFolderJobStatus::Complete(x) => {
15351                // struct
15352                let mut s = serializer.serialize_struct("ShareFolderJobStatus", 19)?;
15353                s.serialize_field(".tag", "complete")?;
15354                x.internal_serialize::<S>(&mut s)?;
15355                s.end()
15356            }
15357            ShareFolderJobStatus::Failed(x) => {
15358                // union or polymporphic struct
15359                let mut s = serializer.serialize_struct("ShareFolderJobStatus", 2)?;
15360                s.serialize_field(".tag", "failed")?;
15361                s.serialize_field("failed", x)?;
15362                s.end()
15363            }
15364        }
15365    }
15366}
15367
15368// union extends crate::types::dbx_async::PollResultBase
15369impl From<crate::types::dbx_async::PollResultBase> for ShareFolderJobStatus {
15370    fn from(parent: crate::types::dbx_async::PollResultBase) -> Self {
15371        match parent {
15372            crate::types::dbx_async::PollResultBase::InProgress => ShareFolderJobStatus::InProgress,
15373        }
15374    }
15375}
15376#[derive(Debug, Clone, PartialEq, Eq)]
15377pub enum ShareFolderLaunch {
15378    /// This response indicates that the processing is asynchronous. The string is an id that can be
15379    /// used to obtain the status of the asynchronous job.
15380    AsyncJobId(crate::types::dbx_async::AsyncJobId),
15381    Complete(SharedFolderMetadata),
15382}
15383
15384impl<'de> ::serde::de::Deserialize<'de> for ShareFolderLaunch {
15385    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
15386        // union deserializer
15387        use serde::de::{self, MapAccess, Visitor};
15388        struct EnumVisitor;
15389        impl<'de> Visitor<'de> for EnumVisitor {
15390            type Value = ShareFolderLaunch;
15391            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
15392                f.write_str("a ShareFolderLaunch structure")
15393            }
15394            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
15395                let tag: &str = match map.next_key()? {
15396                    Some(".tag") => map.next_value()?,
15397                    _ => return Err(de::Error::missing_field(".tag"))
15398                };
15399                let value = match tag {
15400                    "async_job_id" => {
15401                        match map.next_key()? {
15402                            Some("async_job_id") => ShareFolderLaunch::AsyncJobId(map.next_value()?),
15403                            None => return Err(de::Error::missing_field("async_job_id")),
15404                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
15405                        }
15406                    }
15407                    "complete" => ShareFolderLaunch::Complete(SharedFolderMetadata::internal_deserialize(&mut map)?),
15408                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
15409                };
15410                crate::eat_json_fields(&mut map)?;
15411                Ok(value)
15412            }
15413        }
15414        const VARIANTS: &[&str] = &["async_job_id",
15415                                    "complete"];
15416        deserializer.deserialize_struct("ShareFolderLaunch", VARIANTS, EnumVisitor)
15417    }
15418}
15419
15420impl ::serde::ser::Serialize for ShareFolderLaunch {
15421    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
15422        // union serializer
15423        use serde::ser::SerializeStruct;
15424        match self {
15425            ShareFolderLaunch::AsyncJobId(x) => {
15426                // primitive
15427                let mut s = serializer.serialize_struct("ShareFolderLaunch", 2)?;
15428                s.serialize_field(".tag", "async_job_id")?;
15429                s.serialize_field("async_job_id", x)?;
15430                s.end()
15431            }
15432            ShareFolderLaunch::Complete(x) => {
15433                // struct
15434                let mut s = serializer.serialize_struct("ShareFolderLaunch", 19)?;
15435                s.serialize_field(".tag", "complete")?;
15436                x.internal_serialize::<S>(&mut s)?;
15437                s.end()
15438            }
15439        }
15440    }
15441}
15442
15443// union extends crate::types::dbx_async::LaunchResultBase
15444impl From<crate::types::dbx_async::LaunchResultBase> for ShareFolderLaunch {
15445    fn from(parent: crate::types::dbx_async::LaunchResultBase) -> Self {
15446        match parent {
15447            crate::types::dbx_async::LaunchResultBase::AsyncJobId(x) => ShareFolderLaunch::AsyncJobId(x),
15448        }
15449    }
15450}
15451#[derive(Debug, Clone, PartialEq, Eq)]
15452#[non_exhaustive] // variants may be added in the future
15453pub enum SharePathError {
15454    /// A file is at the specified path.
15455    IsFile,
15456    /// We do not support sharing a folder inside a shared folder.
15457    InsideSharedFolder,
15458    /// We do not support shared folders that contain shared folders.
15459    ContainsSharedFolder,
15460    /// We do not support shared folders that contain app folders.
15461    ContainsAppFolder,
15462    /// We do not support shared folders that contain team folders.
15463    ContainsTeamFolder,
15464    /// We do not support sharing an app folder.
15465    IsAppFolder,
15466    /// We do not support sharing a folder inside an app folder.
15467    InsideAppFolder,
15468    /// A public folder can't be shared this way. Use a public link instead.
15469    IsPublicFolder,
15470    /// A folder inside a public folder can't be shared this way. Use a public link instead.
15471    InsidePublicFolder,
15472    /// Folder is already shared. Contains metadata about the existing shared folder.
15473    AlreadyShared(SharedFolderMetadata),
15474    /// Path is not valid.
15475    InvalidPath,
15476    /// We do not support sharing a Mac OS X package.
15477    IsOsxPackage,
15478    /// We do not support sharing a folder inside a Mac OS X package.
15479    InsideOsxPackage,
15480    /// We do not support sharing the Vault folder.
15481    IsVault,
15482    /// We do not support sharing a folder inside a locked Vault.
15483    IsVaultLocked,
15484    /// We do not support sharing the Family folder.
15485    IsFamily,
15486    /// Catch-all used for unrecognized values returned from the server. Encountering this value
15487    /// typically indicates that this SDK version is out of date.
15488    Other,
15489}
15490
15491impl<'de> ::serde::de::Deserialize<'de> for SharePathError {
15492    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
15493        // union deserializer
15494        use serde::de::{self, MapAccess, Visitor};
15495        struct EnumVisitor;
15496        impl<'de> Visitor<'de> for EnumVisitor {
15497            type Value = SharePathError;
15498            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
15499                f.write_str("a SharePathError structure")
15500            }
15501            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
15502                let tag: &str = match map.next_key()? {
15503                    Some(".tag") => map.next_value()?,
15504                    _ => return Err(de::Error::missing_field(".tag"))
15505                };
15506                let value = match tag {
15507                    "is_file" => SharePathError::IsFile,
15508                    "inside_shared_folder" => SharePathError::InsideSharedFolder,
15509                    "contains_shared_folder" => SharePathError::ContainsSharedFolder,
15510                    "contains_app_folder" => SharePathError::ContainsAppFolder,
15511                    "contains_team_folder" => SharePathError::ContainsTeamFolder,
15512                    "is_app_folder" => SharePathError::IsAppFolder,
15513                    "inside_app_folder" => SharePathError::InsideAppFolder,
15514                    "is_public_folder" => SharePathError::IsPublicFolder,
15515                    "inside_public_folder" => SharePathError::InsidePublicFolder,
15516                    "already_shared" => SharePathError::AlreadyShared(SharedFolderMetadata::internal_deserialize(&mut map)?),
15517                    "invalid_path" => SharePathError::InvalidPath,
15518                    "is_osx_package" => SharePathError::IsOsxPackage,
15519                    "inside_osx_package" => SharePathError::InsideOsxPackage,
15520                    "is_vault" => SharePathError::IsVault,
15521                    "is_vault_locked" => SharePathError::IsVaultLocked,
15522                    "is_family" => SharePathError::IsFamily,
15523                    _ => SharePathError::Other,
15524                };
15525                crate::eat_json_fields(&mut map)?;
15526                Ok(value)
15527            }
15528        }
15529        const VARIANTS: &[&str] = &["is_file",
15530                                    "inside_shared_folder",
15531                                    "contains_shared_folder",
15532                                    "contains_app_folder",
15533                                    "contains_team_folder",
15534                                    "is_app_folder",
15535                                    "inside_app_folder",
15536                                    "is_public_folder",
15537                                    "inside_public_folder",
15538                                    "already_shared",
15539                                    "invalid_path",
15540                                    "is_osx_package",
15541                                    "inside_osx_package",
15542                                    "is_vault",
15543                                    "is_vault_locked",
15544                                    "is_family",
15545                                    "other"];
15546        deserializer.deserialize_struct("SharePathError", VARIANTS, EnumVisitor)
15547    }
15548}
15549
15550impl ::serde::ser::Serialize for SharePathError {
15551    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
15552        // union serializer
15553        use serde::ser::SerializeStruct;
15554        match self {
15555            SharePathError::IsFile => {
15556                // unit
15557                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15558                s.serialize_field(".tag", "is_file")?;
15559                s.end()
15560            }
15561            SharePathError::InsideSharedFolder => {
15562                // unit
15563                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15564                s.serialize_field(".tag", "inside_shared_folder")?;
15565                s.end()
15566            }
15567            SharePathError::ContainsSharedFolder => {
15568                // unit
15569                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15570                s.serialize_field(".tag", "contains_shared_folder")?;
15571                s.end()
15572            }
15573            SharePathError::ContainsAppFolder => {
15574                // unit
15575                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15576                s.serialize_field(".tag", "contains_app_folder")?;
15577                s.end()
15578            }
15579            SharePathError::ContainsTeamFolder => {
15580                // unit
15581                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15582                s.serialize_field(".tag", "contains_team_folder")?;
15583                s.end()
15584            }
15585            SharePathError::IsAppFolder => {
15586                // unit
15587                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15588                s.serialize_field(".tag", "is_app_folder")?;
15589                s.end()
15590            }
15591            SharePathError::InsideAppFolder => {
15592                // unit
15593                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15594                s.serialize_field(".tag", "inside_app_folder")?;
15595                s.end()
15596            }
15597            SharePathError::IsPublicFolder => {
15598                // unit
15599                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15600                s.serialize_field(".tag", "is_public_folder")?;
15601                s.end()
15602            }
15603            SharePathError::InsidePublicFolder => {
15604                // unit
15605                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15606                s.serialize_field(".tag", "inside_public_folder")?;
15607                s.end()
15608            }
15609            SharePathError::AlreadyShared(x) => {
15610                // struct
15611                let mut s = serializer.serialize_struct("SharePathError", 19)?;
15612                s.serialize_field(".tag", "already_shared")?;
15613                x.internal_serialize::<S>(&mut s)?;
15614                s.end()
15615            }
15616            SharePathError::InvalidPath => {
15617                // unit
15618                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15619                s.serialize_field(".tag", "invalid_path")?;
15620                s.end()
15621            }
15622            SharePathError::IsOsxPackage => {
15623                // unit
15624                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15625                s.serialize_field(".tag", "is_osx_package")?;
15626                s.end()
15627            }
15628            SharePathError::InsideOsxPackage => {
15629                // unit
15630                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15631                s.serialize_field(".tag", "inside_osx_package")?;
15632                s.end()
15633            }
15634            SharePathError::IsVault => {
15635                // unit
15636                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15637                s.serialize_field(".tag", "is_vault")?;
15638                s.end()
15639            }
15640            SharePathError::IsVaultLocked => {
15641                // unit
15642                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15643                s.serialize_field(".tag", "is_vault_locked")?;
15644                s.end()
15645            }
15646            SharePathError::IsFamily => {
15647                // unit
15648                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15649                s.serialize_field(".tag", "is_family")?;
15650                s.end()
15651            }
15652            SharePathError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
15653        }
15654    }
15655}
15656
15657impl ::std::error::Error for SharePathError {
15658}
15659
15660impl ::std::fmt::Display for SharePathError {
15661    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
15662        match self {
15663            SharePathError::IsFile => f.write_str("A file is at the specified path."),
15664            SharePathError::InsideSharedFolder => f.write_str("We do not support sharing a folder inside a shared folder."),
15665            SharePathError::ContainsSharedFolder => f.write_str("We do not support shared folders that contain shared folders."),
15666            SharePathError::ContainsAppFolder => f.write_str("We do not support shared folders that contain app folders."),
15667            SharePathError::ContainsTeamFolder => f.write_str("We do not support shared folders that contain team folders."),
15668            SharePathError::IsAppFolder => f.write_str("We do not support sharing an app folder."),
15669            SharePathError::InsideAppFolder => f.write_str("We do not support sharing a folder inside an app folder."),
15670            SharePathError::IsPublicFolder => f.write_str("A public folder can't be shared this way. Use a public link instead."),
15671            SharePathError::InsidePublicFolder => f.write_str("A folder inside a public folder can't be shared this way. Use a public link instead."),
15672            SharePathError::AlreadyShared(inner) => write!(f, "Folder is already shared. Contains metadata about the existing shared folder: {:?}", inner),
15673            SharePathError::InvalidPath => f.write_str("Path is not valid."),
15674            SharePathError::IsOsxPackage => f.write_str("We do not support sharing a Mac OS X package."),
15675            SharePathError::InsideOsxPackage => f.write_str("We do not support sharing a folder inside a Mac OS X package."),
15676            SharePathError::IsVault => f.write_str("We do not support sharing the Vault folder."),
15677            SharePathError::IsVaultLocked => f.write_str("We do not support sharing a folder inside a locked Vault."),
15678            SharePathError::IsFamily => f.write_str("We do not support sharing the Family folder."),
15679            _ => write!(f, "{:?}", *self),
15680        }
15681    }
15682}
15683
15684#[derive(Debug, Clone, PartialEq, Eq)]
15685#[non_exhaustive] // variants may be added in the future
15686pub enum SharePathErrorBaseV2 {
15687    /// A file is at the specified path.
15688    IsFile,
15689    /// We do not support sharing a folder inside a shared folder.
15690    InsideSharedFolder,
15691    /// We do not support shared folders that contain shared folders.
15692    ContainsSharedFolder,
15693    /// We do not support shared folders that contain team folders.
15694    ContainsTeamFolder,
15695    /// We do not support sharing an app folder.
15696    IsAppFolder,
15697    /// We do not support sharing a folder inside an app folder.
15698    InsideAppFolder,
15699    /// A public folder can't be shared this way. Use a public link instead.
15700    IsPublicFolder,
15701    /// A folder inside a public folder can't be shared this way. Use a public link instead.
15702    InsidePublicFolder,
15703    /// Folder is already shared. Contains metadata about the existing shared folder.
15704    AlreadyShared(SharedFolderMetadata),
15705    /// Path is not valid.
15706    InvalidPath,
15707    /// We do not support sharing a Mac OS X package.
15708    IsOsxPackage,
15709    /// We do not support sharing a folder inside a Mac OS X package.
15710    InsideOsxPackage,
15711    /// We do not support sharing the Vault folder.
15712    IsVault,
15713    /// We do not support sharing a folder inside a locked Vault.
15714    IsVaultLocked,
15715    /// Catch-all used for unrecognized values returned from the server. Encountering this value
15716    /// typically indicates that this SDK version is out of date.
15717    Other,
15718}
15719
15720impl<'de> ::serde::de::Deserialize<'de> for SharePathErrorBaseV2 {
15721    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
15722        // union deserializer
15723        use serde::de::{self, MapAccess, Visitor};
15724        struct EnumVisitor;
15725        impl<'de> Visitor<'de> for EnumVisitor {
15726            type Value = SharePathErrorBaseV2;
15727            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
15728                f.write_str("a SharePathErrorBaseV2 structure")
15729            }
15730            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
15731                let tag: &str = match map.next_key()? {
15732                    Some(".tag") => map.next_value()?,
15733                    _ => return Err(de::Error::missing_field(".tag"))
15734                };
15735                let value = match tag {
15736                    "is_file" => SharePathErrorBaseV2::IsFile,
15737                    "inside_shared_folder" => SharePathErrorBaseV2::InsideSharedFolder,
15738                    "contains_shared_folder" => SharePathErrorBaseV2::ContainsSharedFolder,
15739                    "contains_team_folder" => SharePathErrorBaseV2::ContainsTeamFolder,
15740                    "is_app_folder" => SharePathErrorBaseV2::IsAppFolder,
15741                    "inside_app_folder" => SharePathErrorBaseV2::InsideAppFolder,
15742                    "is_public_folder" => SharePathErrorBaseV2::IsPublicFolder,
15743                    "inside_public_folder" => SharePathErrorBaseV2::InsidePublicFolder,
15744                    "already_shared" => SharePathErrorBaseV2::AlreadyShared(SharedFolderMetadata::internal_deserialize(&mut map)?),
15745                    "invalid_path" => SharePathErrorBaseV2::InvalidPath,
15746                    "is_osx_package" => SharePathErrorBaseV2::IsOsxPackage,
15747                    "inside_osx_package" => SharePathErrorBaseV2::InsideOsxPackage,
15748                    "is_vault" => SharePathErrorBaseV2::IsVault,
15749                    "is_vault_locked" => SharePathErrorBaseV2::IsVaultLocked,
15750                    _ => SharePathErrorBaseV2::Other,
15751                };
15752                crate::eat_json_fields(&mut map)?;
15753                Ok(value)
15754            }
15755        }
15756        const VARIANTS: &[&str] = &["is_file",
15757                                    "inside_shared_folder",
15758                                    "contains_shared_folder",
15759                                    "contains_team_folder",
15760                                    "is_app_folder",
15761                                    "inside_app_folder",
15762                                    "is_public_folder",
15763                                    "inside_public_folder",
15764                                    "already_shared",
15765                                    "invalid_path",
15766                                    "is_osx_package",
15767                                    "inside_osx_package",
15768                                    "is_vault",
15769                                    "is_vault_locked",
15770                                    "other"];
15771        deserializer.deserialize_struct("SharePathErrorBaseV2", VARIANTS, EnumVisitor)
15772    }
15773}
15774
15775impl ::serde::ser::Serialize for SharePathErrorBaseV2 {
15776    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
15777        // union serializer
15778        use serde::ser::SerializeStruct;
15779        match self {
15780            SharePathErrorBaseV2::IsFile => {
15781                // unit
15782                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 1)?;
15783                s.serialize_field(".tag", "is_file")?;
15784                s.end()
15785            }
15786            SharePathErrorBaseV2::InsideSharedFolder => {
15787                // unit
15788                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 1)?;
15789                s.serialize_field(".tag", "inside_shared_folder")?;
15790                s.end()
15791            }
15792            SharePathErrorBaseV2::ContainsSharedFolder => {
15793                // unit
15794                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 1)?;
15795                s.serialize_field(".tag", "contains_shared_folder")?;
15796                s.end()
15797            }
15798            SharePathErrorBaseV2::ContainsTeamFolder => {
15799                // unit
15800                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 1)?;
15801                s.serialize_field(".tag", "contains_team_folder")?;
15802                s.end()
15803            }
15804            SharePathErrorBaseV2::IsAppFolder => {
15805                // unit
15806                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 1)?;
15807                s.serialize_field(".tag", "is_app_folder")?;
15808                s.end()
15809            }
15810            SharePathErrorBaseV2::InsideAppFolder => {
15811                // unit
15812                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 1)?;
15813                s.serialize_field(".tag", "inside_app_folder")?;
15814                s.end()
15815            }
15816            SharePathErrorBaseV2::IsPublicFolder => {
15817                // unit
15818                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 1)?;
15819                s.serialize_field(".tag", "is_public_folder")?;
15820                s.end()
15821            }
15822            SharePathErrorBaseV2::InsidePublicFolder => {
15823                // unit
15824                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 1)?;
15825                s.serialize_field(".tag", "inside_public_folder")?;
15826                s.end()
15827            }
15828            SharePathErrorBaseV2::AlreadyShared(x) => {
15829                // struct
15830                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 19)?;
15831                s.serialize_field(".tag", "already_shared")?;
15832                x.internal_serialize::<S>(&mut s)?;
15833                s.end()
15834            }
15835            SharePathErrorBaseV2::InvalidPath => {
15836                // unit
15837                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 1)?;
15838                s.serialize_field(".tag", "invalid_path")?;
15839                s.end()
15840            }
15841            SharePathErrorBaseV2::IsOsxPackage => {
15842                // unit
15843                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 1)?;
15844                s.serialize_field(".tag", "is_osx_package")?;
15845                s.end()
15846            }
15847            SharePathErrorBaseV2::InsideOsxPackage => {
15848                // unit
15849                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 1)?;
15850                s.serialize_field(".tag", "inside_osx_package")?;
15851                s.end()
15852            }
15853            SharePathErrorBaseV2::IsVault => {
15854                // unit
15855                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 1)?;
15856                s.serialize_field(".tag", "is_vault")?;
15857                s.end()
15858            }
15859            SharePathErrorBaseV2::IsVaultLocked => {
15860                // unit
15861                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 1)?;
15862                s.serialize_field(".tag", "is_vault_locked")?;
15863                s.end()
15864            }
15865            SharePathErrorBaseV2::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
15866        }
15867    }
15868}
15869
15870#[derive(Debug, Clone, PartialEq, Eq)]
15871#[non_exhaustive] // variants may be added in the future
15872pub enum SharePathErrorV2 {
15873    /// A file is at the specified path.
15874    IsFile,
15875    /// We do not support sharing a folder inside a shared folder.
15876    InsideSharedFolder,
15877    /// We do not support shared folders that contain shared folders.
15878    ContainsSharedFolder,
15879    /// We do not support shared folders that contain team folders.
15880    ContainsTeamFolder,
15881    /// We do not support sharing an app folder.
15882    IsAppFolder,
15883    /// We do not support sharing a folder inside an app folder.
15884    InsideAppFolder,
15885    /// A public folder can't be shared this way. Use a public link instead.
15886    IsPublicFolder,
15887    /// A folder inside a public folder can't be shared this way. Use a public link instead.
15888    InsidePublicFolder,
15889    /// Folder is already shared. Contains metadata about the existing shared folder.
15890    AlreadyShared(SharedFolderMetadata),
15891    /// Path is not valid.
15892    InvalidPath,
15893    /// We do not support sharing a Mac OS X package.
15894    IsOsxPackage,
15895    /// We do not support sharing a folder inside a Mac OS X package.
15896    InsideOsxPackage,
15897    /// We do not support sharing the Vault folder.
15898    IsVault,
15899    /// We do not support sharing a folder inside a locked Vault.
15900    IsVaultLocked,
15901    /// We do not support sharing the Family folder.
15902    IsFamily,
15903    /// We do not support shared folders that contain app folders.
15904    ContainsAppFolder,
15905    /// Catch-all used for unrecognized values returned from the server. Encountering this value
15906    /// typically indicates that this SDK version is out of date.
15907    Other,
15908}
15909
15910impl<'de> ::serde::de::Deserialize<'de> for SharePathErrorV2 {
15911    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
15912        // union deserializer
15913        use serde::de::{self, MapAccess, Visitor};
15914        struct EnumVisitor;
15915        impl<'de> Visitor<'de> for EnumVisitor {
15916            type Value = SharePathErrorV2;
15917            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
15918                f.write_str("a SharePathErrorV2 structure")
15919            }
15920            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
15921                let tag: &str = match map.next_key()? {
15922                    Some(".tag") => map.next_value()?,
15923                    _ => return Err(de::Error::missing_field(".tag"))
15924                };
15925                let value = match tag {
15926                    "is_file" => SharePathErrorV2::IsFile,
15927                    "inside_shared_folder" => SharePathErrorV2::InsideSharedFolder,
15928                    "contains_shared_folder" => SharePathErrorV2::ContainsSharedFolder,
15929                    "contains_team_folder" => SharePathErrorV2::ContainsTeamFolder,
15930                    "is_app_folder" => SharePathErrorV2::IsAppFolder,
15931                    "inside_app_folder" => SharePathErrorV2::InsideAppFolder,
15932                    "is_public_folder" => SharePathErrorV2::IsPublicFolder,
15933                    "inside_public_folder" => SharePathErrorV2::InsidePublicFolder,
15934                    "already_shared" => SharePathErrorV2::AlreadyShared(SharedFolderMetadata::internal_deserialize(&mut map)?),
15935                    "invalid_path" => SharePathErrorV2::InvalidPath,
15936                    "is_osx_package" => SharePathErrorV2::IsOsxPackage,
15937                    "inside_osx_package" => SharePathErrorV2::InsideOsxPackage,
15938                    "is_vault" => SharePathErrorV2::IsVault,
15939                    "is_vault_locked" => SharePathErrorV2::IsVaultLocked,
15940                    "is_family" => SharePathErrorV2::IsFamily,
15941                    "contains_app_folder" => SharePathErrorV2::ContainsAppFolder,
15942                    _ => SharePathErrorV2::Other,
15943                };
15944                crate::eat_json_fields(&mut map)?;
15945                Ok(value)
15946            }
15947        }
15948        const VARIANTS: &[&str] = &["is_file",
15949                                    "inside_shared_folder",
15950                                    "contains_shared_folder",
15951                                    "contains_team_folder",
15952                                    "is_app_folder",
15953                                    "inside_app_folder",
15954                                    "is_public_folder",
15955                                    "inside_public_folder",
15956                                    "already_shared",
15957                                    "invalid_path",
15958                                    "is_osx_package",
15959                                    "inside_osx_package",
15960                                    "is_vault",
15961                                    "is_vault_locked",
15962                                    "other",
15963                                    "is_family",
15964                                    "contains_app_folder"];
15965        deserializer.deserialize_struct("SharePathErrorV2", VARIANTS, EnumVisitor)
15966    }
15967}
15968
15969impl ::serde::ser::Serialize for SharePathErrorV2 {
15970    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
15971        // union serializer
15972        use serde::ser::SerializeStruct;
15973        match self {
15974            SharePathErrorV2::IsFile => {
15975                // unit
15976                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
15977                s.serialize_field(".tag", "is_file")?;
15978                s.end()
15979            }
15980            SharePathErrorV2::InsideSharedFolder => {
15981                // unit
15982                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
15983                s.serialize_field(".tag", "inside_shared_folder")?;
15984                s.end()
15985            }
15986            SharePathErrorV2::ContainsSharedFolder => {
15987                // unit
15988                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
15989                s.serialize_field(".tag", "contains_shared_folder")?;
15990                s.end()
15991            }
15992            SharePathErrorV2::ContainsTeamFolder => {
15993                // unit
15994                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
15995                s.serialize_field(".tag", "contains_team_folder")?;
15996                s.end()
15997            }
15998            SharePathErrorV2::IsAppFolder => {
15999                // unit
16000                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
16001                s.serialize_field(".tag", "is_app_folder")?;
16002                s.end()
16003            }
16004            SharePathErrorV2::InsideAppFolder => {
16005                // unit
16006                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
16007                s.serialize_field(".tag", "inside_app_folder")?;
16008                s.end()
16009            }
16010            SharePathErrorV2::IsPublicFolder => {
16011                // unit
16012                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
16013                s.serialize_field(".tag", "is_public_folder")?;
16014                s.end()
16015            }
16016            SharePathErrorV2::InsidePublicFolder => {
16017                // unit
16018                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
16019                s.serialize_field(".tag", "inside_public_folder")?;
16020                s.end()
16021            }
16022            SharePathErrorV2::AlreadyShared(x) => {
16023                // struct
16024                let mut s = serializer.serialize_struct("SharePathErrorV2", 19)?;
16025                s.serialize_field(".tag", "already_shared")?;
16026                x.internal_serialize::<S>(&mut s)?;
16027                s.end()
16028            }
16029            SharePathErrorV2::InvalidPath => {
16030                // unit
16031                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
16032                s.serialize_field(".tag", "invalid_path")?;
16033                s.end()
16034            }
16035            SharePathErrorV2::IsOsxPackage => {
16036                // unit
16037                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
16038                s.serialize_field(".tag", "is_osx_package")?;
16039                s.end()
16040            }
16041            SharePathErrorV2::InsideOsxPackage => {
16042                // unit
16043                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
16044                s.serialize_field(".tag", "inside_osx_package")?;
16045                s.end()
16046            }
16047            SharePathErrorV2::IsVault => {
16048                // unit
16049                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
16050                s.serialize_field(".tag", "is_vault")?;
16051                s.end()
16052            }
16053            SharePathErrorV2::IsVaultLocked => {
16054                // unit
16055                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
16056                s.serialize_field(".tag", "is_vault_locked")?;
16057                s.end()
16058            }
16059            SharePathErrorV2::IsFamily => {
16060                // unit
16061                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
16062                s.serialize_field(".tag", "is_family")?;
16063                s.end()
16064            }
16065            SharePathErrorV2::ContainsAppFolder => {
16066                // unit
16067                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
16068                s.serialize_field(".tag", "contains_app_folder")?;
16069                s.end()
16070            }
16071            SharePathErrorV2::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
16072        }
16073    }
16074}
16075
16076// union extends SharePathErrorBaseV2
16077impl From<SharePathErrorBaseV2> for SharePathErrorV2 {
16078    fn from(parent: SharePathErrorBaseV2) -> Self {
16079        match parent {
16080            SharePathErrorBaseV2::IsFile => SharePathErrorV2::IsFile,
16081            SharePathErrorBaseV2::InsideSharedFolder => SharePathErrorV2::InsideSharedFolder,
16082            SharePathErrorBaseV2::ContainsSharedFolder => SharePathErrorV2::ContainsSharedFolder,
16083            SharePathErrorBaseV2::ContainsTeamFolder => SharePathErrorV2::ContainsTeamFolder,
16084            SharePathErrorBaseV2::IsAppFolder => SharePathErrorV2::IsAppFolder,
16085            SharePathErrorBaseV2::InsideAppFolder => SharePathErrorV2::InsideAppFolder,
16086            SharePathErrorBaseV2::IsPublicFolder => SharePathErrorV2::IsPublicFolder,
16087            SharePathErrorBaseV2::InsidePublicFolder => SharePathErrorV2::InsidePublicFolder,
16088            SharePathErrorBaseV2::AlreadyShared(x) => SharePathErrorV2::AlreadyShared(x),
16089            SharePathErrorBaseV2::InvalidPath => SharePathErrorV2::InvalidPath,
16090            SharePathErrorBaseV2::IsOsxPackage => SharePathErrorV2::IsOsxPackage,
16091            SharePathErrorBaseV2::InsideOsxPackage => SharePathErrorV2::InsideOsxPackage,
16092            SharePathErrorBaseV2::IsVault => SharePathErrorV2::IsVault,
16093            SharePathErrorBaseV2::IsVaultLocked => SharePathErrorV2::IsVaultLocked,
16094            SharePathErrorBaseV2::Other => SharePathErrorV2::Other,
16095        }
16096    }
16097}
16098/// Metadata of a shared link for a file or folder.
16099#[derive(Debug, Clone, PartialEq, Eq)]
16100#[non_exhaustive] // structs may have more fields added in the future.
16101pub struct SharedContentLinkMetadata {
16102    /// The audience options that are available for the content. Some audience options may be
16103    /// unavailable. For example, team_only may be unavailable if the content is not owned by a user
16104    /// on a team. The 'default' audience option is always available if the user can modify link
16105    /// settings.
16106    pub audience_options: Vec<LinkAudience>,
16107    /// The current audience of the link.
16108    pub current_audience: LinkAudience,
16109    /// A list of permissions for actions you can perform on the link.
16110    pub link_permissions: Vec<LinkPermission>,
16111    /// Whether the link is protected by a password.
16112    pub password_protected: bool,
16113    /// The URL of the link.
16114    pub url: String,
16115    /// The access level on the link for this file.
16116    pub access_level: Option<AccessLevel>,
16117    /// The shared folder that prevents the link audience for this link from being more restrictive.
16118    pub audience_restricting_shared_folder: Option<AudienceRestrictingSharedFolder>,
16119    /// Whether the link has an expiry set on it. A link with an expiry will have its audience
16120    /// changed to members when the expiry is reached.
16121    pub expiry: Option<crate::types::common::DropboxTimestamp>,
16122    /// The content inside this folder with link audience different than this folder's. This is only
16123    /// returned when an endpoint that returns metadata for a single shared folder is called, e.g.
16124    /// /get_folder_metadata.
16125    pub audience_exceptions: Option<AudienceExceptions>,
16126}
16127
16128impl SharedContentLinkMetadata {
16129    pub fn new(
16130        audience_options: Vec<LinkAudience>,
16131        current_audience: LinkAudience,
16132        link_permissions: Vec<LinkPermission>,
16133        password_protected: bool,
16134        url: String,
16135    ) -> Self {
16136        SharedContentLinkMetadata {
16137            audience_options,
16138            current_audience,
16139            link_permissions,
16140            password_protected,
16141            url,
16142            access_level: None,
16143            audience_restricting_shared_folder: None,
16144            expiry: None,
16145            audience_exceptions: None,
16146        }
16147    }
16148
16149    pub fn with_access_level(mut self, value: AccessLevel) -> Self {
16150        self.access_level = Some(value);
16151        self
16152    }
16153
16154    pub fn with_audience_restricting_shared_folder(
16155        mut self,
16156        value: AudienceRestrictingSharedFolder,
16157    ) -> Self {
16158        self.audience_restricting_shared_folder = Some(value);
16159        self
16160    }
16161
16162    pub fn with_expiry(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
16163        self.expiry = Some(value);
16164        self
16165    }
16166
16167    pub fn with_audience_exceptions(mut self, value: AudienceExceptions) -> Self {
16168        self.audience_exceptions = Some(value);
16169        self
16170    }
16171}
16172
16173const SHARED_CONTENT_LINK_METADATA_FIELDS: &[&str] = &["audience_options",
16174                                                       "current_audience",
16175                                                       "link_permissions",
16176                                                       "password_protected",
16177                                                       "url",
16178                                                       "access_level",
16179                                                       "audience_restricting_shared_folder",
16180                                                       "expiry",
16181                                                       "audience_exceptions"];
16182impl SharedContentLinkMetadata {
16183    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
16184        map: V,
16185    ) -> Result<SharedContentLinkMetadata, V::Error> {
16186        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
16187    }
16188
16189    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
16190        mut map: V,
16191        optional: bool,
16192    ) -> Result<Option<SharedContentLinkMetadata>, V::Error> {
16193        let mut field_audience_options = None;
16194        let mut field_current_audience = None;
16195        let mut field_link_permissions = None;
16196        let mut field_password_protected = None;
16197        let mut field_url = None;
16198        let mut field_access_level = None;
16199        let mut field_audience_restricting_shared_folder = None;
16200        let mut field_expiry = None;
16201        let mut field_audience_exceptions = None;
16202        let mut nothing = true;
16203        while let Some(key) = map.next_key::<&str>()? {
16204            nothing = false;
16205            match key {
16206                "audience_options" => {
16207                    if field_audience_options.is_some() {
16208                        return Err(::serde::de::Error::duplicate_field("audience_options"));
16209                    }
16210                    field_audience_options = Some(map.next_value()?);
16211                }
16212                "current_audience" => {
16213                    if field_current_audience.is_some() {
16214                        return Err(::serde::de::Error::duplicate_field("current_audience"));
16215                    }
16216                    field_current_audience = Some(map.next_value()?);
16217                }
16218                "link_permissions" => {
16219                    if field_link_permissions.is_some() {
16220                        return Err(::serde::de::Error::duplicate_field("link_permissions"));
16221                    }
16222                    field_link_permissions = Some(map.next_value()?);
16223                }
16224                "password_protected" => {
16225                    if field_password_protected.is_some() {
16226                        return Err(::serde::de::Error::duplicate_field("password_protected"));
16227                    }
16228                    field_password_protected = Some(map.next_value()?);
16229                }
16230                "url" => {
16231                    if field_url.is_some() {
16232                        return Err(::serde::de::Error::duplicate_field("url"));
16233                    }
16234                    field_url = Some(map.next_value()?);
16235                }
16236                "access_level" => {
16237                    if field_access_level.is_some() {
16238                        return Err(::serde::de::Error::duplicate_field("access_level"));
16239                    }
16240                    field_access_level = Some(map.next_value()?);
16241                }
16242                "audience_restricting_shared_folder" => {
16243                    if field_audience_restricting_shared_folder.is_some() {
16244                        return Err(::serde::de::Error::duplicate_field("audience_restricting_shared_folder"));
16245                    }
16246                    field_audience_restricting_shared_folder = Some(map.next_value()?);
16247                }
16248                "expiry" => {
16249                    if field_expiry.is_some() {
16250                        return Err(::serde::de::Error::duplicate_field("expiry"));
16251                    }
16252                    field_expiry = Some(map.next_value()?);
16253                }
16254                "audience_exceptions" => {
16255                    if field_audience_exceptions.is_some() {
16256                        return Err(::serde::de::Error::duplicate_field("audience_exceptions"));
16257                    }
16258                    field_audience_exceptions = Some(map.next_value()?);
16259                }
16260                _ => {
16261                    // unknown field allowed and ignored
16262                    map.next_value::<::serde_json::Value>()?;
16263                }
16264            }
16265        }
16266        if optional && nothing {
16267            return Ok(None);
16268        }
16269        let result = SharedContentLinkMetadata {
16270            audience_options: field_audience_options.ok_or_else(|| ::serde::de::Error::missing_field("audience_options"))?,
16271            current_audience: field_current_audience.ok_or_else(|| ::serde::de::Error::missing_field("current_audience"))?,
16272            link_permissions: field_link_permissions.ok_or_else(|| ::serde::de::Error::missing_field("link_permissions"))?,
16273            password_protected: field_password_protected.ok_or_else(|| ::serde::de::Error::missing_field("password_protected"))?,
16274            url: field_url.ok_or_else(|| ::serde::de::Error::missing_field("url"))?,
16275            access_level: field_access_level.and_then(Option::flatten),
16276            audience_restricting_shared_folder: field_audience_restricting_shared_folder.and_then(Option::flatten),
16277            expiry: field_expiry.and_then(Option::flatten),
16278            audience_exceptions: field_audience_exceptions.and_then(Option::flatten),
16279        };
16280        Ok(Some(result))
16281    }
16282
16283    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
16284        &self,
16285        s: &mut S::SerializeStruct,
16286    ) -> Result<(), S::Error> {
16287        use serde::ser::SerializeStruct;
16288        s.serialize_field("audience_options", &self.audience_options)?;
16289        s.serialize_field("current_audience", &self.current_audience)?;
16290        s.serialize_field("link_permissions", &self.link_permissions)?;
16291        s.serialize_field("password_protected", &self.password_protected)?;
16292        s.serialize_field("url", &self.url)?;
16293        if let Some(val) = &self.access_level {
16294            s.serialize_field("access_level", val)?;
16295        }
16296        if let Some(val) = &self.audience_restricting_shared_folder {
16297            s.serialize_field("audience_restricting_shared_folder", val)?;
16298        }
16299        if let Some(val) = &self.expiry {
16300            s.serialize_field("expiry", val)?;
16301        }
16302        if let Some(val) = &self.audience_exceptions {
16303            s.serialize_field("audience_exceptions", val)?;
16304        }
16305        Ok(())
16306    }
16307}
16308
16309impl<'de> ::serde::de::Deserialize<'de> for SharedContentLinkMetadata {
16310    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
16311        // struct deserializer
16312        use serde::de::{MapAccess, Visitor};
16313        struct StructVisitor;
16314        impl<'de> Visitor<'de> for StructVisitor {
16315            type Value = SharedContentLinkMetadata;
16316            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
16317                f.write_str("a SharedContentLinkMetadata struct")
16318            }
16319            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
16320                SharedContentLinkMetadata::internal_deserialize(map)
16321            }
16322        }
16323        deserializer.deserialize_struct("SharedContentLinkMetadata", SHARED_CONTENT_LINK_METADATA_FIELDS, StructVisitor)
16324    }
16325}
16326
16327impl ::serde::ser::Serialize for SharedContentLinkMetadata {
16328    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
16329        // struct serializer
16330        use serde::ser::SerializeStruct;
16331        let mut s = serializer.serialize_struct("SharedContentLinkMetadata", 9)?;
16332        self.internal_serialize::<S>(&mut s)?;
16333        s.end()
16334    }
16335}
16336
16337// struct extends SharedContentLinkMetadataBase
16338impl From<SharedContentLinkMetadata> for SharedContentLinkMetadataBase {
16339    fn from(subtype: SharedContentLinkMetadata) -> Self {
16340        Self {
16341            audience_options: subtype.audience_options,
16342            current_audience: subtype.current_audience,
16343            link_permissions: subtype.link_permissions,
16344            password_protected: subtype.password_protected,
16345            access_level: subtype.access_level,
16346            audience_restricting_shared_folder: subtype.audience_restricting_shared_folder,
16347            expiry: subtype.expiry,
16348        }
16349    }
16350}
16351#[derive(Debug, Clone, PartialEq, Eq)]
16352#[non_exhaustive] // structs may have more fields added in the future.
16353pub struct SharedContentLinkMetadataBase {
16354    /// The audience options that are available for the content. Some audience options may be
16355    /// unavailable. For example, team_only may be unavailable if the content is not owned by a user
16356    /// on a team. The 'default' audience option is always available if the user can modify link
16357    /// settings.
16358    pub audience_options: Vec<LinkAudience>,
16359    /// The current audience of the link.
16360    pub current_audience: LinkAudience,
16361    /// A list of permissions for actions you can perform on the link.
16362    pub link_permissions: Vec<LinkPermission>,
16363    /// Whether the link is protected by a password.
16364    pub password_protected: bool,
16365    /// The access level on the link for this file.
16366    pub access_level: Option<AccessLevel>,
16367    /// The shared folder that prevents the link audience for this link from being more restrictive.
16368    pub audience_restricting_shared_folder: Option<AudienceRestrictingSharedFolder>,
16369    /// Whether the link has an expiry set on it. A link with an expiry will have its audience
16370    /// changed to members when the expiry is reached.
16371    pub expiry: Option<crate::types::common::DropboxTimestamp>,
16372}
16373
16374impl SharedContentLinkMetadataBase {
16375    pub fn new(
16376        audience_options: Vec<LinkAudience>,
16377        current_audience: LinkAudience,
16378        link_permissions: Vec<LinkPermission>,
16379        password_protected: bool,
16380    ) -> Self {
16381        SharedContentLinkMetadataBase {
16382            audience_options,
16383            current_audience,
16384            link_permissions,
16385            password_protected,
16386            access_level: None,
16387            audience_restricting_shared_folder: None,
16388            expiry: None,
16389        }
16390    }
16391
16392    pub fn with_access_level(mut self, value: AccessLevel) -> Self {
16393        self.access_level = Some(value);
16394        self
16395    }
16396
16397    pub fn with_audience_restricting_shared_folder(
16398        mut self,
16399        value: AudienceRestrictingSharedFolder,
16400    ) -> Self {
16401        self.audience_restricting_shared_folder = Some(value);
16402        self
16403    }
16404
16405    pub fn with_expiry(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
16406        self.expiry = Some(value);
16407        self
16408    }
16409}
16410
16411const SHARED_CONTENT_LINK_METADATA_BASE_FIELDS: &[&str] = &["audience_options",
16412                                                            "current_audience",
16413                                                            "link_permissions",
16414                                                            "password_protected",
16415                                                            "access_level",
16416                                                            "audience_restricting_shared_folder",
16417                                                            "expiry"];
16418impl SharedContentLinkMetadataBase {
16419    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
16420        map: V,
16421    ) -> Result<SharedContentLinkMetadataBase, V::Error> {
16422        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
16423    }
16424
16425    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
16426        mut map: V,
16427        optional: bool,
16428    ) -> Result<Option<SharedContentLinkMetadataBase>, V::Error> {
16429        let mut field_audience_options = None;
16430        let mut field_current_audience = None;
16431        let mut field_link_permissions = None;
16432        let mut field_password_protected = None;
16433        let mut field_access_level = None;
16434        let mut field_audience_restricting_shared_folder = None;
16435        let mut field_expiry = None;
16436        let mut nothing = true;
16437        while let Some(key) = map.next_key::<&str>()? {
16438            nothing = false;
16439            match key {
16440                "audience_options" => {
16441                    if field_audience_options.is_some() {
16442                        return Err(::serde::de::Error::duplicate_field("audience_options"));
16443                    }
16444                    field_audience_options = Some(map.next_value()?);
16445                }
16446                "current_audience" => {
16447                    if field_current_audience.is_some() {
16448                        return Err(::serde::de::Error::duplicate_field("current_audience"));
16449                    }
16450                    field_current_audience = Some(map.next_value()?);
16451                }
16452                "link_permissions" => {
16453                    if field_link_permissions.is_some() {
16454                        return Err(::serde::de::Error::duplicate_field("link_permissions"));
16455                    }
16456                    field_link_permissions = Some(map.next_value()?);
16457                }
16458                "password_protected" => {
16459                    if field_password_protected.is_some() {
16460                        return Err(::serde::de::Error::duplicate_field("password_protected"));
16461                    }
16462                    field_password_protected = Some(map.next_value()?);
16463                }
16464                "access_level" => {
16465                    if field_access_level.is_some() {
16466                        return Err(::serde::de::Error::duplicate_field("access_level"));
16467                    }
16468                    field_access_level = Some(map.next_value()?);
16469                }
16470                "audience_restricting_shared_folder" => {
16471                    if field_audience_restricting_shared_folder.is_some() {
16472                        return Err(::serde::de::Error::duplicate_field("audience_restricting_shared_folder"));
16473                    }
16474                    field_audience_restricting_shared_folder = Some(map.next_value()?);
16475                }
16476                "expiry" => {
16477                    if field_expiry.is_some() {
16478                        return Err(::serde::de::Error::duplicate_field("expiry"));
16479                    }
16480                    field_expiry = Some(map.next_value()?);
16481                }
16482                _ => {
16483                    // unknown field allowed and ignored
16484                    map.next_value::<::serde_json::Value>()?;
16485                }
16486            }
16487        }
16488        if optional && nothing {
16489            return Ok(None);
16490        }
16491        let result = SharedContentLinkMetadataBase {
16492            audience_options: field_audience_options.ok_or_else(|| ::serde::de::Error::missing_field("audience_options"))?,
16493            current_audience: field_current_audience.ok_or_else(|| ::serde::de::Error::missing_field("current_audience"))?,
16494            link_permissions: field_link_permissions.ok_or_else(|| ::serde::de::Error::missing_field("link_permissions"))?,
16495            password_protected: field_password_protected.ok_or_else(|| ::serde::de::Error::missing_field("password_protected"))?,
16496            access_level: field_access_level.and_then(Option::flatten),
16497            audience_restricting_shared_folder: field_audience_restricting_shared_folder.and_then(Option::flatten),
16498            expiry: field_expiry.and_then(Option::flatten),
16499        };
16500        Ok(Some(result))
16501    }
16502
16503    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
16504        &self,
16505        s: &mut S::SerializeStruct,
16506    ) -> Result<(), S::Error> {
16507        use serde::ser::SerializeStruct;
16508        s.serialize_field("audience_options", &self.audience_options)?;
16509        s.serialize_field("current_audience", &self.current_audience)?;
16510        s.serialize_field("link_permissions", &self.link_permissions)?;
16511        s.serialize_field("password_protected", &self.password_protected)?;
16512        if let Some(val) = &self.access_level {
16513            s.serialize_field("access_level", val)?;
16514        }
16515        if let Some(val) = &self.audience_restricting_shared_folder {
16516            s.serialize_field("audience_restricting_shared_folder", val)?;
16517        }
16518        if let Some(val) = &self.expiry {
16519            s.serialize_field("expiry", val)?;
16520        }
16521        Ok(())
16522    }
16523}
16524
16525impl<'de> ::serde::de::Deserialize<'de> for SharedContentLinkMetadataBase {
16526    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
16527        // struct deserializer
16528        use serde::de::{MapAccess, Visitor};
16529        struct StructVisitor;
16530        impl<'de> Visitor<'de> for StructVisitor {
16531            type Value = SharedContentLinkMetadataBase;
16532            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
16533                f.write_str("a SharedContentLinkMetadataBase struct")
16534            }
16535            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
16536                SharedContentLinkMetadataBase::internal_deserialize(map)
16537            }
16538        }
16539        deserializer.deserialize_struct("SharedContentLinkMetadataBase", SHARED_CONTENT_LINK_METADATA_BASE_FIELDS, StructVisitor)
16540    }
16541}
16542
16543impl ::serde::ser::Serialize for SharedContentLinkMetadataBase {
16544    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
16545        // struct serializer
16546        use serde::ser::SerializeStruct;
16547        let mut s = serializer.serialize_struct("SharedContentLinkMetadataBase", 7)?;
16548        self.internal_serialize::<S>(&mut s)?;
16549        s.end()
16550    }
16551}
16552
16553/// Shared file user, group, and invitee membership. Used for the results of
16554/// [`list_file_members()`](crate::sharing::list_file_members) and
16555/// [`list_file_members_continue()`](crate::sharing::list_file_members_continue), and used as part
16556/// of the results for [`list_file_members_batch()`](crate::sharing::list_file_members_batch).
16557#[derive(Debug, Clone, PartialEq, Eq)]
16558#[non_exhaustive] // structs may have more fields added in the future.
16559pub struct SharedFileMembers {
16560    /// The list of user members of the shared file.
16561    pub users: Vec<UserFileMembershipInfo>,
16562    /// The list of group members of the shared file.
16563    pub groups: Vec<GroupMembershipInfo>,
16564    /// The list of invited members of a file, but have not logged in and claimed this.
16565    pub invitees: Vec<InviteeMembershipInfo>,
16566    /// Present if there are additional shared file members that have not been returned yet. Pass
16567    /// the cursor into [`list_file_members_continue()`](crate::sharing::list_file_members_continue)
16568    /// to list additional members.
16569    pub cursor: Option<String>,
16570}
16571
16572impl SharedFileMembers {
16573    pub fn new(
16574        users: Vec<UserFileMembershipInfo>,
16575        groups: Vec<GroupMembershipInfo>,
16576        invitees: Vec<InviteeMembershipInfo>,
16577    ) -> Self {
16578        SharedFileMembers {
16579            users,
16580            groups,
16581            invitees,
16582            cursor: None,
16583        }
16584    }
16585
16586    pub fn with_cursor(mut self, value: String) -> Self {
16587        self.cursor = Some(value);
16588        self
16589    }
16590}
16591
16592const SHARED_FILE_MEMBERS_FIELDS: &[&str] = &["users",
16593                                              "groups",
16594                                              "invitees",
16595                                              "cursor"];
16596impl SharedFileMembers {
16597    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
16598        map: V,
16599    ) -> Result<SharedFileMembers, V::Error> {
16600        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
16601    }
16602
16603    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
16604        mut map: V,
16605        optional: bool,
16606    ) -> Result<Option<SharedFileMembers>, V::Error> {
16607        let mut field_users = None;
16608        let mut field_groups = None;
16609        let mut field_invitees = None;
16610        let mut field_cursor = None;
16611        let mut nothing = true;
16612        while let Some(key) = map.next_key::<&str>()? {
16613            nothing = false;
16614            match key {
16615                "users" => {
16616                    if field_users.is_some() {
16617                        return Err(::serde::de::Error::duplicate_field("users"));
16618                    }
16619                    field_users = Some(map.next_value()?);
16620                }
16621                "groups" => {
16622                    if field_groups.is_some() {
16623                        return Err(::serde::de::Error::duplicate_field("groups"));
16624                    }
16625                    field_groups = Some(map.next_value()?);
16626                }
16627                "invitees" => {
16628                    if field_invitees.is_some() {
16629                        return Err(::serde::de::Error::duplicate_field("invitees"));
16630                    }
16631                    field_invitees = Some(map.next_value()?);
16632                }
16633                "cursor" => {
16634                    if field_cursor.is_some() {
16635                        return Err(::serde::de::Error::duplicate_field("cursor"));
16636                    }
16637                    field_cursor = Some(map.next_value()?);
16638                }
16639                _ => {
16640                    // unknown field allowed and ignored
16641                    map.next_value::<::serde_json::Value>()?;
16642                }
16643            }
16644        }
16645        if optional && nothing {
16646            return Ok(None);
16647        }
16648        let result = SharedFileMembers {
16649            users: field_users.ok_or_else(|| ::serde::de::Error::missing_field("users"))?,
16650            groups: field_groups.ok_or_else(|| ::serde::de::Error::missing_field("groups"))?,
16651            invitees: field_invitees.ok_or_else(|| ::serde::de::Error::missing_field("invitees"))?,
16652            cursor: field_cursor.and_then(Option::flatten),
16653        };
16654        Ok(Some(result))
16655    }
16656
16657    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
16658        &self,
16659        s: &mut S::SerializeStruct,
16660    ) -> Result<(), S::Error> {
16661        use serde::ser::SerializeStruct;
16662        s.serialize_field("users", &self.users)?;
16663        s.serialize_field("groups", &self.groups)?;
16664        s.serialize_field("invitees", &self.invitees)?;
16665        if let Some(val) = &self.cursor {
16666            s.serialize_field("cursor", val)?;
16667        }
16668        Ok(())
16669    }
16670}
16671
16672impl<'de> ::serde::de::Deserialize<'de> for SharedFileMembers {
16673    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
16674        // struct deserializer
16675        use serde::de::{MapAccess, Visitor};
16676        struct StructVisitor;
16677        impl<'de> Visitor<'de> for StructVisitor {
16678            type Value = SharedFileMembers;
16679            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
16680                f.write_str("a SharedFileMembers struct")
16681            }
16682            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
16683                SharedFileMembers::internal_deserialize(map)
16684            }
16685        }
16686        deserializer.deserialize_struct("SharedFileMembers", SHARED_FILE_MEMBERS_FIELDS, StructVisitor)
16687    }
16688}
16689
16690impl ::serde::ser::Serialize for SharedFileMembers {
16691    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
16692        // struct serializer
16693        use serde::ser::SerializeStruct;
16694        let mut s = serializer.serialize_struct("SharedFileMembers", 4)?;
16695        self.internal_serialize::<S>(&mut s)?;
16696        s.end()
16697    }
16698}
16699
16700/// Properties of the shared file.
16701#[derive(Debug, Clone, PartialEq, Eq)]
16702#[non_exhaustive] // structs may have more fields added in the future.
16703pub struct SharedFileMetadata {
16704    /// The ID of the file.
16705    pub id: crate::types::files::FileId,
16706    /// The name of this file.
16707    pub name: String,
16708    /// Policies governing this shared file.
16709    pub policy: FolderPolicy,
16710    /// URL for displaying a web preview of the shared file.
16711    pub preview_url: String,
16712    /// The current user's access level for this shared file.
16713    pub access_type: Option<AccessLevel>,
16714    /// The expected metadata of the link associated for the file when it is first shared. Absent if
16715    /// the link already exists. This is for an unreleased feature so it may not be returned yet.
16716    pub expected_link_metadata: Option<ExpectedSharedContentLinkMetadata>,
16717    /// The metadata of the link associated for the file. This is for an unreleased feature so it
16718    /// may not be returned yet.
16719    pub link_metadata: Option<SharedContentLinkMetadata>,
16720    /// The display names of the users that own the file. If the file is part of a team folder, the
16721    /// display names of the team admins are also included. Absent if the owner display names cannot
16722    /// be fetched.
16723    pub owner_display_names: Option<Vec<String>>,
16724    /// The team that owns the file. This field is not present if the file is not owned by a team.
16725    pub owner_team: Option<crate::types::users::Team>,
16726    /// The ID of the parent shared folder. This field is present only if the file is contained
16727    /// within a shared folder.
16728    pub parent_shared_folder_id: Option<crate::types::common::SharedFolderId>,
16729    /// The cased path to be used for display purposes only. In rare instances the casing will not
16730    /// correctly match the user's filesystem, but this behavior will match the path provided in the
16731    /// Core API v1. Absent for unmounted files.
16732    pub path_display: Option<String>,
16733    /// The lower-case full path of this file. Absent for unmounted files.
16734    pub path_lower: Option<String>,
16735    /// The sharing permissions that requesting user has on this file. This corresponds to the
16736    /// entries given in [`GetFileMetadataBatchArg::actions`](GetFileMetadataBatchArg) or
16737    /// [`GetFileMetadataArg::actions`](GetFileMetadataArg).
16738    pub permissions: Option<Vec<FilePermission>>,
16739    /// Timestamp indicating when the current user was invited to this shared file. If the user was
16740    /// not invited to the shared file, the timestamp will indicate when the user was invited to the
16741    /// parent shared folder. This value may be absent.
16742    pub time_invited: Option<crate::types::common::DropboxTimestamp>,
16743}
16744
16745impl SharedFileMetadata {
16746    pub fn new(
16747        id: crate::types::files::FileId,
16748        name: String,
16749        policy: FolderPolicy,
16750        preview_url: String,
16751    ) -> Self {
16752        SharedFileMetadata {
16753            id,
16754            name,
16755            policy,
16756            preview_url,
16757            access_type: None,
16758            expected_link_metadata: None,
16759            link_metadata: None,
16760            owner_display_names: None,
16761            owner_team: None,
16762            parent_shared_folder_id: None,
16763            path_display: None,
16764            path_lower: None,
16765            permissions: None,
16766            time_invited: None,
16767        }
16768    }
16769
16770    pub fn with_access_type(mut self, value: AccessLevel) -> Self {
16771        self.access_type = Some(value);
16772        self
16773    }
16774
16775    pub fn with_expected_link_metadata(
16776        mut self,
16777        value: ExpectedSharedContentLinkMetadata,
16778    ) -> Self {
16779        self.expected_link_metadata = Some(value);
16780        self
16781    }
16782
16783    pub fn with_link_metadata(mut self, value: SharedContentLinkMetadata) -> Self {
16784        self.link_metadata = Some(value);
16785        self
16786    }
16787
16788    pub fn with_owner_display_names(mut self, value: Vec<String>) -> Self {
16789        self.owner_display_names = Some(value);
16790        self
16791    }
16792
16793    pub fn with_owner_team(mut self, value: crate::types::users::Team) -> Self {
16794        self.owner_team = Some(value);
16795        self
16796    }
16797
16798    pub fn with_parent_shared_folder_id(
16799        mut self,
16800        value: crate::types::common::SharedFolderId,
16801    ) -> Self {
16802        self.parent_shared_folder_id = Some(value);
16803        self
16804    }
16805
16806    pub fn with_path_display(mut self, value: String) -> Self {
16807        self.path_display = Some(value);
16808        self
16809    }
16810
16811    pub fn with_path_lower(mut self, value: String) -> Self {
16812        self.path_lower = Some(value);
16813        self
16814    }
16815
16816    pub fn with_permissions(mut self, value: Vec<FilePermission>) -> Self {
16817        self.permissions = Some(value);
16818        self
16819    }
16820
16821    pub fn with_time_invited(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
16822        self.time_invited = Some(value);
16823        self
16824    }
16825}
16826
16827const SHARED_FILE_METADATA_FIELDS: &[&str] = &["id",
16828                                               "name",
16829                                               "policy",
16830                                               "preview_url",
16831                                               "access_type",
16832                                               "expected_link_metadata",
16833                                               "link_metadata",
16834                                               "owner_display_names",
16835                                               "owner_team",
16836                                               "parent_shared_folder_id",
16837                                               "path_display",
16838                                               "path_lower",
16839                                               "permissions",
16840                                               "time_invited"];
16841impl SharedFileMetadata {
16842    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
16843        map: V,
16844    ) -> Result<SharedFileMetadata, V::Error> {
16845        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
16846    }
16847
16848    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
16849        mut map: V,
16850        optional: bool,
16851    ) -> Result<Option<SharedFileMetadata>, V::Error> {
16852        let mut field_id = None;
16853        let mut field_name = None;
16854        let mut field_policy = None;
16855        let mut field_preview_url = None;
16856        let mut field_access_type = None;
16857        let mut field_expected_link_metadata = None;
16858        let mut field_link_metadata = None;
16859        let mut field_owner_display_names = None;
16860        let mut field_owner_team = None;
16861        let mut field_parent_shared_folder_id = None;
16862        let mut field_path_display = None;
16863        let mut field_path_lower = None;
16864        let mut field_permissions = None;
16865        let mut field_time_invited = None;
16866        let mut nothing = true;
16867        while let Some(key) = map.next_key::<&str>()? {
16868            nothing = false;
16869            match key {
16870                "id" => {
16871                    if field_id.is_some() {
16872                        return Err(::serde::de::Error::duplicate_field("id"));
16873                    }
16874                    field_id = Some(map.next_value()?);
16875                }
16876                "name" => {
16877                    if field_name.is_some() {
16878                        return Err(::serde::de::Error::duplicate_field("name"));
16879                    }
16880                    field_name = Some(map.next_value()?);
16881                }
16882                "policy" => {
16883                    if field_policy.is_some() {
16884                        return Err(::serde::de::Error::duplicate_field("policy"));
16885                    }
16886                    field_policy = Some(map.next_value()?);
16887                }
16888                "preview_url" => {
16889                    if field_preview_url.is_some() {
16890                        return Err(::serde::de::Error::duplicate_field("preview_url"));
16891                    }
16892                    field_preview_url = Some(map.next_value()?);
16893                }
16894                "access_type" => {
16895                    if field_access_type.is_some() {
16896                        return Err(::serde::de::Error::duplicate_field("access_type"));
16897                    }
16898                    field_access_type = Some(map.next_value()?);
16899                }
16900                "expected_link_metadata" => {
16901                    if field_expected_link_metadata.is_some() {
16902                        return Err(::serde::de::Error::duplicate_field("expected_link_metadata"));
16903                    }
16904                    field_expected_link_metadata = Some(map.next_value()?);
16905                }
16906                "link_metadata" => {
16907                    if field_link_metadata.is_some() {
16908                        return Err(::serde::de::Error::duplicate_field("link_metadata"));
16909                    }
16910                    field_link_metadata = Some(map.next_value()?);
16911                }
16912                "owner_display_names" => {
16913                    if field_owner_display_names.is_some() {
16914                        return Err(::serde::de::Error::duplicate_field("owner_display_names"));
16915                    }
16916                    field_owner_display_names = Some(map.next_value()?);
16917                }
16918                "owner_team" => {
16919                    if field_owner_team.is_some() {
16920                        return Err(::serde::de::Error::duplicate_field("owner_team"));
16921                    }
16922                    field_owner_team = Some(map.next_value()?);
16923                }
16924                "parent_shared_folder_id" => {
16925                    if field_parent_shared_folder_id.is_some() {
16926                        return Err(::serde::de::Error::duplicate_field("parent_shared_folder_id"));
16927                    }
16928                    field_parent_shared_folder_id = Some(map.next_value()?);
16929                }
16930                "path_display" => {
16931                    if field_path_display.is_some() {
16932                        return Err(::serde::de::Error::duplicate_field("path_display"));
16933                    }
16934                    field_path_display = Some(map.next_value()?);
16935                }
16936                "path_lower" => {
16937                    if field_path_lower.is_some() {
16938                        return Err(::serde::de::Error::duplicate_field("path_lower"));
16939                    }
16940                    field_path_lower = Some(map.next_value()?);
16941                }
16942                "permissions" => {
16943                    if field_permissions.is_some() {
16944                        return Err(::serde::de::Error::duplicate_field("permissions"));
16945                    }
16946                    field_permissions = Some(map.next_value()?);
16947                }
16948                "time_invited" => {
16949                    if field_time_invited.is_some() {
16950                        return Err(::serde::de::Error::duplicate_field("time_invited"));
16951                    }
16952                    field_time_invited = Some(map.next_value()?);
16953                }
16954                _ => {
16955                    // unknown field allowed and ignored
16956                    map.next_value::<::serde_json::Value>()?;
16957                }
16958            }
16959        }
16960        if optional && nothing {
16961            return Ok(None);
16962        }
16963        let result = SharedFileMetadata {
16964            id: field_id.ok_or_else(|| ::serde::de::Error::missing_field("id"))?,
16965            name: field_name.ok_or_else(|| ::serde::de::Error::missing_field("name"))?,
16966            policy: field_policy.ok_or_else(|| ::serde::de::Error::missing_field("policy"))?,
16967            preview_url: field_preview_url.ok_or_else(|| ::serde::de::Error::missing_field("preview_url"))?,
16968            access_type: field_access_type.and_then(Option::flatten),
16969            expected_link_metadata: field_expected_link_metadata.and_then(Option::flatten),
16970            link_metadata: field_link_metadata.and_then(Option::flatten),
16971            owner_display_names: field_owner_display_names.and_then(Option::flatten),
16972            owner_team: field_owner_team.and_then(Option::flatten),
16973            parent_shared_folder_id: field_parent_shared_folder_id.and_then(Option::flatten),
16974            path_display: field_path_display.and_then(Option::flatten),
16975            path_lower: field_path_lower.and_then(Option::flatten),
16976            permissions: field_permissions.and_then(Option::flatten),
16977            time_invited: field_time_invited.and_then(Option::flatten),
16978        };
16979        Ok(Some(result))
16980    }
16981
16982    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
16983        &self,
16984        s: &mut S::SerializeStruct,
16985    ) -> Result<(), S::Error> {
16986        use serde::ser::SerializeStruct;
16987        s.serialize_field("id", &self.id)?;
16988        s.serialize_field("name", &self.name)?;
16989        s.serialize_field("policy", &self.policy)?;
16990        s.serialize_field("preview_url", &self.preview_url)?;
16991        if let Some(val) = &self.access_type {
16992            s.serialize_field("access_type", val)?;
16993        }
16994        if let Some(val) = &self.expected_link_metadata {
16995            s.serialize_field("expected_link_metadata", val)?;
16996        }
16997        if let Some(val) = &self.link_metadata {
16998            s.serialize_field("link_metadata", val)?;
16999        }
17000        if let Some(val) = &self.owner_display_names {
17001            s.serialize_field("owner_display_names", val)?;
17002        }
17003        if let Some(val) = &self.owner_team {
17004            s.serialize_field("owner_team", val)?;
17005        }
17006        if let Some(val) = &self.parent_shared_folder_id {
17007            s.serialize_field("parent_shared_folder_id", val)?;
17008        }
17009        if let Some(val) = &self.path_display {
17010            s.serialize_field("path_display", val)?;
17011        }
17012        if let Some(val) = &self.path_lower {
17013            s.serialize_field("path_lower", val)?;
17014        }
17015        if let Some(val) = &self.permissions {
17016            s.serialize_field("permissions", val)?;
17017        }
17018        if let Some(val) = &self.time_invited {
17019            s.serialize_field("time_invited", val)?;
17020        }
17021        Ok(())
17022    }
17023}
17024
17025impl<'de> ::serde::de::Deserialize<'de> for SharedFileMetadata {
17026    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
17027        // struct deserializer
17028        use serde::de::{MapAccess, Visitor};
17029        struct StructVisitor;
17030        impl<'de> Visitor<'de> for StructVisitor {
17031            type Value = SharedFileMetadata;
17032            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17033                f.write_str("a SharedFileMetadata struct")
17034            }
17035            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
17036                SharedFileMetadata::internal_deserialize(map)
17037            }
17038        }
17039        deserializer.deserialize_struct("SharedFileMetadata", SHARED_FILE_METADATA_FIELDS, StructVisitor)
17040    }
17041}
17042
17043impl ::serde::ser::Serialize for SharedFileMetadata {
17044    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
17045        // struct serializer
17046        use serde::ser::SerializeStruct;
17047        let mut s = serializer.serialize_struct("SharedFileMetadata", 14)?;
17048        self.internal_serialize::<S>(&mut s)?;
17049        s.end()
17050    }
17051}
17052
17053/// There is an error accessing the shared folder.
17054#[derive(Debug, Clone, PartialEq, Eq)]
17055#[non_exhaustive] // variants may be added in the future
17056pub enum SharedFolderAccessError {
17057    /// This shared folder ID is invalid.
17058    InvalidId,
17059    /// The user is not a member of the shared folder thus cannot access it.
17060    NotAMember,
17061    /// The user does not exist or their account is disabled.
17062    InvalidMember,
17063    /// Field is deprecated. Never set.
17064    #[deprecated]
17065    EmailUnverified,
17066    /// The shared folder is unmounted.
17067    Unmounted,
17068    /// Catch-all used for unrecognized values returned from the server. Encountering this value
17069    /// typically indicates that this SDK version is out of date.
17070    Other,
17071}
17072
17073impl<'de> ::serde::de::Deserialize<'de> for SharedFolderAccessError {
17074    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
17075        // union deserializer
17076        use serde::de::{self, MapAccess, Visitor};
17077        struct EnumVisitor;
17078        impl<'de> Visitor<'de> for EnumVisitor {
17079            type Value = SharedFolderAccessError;
17080            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17081                f.write_str("a SharedFolderAccessError structure")
17082            }
17083            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
17084                let tag: &str = match map.next_key()? {
17085                    Some(".tag") => map.next_value()?,
17086                    _ => return Err(de::Error::missing_field(".tag"))
17087                };
17088                let value = match tag {
17089                    "invalid_id" => SharedFolderAccessError::InvalidId,
17090                    "not_a_member" => SharedFolderAccessError::NotAMember,
17091                    "invalid_member" => SharedFolderAccessError::InvalidMember,
17092                    #[allow(deprecated)]
17093                    "email_unverified" => SharedFolderAccessError::EmailUnverified,
17094                    "unmounted" => SharedFolderAccessError::Unmounted,
17095                    _ => SharedFolderAccessError::Other,
17096                };
17097                crate::eat_json_fields(&mut map)?;
17098                Ok(value)
17099            }
17100        }
17101        const VARIANTS: &[&str] = &["invalid_id",
17102                                    "not_a_member",
17103                                    "invalid_member",
17104                                    "email_unverified",
17105                                    "unmounted",
17106                                    "other"];
17107        deserializer.deserialize_struct("SharedFolderAccessError", VARIANTS, EnumVisitor)
17108    }
17109}
17110
17111impl ::serde::ser::Serialize for SharedFolderAccessError {
17112    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
17113        // union serializer
17114        use serde::ser::SerializeStruct;
17115        match self {
17116            SharedFolderAccessError::InvalidId => {
17117                // unit
17118                let mut s = serializer.serialize_struct("SharedFolderAccessError", 1)?;
17119                s.serialize_field(".tag", "invalid_id")?;
17120                s.end()
17121            }
17122            SharedFolderAccessError::NotAMember => {
17123                // unit
17124                let mut s = serializer.serialize_struct("SharedFolderAccessError", 1)?;
17125                s.serialize_field(".tag", "not_a_member")?;
17126                s.end()
17127            }
17128            SharedFolderAccessError::InvalidMember => {
17129                // unit
17130                let mut s = serializer.serialize_struct("SharedFolderAccessError", 1)?;
17131                s.serialize_field(".tag", "invalid_member")?;
17132                s.end()
17133            }
17134            #[allow(deprecated)]
17135            SharedFolderAccessError::EmailUnverified => {
17136                // unit
17137                let mut s = serializer.serialize_struct("SharedFolderAccessError", 1)?;
17138                s.serialize_field(".tag", "email_unverified")?;
17139                s.end()
17140            }
17141            SharedFolderAccessError::Unmounted => {
17142                // unit
17143                let mut s = serializer.serialize_struct("SharedFolderAccessError", 1)?;
17144                s.serialize_field(".tag", "unmounted")?;
17145                s.end()
17146            }
17147            SharedFolderAccessError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
17148        }
17149    }
17150}
17151
17152impl ::std::error::Error for SharedFolderAccessError {
17153}
17154
17155impl ::std::fmt::Display for SharedFolderAccessError {
17156    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17157        match self {
17158            SharedFolderAccessError::InvalidId => f.write_str("This shared folder ID is invalid."),
17159            SharedFolderAccessError::NotAMember => f.write_str("The user is not a member of the shared folder thus cannot access it."),
17160            SharedFolderAccessError::InvalidMember => f.write_str("The user does not exist or their account is disabled."),
17161            #[allow(deprecated)] SharedFolderAccessError::EmailUnverified => f.write_str("Field is deprecated. Never set."),
17162            SharedFolderAccessError::Unmounted => f.write_str("The shared folder is unmounted."),
17163            _ => write!(f, "{:?}", *self),
17164        }
17165    }
17166}
17167
17168#[derive(Debug, Clone, PartialEq, Eq)]
17169#[non_exhaustive] // variants may be added in the future
17170pub enum SharedFolderMemberError {
17171    /// The target dropbox_id is invalid.
17172    InvalidDropboxId,
17173    /// The target dropbox_id is not a member of the shared folder.
17174    NotAMember,
17175    /// The target member only has inherited access to the shared folder.
17176    NoExplicitAccess(MemberAccessLevelResult),
17177    /// Catch-all used for unrecognized values returned from the server. Encountering this value
17178    /// typically indicates that this SDK version is out of date.
17179    Other,
17180}
17181
17182impl<'de> ::serde::de::Deserialize<'de> for SharedFolderMemberError {
17183    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
17184        // union deserializer
17185        use serde::de::{self, MapAccess, Visitor};
17186        struct EnumVisitor;
17187        impl<'de> Visitor<'de> for EnumVisitor {
17188            type Value = SharedFolderMemberError;
17189            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17190                f.write_str("a SharedFolderMemberError structure")
17191            }
17192            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
17193                let tag: &str = match map.next_key()? {
17194                    Some(".tag") => map.next_value()?,
17195                    _ => return Err(de::Error::missing_field(".tag"))
17196                };
17197                let value = match tag {
17198                    "invalid_dropbox_id" => SharedFolderMemberError::InvalidDropboxId,
17199                    "not_a_member" => SharedFolderMemberError::NotAMember,
17200                    "no_explicit_access" => SharedFolderMemberError::NoExplicitAccess(MemberAccessLevelResult::internal_deserialize(&mut map)?),
17201                    _ => SharedFolderMemberError::Other,
17202                };
17203                crate::eat_json_fields(&mut map)?;
17204                Ok(value)
17205            }
17206        }
17207        const VARIANTS: &[&str] = &["invalid_dropbox_id",
17208                                    "not_a_member",
17209                                    "no_explicit_access",
17210                                    "other"];
17211        deserializer.deserialize_struct("SharedFolderMemberError", VARIANTS, EnumVisitor)
17212    }
17213}
17214
17215impl ::serde::ser::Serialize for SharedFolderMemberError {
17216    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
17217        // union serializer
17218        use serde::ser::SerializeStruct;
17219        match self {
17220            SharedFolderMemberError::InvalidDropboxId => {
17221                // unit
17222                let mut s = serializer.serialize_struct("SharedFolderMemberError", 1)?;
17223                s.serialize_field(".tag", "invalid_dropbox_id")?;
17224                s.end()
17225            }
17226            SharedFolderMemberError::NotAMember => {
17227                // unit
17228                let mut s = serializer.serialize_struct("SharedFolderMemberError", 1)?;
17229                s.serialize_field(".tag", "not_a_member")?;
17230                s.end()
17231            }
17232            SharedFolderMemberError::NoExplicitAccess(x) => {
17233                // struct
17234                let mut s = serializer.serialize_struct("SharedFolderMemberError", 4)?;
17235                s.serialize_field(".tag", "no_explicit_access")?;
17236                x.internal_serialize::<S>(&mut s)?;
17237                s.end()
17238            }
17239            SharedFolderMemberError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
17240        }
17241    }
17242}
17243
17244impl ::std::error::Error for SharedFolderMemberError {
17245}
17246
17247impl ::std::fmt::Display for SharedFolderMemberError {
17248    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17249        match self {
17250            SharedFolderMemberError::InvalidDropboxId => f.write_str("The target dropbox_id is invalid."),
17251            SharedFolderMemberError::NotAMember => f.write_str("The target dropbox_id is not a member of the shared folder."),
17252            SharedFolderMemberError::NoExplicitAccess(inner) => write!(f, "The target member only has inherited access to the shared folder: {:?}", inner),
17253            _ => write!(f, "{:?}", *self),
17254        }
17255    }
17256}
17257
17258/// Shared folder user and group membership.
17259#[derive(Debug, Clone, PartialEq, Eq)]
17260#[non_exhaustive] // structs may have more fields added in the future.
17261pub struct SharedFolderMembers {
17262    /// The list of user members of the shared folder.
17263    pub users: Vec<UserMembershipInfo>,
17264    /// The list of group members of the shared folder.
17265    pub groups: Vec<GroupMembershipInfo>,
17266    /// The list of invitees to the shared folder.
17267    pub invitees: Vec<InviteeMembershipInfo>,
17268    /// Present if there are additional shared folder members that have not been returned yet. Pass
17269    /// the cursor into
17270    /// [`list_folder_members_continue()`](crate::sharing::list_folder_members_continue) to list
17271    /// additional members.
17272    pub cursor: Option<String>,
17273}
17274
17275impl SharedFolderMembers {
17276    pub fn new(
17277        users: Vec<UserMembershipInfo>,
17278        groups: Vec<GroupMembershipInfo>,
17279        invitees: Vec<InviteeMembershipInfo>,
17280    ) -> Self {
17281        SharedFolderMembers {
17282            users,
17283            groups,
17284            invitees,
17285            cursor: None,
17286        }
17287    }
17288
17289    pub fn with_cursor(mut self, value: String) -> Self {
17290        self.cursor = Some(value);
17291        self
17292    }
17293}
17294
17295const SHARED_FOLDER_MEMBERS_FIELDS: &[&str] = &["users",
17296                                                "groups",
17297                                                "invitees",
17298                                                "cursor"];
17299impl SharedFolderMembers {
17300    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
17301        map: V,
17302    ) -> Result<SharedFolderMembers, V::Error> {
17303        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
17304    }
17305
17306    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
17307        mut map: V,
17308        optional: bool,
17309    ) -> Result<Option<SharedFolderMembers>, V::Error> {
17310        let mut field_users = None;
17311        let mut field_groups = None;
17312        let mut field_invitees = None;
17313        let mut field_cursor = None;
17314        let mut nothing = true;
17315        while let Some(key) = map.next_key::<&str>()? {
17316            nothing = false;
17317            match key {
17318                "users" => {
17319                    if field_users.is_some() {
17320                        return Err(::serde::de::Error::duplicate_field("users"));
17321                    }
17322                    field_users = Some(map.next_value()?);
17323                }
17324                "groups" => {
17325                    if field_groups.is_some() {
17326                        return Err(::serde::de::Error::duplicate_field("groups"));
17327                    }
17328                    field_groups = Some(map.next_value()?);
17329                }
17330                "invitees" => {
17331                    if field_invitees.is_some() {
17332                        return Err(::serde::de::Error::duplicate_field("invitees"));
17333                    }
17334                    field_invitees = Some(map.next_value()?);
17335                }
17336                "cursor" => {
17337                    if field_cursor.is_some() {
17338                        return Err(::serde::de::Error::duplicate_field("cursor"));
17339                    }
17340                    field_cursor = Some(map.next_value()?);
17341                }
17342                _ => {
17343                    // unknown field allowed and ignored
17344                    map.next_value::<::serde_json::Value>()?;
17345                }
17346            }
17347        }
17348        if optional && nothing {
17349            return Ok(None);
17350        }
17351        let result = SharedFolderMembers {
17352            users: field_users.ok_or_else(|| ::serde::de::Error::missing_field("users"))?,
17353            groups: field_groups.ok_or_else(|| ::serde::de::Error::missing_field("groups"))?,
17354            invitees: field_invitees.ok_or_else(|| ::serde::de::Error::missing_field("invitees"))?,
17355            cursor: field_cursor.and_then(Option::flatten),
17356        };
17357        Ok(Some(result))
17358    }
17359
17360    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
17361        &self,
17362        s: &mut S::SerializeStruct,
17363    ) -> Result<(), S::Error> {
17364        use serde::ser::SerializeStruct;
17365        s.serialize_field("users", &self.users)?;
17366        s.serialize_field("groups", &self.groups)?;
17367        s.serialize_field("invitees", &self.invitees)?;
17368        if let Some(val) = &self.cursor {
17369            s.serialize_field("cursor", val)?;
17370        }
17371        Ok(())
17372    }
17373}
17374
17375impl<'de> ::serde::de::Deserialize<'de> for SharedFolderMembers {
17376    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
17377        // struct deserializer
17378        use serde::de::{MapAccess, Visitor};
17379        struct StructVisitor;
17380        impl<'de> Visitor<'de> for StructVisitor {
17381            type Value = SharedFolderMembers;
17382            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17383                f.write_str("a SharedFolderMembers struct")
17384            }
17385            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
17386                SharedFolderMembers::internal_deserialize(map)
17387            }
17388        }
17389        deserializer.deserialize_struct("SharedFolderMembers", SHARED_FOLDER_MEMBERS_FIELDS, StructVisitor)
17390    }
17391}
17392
17393impl ::serde::ser::Serialize for SharedFolderMembers {
17394    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
17395        // struct serializer
17396        use serde::ser::SerializeStruct;
17397        let mut s = serializer.serialize_struct("SharedFolderMembers", 4)?;
17398        self.internal_serialize::<S>(&mut s)?;
17399        s.end()
17400    }
17401}
17402
17403/// The metadata which includes basic information about the shared folder.
17404#[derive(Debug, Clone, PartialEq, Eq)]
17405#[non_exhaustive] // structs may have more fields added in the future.
17406pub struct SharedFolderMetadata {
17407    /// The current user's access level for this shared folder.
17408    pub access_type: AccessLevel,
17409    /// Whether this folder is inside of a team folder.
17410    pub is_inside_team_folder: bool,
17411    /// Whether this folder is a [team folder](https://www.dropbox.com/en/help/986).
17412    pub is_team_folder: bool,
17413    /// The name of the this shared folder.
17414    pub name: String,
17415    /// Policies governing this shared folder.
17416    pub policy: FolderPolicy,
17417    /// URL for displaying a web preview of the shared folder.
17418    pub preview_url: String,
17419    /// The ID of the shared folder.
17420    pub shared_folder_id: crate::types::common::SharedFolderId,
17421    /// Timestamp indicating when the current user was invited to this shared folder.
17422    pub time_invited: crate::types::common::DropboxTimestamp,
17423    /// The display names of the users that own the folder. If the folder is part of a team folder,
17424    /// the display names of the team admins are also included. Absent if the owner display names
17425    /// cannot be fetched.
17426    pub owner_display_names: Option<Vec<String>>,
17427    /// The team that owns the folder. This field is not present if the folder is not owned by a
17428    /// team.
17429    pub owner_team: Option<crate::types::users::Team>,
17430    /// The ID of the parent shared folder. This field is present only if the folder is contained
17431    /// within another shared folder.
17432    pub parent_shared_folder_id: Option<crate::types::common::SharedFolderId>,
17433    /// The full path of this shared folder. Absent for unmounted folders.
17434    pub path_display: Option<String>,
17435    /// The lower-cased full path of this shared folder. Absent for unmounted folders.
17436    pub path_lower: Option<String>,
17437    /// Display name for the parent folder.
17438    pub parent_folder_name: Option<String>,
17439    /// The metadata of the shared content link to this shared folder. Absent if there is no link on
17440    /// the folder. This is for an unreleased feature so it may not be returned yet.
17441    pub link_metadata: Option<SharedContentLinkMetadata>,
17442    /// Actions the current user may perform on the folder and its contents. The set of permissions
17443    /// corresponds to the FolderActions in the request.
17444    pub permissions: Option<Vec<FolderPermission>>,
17445    /// Whether the folder inherits its members from its parent.
17446    pub access_inheritance: AccessInheritance,
17447    /// The ID of the content.
17448    pub folder_id: Option<crate::types::files::FileId>,
17449}
17450
17451impl SharedFolderMetadata {
17452    pub fn new(
17453        access_type: AccessLevel,
17454        is_inside_team_folder: bool,
17455        is_team_folder: bool,
17456        name: String,
17457        policy: FolderPolicy,
17458        preview_url: String,
17459        shared_folder_id: crate::types::common::SharedFolderId,
17460        time_invited: crate::types::common::DropboxTimestamp,
17461    ) -> Self {
17462        SharedFolderMetadata {
17463            access_type,
17464            is_inside_team_folder,
17465            is_team_folder,
17466            name,
17467            policy,
17468            preview_url,
17469            shared_folder_id,
17470            time_invited,
17471            owner_display_names: None,
17472            owner_team: None,
17473            parent_shared_folder_id: None,
17474            path_display: None,
17475            path_lower: None,
17476            parent_folder_name: None,
17477            link_metadata: None,
17478            permissions: None,
17479            access_inheritance: AccessInheritance::Inherit,
17480            folder_id: None,
17481        }
17482    }
17483
17484    pub fn with_owner_display_names(mut self, value: Vec<String>) -> Self {
17485        self.owner_display_names = Some(value);
17486        self
17487    }
17488
17489    pub fn with_owner_team(mut self, value: crate::types::users::Team) -> Self {
17490        self.owner_team = Some(value);
17491        self
17492    }
17493
17494    pub fn with_parent_shared_folder_id(
17495        mut self,
17496        value: crate::types::common::SharedFolderId,
17497    ) -> Self {
17498        self.parent_shared_folder_id = Some(value);
17499        self
17500    }
17501
17502    pub fn with_path_display(mut self, value: String) -> Self {
17503        self.path_display = Some(value);
17504        self
17505    }
17506
17507    pub fn with_path_lower(mut self, value: String) -> Self {
17508        self.path_lower = Some(value);
17509        self
17510    }
17511
17512    pub fn with_parent_folder_name(mut self, value: String) -> Self {
17513        self.parent_folder_name = Some(value);
17514        self
17515    }
17516
17517    pub fn with_link_metadata(mut self, value: SharedContentLinkMetadata) -> Self {
17518        self.link_metadata = Some(value);
17519        self
17520    }
17521
17522    pub fn with_permissions(mut self, value: Vec<FolderPermission>) -> Self {
17523        self.permissions = Some(value);
17524        self
17525    }
17526
17527    pub fn with_access_inheritance(mut self, value: AccessInheritance) -> Self {
17528        self.access_inheritance = value;
17529        self
17530    }
17531
17532    pub fn with_folder_id(mut self, value: crate::types::files::FileId) -> Self {
17533        self.folder_id = Some(value);
17534        self
17535    }
17536}
17537
17538const SHARED_FOLDER_METADATA_FIELDS: &[&str] = &["access_type",
17539                                                 "is_inside_team_folder",
17540                                                 "is_team_folder",
17541                                                 "name",
17542                                                 "policy",
17543                                                 "preview_url",
17544                                                 "shared_folder_id",
17545                                                 "time_invited",
17546                                                 "owner_display_names",
17547                                                 "owner_team",
17548                                                 "parent_shared_folder_id",
17549                                                 "path_display",
17550                                                 "path_lower",
17551                                                 "parent_folder_name",
17552                                                 "link_metadata",
17553                                                 "permissions",
17554                                                 "access_inheritance",
17555                                                 "folder_id"];
17556impl SharedFolderMetadata {
17557    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
17558        map: V,
17559    ) -> Result<SharedFolderMetadata, V::Error> {
17560        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
17561    }
17562
17563    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
17564        mut map: V,
17565        optional: bool,
17566    ) -> Result<Option<SharedFolderMetadata>, V::Error> {
17567        let mut field_access_type = None;
17568        let mut field_is_inside_team_folder = None;
17569        let mut field_is_team_folder = None;
17570        let mut field_name = None;
17571        let mut field_policy = None;
17572        let mut field_preview_url = None;
17573        let mut field_shared_folder_id = None;
17574        let mut field_time_invited = None;
17575        let mut field_owner_display_names = None;
17576        let mut field_owner_team = None;
17577        let mut field_parent_shared_folder_id = None;
17578        let mut field_path_display = None;
17579        let mut field_path_lower = None;
17580        let mut field_parent_folder_name = None;
17581        let mut field_link_metadata = None;
17582        let mut field_permissions = None;
17583        let mut field_access_inheritance = None;
17584        let mut field_folder_id = None;
17585        let mut nothing = true;
17586        while let Some(key) = map.next_key::<&str>()? {
17587            nothing = false;
17588            match key {
17589                "access_type" => {
17590                    if field_access_type.is_some() {
17591                        return Err(::serde::de::Error::duplicate_field("access_type"));
17592                    }
17593                    field_access_type = Some(map.next_value()?);
17594                }
17595                "is_inside_team_folder" => {
17596                    if field_is_inside_team_folder.is_some() {
17597                        return Err(::serde::de::Error::duplicate_field("is_inside_team_folder"));
17598                    }
17599                    field_is_inside_team_folder = Some(map.next_value()?);
17600                }
17601                "is_team_folder" => {
17602                    if field_is_team_folder.is_some() {
17603                        return Err(::serde::de::Error::duplicate_field("is_team_folder"));
17604                    }
17605                    field_is_team_folder = Some(map.next_value()?);
17606                }
17607                "name" => {
17608                    if field_name.is_some() {
17609                        return Err(::serde::de::Error::duplicate_field("name"));
17610                    }
17611                    field_name = Some(map.next_value()?);
17612                }
17613                "policy" => {
17614                    if field_policy.is_some() {
17615                        return Err(::serde::de::Error::duplicate_field("policy"));
17616                    }
17617                    field_policy = Some(map.next_value()?);
17618                }
17619                "preview_url" => {
17620                    if field_preview_url.is_some() {
17621                        return Err(::serde::de::Error::duplicate_field("preview_url"));
17622                    }
17623                    field_preview_url = Some(map.next_value()?);
17624                }
17625                "shared_folder_id" => {
17626                    if field_shared_folder_id.is_some() {
17627                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
17628                    }
17629                    field_shared_folder_id = Some(map.next_value()?);
17630                }
17631                "time_invited" => {
17632                    if field_time_invited.is_some() {
17633                        return Err(::serde::de::Error::duplicate_field("time_invited"));
17634                    }
17635                    field_time_invited = Some(map.next_value()?);
17636                }
17637                "owner_display_names" => {
17638                    if field_owner_display_names.is_some() {
17639                        return Err(::serde::de::Error::duplicate_field("owner_display_names"));
17640                    }
17641                    field_owner_display_names = Some(map.next_value()?);
17642                }
17643                "owner_team" => {
17644                    if field_owner_team.is_some() {
17645                        return Err(::serde::de::Error::duplicate_field("owner_team"));
17646                    }
17647                    field_owner_team = Some(map.next_value()?);
17648                }
17649                "parent_shared_folder_id" => {
17650                    if field_parent_shared_folder_id.is_some() {
17651                        return Err(::serde::de::Error::duplicate_field("parent_shared_folder_id"));
17652                    }
17653                    field_parent_shared_folder_id = Some(map.next_value()?);
17654                }
17655                "path_display" => {
17656                    if field_path_display.is_some() {
17657                        return Err(::serde::de::Error::duplicate_field("path_display"));
17658                    }
17659                    field_path_display = Some(map.next_value()?);
17660                }
17661                "path_lower" => {
17662                    if field_path_lower.is_some() {
17663                        return Err(::serde::de::Error::duplicate_field("path_lower"));
17664                    }
17665                    field_path_lower = Some(map.next_value()?);
17666                }
17667                "parent_folder_name" => {
17668                    if field_parent_folder_name.is_some() {
17669                        return Err(::serde::de::Error::duplicate_field("parent_folder_name"));
17670                    }
17671                    field_parent_folder_name = Some(map.next_value()?);
17672                }
17673                "link_metadata" => {
17674                    if field_link_metadata.is_some() {
17675                        return Err(::serde::de::Error::duplicate_field("link_metadata"));
17676                    }
17677                    field_link_metadata = Some(map.next_value()?);
17678                }
17679                "permissions" => {
17680                    if field_permissions.is_some() {
17681                        return Err(::serde::de::Error::duplicate_field("permissions"));
17682                    }
17683                    field_permissions = Some(map.next_value()?);
17684                }
17685                "access_inheritance" => {
17686                    if field_access_inheritance.is_some() {
17687                        return Err(::serde::de::Error::duplicate_field("access_inheritance"));
17688                    }
17689                    field_access_inheritance = Some(map.next_value()?);
17690                }
17691                "folder_id" => {
17692                    if field_folder_id.is_some() {
17693                        return Err(::serde::de::Error::duplicate_field("folder_id"));
17694                    }
17695                    field_folder_id = Some(map.next_value()?);
17696                }
17697                _ => {
17698                    // unknown field allowed and ignored
17699                    map.next_value::<::serde_json::Value>()?;
17700                }
17701            }
17702        }
17703        if optional && nothing {
17704            return Ok(None);
17705        }
17706        let result = SharedFolderMetadata {
17707            access_type: field_access_type.ok_or_else(|| ::serde::de::Error::missing_field("access_type"))?,
17708            is_inside_team_folder: field_is_inside_team_folder.ok_or_else(|| ::serde::de::Error::missing_field("is_inside_team_folder"))?,
17709            is_team_folder: field_is_team_folder.ok_or_else(|| ::serde::de::Error::missing_field("is_team_folder"))?,
17710            name: field_name.ok_or_else(|| ::serde::de::Error::missing_field("name"))?,
17711            policy: field_policy.ok_or_else(|| ::serde::de::Error::missing_field("policy"))?,
17712            preview_url: field_preview_url.ok_or_else(|| ::serde::de::Error::missing_field("preview_url"))?,
17713            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
17714            time_invited: field_time_invited.ok_or_else(|| ::serde::de::Error::missing_field("time_invited"))?,
17715            owner_display_names: field_owner_display_names.and_then(Option::flatten),
17716            owner_team: field_owner_team.and_then(Option::flatten),
17717            parent_shared_folder_id: field_parent_shared_folder_id.and_then(Option::flatten),
17718            path_display: field_path_display.and_then(Option::flatten),
17719            path_lower: field_path_lower.and_then(Option::flatten),
17720            parent_folder_name: field_parent_folder_name.and_then(Option::flatten),
17721            link_metadata: field_link_metadata.and_then(Option::flatten),
17722            permissions: field_permissions.and_then(Option::flatten),
17723            access_inheritance: field_access_inheritance.unwrap_or(AccessInheritance::Inherit),
17724            folder_id: field_folder_id.and_then(Option::flatten),
17725        };
17726        Ok(Some(result))
17727    }
17728
17729    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
17730        &self,
17731        s: &mut S::SerializeStruct,
17732    ) -> Result<(), S::Error> {
17733        use serde::ser::SerializeStruct;
17734        s.serialize_field("access_type", &self.access_type)?;
17735        s.serialize_field("is_inside_team_folder", &self.is_inside_team_folder)?;
17736        s.serialize_field("is_team_folder", &self.is_team_folder)?;
17737        s.serialize_field("name", &self.name)?;
17738        s.serialize_field("policy", &self.policy)?;
17739        s.serialize_field("preview_url", &self.preview_url)?;
17740        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
17741        s.serialize_field("time_invited", &self.time_invited)?;
17742        if let Some(val) = &self.owner_display_names {
17743            s.serialize_field("owner_display_names", val)?;
17744        }
17745        if let Some(val) = &self.owner_team {
17746            s.serialize_field("owner_team", val)?;
17747        }
17748        if let Some(val) = &self.parent_shared_folder_id {
17749            s.serialize_field("parent_shared_folder_id", val)?;
17750        }
17751        if let Some(val) = &self.path_display {
17752            s.serialize_field("path_display", val)?;
17753        }
17754        if let Some(val) = &self.path_lower {
17755            s.serialize_field("path_lower", val)?;
17756        }
17757        if let Some(val) = &self.parent_folder_name {
17758            s.serialize_field("parent_folder_name", val)?;
17759        }
17760        if let Some(val) = &self.link_metadata {
17761            s.serialize_field("link_metadata", val)?;
17762        }
17763        if let Some(val) = &self.permissions {
17764            s.serialize_field("permissions", val)?;
17765        }
17766        if self.access_inheritance != AccessInheritance::Inherit {
17767            s.serialize_field("access_inheritance", &self.access_inheritance)?;
17768        }
17769        if let Some(val) = &self.folder_id {
17770            s.serialize_field("folder_id", val)?;
17771        }
17772        Ok(())
17773    }
17774}
17775
17776impl<'de> ::serde::de::Deserialize<'de> for SharedFolderMetadata {
17777    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
17778        // struct deserializer
17779        use serde::de::{MapAccess, Visitor};
17780        struct StructVisitor;
17781        impl<'de> Visitor<'de> for StructVisitor {
17782            type Value = SharedFolderMetadata;
17783            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17784                f.write_str("a SharedFolderMetadata struct")
17785            }
17786            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
17787                SharedFolderMetadata::internal_deserialize(map)
17788            }
17789        }
17790        deserializer.deserialize_struct("SharedFolderMetadata", SHARED_FOLDER_METADATA_FIELDS, StructVisitor)
17791    }
17792}
17793
17794impl ::serde::ser::Serialize for SharedFolderMetadata {
17795    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
17796        // struct serializer
17797        use serde::ser::SerializeStruct;
17798        let mut s = serializer.serialize_struct("SharedFolderMetadata", 18)?;
17799        self.internal_serialize::<S>(&mut s)?;
17800        s.end()
17801    }
17802}
17803
17804// struct extends SharedFolderMetadataBase
17805impl From<SharedFolderMetadata> for SharedFolderMetadataBase {
17806    fn from(subtype: SharedFolderMetadata) -> Self {
17807        Self {
17808            access_type: subtype.access_type,
17809            is_inside_team_folder: subtype.is_inside_team_folder,
17810            is_team_folder: subtype.is_team_folder,
17811            owner_display_names: subtype.owner_display_names,
17812            owner_team: subtype.owner_team,
17813            parent_shared_folder_id: subtype.parent_shared_folder_id,
17814            path_display: subtype.path_display,
17815            path_lower: subtype.path_lower,
17816            parent_folder_name: subtype.parent_folder_name,
17817        }
17818    }
17819}
17820/// Properties of the shared folder.
17821#[derive(Debug, Clone, PartialEq, Eq)]
17822#[non_exhaustive] // structs may have more fields added in the future.
17823pub struct SharedFolderMetadataBase {
17824    /// The current user's access level for this shared folder.
17825    pub access_type: AccessLevel,
17826    /// Whether this folder is inside of a team folder.
17827    pub is_inside_team_folder: bool,
17828    /// Whether this folder is a [team folder](https://www.dropbox.com/en/help/986).
17829    pub is_team_folder: bool,
17830    /// The display names of the users that own the folder. If the folder is part of a team folder,
17831    /// the display names of the team admins are also included. Absent if the owner display names
17832    /// cannot be fetched.
17833    pub owner_display_names: Option<Vec<String>>,
17834    /// The team that owns the folder. This field is not present if the folder is not owned by a
17835    /// team.
17836    pub owner_team: Option<crate::types::users::Team>,
17837    /// The ID of the parent shared folder. This field is present only if the folder is contained
17838    /// within another shared folder.
17839    pub parent_shared_folder_id: Option<crate::types::common::SharedFolderId>,
17840    /// The full path of this shared folder. Absent for unmounted folders.
17841    pub path_display: Option<String>,
17842    /// The lower-cased full path of this shared folder. Absent for unmounted folders.
17843    pub path_lower: Option<String>,
17844    /// Display name for the parent folder.
17845    pub parent_folder_name: Option<String>,
17846}
17847
17848impl SharedFolderMetadataBase {
17849    pub fn new(
17850        access_type: AccessLevel,
17851        is_inside_team_folder: bool,
17852        is_team_folder: bool,
17853    ) -> Self {
17854        SharedFolderMetadataBase {
17855            access_type,
17856            is_inside_team_folder,
17857            is_team_folder,
17858            owner_display_names: None,
17859            owner_team: None,
17860            parent_shared_folder_id: None,
17861            path_display: None,
17862            path_lower: None,
17863            parent_folder_name: None,
17864        }
17865    }
17866
17867    pub fn with_owner_display_names(mut self, value: Vec<String>) -> Self {
17868        self.owner_display_names = Some(value);
17869        self
17870    }
17871
17872    pub fn with_owner_team(mut self, value: crate::types::users::Team) -> Self {
17873        self.owner_team = Some(value);
17874        self
17875    }
17876
17877    pub fn with_parent_shared_folder_id(
17878        mut self,
17879        value: crate::types::common::SharedFolderId,
17880    ) -> Self {
17881        self.parent_shared_folder_id = Some(value);
17882        self
17883    }
17884
17885    pub fn with_path_display(mut self, value: String) -> Self {
17886        self.path_display = Some(value);
17887        self
17888    }
17889
17890    pub fn with_path_lower(mut self, value: String) -> Self {
17891        self.path_lower = Some(value);
17892        self
17893    }
17894
17895    pub fn with_parent_folder_name(mut self, value: String) -> Self {
17896        self.parent_folder_name = Some(value);
17897        self
17898    }
17899}
17900
17901const SHARED_FOLDER_METADATA_BASE_FIELDS: &[&str] = &["access_type",
17902                                                      "is_inside_team_folder",
17903                                                      "is_team_folder",
17904                                                      "owner_display_names",
17905                                                      "owner_team",
17906                                                      "parent_shared_folder_id",
17907                                                      "path_display",
17908                                                      "path_lower",
17909                                                      "parent_folder_name"];
17910impl SharedFolderMetadataBase {
17911    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
17912        map: V,
17913    ) -> Result<SharedFolderMetadataBase, V::Error> {
17914        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
17915    }
17916
17917    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
17918        mut map: V,
17919        optional: bool,
17920    ) -> Result<Option<SharedFolderMetadataBase>, V::Error> {
17921        let mut field_access_type = None;
17922        let mut field_is_inside_team_folder = None;
17923        let mut field_is_team_folder = None;
17924        let mut field_owner_display_names = None;
17925        let mut field_owner_team = None;
17926        let mut field_parent_shared_folder_id = None;
17927        let mut field_path_display = None;
17928        let mut field_path_lower = None;
17929        let mut field_parent_folder_name = None;
17930        let mut nothing = true;
17931        while let Some(key) = map.next_key::<&str>()? {
17932            nothing = false;
17933            match key {
17934                "access_type" => {
17935                    if field_access_type.is_some() {
17936                        return Err(::serde::de::Error::duplicate_field("access_type"));
17937                    }
17938                    field_access_type = Some(map.next_value()?);
17939                }
17940                "is_inside_team_folder" => {
17941                    if field_is_inside_team_folder.is_some() {
17942                        return Err(::serde::de::Error::duplicate_field("is_inside_team_folder"));
17943                    }
17944                    field_is_inside_team_folder = Some(map.next_value()?);
17945                }
17946                "is_team_folder" => {
17947                    if field_is_team_folder.is_some() {
17948                        return Err(::serde::de::Error::duplicate_field("is_team_folder"));
17949                    }
17950                    field_is_team_folder = Some(map.next_value()?);
17951                }
17952                "owner_display_names" => {
17953                    if field_owner_display_names.is_some() {
17954                        return Err(::serde::de::Error::duplicate_field("owner_display_names"));
17955                    }
17956                    field_owner_display_names = Some(map.next_value()?);
17957                }
17958                "owner_team" => {
17959                    if field_owner_team.is_some() {
17960                        return Err(::serde::de::Error::duplicate_field("owner_team"));
17961                    }
17962                    field_owner_team = Some(map.next_value()?);
17963                }
17964                "parent_shared_folder_id" => {
17965                    if field_parent_shared_folder_id.is_some() {
17966                        return Err(::serde::de::Error::duplicate_field("parent_shared_folder_id"));
17967                    }
17968                    field_parent_shared_folder_id = Some(map.next_value()?);
17969                }
17970                "path_display" => {
17971                    if field_path_display.is_some() {
17972                        return Err(::serde::de::Error::duplicate_field("path_display"));
17973                    }
17974                    field_path_display = Some(map.next_value()?);
17975                }
17976                "path_lower" => {
17977                    if field_path_lower.is_some() {
17978                        return Err(::serde::de::Error::duplicate_field("path_lower"));
17979                    }
17980                    field_path_lower = Some(map.next_value()?);
17981                }
17982                "parent_folder_name" => {
17983                    if field_parent_folder_name.is_some() {
17984                        return Err(::serde::de::Error::duplicate_field("parent_folder_name"));
17985                    }
17986                    field_parent_folder_name = Some(map.next_value()?);
17987                }
17988                _ => {
17989                    // unknown field allowed and ignored
17990                    map.next_value::<::serde_json::Value>()?;
17991                }
17992            }
17993        }
17994        if optional && nothing {
17995            return Ok(None);
17996        }
17997        let result = SharedFolderMetadataBase {
17998            access_type: field_access_type.ok_or_else(|| ::serde::de::Error::missing_field("access_type"))?,
17999            is_inside_team_folder: field_is_inside_team_folder.ok_or_else(|| ::serde::de::Error::missing_field("is_inside_team_folder"))?,
18000            is_team_folder: field_is_team_folder.ok_or_else(|| ::serde::de::Error::missing_field("is_team_folder"))?,
18001            owner_display_names: field_owner_display_names.and_then(Option::flatten),
18002            owner_team: field_owner_team.and_then(Option::flatten),
18003            parent_shared_folder_id: field_parent_shared_folder_id.and_then(Option::flatten),
18004            path_display: field_path_display.and_then(Option::flatten),
18005            path_lower: field_path_lower.and_then(Option::flatten),
18006            parent_folder_name: field_parent_folder_name.and_then(Option::flatten),
18007        };
18008        Ok(Some(result))
18009    }
18010
18011    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
18012        &self,
18013        s: &mut S::SerializeStruct,
18014    ) -> Result<(), S::Error> {
18015        use serde::ser::SerializeStruct;
18016        s.serialize_field("access_type", &self.access_type)?;
18017        s.serialize_field("is_inside_team_folder", &self.is_inside_team_folder)?;
18018        s.serialize_field("is_team_folder", &self.is_team_folder)?;
18019        if let Some(val) = &self.owner_display_names {
18020            s.serialize_field("owner_display_names", val)?;
18021        }
18022        if let Some(val) = &self.owner_team {
18023            s.serialize_field("owner_team", val)?;
18024        }
18025        if let Some(val) = &self.parent_shared_folder_id {
18026            s.serialize_field("parent_shared_folder_id", val)?;
18027        }
18028        if let Some(val) = &self.path_display {
18029            s.serialize_field("path_display", val)?;
18030        }
18031        if let Some(val) = &self.path_lower {
18032            s.serialize_field("path_lower", val)?;
18033        }
18034        if let Some(val) = &self.parent_folder_name {
18035            s.serialize_field("parent_folder_name", val)?;
18036        }
18037        Ok(())
18038    }
18039}
18040
18041impl<'de> ::serde::de::Deserialize<'de> for SharedFolderMetadataBase {
18042    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18043        // struct deserializer
18044        use serde::de::{MapAccess, Visitor};
18045        struct StructVisitor;
18046        impl<'de> Visitor<'de> for StructVisitor {
18047            type Value = SharedFolderMetadataBase;
18048            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18049                f.write_str("a SharedFolderMetadataBase struct")
18050            }
18051            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
18052                SharedFolderMetadataBase::internal_deserialize(map)
18053            }
18054        }
18055        deserializer.deserialize_struct("SharedFolderMetadataBase", SHARED_FOLDER_METADATA_BASE_FIELDS, StructVisitor)
18056    }
18057}
18058
18059impl ::serde::ser::Serialize for SharedFolderMetadataBase {
18060    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18061        // struct serializer
18062        use serde::ser::SerializeStruct;
18063        let mut s = serializer.serialize_struct("SharedFolderMetadataBase", 9)?;
18064        self.internal_serialize::<S>(&mut s)?;
18065        s.end()
18066    }
18067}
18068
18069#[derive(Debug, Clone, PartialEq, Eq)]
18070#[non_exhaustive] // variants may be added in the future
18071pub enum SharedLinkAccessFailureReason {
18072    /// User is not logged in.
18073    LoginRequired,
18074    /// This user's email address is not verified. This functionality is only available on accounts
18075    /// with a verified email address. Users can verify their email address
18076    /// [here](https://www.dropbox.com/help/317).
18077    EmailVerifyRequired,
18078    /// The link is password protected.
18079    PasswordRequired,
18080    /// Access is allowed for team members only.
18081    TeamOnly,
18082    /// Access is allowed for the shared link's owner only.
18083    OwnerOnly,
18084    /// Catch-all used for unrecognized values returned from the server. Encountering this value
18085    /// typically indicates that this SDK version is out of date.
18086    Other,
18087}
18088
18089impl<'de> ::serde::de::Deserialize<'de> for SharedLinkAccessFailureReason {
18090    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18091        // union deserializer
18092        use serde::de::{self, MapAccess, Visitor};
18093        struct EnumVisitor;
18094        impl<'de> Visitor<'de> for EnumVisitor {
18095            type Value = SharedLinkAccessFailureReason;
18096            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18097                f.write_str("a SharedLinkAccessFailureReason structure")
18098            }
18099            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
18100                let tag: &str = match map.next_key()? {
18101                    Some(".tag") => map.next_value()?,
18102                    _ => return Err(de::Error::missing_field(".tag"))
18103                };
18104                let value = match tag {
18105                    "login_required" => SharedLinkAccessFailureReason::LoginRequired,
18106                    "email_verify_required" => SharedLinkAccessFailureReason::EmailVerifyRequired,
18107                    "password_required" => SharedLinkAccessFailureReason::PasswordRequired,
18108                    "team_only" => SharedLinkAccessFailureReason::TeamOnly,
18109                    "owner_only" => SharedLinkAccessFailureReason::OwnerOnly,
18110                    _ => SharedLinkAccessFailureReason::Other,
18111                };
18112                crate::eat_json_fields(&mut map)?;
18113                Ok(value)
18114            }
18115        }
18116        const VARIANTS: &[&str] = &["login_required",
18117                                    "email_verify_required",
18118                                    "password_required",
18119                                    "team_only",
18120                                    "owner_only",
18121                                    "other"];
18122        deserializer.deserialize_struct("SharedLinkAccessFailureReason", VARIANTS, EnumVisitor)
18123    }
18124}
18125
18126impl ::serde::ser::Serialize for SharedLinkAccessFailureReason {
18127    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18128        // union serializer
18129        use serde::ser::SerializeStruct;
18130        match self {
18131            SharedLinkAccessFailureReason::LoginRequired => {
18132                // unit
18133                let mut s = serializer.serialize_struct("SharedLinkAccessFailureReason", 1)?;
18134                s.serialize_field(".tag", "login_required")?;
18135                s.end()
18136            }
18137            SharedLinkAccessFailureReason::EmailVerifyRequired => {
18138                // unit
18139                let mut s = serializer.serialize_struct("SharedLinkAccessFailureReason", 1)?;
18140                s.serialize_field(".tag", "email_verify_required")?;
18141                s.end()
18142            }
18143            SharedLinkAccessFailureReason::PasswordRequired => {
18144                // unit
18145                let mut s = serializer.serialize_struct("SharedLinkAccessFailureReason", 1)?;
18146                s.serialize_field(".tag", "password_required")?;
18147                s.end()
18148            }
18149            SharedLinkAccessFailureReason::TeamOnly => {
18150                // unit
18151                let mut s = serializer.serialize_struct("SharedLinkAccessFailureReason", 1)?;
18152                s.serialize_field(".tag", "team_only")?;
18153                s.end()
18154            }
18155            SharedLinkAccessFailureReason::OwnerOnly => {
18156                // unit
18157                let mut s = serializer.serialize_struct("SharedLinkAccessFailureReason", 1)?;
18158                s.serialize_field(".tag", "owner_only")?;
18159                s.end()
18160            }
18161            SharedLinkAccessFailureReason::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
18162        }
18163    }
18164}
18165
18166#[derive(Debug, Clone, PartialEq, Eq)]
18167#[non_exhaustive] // variants may be added in the future
18168pub enum SharedLinkAlreadyExistsMetadata {
18169    /// Metadata of the shared link that already exists.
18170    Metadata(SharedLinkMetadata),
18171    /// Catch-all used for unrecognized values returned from the server. Encountering this value
18172    /// typically indicates that this SDK version is out of date.
18173    Other,
18174}
18175
18176impl<'de> ::serde::de::Deserialize<'de> for SharedLinkAlreadyExistsMetadata {
18177    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18178        // union deserializer
18179        use serde::de::{self, MapAccess, Visitor};
18180        struct EnumVisitor;
18181        impl<'de> Visitor<'de> for EnumVisitor {
18182            type Value = SharedLinkAlreadyExistsMetadata;
18183            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18184                f.write_str("a SharedLinkAlreadyExistsMetadata structure")
18185            }
18186            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
18187                let tag: &str = match map.next_key()? {
18188                    Some(".tag") => map.next_value()?,
18189                    _ => return Err(de::Error::missing_field(".tag"))
18190                };
18191                let value = match tag {
18192                    "metadata" => {
18193                        match map.next_key()? {
18194                            Some("metadata") => SharedLinkAlreadyExistsMetadata::Metadata(map.next_value()?),
18195                            None => return Err(de::Error::missing_field("metadata")),
18196                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
18197                        }
18198                    }
18199                    _ => SharedLinkAlreadyExistsMetadata::Other,
18200                };
18201                crate::eat_json_fields(&mut map)?;
18202                Ok(value)
18203            }
18204        }
18205        const VARIANTS: &[&str] = &["metadata",
18206                                    "other"];
18207        deserializer.deserialize_struct("SharedLinkAlreadyExistsMetadata", VARIANTS, EnumVisitor)
18208    }
18209}
18210
18211impl ::serde::ser::Serialize for SharedLinkAlreadyExistsMetadata {
18212    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18213        // union serializer
18214        use serde::ser::SerializeStruct;
18215        match self {
18216            SharedLinkAlreadyExistsMetadata::Metadata(x) => {
18217                // union or polymporphic struct
18218                let mut s = serializer.serialize_struct("SharedLinkAlreadyExistsMetadata", 2)?;
18219                s.serialize_field(".tag", "metadata")?;
18220                s.serialize_field("metadata", x)?;
18221                s.end()
18222            }
18223            SharedLinkAlreadyExistsMetadata::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
18224        }
18225    }
18226}
18227
18228#[derive(Debug, Clone, PartialEq, Eq)]
18229#[non_exhaustive] // variants may be added in the future
18230pub enum SharedLinkError {
18231    /// The shared link wasn't found.
18232    SharedLinkNotFound,
18233    /// The caller is not allowed to access this shared link.
18234    SharedLinkAccessDenied,
18235    /// This type of link is not supported; use [`files::export()`](crate::files::export) instead.
18236    UnsupportedLinkType,
18237    /// Private shared links do not support `path` or `link_password` parameter fields.
18238    UnsupportedParameterField,
18239    /// Catch-all used for unrecognized values returned from the server. Encountering this value
18240    /// typically indicates that this SDK version is out of date.
18241    Other,
18242}
18243
18244impl<'de> ::serde::de::Deserialize<'de> for SharedLinkError {
18245    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18246        // union deserializer
18247        use serde::de::{self, MapAccess, Visitor};
18248        struct EnumVisitor;
18249        impl<'de> Visitor<'de> for EnumVisitor {
18250            type Value = SharedLinkError;
18251            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18252                f.write_str("a SharedLinkError structure")
18253            }
18254            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
18255                let tag: &str = match map.next_key()? {
18256                    Some(".tag") => map.next_value()?,
18257                    _ => return Err(de::Error::missing_field(".tag"))
18258                };
18259                let value = match tag {
18260                    "shared_link_not_found" => SharedLinkError::SharedLinkNotFound,
18261                    "shared_link_access_denied" => SharedLinkError::SharedLinkAccessDenied,
18262                    "unsupported_link_type" => SharedLinkError::UnsupportedLinkType,
18263                    "unsupported_parameter_field" => SharedLinkError::UnsupportedParameterField,
18264                    _ => SharedLinkError::Other,
18265                };
18266                crate::eat_json_fields(&mut map)?;
18267                Ok(value)
18268            }
18269        }
18270        const VARIANTS: &[&str] = &["shared_link_not_found",
18271                                    "shared_link_access_denied",
18272                                    "unsupported_link_type",
18273                                    "unsupported_parameter_field",
18274                                    "other"];
18275        deserializer.deserialize_struct("SharedLinkError", VARIANTS, EnumVisitor)
18276    }
18277}
18278
18279impl ::serde::ser::Serialize for SharedLinkError {
18280    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18281        // union serializer
18282        use serde::ser::SerializeStruct;
18283        match self {
18284            SharedLinkError::SharedLinkNotFound => {
18285                // unit
18286                let mut s = serializer.serialize_struct("SharedLinkError", 1)?;
18287                s.serialize_field(".tag", "shared_link_not_found")?;
18288                s.end()
18289            }
18290            SharedLinkError::SharedLinkAccessDenied => {
18291                // unit
18292                let mut s = serializer.serialize_struct("SharedLinkError", 1)?;
18293                s.serialize_field(".tag", "shared_link_access_denied")?;
18294                s.end()
18295            }
18296            SharedLinkError::UnsupportedLinkType => {
18297                // unit
18298                let mut s = serializer.serialize_struct("SharedLinkError", 1)?;
18299                s.serialize_field(".tag", "unsupported_link_type")?;
18300                s.end()
18301            }
18302            SharedLinkError::UnsupportedParameterField => {
18303                // unit
18304                let mut s = serializer.serialize_struct("SharedLinkError", 1)?;
18305                s.serialize_field(".tag", "unsupported_parameter_field")?;
18306                s.end()
18307            }
18308            SharedLinkError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
18309        }
18310    }
18311}
18312
18313impl ::std::error::Error for SharedLinkError {
18314}
18315
18316impl ::std::fmt::Display for SharedLinkError {
18317    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18318        match self {
18319            SharedLinkError::SharedLinkNotFound => f.write_str("The shared link wasn't found."),
18320            SharedLinkError::SharedLinkAccessDenied => f.write_str("The caller is not allowed to access this shared link."),
18321            SharedLinkError::UnsupportedParameterField => f.write_str("Private shared links do not support `path` or `link_password` parameter fields."),
18322            _ => write!(f, "{:?}", *self),
18323        }
18324    }
18325}
18326
18327/// The metadata of a shared link.
18328#[derive(Debug, Clone, PartialEq, Eq)]
18329#[non_exhaustive] // variants may be added in the future
18330pub enum SharedLinkMetadata {
18331    File(FileLinkMetadata),
18332    Folder(FolderLinkMetadata),
18333    /// Catch-all used for unrecognized values returned from the server. Encountering this value
18334    /// typically indicates that this SDK version is out of date.
18335    Other,
18336}
18337
18338impl<'de> ::serde::de::Deserialize<'de> for SharedLinkMetadata {
18339    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18340        // polymorphic struct deserializer
18341        use serde::de::{self, MapAccess, Visitor};
18342        struct EnumVisitor;
18343        impl<'de> Visitor<'de> for EnumVisitor {
18344            type Value = SharedLinkMetadata;
18345            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18346                f.write_str("a SharedLinkMetadata structure")
18347            }
18348            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
18349                let tag = match map.next_key()? {
18350                    Some(".tag") => map.next_value()?,
18351                    _ => return Err(de::Error::missing_field(".tag"))
18352                };
18353                match tag {
18354                    "file" => Ok(SharedLinkMetadata::File(FileLinkMetadata::internal_deserialize(map)?)),
18355                    "folder" => Ok(SharedLinkMetadata::Folder(FolderLinkMetadata::internal_deserialize(map)?)),
18356                    _ => {
18357                        crate::eat_json_fields(&mut map)?;
18358                        Ok(SharedLinkMetadata::Other)
18359                    }
18360                }
18361            }
18362        }
18363        const VARIANTS: &[&str] = &["file",
18364                                    "folder"];
18365        deserializer.deserialize_struct("SharedLinkMetadata", VARIANTS, EnumVisitor)
18366    }
18367}
18368
18369impl ::serde::ser::Serialize for SharedLinkMetadata {
18370    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18371        // polymorphic struct serializer
18372        use serde::ser::SerializeStruct;
18373        match self {
18374            SharedLinkMetadata::File(x) => {
18375                let mut s = serializer.serialize_struct("SharedLinkMetadata", 13)?;
18376                s.serialize_field(".tag", "file")?;
18377                x.internal_serialize::<S>(&mut s)?;
18378                s.end()
18379            }
18380            SharedLinkMetadata::Folder(x) => {
18381                let mut s = serializer.serialize_struct("SharedLinkMetadata", 9)?;
18382                s.serialize_field(".tag", "folder")?;
18383                x.internal_serialize::<S>(&mut s)?;
18384                s.end()
18385            }
18386            SharedLinkMetadata::Other => Err(::serde::ser::Error::custom("cannot serialize unknown variant"))
18387        }
18388    }
18389}
18390
18391/// The potential errors for a call to get_shared_link_metadata.
18392#[derive(Debug, Clone, PartialEq, Eq)]
18393#[non_exhaustive] // variants may be added in the future
18394pub enum SharedLinkMetadataError {
18395    /// The shared link wasn't found.
18396    SharedLinkNotFound,
18397    /// The caller is not allowed to access this shared link.
18398    SharedLinkAccessDenied,
18399    /// This type of link is not supported; use [`files::export()`](crate::files::export) instead.
18400    UnsupportedLinkType,
18401    /// Private shared links do not support `path` or `link_password` parameter fields.
18402    UnsupportedParameterField,
18403    /// Catch-all used for unrecognized values returned from the server. Encountering this value
18404    /// typically indicates that this SDK version is out of date.
18405    Other,
18406}
18407
18408impl<'de> ::serde::de::Deserialize<'de> for SharedLinkMetadataError {
18409    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18410        // union deserializer
18411        use serde::de::{self, MapAccess, Visitor};
18412        struct EnumVisitor;
18413        impl<'de> Visitor<'de> for EnumVisitor {
18414            type Value = SharedLinkMetadataError;
18415            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18416                f.write_str("a SharedLinkMetadataError structure")
18417            }
18418            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
18419                let tag: &str = match map.next_key()? {
18420                    Some(".tag") => map.next_value()?,
18421                    _ => return Err(de::Error::missing_field(".tag"))
18422                };
18423                let value = match tag {
18424                    "shared_link_not_found" => SharedLinkMetadataError::SharedLinkNotFound,
18425                    "shared_link_access_denied" => SharedLinkMetadataError::SharedLinkAccessDenied,
18426                    "unsupported_link_type" => SharedLinkMetadataError::UnsupportedLinkType,
18427                    "unsupported_parameter_field" => SharedLinkMetadataError::UnsupportedParameterField,
18428                    _ => SharedLinkMetadataError::Other,
18429                };
18430                crate::eat_json_fields(&mut map)?;
18431                Ok(value)
18432            }
18433        }
18434        const VARIANTS: &[&str] = &["shared_link_not_found",
18435                                    "shared_link_access_denied",
18436                                    "unsupported_link_type",
18437                                    "unsupported_parameter_field",
18438                                    "other"];
18439        deserializer.deserialize_struct("SharedLinkMetadataError", VARIANTS, EnumVisitor)
18440    }
18441}
18442
18443impl ::serde::ser::Serialize for SharedLinkMetadataError {
18444    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18445        // union serializer
18446        use serde::ser::SerializeStruct;
18447        match self {
18448            SharedLinkMetadataError::SharedLinkNotFound => {
18449                // unit
18450                let mut s = serializer.serialize_struct("SharedLinkMetadataError", 1)?;
18451                s.serialize_field(".tag", "shared_link_not_found")?;
18452                s.end()
18453            }
18454            SharedLinkMetadataError::SharedLinkAccessDenied => {
18455                // unit
18456                let mut s = serializer.serialize_struct("SharedLinkMetadataError", 1)?;
18457                s.serialize_field(".tag", "shared_link_access_denied")?;
18458                s.end()
18459            }
18460            SharedLinkMetadataError::UnsupportedLinkType => {
18461                // unit
18462                let mut s = serializer.serialize_struct("SharedLinkMetadataError", 1)?;
18463                s.serialize_field(".tag", "unsupported_link_type")?;
18464                s.end()
18465            }
18466            SharedLinkMetadataError::UnsupportedParameterField => {
18467                // unit
18468                let mut s = serializer.serialize_struct("SharedLinkMetadataError", 1)?;
18469                s.serialize_field(".tag", "unsupported_parameter_field")?;
18470                s.end()
18471            }
18472            SharedLinkMetadataError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
18473        }
18474    }
18475}
18476
18477impl ::std::error::Error for SharedLinkMetadataError {
18478}
18479
18480impl ::std::fmt::Display for SharedLinkMetadataError {
18481    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18482        match self {
18483            SharedLinkMetadataError::SharedLinkNotFound => f.write_str("The shared link wasn't found."),
18484            SharedLinkMetadataError::SharedLinkAccessDenied => f.write_str("The caller is not allowed to access this shared link."),
18485            SharedLinkMetadataError::UnsupportedParameterField => f.write_str("Private shared links do not support `path` or `link_password` parameter fields."),
18486            _ => write!(f, "{:?}", *self),
18487        }
18488    }
18489}
18490
18491// union extends SharedLinkError
18492impl From<SharedLinkError> for SharedLinkMetadataError {
18493    fn from(parent: SharedLinkError) -> Self {
18494        match parent {
18495            SharedLinkError::SharedLinkNotFound => SharedLinkMetadataError::SharedLinkNotFound,
18496            SharedLinkError::SharedLinkAccessDenied => SharedLinkMetadataError::SharedLinkAccessDenied,
18497            SharedLinkError::UnsupportedLinkType => SharedLinkMetadataError::UnsupportedLinkType,
18498            SharedLinkError::UnsupportedParameterField => SharedLinkMetadataError::UnsupportedParameterField,
18499            SharedLinkError::Other => SharedLinkMetadataError::Other,
18500        }
18501    }
18502}
18503/// Who can view shared links in this folder.
18504#[derive(Debug, Clone, PartialEq, Eq)]
18505#[non_exhaustive] // variants may be added in the future
18506pub enum SharedLinkPolicy {
18507    /// Links can be shared with anyone.
18508    Anyone,
18509    /// Field is deprecated. Links can be shared with anyone on the same team as the owner.
18510    #[deprecated]
18511    Team,
18512    /// Links can only be shared among members of the shared folder.
18513    Members,
18514    /// Catch-all used for unrecognized values returned from the server. Encountering this value
18515    /// typically indicates that this SDK version is out of date.
18516    Other,
18517}
18518
18519impl<'de> ::serde::de::Deserialize<'de> for SharedLinkPolicy {
18520    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18521        // union deserializer
18522        use serde::de::{self, MapAccess, Visitor};
18523        struct EnumVisitor;
18524        impl<'de> Visitor<'de> for EnumVisitor {
18525            type Value = SharedLinkPolicy;
18526            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18527                f.write_str("a SharedLinkPolicy structure")
18528            }
18529            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
18530                let tag: &str = match map.next_key()? {
18531                    Some(".tag") => map.next_value()?,
18532                    _ => return Err(de::Error::missing_field(".tag"))
18533                };
18534                let value = match tag {
18535                    "anyone" => SharedLinkPolicy::Anyone,
18536                    #[allow(deprecated)]
18537                    "team" => SharedLinkPolicy::Team,
18538                    "members" => SharedLinkPolicy::Members,
18539                    _ => SharedLinkPolicy::Other,
18540                };
18541                crate::eat_json_fields(&mut map)?;
18542                Ok(value)
18543            }
18544        }
18545        const VARIANTS: &[&str] = &["anyone",
18546                                    "team",
18547                                    "members",
18548                                    "other"];
18549        deserializer.deserialize_struct("SharedLinkPolicy", VARIANTS, EnumVisitor)
18550    }
18551}
18552
18553impl ::serde::ser::Serialize for SharedLinkPolicy {
18554    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18555        // union serializer
18556        use serde::ser::SerializeStruct;
18557        match self {
18558            SharedLinkPolicy::Anyone => {
18559                // unit
18560                let mut s = serializer.serialize_struct("SharedLinkPolicy", 1)?;
18561                s.serialize_field(".tag", "anyone")?;
18562                s.end()
18563            }
18564            #[allow(deprecated)]
18565            SharedLinkPolicy::Team => {
18566                // unit
18567                let mut s = serializer.serialize_struct("SharedLinkPolicy", 1)?;
18568                s.serialize_field(".tag", "team")?;
18569                s.end()
18570            }
18571            SharedLinkPolicy::Members => {
18572                // unit
18573                let mut s = serializer.serialize_struct("SharedLinkPolicy", 1)?;
18574                s.serialize_field(".tag", "members")?;
18575                s.end()
18576            }
18577            SharedLinkPolicy::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
18578        }
18579    }
18580}
18581
18582#[derive(Debug, Clone, PartialEq, Eq, Default)]
18583#[non_exhaustive] // structs may have more fields added in the future.
18584pub struct SharedLinkSettings {
18585    /// Boolean flag to enable or disable password protection.
18586    pub require_password: Option<bool>,
18587    /// If `require_password` is true, this is needed to specify the password to access the link.
18588    pub link_password: Option<String>,
18589    /// Expiration time of the shared link. By default the link won't expire.
18590    pub expires: Option<crate::types::common::DropboxTimestamp>,
18591    /// The new audience who can benefit from the access level specified by the link's access level
18592    /// specified in the `link_access_level` field of `LinkPermissions`. This is used in conjunction
18593    /// with team policies and shared folder policies to determine the final effective audience type
18594    /// in the `effective_audience` field of `LinkPermissions.
18595    pub audience: Option<LinkAudience>,
18596    /// Requested access level you want the audience to gain from this link. Note, modifying access
18597    /// level for an existing link is not supported.
18598    pub access: Option<RequestedLinkAccessLevel>,
18599    /// Field is deprecated. Use `audience` instead.  The requested access for this shared link.
18600    #[deprecated]
18601    pub requested_visibility: Option<RequestedVisibility>,
18602    /// Boolean flag to allow or not download capabilities for shared links.
18603    pub allow_download: Option<bool>,
18604}
18605
18606impl SharedLinkSettings {
18607    pub fn with_require_password(mut self, value: bool) -> Self {
18608        self.require_password = Some(value);
18609        self
18610    }
18611
18612    pub fn with_link_password(mut self, value: String) -> Self {
18613        self.link_password = Some(value);
18614        self
18615    }
18616
18617    pub fn with_expires(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
18618        self.expires = Some(value);
18619        self
18620    }
18621
18622    pub fn with_audience(mut self, value: LinkAudience) -> Self {
18623        self.audience = Some(value);
18624        self
18625    }
18626
18627    pub fn with_access(mut self, value: RequestedLinkAccessLevel) -> Self {
18628        self.access = Some(value);
18629        self
18630    }
18631
18632    #[deprecated]
18633    #[allow(deprecated)]
18634    pub fn with_requested_visibility(mut self, value: RequestedVisibility) -> Self {
18635        self.requested_visibility = Some(value);
18636        self
18637    }
18638
18639    pub fn with_allow_download(mut self, value: bool) -> Self {
18640        self.allow_download = Some(value);
18641        self
18642    }
18643}
18644
18645const SHARED_LINK_SETTINGS_FIELDS: &[&str] = &["require_password",
18646                                               "link_password",
18647                                               "expires",
18648                                               "audience",
18649                                               "access",
18650                                               "requested_visibility",
18651                                               "allow_download"];
18652impl SharedLinkSettings {
18653    // no _opt deserializer
18654    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
18655        mut map: V,
18656    ) -> Result<SharedLinkSettings, V::Error> {
18657        let mut field_require_password = None;
18658        let mut field_link_password = None;
18659        let mut field_expires = None;
18660        let mut field_audience = None;
18661        let mut field_access = None;
18662        let mut field_requested_visibility = None;
18663        let mut field_allow_download = None;
18664        while let Some(key) = map.next_key::<&str>()? {
18665            match key {
18666                "require_password" => {
18667                    if field_require_password.is_some() {
18668                        return Err(::serde::de::Error::duplicate_field("require_password"));
18669                    }
18670                    field_require_password = Some(map.next_value()?);
18671                }
18672                "link_password" => {
18673                    if field_link_password.is_some() {
18674                        return Err(::serde::de::Error::duplicate_field("link_password"));
18675                    }
18676                    field_link_password = Some(map.next_value()?);
18677                }
18678                "expires" => {
18679                    if field_expires.is_some() {
18680                        return Err(::serde::de::Error::duplicate_field("expires"));
18681                    }
18682                    field_expires = Some(map.next_value()?);
18683                }
18684                "audience" => {
18685                    if field_audience.is_some() {
18686                        return Err(::serde::de::Error::duplicate_field("audience"));
18687                    }
18688                    field_audience = Some(map.next_value()?);
18689                }
18690                "access" => {
18691                    if field_access.is_some() {
18692                        return Err(::serde::de::Error::duplicate_field("access"));
18693                    }
18694                    field_access = Some(map.next_value()?);
18695                }
18696                "requested_visibility" => {
18697                    if field_requested_visibility.is_some() {
18698                        return Err(::serde::de::Error::duplicate_field("requested_visibility"));
18699                    }
18700                    field_requested_visibility = Some(map.next_value()?);
18701                }
18702                "allow_download" => {
18703                    if field_allow_download.is_some() {
18704                        return Err(::serde::de::Error::duplicate_field("allow_download"));
18705                    }
18706                    field_allow_download = Some(map.next_value()?);
18707                }
18708                _ => {
18709                    // unknown field allowed and ignored
18710                    map.next_value::<::serde_json::Value>()?;
18711                }
18712            }
18713        }
18714        let result = SharedLinkSettings {
18715            require_password: field_require_password.and_then(Option::flatten),
18716            link_password: field_link_password.and_then(Option::flatten),
18717            expires: field_expires.and_then(Option::flatten),
18718            audience: field_audience.and_then(Option::flatten),
18719            access: field_access.and_then(Option::flatten),
18720            #[allow(deprecated)] requested_visibility: field_requested_visibility.and_then(Option::flatten),
18721            allow_download: field_allow_download.and_then(Option::flatten),
18722        };
18723        Ok(result)
18724    }
18725
18726    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
18727        &self,
18728        s: &mut S::SerializeStruct,
18729    ) -> Result<(), S::Error> {
18730        use serde::ser::SerializeStruct;
18731        if let Some(val) = &self.require_password {
18732            s.serialize_field("require_password", val)?;
18733        }
18734        if let Some(val) = &self.link_password {
18735            s.serialize_field("link_password", val)?;
18736        }
18737        if let Some(val) = &self.expires {
18738            s.serialize_field("expires", val)?;
18739        }
18740        if let Some(val) = &self.audience {
18741            s.serialize_field("audience", val)?;
18742        }
18743        if let Some(val) = &self.access {
18744            s.serialize_field("access", val)?;
18745        }
18746        #[allow(deprecated)]
18747        if let Some(val) = &self.requested_visibility {
18748            s.serialize_field("requested_visibility", val)?;
18749        }
18750        if let Some(val) = &self.allow_download {
18751            s.serialize_field("allow_download", val)?;
18752        }
18753        Ok(())
18754    }
18755}
18756
18757impl<'de> ::serde::de::Deserialize<'de> for SharedLinkSettings {
18758    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18759        // struct deserializer
18760        use serde::de::{MapAccess, Visitor};
18761        struct StructVisitor;
18762        impl<'de> Visitor<'de> for StructVisitor {
18763            type Value = SharedLinkSettings;
18764            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18765                f.write_str("a SharedLinkSettings struct")
18766            }
18767            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
18768                SharedLinkSettings::internal_deserialize(map)
18769            }
18770        }
18771        deserializer.deserialize_struct("SharedLinkSettings", SHARED_LINK_SETTINGS_FIELDS, StructVisitor)
18772    }
18773}
18774
18775impl ::serde::ser::Serialize for SharedLinkSettings {
18776    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18777        // struct serializer
18778        use serde::ser::SerializeStruct;
18779        let mut s = serializer.serialize_struct("SharedLinkSettings", 7)?;
18780        self.internal_serialize::<S>(&mut s)?;
18781        s.end()
18782    }
18783}
18784
18785#[derive(Debug, Clone, PartialEq, Eq)]
18786pub enum SharedLinkSettingsError {
18787    /// The given settings are invalid (for example, all attributes of the [`SharedLinkSettings`]
18788    /// are empty, the requested visibility is [`RequestedVisibility::Password`] but the
18789    /// [`SharedLinkSettings::link_password`](SharedLinkSettings) is missing,
18790    /// [`SharedLinkSettings::expires`](SharedLinkSettings) is set to the past, etc.).
18791    InvalidSettings,
18792    /// User is not allowed to modify the settings of this link. Note that basic users can only set
18793    /// [`RequestedVisibility::Public`] as the
18794    /// [`SharedLinkSettings::requested_visibility`](SharedLinkSettings) and cannot set
18795    /// [`SharedLinkSettings::expires`](SharedLinkSettings).
18796    NotAuthorized,
18797}
18798
18799impl<'de> ::serde::de::Deserialize<'de> for SharedLinkSettingsError {
18800    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18801        // union deserializer
18802        use serde::de::{self, MapAccess, Visitor};
18803        struct EnumVisitor;
18804        impl<'de> Visitor<'de> for EnumVisitor {
18805            type Value = SharedLinkSettingsError;
18806            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18807                f.write_str("a SharedLinkSettingsError structure")
18808            }
18809            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
18810                let tag: &str = match map.next_key()? {
18811                    Some(".tag") => map.next_value()?,
18812                    _ => return Err(de::Error::missing_field(".tag"))
18813                };
18814                let value = match tag {
18815                    "invalid_settings" => SharedLinkSettingsError::InvalidSettings,
18816                    "not_authorized" => SharedLinkSettingsError::NotAuthorized,
18817                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
18818                };
18819                crate::eat_json_fields(&mut map)?;
18820                Ok(value)
18821            }
18822        }
18823        const VARIANTS: &[&str] = &["invalid_settings",
18824                                    "not_authorized"];
18825        deserializer.deserialize_struct("SharedLinkSettingsError", VARIANTS, EnumVisitor)
18826    }
18827}
18828
18829impl ::serde::ser::Serialize for SharedLinkSettingsError {
18830    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18831        // union serializer
18832        use serde::ser::SerializeStruct;
18833        match self {
18834            SharedLinkSettingsError::InvalidSettings => {
18835                // unit
18836                let mut s = serializer.serialize_struct("SharedLinkSettingsError", 1)?;
18837                s.serialize_field(".tag", "invalid_settings")?;
18838                s.end()
18839            }
18840            SharedLinkSettingsError::NotAuthorized => {
18841                // unit
18842                let mut s = serializer.serialize_struct("SharedLinkSettingsError", 1)?;
18843                s.serialize_field(".tag", "not_authorized")?;
18844                s.end()
18845            }
18846        }
18847    }
18848}
18849
18850impl ::std::error::Error for SharedLinkSettingsError {
18851}
18852
18853impl ::std::fmt::Display for SharedLinkSettingsError {
18854    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18855        write!(f, "{:?}", *self)
18856    }
18857}
18858
18859/// User could not access this file.
18860#[derive(Debug, Clone, PartialEq, Eq)]
18861#[non_exhaustive] // variants may be added in the future
18862pub enum SharingFileAccessError {
18863    /// Current user does not have sufficient privileges to perform the desired action.
18864    NoPermission,
18865    /// File specified was not found.
18866    InvalidFile,
18867    /// A folder can't be shared this way. Use folder sharing or a shared link instead.
18868    IsFolder,
18869    /// A file inside a public folder can't be shared this way. Use a public link instead.
18870    InsidePublicFolder,
18871    /// A Mac OS X package can't be shared this way. Use a shared link instead.
18872    InsideOsxPackage,
18873    /// Catch-all used for unrecognized values returned from the server. Encountering this value
18874    /// typically indicates that this SDK version is out of date.
18875    Other,
18876}
18877
18878impl<'de> ::serde::de::Deserialize<'de> for SharingFileAccessError {
18879    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18880        // union deserializer
18881        use serde::de::{self, MapAccess, Visitor};
18882        struct EnumVisitor;
18883        impl<'de> Visitor<'de> for EnumVisitor {
18884            type Value = SharingFileAccessError;
18885            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18886                f.write_str("a SharingFileAccessError structure")
18887            }
18888            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
18889                let tag: &str = match map.next_key()? {
18890                    Some(".tag") => map.next_value()?,
18891                    _ => return Err(de::Error::missing_field(".tag"))
18892                };
18893                let value = match tag {
18894                    "no_permission" => SharingFileAccessError::NoPermission,
18895                    "invalid_file" => SharingFileAccessError::InvalidFile,
18896                    "is_folder" => SharingFileAccessError::IsFolder,
18897                    "inside_public_folder" => SharingFileAccessError::InsidePublicFolder,
18898                    "inside_osx_package" => SharingFileAccessError::InsideOsxPackage,
18899                    _ => SharingFileAccessError::Other,
18900                };
18901                crate::eat_json_fields(&mut map)?;
18902                Ok(value)
18903            }
18904        }
18905        const VARIANTS: &[&str] = &["no_permission",
18906                                    "invalid_file",
18907                                    "is_folder",
18908                                    "inside_public_folder",
18909                                    "inside_osx_package",
18910                                    "other"];
18911        deserializer.deserialize_struct("SharingFileAccessError", VARIANTS, EnumVisitor)
18912    }
18913}
18914
18915impl ::serde::ser::Serialize for SharingFileAccessError {
18916    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18917        // union serializer
18918        use serde::ser::SerializeStruct;
18919        match self {
18920            SharingFileAccessError::NoPermission => {
18921                // unit
18922                let mut s = serializer.serialize_struct("SharingFileAccessError", 1)?;
18923                s.serialize_field(".tag", "no_permission")?;
18924                s.end()
18925            }
18926            SharingFileAccessError::InvalidFile => {
18927                // unit
18928                let mut s = serializer.serialize_struct("SharingFileAccessError", 1)?;
18929                s.serialize_field(".tag", "invalid_file")?;
18930                s.end()
18931            }
18932            SharingFileAccessError::IsFolder => {
18933                // unit
18934                let mut s = serializer.serialize_struct("SharingFileAccessError", 1)?;
18935                s.serialize_field(".tag", "is_folder")?;
18936                s.end()
18937            }
18938            SharingFileAccessError::InsidePublicFolder => {
18939                // unit
18940                let mut s = serializer.serialize_struct("SharingFileAccessError", 1)?;
18941                s.serialize_field(".tag", "inside_public_folder")?;
18942                s.end()
18943            }
18944            SharingFileAccessError::InsideOsxPackage => {
18945                // unit
18946                let mut s = serializer.serialize_struct("SharingFileAccessError", 1)?;
18947                s.serialize_field(".tag", "inside_osx_package")?;
18948                s.end()
18949            }
18950            SharingFileAccessError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
18951        }
18952    }
18953}
18954
18955impl ::std::error::Error for SharingFileAccessError {
18956}
18957
18958impl ::std::fmt::Display for SharingFileAccessError {
18959    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18960        match self {
18961            SharingFileAccessError::NoPermission => f.write_str("Current user does not have sufficient privileges to perform the desired action."),
18962            SharingFileAccessError::InvalidFile => f.write_str("File specified was not found."),
18963            SharingFileAccessError::IsFolder => f.write_str("A folder can't be shared this way. Use folder sharing or a shared link instead."),
18964            SharingFileAccessError::InsidePublicFolder => f.write_str("A file inside a public folder can't be shared this way. Use a public link instead."),
18965            SharingFileAccessError::InsideOsxPackage => f.write_str("A Mac OS X package can't be shared this way. Use a shared link instead."),
18966            _ => write!(f, "{:?}", *self),
18967        }
18968    }
18969}
18970
18971/// User account had a problem preventing this action.
18972#[derive(Debug, Clone, PartialEq, Eq)]
18973#[non_exhaustive] // variants may be added in the future
18974pub enum SharingUserError {
18975    /// This user's email address is not verified. This functionality is only available on accounts
18976    /// with a verified email address. Users can verify their email address
18977    /// [here](https://www.dropbox.com/help/317).
18978    EmailUnverified,
18979    /// Catch-all used for unrecognized values returned from the server. Encountering this value
18980    /// typically indicates that this SDK version is out of date.
18981    Other,
18982}
18983
18984impl<'de> ::serde::de::Deserialize<'de> for SharingUserError {
18985    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18986        // union deserializer
18987        use serde::de::{self, MapAccess, Visitor};
18988        struct EnumVisitor;
18989        impl<'de> Visitor<'de> for EnumVisitor {
18990            type Value = SharingUserError;
18991            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18992                f.write_str("a SharingUserError structure")
18993            }
18994            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
18995                let tag: &str = match map.next_key()? {
18996                    Some(".tag") => map.next_value()?,
18997                    _ => return Err(de::Error::missing_field(".tag"))
18998                };
18999                let value = match tag {
19000                    "email_unverified" => SharingUserError::EmailUnverified,
19001                    _ => SharingUserError::Other,
19002                };
19003                crate::eat_json_fields(&mut map)?;
19004                Ok(value)
19005            }
19006        }
19007        const VARIANTS: &[&str] = &["email_unverified",
19008                                    "other"];
19009        deserializer.deserialize_struct("SharingUserError", VARIANTS, EnumVisitor)
19010    }
19011}
19012
19013impl ::serde::ser::Serialize for SharingUserError {
19014    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19015        // union serializer
19016        use serde::ser::SerializeStruct;
19017        match self {
19018            SharingUserError::EmailUnverified => {
19019                // unit
19020                let mut s = serializer.serialize_struct("SharingUserError", 1)?;
19021                s.serialize_field(".tag", "email_unverified")?;
19022                s.end()
19023            }
19024            SharingUserError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
19025        }
19026    }
19027}
19028
19029impl ::std::error::Error for SharingUserError {
19030}
19031
19032impl ::std::fmt::Display for SharingUserError {
19033    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19034        write!(f, "{:?}", *self)
19035    }
19036}
19037
19038/// Information about a team member.
19039#[derive(Debug, Clone, PartialEq, Eq)]
19040#[non_exhaustive] // structs may have more fields added in the future.
19041pub struct TeamMemberInfo {
19042    /// Information about the member's team.
19043    pub team_info: TeamInfo,
19044    /// The display name of the user.
19045    pub display_name: String,
19046    /// ID of user as a member of a team. This field will only be present if the member is in the
19047    /// same team as current user.
19048    pub member_id: Option<String>,
19049}
19050
19051impl TeamMemberInfo {
19052    pub fn new(team_info: TeamInfo, display_name: String) -> Self {
19053        TeamMemberInfo {
19054            team_info,
19055            display_name,
19056            member_id: None,
19057        }
19058    }
19059
19060    pub fn with_member_id(mut self, value: String) -> Self {
19061        self.member_id = Some(value);
19062        self
19063    }
19064}
19065
19066const TEAM_MEMBER_INFO_FIELDS: &[&str] = &["team_info",
19067                                           "display_name",
19068                                           "member_id"];
19069impl TeamMemberInfo {
19070    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
19071        map: V,
19072    ) -> Result<TeamMemberInfo, V::Error> {
19073        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
19074    }
19075
19076    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
19077        mut map: V,
19078        optional: bool,
19079    ) -> Result<Option<TeamMemberInfo>, V::Error> {
19080        let mut field_team_info = None;
19081        let mut field_display_name = None;
19082        let mut field_member_id = None;
19083        let mut nothing = true;
19084        while let Some(key) = map.next_key::<&str>()? {
19085            nothing = false;
19086            match key {
19087                "team_info" => {
19088                    if field_team_info.is_some() {
19089                        return Err(::serde::de::Error::duplicate_field("team_info"));
19090                    }
19091                    field_team_info = Some(map.next_value()?);
19092                }
19093                "display_name" => {
19094                    if field_display_name.is_some() {
19095                        return Err(::serde::de::Error::duplicate_field("display_name"));
19096                    }
19097                    field_display_name = Some(map.next_value()?);
19098                }
19099                "member_id" => {
19100                    if field_member_id.is_some() {
19101                        return Err(::serde::de::Error::duplicate_field("member_id"));
19102                    }
19103                    field_member_id = Some(map.next_value()?);
19104                }
19105                _ => {
19106                    // unknown field allowed and ignored
19107                    map.next_value::<::serde_json::Value>()?;
19108                }
19109            }
19110        }
19111        if optional && nothing {
19112            return Ok(None);
19113        }
19114        let result = TeamMemberInfo {
19115            team_info: field_team_info.ok_or_else(|| ::serde::de::Error::missing_field("team_info"))?,
19116            display_name: field_display_name.ok_or_else(|| ::serde::de::Error::missing_field("display_name"))?,
19117            member_id: field_member_id.and_then(Option::flatten),
19118        };
19119        Ok(Some(result))
19120    }
19121
19122    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
19123        &self,
19124        s: &mut S::SerializeStruct,
19125    ) -> Result<(), S::Error> {
19126        use serde::ser::SerializeStruct;
19127        s.serialize_field("team_info", &self.team_info)?;
19128        s.serialize_field("display_name", &self.display_name)?;
19129        if let Some(val) = &self.member_id {
19130            s.serialize_field("member_id", val)?;
19131        }
19132        Ok(())
19133    }
19134}
19135
19136impl<'de> ::serde::de::Deserialize<'de> for TeamMemberInfo {
19137    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19138        // struct deserializer
19139        use serde::de::{MapAccess, Visitor};
19140        struct StructVisitor;
19141        impl<'de> Visitor<'de> for StructVisitor {
19142            type Value = TeamMemberInfo;
19143            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19144                f.write_str("a TeamMemberInfo struct")
19145            }
19146            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
19147                TeamMemberInfo::internal_deserialize(map)
19148            }
19149        }
19150        deserializer.deserialize_struct("TeamMemberInfo", TEAM_MEMBER_INFO_FIELDS, StructVisitor)
19151    }
19152}
19153
19154impl ::serde::ser::Serialize for TeamMemberInfo {
19155    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19156        // struct serializer
19157        use serde::ser::SerializeStruct;
19158        let mut s = serializer.serialize_struct("TeamMemberInfo", 3)?;
19159        self.internal_serialize::<S>(&mut s)?;
19160        s.end()
19161    }
19162}
19163
19164#[derive(Debug, Clone, PartialEq, Eq)]
19165#[non_exhaustive] // structs may have more fields added in the future.
19166pub struct TransferFolderArg {
19167    /// The ID for the shared folder.
19168    pub shared_folder_id: crate::types::common::SharedFolderId,
19169    /// A account or team member ID to transfer ownership to.
19170    pub to_dropbox_id: DropboxId,
19171}
19172
19173impl TransferFolderArg {
19174    pub fn new(
19175        shared_folder_id: crate::types::common::SharedFolderId,
19176        to_dropbox_id: DropboxId,
19177    ) -> Self {
19178        TransferFolderArg {
19179            shared_folder_id,
19180            to_dropbox_id,
19181        }
19182    }
19183}
19184
19185const TRANSFER_FOLDER_ARG_FIELDS: &[&str] = &["shared_folder_id",
19186                                              "to_dropbox_id"];
19187impl TransferFolderArg {
19188    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
19189        map: V,
19190    ) -> Result<TransferFolderArg, V::Error> {
19191        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
19192    }
19193
19194    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
19195        mut map: V,
19196        optional: bool,
19197    ) -> Result<Option<TransferFolderArg>, V::Error> {
19198        let mut field_shared_folder_id = None;
19199        let mut field_to_dropbox_id = None;
19200        let mut nothing = true;
19201        while let Some(key) = map.next_key::<&str>()? {
19202            nothing = false;
19203            match key {
19204                "shared_folder_id" => {
19205                    if field_shared_folder_id.is_some() {
19206                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
19207                    }
19208                    field_shared_folder_id = Some(map.next_value()?);
19209                }
19210                "to_dropbox_id" => {
19211                    if field_to_dropbox_id.is_some() {
19212                        return Err(::serde::de::Error::duplicate_field("to_dropbox_id"));
19213                    }
19214                    field_to_dropbox_id = Some(map.next_value()?);
19215                }
19216                _ => {
19217                    // unknown field allowed and ignored
19218                    map.next_value::<::serde_json::Value>()?;
19219                }
19220            }
19221        }
19222        if optional && nothing {
19223            return Ok(None);
19224        }
19225        let result = TransferFolderArg {
19226            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
19227            to_dropbox_id: field_to_dropbox_id.ok_or_else(|| ::serde::de::Error::missing_field("to_dropbox_id"))?,
19228        };
19229        Ok(Some(result))
19230    }
19231
19232    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
19233        &self,
19234        s: &mut S::SerializeStruct,
19235    ) -> Result<(), S::Error> {
19236        use serde::ser::SerializeStruct;
19237        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
19238        s.serialize_field("to_dropbox_id", &self.to_dropbox_id)?;
19239        Ok(())
19240    }
19241}
19242
19243impl<'de> ::serde::de::Deserialize<'de> for TransferFolderArg {
19244    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19245        // struct deserializer
19246        use serde::de::{MapAccess, Visitor};
19247        struct StructVisitor;
19248        impl<'de> Visitor<'de> for StructVisitor {
19249            type Value = TransferFolderArg;
19250            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19251                f.write_str("a TransferFolderArg struct")
19252            }
19253            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
19254                TransferFolderArg::internal_deserialize(map)
19255            }
19256        }
19257        deserializer.deserialize_struct("TransferFolderArg", TRANSFER_FOLDER_ARG_FIELDS, StructVisitor)
19258    }
19259}
19260
19261impl ::serde::ser::Serialize for TransferFolderArg {
19262    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19263        // struct serializer
19264        use serde::ser::SerializeStruct;
19265        let mut s = serializer.serialize_struct("TransferFolderArg", 2)?;
19266        self.internal_serialize::<S>(&mut s)?;
19267        s.end()
19268    }
19269}
19270
19271#[derive(Debug, Clone, PartialEq, Eq)]
19272#[non_exhaustive] // variants may be added in the future
19273pub enum TransferFolderError {
19274    AccessError(SharedFolderAccessError),
19275    /// [`TransferFolderArg::to_dropbox_id`](TransferFolderArg) is invalid.
19276    InvalidDropboxId,
19277    /// The new designated owner is not currently a member of the shared folder.
19278    NewOwnerNotAMember,
19279    /// The new designated owner has not added the folder to their Dropbox.
19280    NewOwnerUnmounted,
19281    /// The new designated owner's email address is not verified. This functionality is only
19282    /// available on accounts with a verified email address. Users can verify their email address
19283    /// [here](https://www.dropbox.com/help/317).
19284    NewOwnerEmailUnverified,
19285    /// This action cannot be performed on a team shared folder.
19286    TeamFolder,
19287    /// The current user does not have permission to perform this action.
19288    NoPermission,
19289    /// Catch-all used for unrecognized values returned from the server. Encountering this value
19290    /// typically indicates that this SDK version is out of date.
19291    Other,
19292}
19293
19294impl<'de> ::serde::de::Deserialize<'de> for TransferFolderError {
19295    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19296        // union deserializer
19297        use serde::de::{self, MapAccess, Visitor};
19298        struct EnumVisitor;
19299        impl<'de> Visitor<'de> for EnumVisitor {
19300            type Value = TransferFolderError;
19301            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19302                f.write_str("a TransferFolderError structure")
19303            }
19304            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
19305                let tag: &str = match map.next_key()? {
19306                    Some(".tag") => map.next_value()?,
19307                    _ => return Err(de::Error::missing_field(".tag"))
19308                };
19309                let value = match tag {
19310                    "access_error" => {
19311                        match map.next_key()? {
19312                            Some("access_error") => TransferFolderError::AccessError(map.next_value()?),
19313                            None => return Err(de::Error::missing_field("access_error")),
19314                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
19315                        }
19316                    }
19317                    "invalid_dropbox_id" => TransferFolderError::InvalidDropboxId,
19318                    "new_owner_not_a_member" => TransferFolderError::NewOwnerNotAMember,
19319                    "new_owner_unmounted" => TransferFolderError::NewOwnerUnmounted,
19320                    "new_owner_email_unverified" => TransferFolderError::NewOwnerEmailUnverified,
19321                    "team_folder" => TransferFolderError::TeamFolder,
19322                    "no_permission" => TransferFolderError::NoPermission,
19323                    _ => TransferFolderError::Other,
19324                };
19325                crate::eat_json_fields(&mut map)?;
19326                Ok(value)
19327            }
19328        }
19329        const VARIANTS: &[&str] = &["access_error",
19330                                    "invalid_dropbox_id",
19331                                    "new_owner_not_a_member",
19332                                    "new_owner_unmounted",
19333                                    "new_owner_email_unverified",
19334                                    "team_folder",
19335                                    "no_permission",
19336                                    "other"];
19337        deserializer.deserialize_struct("TransferFolderError", VARIANTS, EnumVisitor)
19338    }
19339}
19340
19341impl ::serde::ser::Serialize for TransferFolderError {
19342    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19343        // union serializer
19344        use serde::ser::SerializeStruct;
19345        match self {
19346            TransferFolderError::AccessError(x) => {
19347                // union or polymporphic struct
19348                let mut s = serializer.serialize_struct("TransferFolderError", 2)?;
19349                s.serialize_field(".tag", "access_error")?;
19350                s.serialize_field("access_error", x)?;
19351                s.end()
19352            }
19353            TransferFolderError::InvalidDropboxId => {
19354                // unit
19355                let mut s = serializer.serialize_struct("TransferFolderError", 1)?;
19356                s.serialize_field(".tag", "invalid_dropbox_id")?;
19357                s.end()
19358            }
19359            TransferFolderError::NewOwnerNotAMember => {
19360                // unit
19361                let mut s = serializer.serialize_struct("TransferFolderError", 1)?;
19362                s.serialize_field(".tag", "new_owner_not_a_member")?;
19363                s.end()
19364            }
19365            TransferFolderError::NewOwnerUnmounted => {
19366                // unit
19367                let mut s = serializer.serialize_struct("TransferFolderError", 1)?;
19368                s.serialize_field(".tag", "new_owner_unmounted")?;
19369                s.end()
19370            }
19371            TransferFolderError::NewOwnerEmailUnverified => {
19372                // unit
19373                let mut s = serializer.serialize_struct("TransferFolderError", 1)?;
19374                s.serialize_field(".tag", "new_owner_email_unverified")?;
19375                s.end()
19376            }
19377            TransferFolderError::TeamFolder => {
19378                // unit
19379                let mut s = serializer.serialize_struct("TransferFolderError", 1)?;
19380                s.serialize_field(".tag", "team_folder")?;
19381                s.end()
19382            }
19383            TransferFolderError::NoPermission => {
19384                // unit
19385                let mut s = serializer.serialize_struct("TransferFolderError", 1)?;
19386                s.serialize_field(".tag", "no_permission")?;
19387                s.end()
19388            }
19389            TransferFolderError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
19390        }
19391    }
19392}
19393
19394impl ::std::error::Error for TransferFolderError {
19395    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
19396        match self {
19397            TransferFolderError::AccessError(inner) => Some(inner),
19398            _ => None,
19399        }
19400    }
19401}
19402
19403impl ::std::fmt::Display for TransferFolderError {
19404    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19405        match self {
19406            TransferFolderError::AccessError(inner) => write!(f, "TransferFolderError: {}", inner),
19407            TransferFolderError::NewOwnerNotAMember => f.write_str("The new designated owner is not currently a member of the shared folder."),
19408            TransferFolderError::NewOwnerUnmounted => f.write_str("The new designated owner has not added the folder to their Dropbox."),
19409            TransferFolderError::TeamFolder => f.write_str("This action cannot be performed on a team shared folder."),
19410            TransferFolderError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
19411            _ => write!(f, "{:?}", *self),
19412        }
19413    }
19414}
19415
19416#[derive(Debug, Clone, PartialEq, Eq)]
19417#[non_exhaustive] // structs may have more fields added in the future.
19418pub struct UnmountFolderArg {
19419    /// The ID for the shared folder.
19420    pub shared_folder_id: crate::types::common::SharedFolderId,
19421}
19422
19423impl UnmountFolderArg {
19424    pub fn new(shared_folder_id: crate::types::common::SharedFolderId) -> Self {
19425        UnmountFolderArg {
19426            shared_folder_id,
19427        }
19428    }
19429}
19430
19431const UNMOUNT_FOLDER_ARG_FIELDS: &[&str] = &["shared_folder_id"];
19432impl UnmountFolderArg {
19433    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
19434        map: V,
19435    ) -> Result<UnmountFolderArg, V::Error> {
19436        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
19437    }
19438
19439    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
19440        mut map: V,
19441        optional: bool,
19442    ) -> Result<Option<UnmountFolderArg>, V::Error> {
19443        let mut field_shared_folder_id = None;
19444        let mut nothing = true;
19445        while let Some(key) = map.next_key::<&str>()? {
19446            nothing = false;
19447            match key {
19448                "shared_folder_id" => {
19449                    if field_shared_folder_id.is_some() {
19450                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
19451                    }
19452                    field_shared_folder_id = Some(map.next_value()?);
19453                }
19454                _ => {
19455                    // unknown field allowed and ignored
19456                    map.next_value::<::serde_json::Value>()?;
19457                }
19458            }
19459        }
19460        if optional && nothing {
19461            return Ok(None);
19462        }
19463        let result = UnmountFolderArg {
19464            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
19465        };
19466        Ok(Some(result))
19467    }
19468
19469    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
19470        &self,
19471        s: &mut S::SerializeStruct,
19472    ) -> Result<(), S::Error> {
19473        use serde::ser::SerializeStruct;
19474        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
19475        Ok(())
19476    }
19477}
19478
19479impl<'de> ::serde::de::Deserialize<'de> for UnmountFolderArg {
19480    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19481        // struct deserializer
19482        use serde::de::{MapAccess, Visitor};
19483        struct StructVisitor;
19484        impl<'de> Visitor<'de> for StructVisitor {
19485            type Value = UnmountFolderArg;
19486            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19487                f.write_str("a UnmountFolderArg struct")
19488            }
19489            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
19490                UnmountFolderArg::internal_deserialize(map)
19491            }
19492        }
19493        deserializer.deserialize_struct("UnmountFolderArg", UNMOUNT_FOLDER_ARG_FIELDS, StructVisitor)
19494    }
19495}
19496
19497impl ::serde::ser::Serialize for UnmountFolderArg {
19498    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19499        // struct serializer
19500        use serde::ser::SerializeStruct;
19501        let mut s = serializer.serialize_struct("UnmountFolderArg", 1)?;
19502        self.internal_serialize::<S>(&mut s)?;
19503        s.end()
19504    }
19505}
19506
19507#[derive(Debug, Clone, PartialEq, Eq)]
19508#[non_exhaustive] // variants may be added in the future
19509pub enum UnmountFolderError {
19510    AccessError(SharedFolderAccessError),
19511    /// The current user does not have permission to perform this action.
19512    NoPermission,
19513    /// The shared folder can't be unmounted. One example where this can occur is when the shared
19514    /// folder's parent folder is also a shared folder that resides in the current user's Dropbox.
19515    NotUnmountable,
19516    /// Catch-all used for unrecognized values returned from the server. Encountering this value
19517    /// typically indicates that this SDK version is out of date.
19518    Other,
19519}
19520
19521impl<'de> ::serde::de::Deserialize<'de> for UnmountFolderError {
19522    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19523        // union deserializer
19524        use serde::de::{self, MapAccess, Visitor};
19525        struct EnumVisitor;
19526        impl<'de> Visitor<'de> for EnumVisitor {
19527            type Value = UnmountFolderError;
19528            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19529                f.write_str("a UnmountFolderError structure")
19530            }
19531            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
19532                let tag: &str = match map.next_key()? {
19533                    Some(".tag") => map.next_value()?,
19534                    _ => return Err(de::Error::missing_field(".tag"))
19535                };
19536                let value = match tag {
19537                    "access_error" => {
19538                        match map.next_key()? {
19539                            Some("access_error") => UnmountFolderError::AccessError(map.next_value()?),
19540                            None => return Err(de::Error::missing_field("access_error")),
19541                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
19542                        }
19543                    }
19544                    "no_permission" => UnmountFolderError::NoPermission,
19545                    "not_unmountable" => UnmountFolderError::NotUnmountable,
19546                    _ => UnmountFolderError::Other,
19547                };
19548                crate::eat_json_fields(&mut map)?;
19549                Ok(value)
19550            }
19551        }
19552        const VARIANTS: &[&str] = &["access_error",
19553                                    "no_permission",
19554                                    "not_unmountable",
19555                                    "other"];
19556        deserializer.deserialize_struct("UnmountFolderError", VARIANTS, EnumVisitor)
19557    }
19558}
19559
19560impl ::serde::ser::Serialize for UnmountFolderError {
19561    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19562        // union serializer
19563        use serde::ser::SerializeStruct;
19564        match self {
19565            UnmountFolderError::AccessError(x) => {
19566                // union or polymporphic struct
19567                let mut s = serializer.serialize_struct("UnmountFolderError", 2)?;
19568                s.serialize_field(".tag", "access_error")?;
19569                s.serialize_field("access_error", x)?;
19570                s.end()
19571            }
19572            UnmountFolderError::NoPermission => {
19573                // unit
19574                let mut s = serializer.serialize_struct("UnmountFolderError", 1)?;
19575                s.serialize_field(".tag", "no_permission")?;
19576                s.end()
19577            }
19578            UnmountFolderError::NotUnmountable => {
19579                // unit
19580                let mut s = serializer.serialize_struct("UnmountFolderError", 1)?;
19581                s.serialize_field(".tag", "not_unmountable")?;
19582                s.end()
19583            }
19584            UnmountFolderError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
19585        }
19586    }
19587}
19588
19589impl ::std::error::Error for UnmountFolderError {
19590    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
19591        match self {
19592            UnmountFolderError::AccessError(inner) => Some(inner),
19593            _ => None,
19594        }
19595    }
19596}
19597
19598impl ::std::fmt::Display for UnmountFolderError {
19599    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19600        match self {
19601            UnmountFolderError::AccessError(inner) => write!(f, "UnmountFolderError: {}", inner),
19602            UnmountFolderError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
19603            UnmountFolderError::NotUnmountable => f.write_str("The shared folder can't be unmounted. One example where this can occur is when the shared folder's parent folder is also a shared folder that resides in the current user's Dropbox."),
19604            _ => write!(f, "{:?}", *self),
19605        }
19606    }
19607}
19608
19609/// Arguments for [`unshare_file()`](crate::sharing::unshare_file).
19610#[derive(Debug, Clone, PartialEq, Eq)]
19611#[non_exhaustive] // structs may have more fields added in the future.
19612pub struct UnshareFileArg {
19613    /// The file to unshare.
19614    pub file: PathOrId,
19615}
19616
19617impl UnshareFileArg {
19618    pub fn new(file: PathOrId) -> Self {
19619        UnshareFileArg {
19620            file,
19621        }
19622    }
19623}
19624
19625const UNSHARE_FILE_ARG_FIELDS: &[&str] = &["file"];
19626impl UnshareFileArg {
19627    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
19628        map: V,
19629    ) -> Result<UnshareFileArg, V::Error> {
19630        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
19631    }
19632
19633    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
19634        mut map: V,
19635        optional: bool,
19636    ) -> Result<Option<UnshareFileArg>, V::Error> {
19637        let mut field_file = None;
19638        let mut nothing = true;
19639        while let Some(key) = map.next_key::<&str>()? {
19640            nothing = false;
19641            match key {
19642                "file" => {
19643                    if field_file.is_some() {
19644                        return Err(::serde::de::Error::duplicate_field("file"));
19645                    }
19646                    field_file = Some(map.next_value()?);
19647                }
19648                _ => {
19649                    // unknown field allowed and ignored
19650                    map.next_value::<::serde_json::Value>()?;
19651                }
19652            }
19653        }
19654        if optional && nothing {
19655            return Ok(None);
19656        }
19657        let result = UnshareFileArg {
19658            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
19659        };
19660        Ok(Some(result))
19661    }
19662
19663    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
19664        &self,
19665        s: &mut S::SerializeStruct,
19666    ) -> Result<(), S::Error> {
19667        use serde::ser::SerializeStruct;
19668        s.serialize_field("file", &self.file)?;
19669        Ok(())
19670    }
19671}
19672
19673impl<'de> ::serde::de::Deserialize<'de> for UnshareFileArg {
19674    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19675        // struct deserializer
19676        use serde::de::{MapAccess, Visitor};
19677        struct StructVisitor;
19678        impl<'de> Visitor<'de> for StructVisitor {
19679            type Value = UnshareFileArg;
19680            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19681                f.write_str("a UnshareFileArg struct")
19682            }
19683            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
19684                UnshareFileArg::internal_deserialize(map)
19685            }
19686        }
19687        deserializer.deserialize_struct("UnshareFileArg", UNSHARE_FILE_ARG_FIELDS, StructVisitor)
19688    }
19689}
19690
19691impl ::serde::ser::Serialize for UnshareFileArg {
19692    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19693        // struct serializer
19694        use serde::ser::SerializeStruct;
19695        let mut s = serializer.serialize_struct("UnshareFileArg", 1)?;
19696        self.internal_serialize::<S>(&mut s)?;
19697        s.end()
19698    }
19699}
19700
19701/// Error result for [`unshare_file()`](crate::sharing::unshare_file).
19702#[derive(Debug, Clone, PartialEq, Eq)]
19703#[non_exhaustive] // variants may be added in the future
19704pub enum UnshareFileError {
19705    UserError(SharingUserError),
19706    AccessError(SharingFileAccessError),
19707    /// Catch-all used for unrecognized values returned from the server. Encountering this value
19708    /// typically indicates that this SDK version is out of date.
19709    Other,
19710}
19711
19712impl<'de> ::serde::de::Deserialize<'de> for UnshareFileError {
19713    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19714        // union deserializer
19715        use serde::de::{self, MapAccess, Visitor};
19716        struct EnumVisitor;
19717        impl<'de> Visitor<'de> for EnumVisitor {
19718            type Value = UnshareFileError;
19719            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19720                f.write_str("a UnshareFileError structure")
19721            }
19722            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
19723                let tag: &str = match map.next_key()? {
19724                    Some(".tag") => map.next_value()?,
19725                    _ => return Err(de::Error::missing_field(".tag"))
19726                };
19727                let value = match tag {
19728                    "user_error" => {
19729                        match map.next_key()? {
19730                            Some("user_error") => UnshareFileError::UserError(map.next_value()?),
19731                            None => return Err(de::Error::missing_field("user_error")),
19732                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
19733                        }
19734                    }
19735                    "access_error" => {
19736                        match map.next_key()? {
19737                            Some("access_error") => UnshareFileError::AccessError(map.next_value()?),
19738                            None => return Err(de::Error::missing_field("access_error")),
19739                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
19740                        }
19741                    }
19742                    _ => UnshareFileError::Other,
19743                };
19744                crate::eat_json_fields(&mut map)?;
19745                Ok(value)
19746            }
19747        }
19748        const VARIANTS: &[&str] = &["user_error",
19749                                    "access_error",
19750                                    "other"];
19751        deserializer.deserialize_struct("UnshareFileError", VARIANTS, EnumVisitor)
19752    }
19753}
19754
19755impl ::serde::ser::Serialize for UnshareFileError {
19756    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19757        // union serializer
19758        use serde::ser::SerializeStruct;
19759        match self {
19760            UnshareFileError::UserError(x) => {
19761                // union or polymporphic struct
19762                let mut s = serializer.serialize_struct("UnshareFileError", 2)?;
19763                s.serialize_field(".tag", "user_error")?;
19764                s.serialize_field("user_error", x)?;
19765                s.end()
19766            }
19767            UnshareFileError::AccessError(x) => {
19768                // union or polymporphic struct
19769                let mut s = serializer.serialize_struct("UnshareFileError", 2)?;
19770                s.serialize_field(".tag", "access_error")?;
19771                s.serialize_field("access_error", x)?;
19772                s.end()
19773            }
19774            UnshareFileError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
19775        }
19776    }
19777}
19778
19779impl ::std::error::Error for UnshareFileError {
19780    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
19781        match self {
19782            UnshareFileError::UserError(inner) => Some(inner),
19783            UnshareFileError::AccessError(inner) => Some(inner),
19784            _ => None,
19785        }
19786    }
19787}
19788
19789impl ::std::fmt::Display for UnshareFileError {
19790    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19791        match self {
19792            UnshareFileError::UserError(inner) => write!(f, "UnshareFileError: {}", inner),
19793            UnshareFileError::AccessError(inner) => write!(f, "UnshareFileError: {}", inner),
19794            _ => write!(f, "{:?}", *self),
19795        }
19796    }
19797}
19798
19799#[derive(Debug, Clone, PartialEq, Eq)]
19800#[non_exhaustive] // structs may have more fields added in the future.
19801pub struct UnshareFolderArg {
19802    /// The ID for the shared folder.
19803    pub shared_folder_id: crate::types::common::SharedFolderId,
19804    /// If true, members of this shared folder will get a copy of this folder after it's unshared.
19805    /// Otherwise, it will be removed from their Dropbox. The current user, who is an owner, will
19806    /// always retain their copy.
19807    pub leave_a_copy: bool,
19808}
19809
19810impl UnshareFolderArg {
19811    pub fn new(shared_folder_id: crate::types::common::SharedFolderId) -> Self {
19812        UnshareFolderArg {
19813            shared_folder_id,
19814            leave_a_copy: false,
19815        }
19816    }
19817
19818    pub fn with_leave_a_copy(mut self, value: bool) -> Self {
19819        self.leave_a_copy = value;
19820        self
19821    }
19822}
19823
19824const UNSHARE_FOLDER_ARG_FIELDS: &[&str] = &["shared_folder_id",
19825                                             "leave_a_copy"];
19826impl UnshareFolderArg {
19827    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
19828        map: V,
19829    ) -> Result<UnshareFolderArg, V::Error> {
19830        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
19831    }
19832
19833    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
19834        mut map: V,
19835        optional: bool,
19836    ) -> Result<Option<UnshareFolderArg>, V::Error> {
19837        let mut field_shared_folder_id = None;
19838        let mut field_leave_a_copy = None;
19839        let mut nothing = true;
19840        while let Some(key) = map.next_key::<&str>()? {
19841            nothing = false;
19842            match key {
19843                "shared_folder_id" => {
19844                    if field_shared_folder_id.is_some() {
19845                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
19846                    }
19847                    field_shared_folder_id = Some(map.next_value()?);
19848                }
19849                "leave_a_copy" => {
19850                    if field_leave_a_copy.is_some() {
19851                        return Err(::serde::de::Error::duplicate_field("leave_a_copy"));
19852                    }
19853                    field_leave_a_copy = Some(map.next_value()?);
19854                }
19855                _ => {
19856                    // unknown field allowed and ignored
19857                    map.next_value::<::serde_json::Value>()?;
19858                }
19859            }
19860        }
19861        if optional && nothing {
19862            return Ok(None);
19863        }
19864        let result = UnshareFolderArg {
19865            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
19866            leave_a_copy: field_leave_a_copy.unwrap_or(false),
19867        };
19868        Ok(Some(result))
19869    }
19870
19871    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
19872        &self,
19873        s: &mut S::SerializeStruct,
19874    ) -> Result<(), S::Error> {
19875        use serde::ser::SerializeStruct;
19876        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
19877        if self.leave_a_copy {
19878            s.serialize_field("leave_a_copy", &self.leave_a_copy)?;
19879        }
19880        Ok(())
19881    }
19882}
19883
19884impl<'de> ::serde::de::Deserialize<'de> for UnshareFolderArg {
19885    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19886        // struct deserializer
19887        use serde::de::{MapAccess, Visitor};
19888        struct StructVisitor;
19889        impl<'de> Visitor<'de> for StructVisitor {
19890            type Value = UnshareFolderArg;
19891            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19892                f.write_str("a UnshareFolderArg struct")
19893            }
19894            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
19895                UnshareFolderArg::internal_deserialize(map)
19896            }
19897        }
19898        deserializer.deserialize_struct("UnshareFolderArg", UNSHARE_FOLDER_ARG_FIELDS, StructVisitor)
19899    }
19900}
19901
19902impl ::serde::ser::Serialize for UnshareFolderArg {
19903    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19904        // struct serializer
19905        use serde::ser::SerializeStruct;
19906        let mut s = serializer.serialize_struct("UnshareFolderArg", 2)?;
19907        self.internal_serialize::<S>(&mut s)?;
19908        s.end()
19909    }
19910}
19911
19912#[derive(Debug, Clone, PartialEq, Eq)]
19913#[non_exhaustive] // variants may be added in the future
19914pub enum UnshareFolderError {
19915    AccessError(SharedFolderAccessError),
19916    /// This action cannot be performed on a team shared folder.
19917    TeamFolder,
19918    /// The current user does not have permission to perform this action.
19919    NoPermission,
19920    /// This shared folder has too many files to be unshared.
19921    TooManyFiles,
19922    /// Catch-all used for unrecognized values returned from the server. Encountering this value
19923    /// typically indicates that this SDK version is out of date.
19924    Other,
19925}
19926
19927impl<'de> ::serde::de::Deserialize<'de> for UnshareFolderError {
19928    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19929        // union deserializer
19930        use serde::de::{self, MapAccess, Visitor};
19931        struct EnumVisitor;
19932        impl<'de> Visitor<'de> for EnumVisitor {
19933            type Value = UnshareFolderError;
19934            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19935                f.write_str("a UnshareFolderError structure")
19936            }
19937            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
19938                let tag: &str = match map.next_key()? {
19939                    Some(".tag") => map.next_value()?,
19940                    _ => return Err(de::Error::missing_field(".tag"))
19941                };
19942                let value = match tag {
19943                    "access_error" => {
19944                        match map.next_key()? {
19945                            Some("access_error") => UnshareFolderError::AccessError(map.next_value()?),
19946                            None => return Err(de::Error::missing_field("access_error")),
19947                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
19948                        }
19949                    }
19950                    "team_folder" => UnshareFolderError::TeamFolder,
19951                    "no_permission" => UnshareFolderError::NoPermission,
19952                    "too_many_files" => UnshareFolderError::TooManyFiles,
19953                    _ => UnshareFolderError::Other,
19954                };
19955                crate::eat_json_fields(&mut map)?;
19956                Ok(value)
19957            }
19958        }
19959        const VARIANTS: &[&str] = &["access_error",
19960                                    "team_folder",
19961                                    "no_permission",
19962                                    "too_many_files",
19963                                    "other"];
19964        deserializer.deserialize_struct("UnshareFolderError", VARIANTS, EnumVisitor)
19965    }
19966}
19967
19968impl ::serde::ser::Serialize for UnshareFolderError {
19969    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19970        // union serializer
19971        use serde::ser::SerializeStruct;
19972        match self {
19973            UnshareFolderError::AccessError(x) => {
19974                // union or polymporphic struct
19975                let mut s = serializer.serialize_struct("UnshareFolderError", 2)?;
19976                s.serialize_field(".tag", "access_error")?;
19977                s.serialize_field("access_error", x)?;
19978                s.end()
19979            }
19980            UnshareFolderError::TeamFolder => {
19981                // unit
19982                let mut s = serializer.serialize_struct("UnshareFolderError", 1)?;
19983                s.serialize_field(".tag", "team_folder")?;
19984                s.end()
19985            }
19986            UnshareFolderError::NoPermission => {
19987                // unit
19988                let mut s = serializer.serialize_struct("UnshareFolderError", 1)?;
19989                s.serialize_field(".tag", "no_permission")?;
19990                s.end()
19991            }
19992            UnshareFolderError::TooManyFiles => {
19993                // unit
19994                let mut s = serializer.serialize_struct("UnshareFolderError", 1)?;
19995                s.serialize_field(".tag", "too_many_files")?;
19996                s.end()
19997            }
19998            UnshareFolderError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
19999        }
20000    }
20001}
20002
20003impl ::std::error::Error for UnshareFolderError {
20004    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
20005        match self {
20006            UnshareFolderError::AccessError(inner) => Some(inner),
20007            _ => None,
20008        }
20009    }
20010}
20011
20012impl ::std::fmt::Display for UnshareFolderError {
20013    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
20014        match self {
20015            UnshareFolderError::AccessError(inner) => write!(f, "UnshareFolderError: {}", inner),
20016            UnshareFolderError::TeamFolder => f.write_str("This action cannot be performed on a team shared folder."),
20017            UnshareFolderError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
20018            UnshareFolderError::TooManyFiles => f.write_str("This shared folder has too many files to be unshared."),
20019            _ => write!(f, "{:?}", *self),
20020        }
20021    }
20022}
20023
20024/// Arguments for [`update_file_member()`](crate::sharing::update_file_member).
20025#[derive(Debug, Clone, PartialEq, Eq)]
20026#[non_exhaustive] // structs may have more fields added in the future.
20027pub struct UpdateFileMemberArgs {
20028    /// File for which we are changing a member's access.
20029    pub file: PathOrId,
20030    /// The member whose access we are changing.
20031    pub member: MemberSelector,
20032    /// The new access level for the member.
20033    pub access_level: AccessLevel,
20034}
20035
20036impl UpdateFileMemberArgs {
20037    pub fn new(file: PathOrId, member: MemberSelector, access_level: AccessLevel) -> Self {
20038        UpdateFileMemberArgs {
20039            file,
20040            member,
20041            access_level,
20042        }
20043    }
20044}
20045
20046const UPDATE_FILE_MEMBER_ARGS_FIELDS: &[&str] = &["file",
20047                                                  "member",
20048                                                  "access_level"];
20049impl UpdateFileMemberArgs {
20050    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
20051        map: V,
20052    ) -> Result<UpdateFileMemberArgs, V::Error> {
20053        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
20054    }
20055
20056    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
20057        mut map: V,
20058        optional: bool,
20059    ) -> Result<Option<UpdateFileMemberArgs>, V::Error> {
20060        let mut field_file = None;
20061        let mut field_member = None;
20062        let mut field_access_level = None;
20063        let mut nothing = true;
20064        while let Some(key) = map.next_key::<&str>()? {
20065            nothing = false;
20066            match key {
20067                "file" => {
20068                    if field_file.is_some() {
20069                        return Err(::serde::de::Error::duplicate_field("file"));
20070                    }
20071                    field_file = Some(map.next_value()?);
20072                }
20073                "member" => {
20074                    if field_member.is_some() {
20075                        return Err(::serde::de::Error::duplicate_field("member"));
20076                    }
20077                    field_member = Some(map.next_value()?);
20078                }
20079                "access_level" => {
20080                    if field_access_level.is_some() {
20081                        return Err(::serde::de::Error::duplicate_field("access_level"));
20082                    }
20083                    field_access_level = Some(map.next_value()?);
20084                }
20085                _ => {
20086                    // unknown field allowed and ignored
20087                    map.next_value::<::serde_json::Value>()?;
20088                }
20089            }
20090        }
20091        if optional && nothing {
20092            return Ok(None);
20093        }
20094        let result = UpdateFileMemberArgs {
20095            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
20096            member: field_member.ok_or_else(|| ::serde::de::Error::missing_field("member"))?,
20097            access_level: field_access_level.ok_or_else(|| ::serde::de::Error::missing_field("access_level"))?,
20098        };
20099        Ok(Some(result))
20100    }
20101
20102    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
20103        &self,
20104        s: &mut S::SerializeStruct,
20105    ) -> Result<(), S::Error> {
20106        use serde::ser::SerializeStruct;
20107        s.serialize_field("file", &self.file)?;
20108        s.serialize_field("member", &self.member)?;
20109        s.serialize_field("access_level", &self.access_level)?;
20110        Ok(())
20111    }
20112}
20113
20114impl<'de> ::serde::de::Deserialize<'de> for UpdateFileMemberArgs {
20115    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
20116        // struct deserializer
20117        use serde::de::{MapAccess, Visitor};
20118        struct StructVisitor;
20119        impl<'de> Visitor<'de> for StructVisitor {
20120            type Value = UpdateFileMemberArgs;
20121            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
20122                f.write_str("a UpdateFileMemberArgs struct")
20123            }
20124            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
20125                UpdateFileMemberArgs::internal_deserialize(map)
20126            }
20127        }
20128        deserializer.deserialize_struct("UpdateFileMemberArgs", UPDATE_FILE_MEMBER_ARGS_FIELDS, StructVisitor)
20129    }
20130}
20131
20132impl ::serde::ser::Serialize for UpdateFileMemberArgs {
20133    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
20134        // struct serializer
20135        use serde::ser::SerializeStruct;
20136        let mut s = serializer.serialize_struct("UpdateFileMemberArgs", 3)?;
20137        self.internal_serialize::<S>(&mut s)?;
20138        s.end()
20139    }
20140}
20141
20142/// Arguments for [`update_file_policy()`](crate::sharing::update_file_policy).
20143#[derive(Debug, Clone, PartialEq, Eq)]
20144#[non_exhaustive] // structs may have more fields added in the future.
20145pub struct UpdateFilePolicyArg {
20146    /// File that we are changing the policy for.
20147    pub file: PathOrId,
20148    /// A list of `FileAction`s corresponding to `FilePermission`s that should appear in the
20149    /// response's [`SharedFileMetadata::permissions`](SharedFileMetadata) field describing the
20150    /// actions the authenticated user can perform on the file.
20151    pub actions: Option<Vec<FileAction>>,
20152    /// Field is deprecated. Settings on the link for the file.
20153    #[deprecated]
20154    pub link_settings: Option<LinkSettings>,
20155    /// The presence and seen state policy on the file.
20156    pub viewer_info_policy: Option<ViewerInfoPolicy>,
20157}
20158
20159impl UpdateFilePolicyArg {
20160    pub fn new(file: PathOrId) -> Self {
20161        UpdateFilePolicyArg {
20162            file,
20163            actions: None,
20164            #[allow(deprecated)] link_settings: None,
20165            viewer_info_policy: None,
20166        }
20167    }
20168
20169    pub fn with_actions(mut self, value: Vec<FileAction>) -> Self {
20170        self.actions = Some(value);
20171        self
20172    }
20173
20174    #[deprecated]
20175    #[allow(deprecated)]
20176    pub fn with_link_settings(mut self, value: LinkSettings) -> Self {
20177        self.link_settings = Some(value);
20178        self
20179    }
20180
20181    pub fn with_viewer_info_policy(mut self, value: ViewerInfoPolicy) -> Self {
20182        self.viewer_info_policy = Some(value);
20183        self
20184    }
20185}
20186
20187const UPDATE_FILE_POLICY_ARG_FIELDS: &[&str] = &["file",
20188                                                 "actions",
20189                                                 "link_settings",
20190                                                 "viewer_info_policy"];
20191impl UpdateFilePolicyArg {
20192    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
20193        map: V,
20194    ) -> Result<UpdateFilePolicyArg, V::Error> {
20195        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
20196    }
20197
20198    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
20199        mut map: V,
20200        optional: bool,
20201    ) -> Result<Option<UpdateFilePolicyArg>, V::Error> {
20202        let mut field_file = None;
20203        let mut field_actions = None;
20204        let mut field_link_settings = None;
20205        let mut field_viewer_info_policy = None;
20206        let mut nothing = true;
20207        while let Some(key) = map.next_key::<&str>()? {
20208            nothing = false;
20209            match key {
20210                "file" => {
20211                    if field_file.is_some() {
20212                        return Err(::serde::de::Error::duplicate_field("file"));
20213                    }
20214                    field_file = Some(map.next_value()?);
20215                }
20216                "actions" => {
20217                    if field_actions.is_some() {
20218                        return Err(::serde::de::Error::duplicate_field("actions"));
20219                    }
20220                    field_actions = Some(map.next_value()?);
20221                }
20222                "link_settings" => {
20223                    if field_link_settings.is_some() {
20224                        return Err(::serde::de::Error::duplicate_field("link_settings"));
20225                    }
20226                    field_link_settings = Some(map.next_value()?);
20227                }
20228                "viewer_info_policy" => {
20229                    if field_viewer_info_policy.is_some() {
20230                        return Err(::serde::de::Error::duplicate_field("viewer_info_policy"));
20231                    }
20232                    field_viewer_info_policy = Some(map.next_value()?);
20233                }
20234                _ => {
20235                    // unknown field allowed and ignored
20236                    map.next_value::<::serde_json::Value>()?;
20237                }
20238            }
20239        }
20240        if optional && nothing {
20241            return Ok(None);
20242        }
20243        let result = UpdateFilePolicyArg {
20244            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
20245            actions: field_actions.and_then(Option::flatten),
20246            #[allow(deprecated)] link_settings: field_link_settings.and_then(Option::flatten),
20247            viewer_info_policy: field_viewer_info_policy.and_then(Option::flatten),
20248        };
20249        Ok(Some(result))
20250    }
20251
20252    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
20253        &self,
20254        s: &mut S::SerializeStruct,
20255    ) -> Result<(), S::Error> {
20256        use serde::ser::SerializeStruct;
20257        s.serialize_field("file", &self.file)?;
20258        if let Some(val) = &self.actions {
20259            s.serialize_field("actions", val)?;
20260        }
20261        #[allow(deprecated)]
20262        if let Some(val) = &self.link_settings {
20263            s.serialize_field("link_settings", val)?;
20264        }
20265        if let Some(val) = &self.viewer_info_policy {
20266            s.serialize_field("viewer_info_policy", val)?;
20267        }
20268        Ok(())
20269    }
20270}
20271
20272impl<'de> ::serde::de::Deserialize<'de> for UpdateFilePolicyArg {
20273    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
20274        // struct deserializer
20275        use serde::de::{MapAccess, Visitor};
20276        struct StructVisitor;
20277        impl<'de> Visitor<'de> for StructVisitor {
20278            type Value = UpdateFilePolicyArg;
20279            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
20280                f.write_str("a UpdateFilePolicyArg struct")
20281            }
20282            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
20283                UpdateFilePolicyArg::internal_deserialize(map)
20284            }
20285        }
20286        deserializer.deserialize_struct("UpdateFilePolicyArg", UPDATE_FILE_POLICY_ARG_FIELDS, StructVisitor)
20287    }
20288}
20289
20290impl ::serde::ser::Serialize for UpdateFilePolicyArg {
20291    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
20292        // struct serializer
20293        use serde::ser::SerializeStruct;
20294        let mut s = serializer.serialize_struct("UpdateFilePolicyArg", 4)?;
20295        self.internal_serialize::<S>(&mut s)?;
20296        s.end()
20297    }
20298}
20299
20300/// Error result for [`update_file_policy()`](crate::sharing::update_file_policy).
20301#[derive(Debug, Clone, PartialEq, Eq)]
20302#[non_exhaustive] // variants may be added in the future
20303pub enum UpdateFilePolicyError {
20304    AccessError(SharingFileAccessError),
20305    /// The file settings are invalid.
20306    InvalidFileSettings,
20307    /// The current user does not have permission to perform this action.
20308    NoPermission,
20309    /// Catch-all used for unrecognized values returned from the server. Encountering this value
20310    /// typically indicates that this SDK version is out of date.
20311    Other,
20312}
20313
20314impl<'de> ::serde::de::Deserialize<'de> for UpdateFilePolicyError {
20315    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
20316        // union deserializer
20317        use serde::de::{self, MapAccess, Visitor};
20318        struct EnumVisitor;
20319        impl<'de> Visitor<'de> for EnumVisitor {
20320            type Value = UpdateFilePolicyError;
20321            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
20322                f.write_str("a UpdateFilePolicyError structure")
20323            }
20324            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
20325                let tag: &str = match map.next_key()? {
20326                    Some(".tag") => map.next_value()?,
20327                    _ => return Err(de::Error::missing_field(".tag"))
20328                };
20329                let value = match tag {
20330                    "access_error" => {
20331                        match map.next_key()? {
20332                            Some("access_error") => UpdateFilePolicyError::AccessError(map.next_value()?),
20333                            None => return Err(de::Error::missing_field("access_error")),
20334                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
20335                        }
20336                    }
20337                    "invalid_file_settings" => UpdateFilePolicyError::InvalidFileSettings,
20338                    "no_permission" => UpdateFilePolicyError::NoPermission,
20339                    _ => UpdateFilePolicyError::Other,
20340                };
20341                crate::eat_json_fields(&mut map)?;
20342                Ok(value)
20343            }
20344        }
20345        const VARIANTS: &[&str] = &["access_error",
20346                                    "invalid_file_settings",
20347                                    "no_permission",
20348                                    "other"];
20349        deserializer.deserialize_struct("UpdateFilePolicyError", VARIANTS, EnumVisitor)
20350    }
20351}
20352
20353impl ::serde::ser::Serialize for UpdateFilePolicyError {
20354    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
20355        // union serializer
20356        use serde::ser::SerializeStruct;
20357        match self {
20358            UpdateFilePolicyError::AccessError(x) => {
20359                // union or polymporphic struct
20360                let mut s = serializer.serialize_struct("UpdateFilePolicyError", 2)?;
20361                s.serialize_field(".tag", "access_error")?;
20362                s.serialize_field("access_error", x)?;
20363                s.end()
20364            }
20365            UpdateFilePolicyError::InvalidFileSettings => {
20366                // unit
20367                let mut s = serializer.serialize_struct("UpdateFilePolicyError", 1)?;
20368                s.serialize_field(".tag", "invalid_file_settings")?;
20369                s.end()
20370            }
20371            UpdateFilePolicyError::NoPermission => {
20372                // unit
20373                let mut s = serializer.serialize_struct("UpdateFilePolicyError", 1)?;
20374                s.serialize_field(".tag", "no_permission")?;
20375                s.end()
20376            }
20377            UpdateFilePolicyError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
20378        }
20379    }
20380}
20381
20382impl ::std::error::Error for UpdateFilePolicyError {
20383    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
20384        match self {
20385            UpdateFilePolicyError::AccessError(inner) => Some(inner),
20386            _ => None,
20387        }
20388    }
20389}
20390
20391impl ::std::fmt::Display for UpdateFilePolicyError {
20392    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
20393        match self {
20394            UpdateFilePolicyError::AccessError(inner) => write!(f, "UpdateFilePolicyError: {}", inner),
20395            UpdateFilePolicyError::InvalidFileSettings => f.write_str("The file settings are invalid."),
20396            UpdateFilePolicyError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
20397            _ => write!(f, "{:?}", *self),
20398        }
20399    }
20400}
20401
20402#[derive(Debug, Clone, PartialEq, Eq)]
20403#[non_exhaustive] // structs may have more fields added in the future.
20404pub struct UpdateFolderMemberArg {
20405    /// The ID for the shared folder.
20406    pub shared_folder_id: crate::types::common::SharedFolderId,
20407    /// The member of the shared folder to update.  Only the [`MemberSelector::DropboxId`] may be
20408    /// set at this time.
20409    pub member: MemberSelector,
20410    /// The new access level for `member`. [`AccessLevel::Owner`] is disallowed.
20411    pub access_level: AccessLevel,
20412}
20413
20414impl UpdateFolderMemberArg {
20415    pub fn new(
20416        shared_folder_id: crate::types::common::SharedFolderId,
20417        member: MemberSelector,
20418        access_level: AccessLevel,
20419    ) -> Self {
20420        UpdateFolderMemberArg {
20421            shared_folder_id,
20422            member,
20423            access_level,
20424        }
20425    }
20426}
20427
20428const UPDATE_FOLDER_MEMBER_ARG_FIELDS: &[&str] = &["shared_folder_id",
20429                                                   "member",
20430                                                   "access_level"];
20431impl UpdateFolderMemberArg {
20432    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
20433        map: V,
20434    ) -> Result<UpdateFolderMemberArg, V::Error> {
20435        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
20436    }
20437
20438    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
20439        mut map: V,
20440        optional: bool,
20441    ) -> Result<Option<UpdateFolderMemberArg>, V::Error> {
20442        let mut field_shared_folder_id = None;
20443        let mut field_member = None;
20444        let mut field_access_level = None;
20445        let mut nothing = true;
20446        while let Some(key) = map.next_key::<&str>()? {
20447            nothing = false;
20448            match key {
20449                "shared_folder_id" => {
20450                    if field_shared_folder_id.is_some() {
20451                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
20452                    }
20453                    field_shared_folder_id = Some(map.next_value()?);
20454                }
20455                "member" => {
20456                    if field_member.is_some() {
20457                        return Err(::serde::de::Error::duplicate_field("member"));
20458                    }
20459                    field_member = Some(map.next_value()?);
20460                }
20461                "access_level" => {
20462                    if field_access_level.is_some() {
20463                        return Err(::serde::de::Error::duplicate_field("access_level"));
20464                    }
20465                    field_access_level = Some(map.next_value()?);
20466                }
20467                _ => {
20468                    // unknown field allowed and ignored
20469                    map.next_value::<::serde_json::Value>()?;
20470                }
20471            }
20472        }
20473        if optional && nothing {
20474            return Ok(None);
20475        }
20476        let result = UpdateFolderMemberArg {
20477            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
20478            member: field_member.ok_or_else(|| ::serde::de::Error::missing_field("member"))?,
20479            access_level: field_access_level.ok_or_else(|| ::serde::de::Error::missing_field("access_level"))?,
20480        };
20481        Ok(Some(result))
20482    }
20483
20484    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
20485        &self,
20486        s: &mut S::SerializeStruct,
20487    ) -> Result<(), S::Error> {
20488        use serde::ser::SerializeStruct;
20489        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
20490        s.serialize_field("member", &self.member)?;
20491        s.serialize_field("access_level", &self.access_level)?;
20492        Ok(())
20493    }
20494}
20495
20496impl<'de> ::serde::de::Deserialize<'de> for UpdateFolderMemberArg {
20497    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
20498        // struct deserializer
20499        use serde::de::{MapAccess, Visitor};
20500        struct StructVisitor;
20501        impl<'de> Visitor<'de> for StructVisitor {
20502            type Value = UpdateFolderMemberArg;
20503            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
20504                f.write_str("a UpdateFolderMemberArg struct")
20505            }
20506            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
20507                UpdateFolderMemberArg::internal_deserialize(map)
20508            }
20509        }
20510        deserializer.deserialize_struct("UpdateFolderMemberArg", UPDATE_FOLDER_MEMBER_ARG_FIELDS, StructVisitor)
20511    }
20512}
20513
20514impl ::serde::ser::Serialize for UpdateFolderMemberArg {
20515    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
20516        // struct serializer
20517        use serde::ser::SerializeStruct;
20518        let mut s = serializer.serialize_struct("UpdateFolderMemberArg", 3)?;
20519        self.internal_serialize::<S>(&mut s)?;
20520        s.end()
20521    }
20522}
20523
20524#[derive(Debug, Clone, PartialEq, Eq)]
20525#[non_exhaustive] // variants may be added in the future
20526pub enum UpdateFolderMemberError {
20527    AccessError(SharedFolderAccessError),
20528    MemberError(SharedFolderMemberError),
20529    /// If updating the access type required the member to be added to the shared folder and there
20530    /// was an error when adding the member.
20531    NoExplicitAccess(AddFolderMemberError),
20532    /// The current user's account doesn't support this action. An example of this is when
20533    /// downgrading a member from editor to viewer. This action can only be performed by users that
20534    /// have upgraded to a Pro or Business plan.
20535    InsufficientPlan,
20536    /// The current user does not have permission to perform this action.
20537    NoPermission,
20538    /// Catch-all used for unrecognized values returned from the server. Encountering this value
20539    /// typically indicates that this SDK version is out of date.
20540    Other,
20541}
20542
20543impl<'de> ::serde::de::Deserialize<'de> for UpdateFolderMemberError {
20544    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
20545        // union deserializer
20546        use serde::de::{self, MapAccess, Visitor};
20547        struct EnumVisitor;
20548        impl<'de> Visitor<'de> for EnumVisitor {
20549            type Value = UpdateFolderMemberError;
20550            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
20551                f.write_str("a UpdateFolderMemberError structure")
20552            }
20553            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
20554                let tag: &str = match map.next_key()? {
20555                    Some(".tag") => map.next_value()?,
20556                    _ => return Err(de::Error::missing_field(".tag"))
20557                };
20558                let value = match tag {
20559                    "access_error" => {
20560                        match map.next_key()? {
20561                            Some("access_error") => UpdateFolderMemberError::AccessError(map.next_value()?),
20562                            None => return Err(de::Error::missing_field("access_error")),
20563                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
20564                        }
20565                    }
20566                    "member_error" => {
20567                        match map.next_key()? {
20568                            Some("member_error") => UpdateFolderMemberError::MemberError(map.next_value()?),
20569                            None => return Err(de::Error::missing_field("member_error")),
20570                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
20571                        }
20572                    }
20573                    "no_explicit_access" => {
20574                        match map.next_key()? {
20575                            Some("no_explicit_access") => UpdateFolderMemberError::NoExplicitAccess(map.next_value()?),
20576                            None => return Err(de::Error::missing_field("no_explicit_access")),
20577                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
20578                        }
20579                    }
20580                    "insufficient_plan" => UpdateFolderMemberError::InsufficientPlan,
20581                    "no_permission" => UpdateFolderMemberError::NoPermission,
20582                    _ => UpdateFolderMemberError::Other,
20583                };
20584                crate::eat_json_fields(&mut map)?;
20585                Ok(value)
20586            }
20587        }
20588        const VARIANTS: &[&str] = &["access_error",
20589                                    "member_error",
20590                                    "no_explicit_access",
20591                                    "insufficient_plan",
20592                                    "no_permission",
20593                                    "other"];
20594        deserializer.deserialize_struct("UpdateFolderMemberError", VARIANTS, EnumVisitor)
20595    }
20596}
20597
20598impl ::serde::ser::Serialize for UpdateFolderMemberError {
20599    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
20600        // union serializer
20601        use serde::ser::SerializeStruct;
20602        match self {
20603            UpdateFolderMemberError::AccessError(x) => {
20604                // union or polymporphic struct
20605                let mut s = serializer.serialize_struct("UpdateFolderMemberError", 2)?;
20606                s.serialize_field(".tag", "access_error")?;
20607                s.serialize_field("access_error", x)?;
20608                s.end()
20609            }
20610            UpdateFolderMemberError::MemberError(x) => {
20611                // union or polymporphic struct
20612                let mut s = serializer.serialize_struct("UpdateFolderMemberError", 2)?;
20613                s.serialize_field(".tag", "member_error")?;
20614                s.serialize_field("member_error", x)?;
20615                s.end()
20616            }
20617            UpdateFolderMemberError::NoExplicitAccess(x) => {
20618                // union or polymporphic struct
20619                let mut s = serializer.serialize_struct("UpdateFolderMemberError", 2)?;
20620                s.serialize_field(".tag", "no_explicit_access")?;
20621                s.serialize_field("no_explicit_access", x)?;
20622                s.end()
20623            }
20624            UpdateFolderMemberError::InsufficientPlan => {
20625                // unit
20626                let mut s = serializer.serialize_struct("UpdateFolderMemberError", 1)?;
20627                s.serialize_field(".tag", "insufficient_plan")?;
20628                s.end()
20629            }
20630            UpdateFolderMemberError::NoPermission => {
20631                // unit
20632                let mut s = serializer.serialize_struct("UpdateFolderMemberError", 1)?;
20633                s.serialize_field(".tag", "no_permission")?;
20634                s.end()
20635            }
20636            UpdateFolderMemberError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
20637        }
20638    }
20639}
20640
20641impl ::std::error::Error for UpdateFolderMemberError {
20642    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
20643        match self {
20644            UpdateFolderMemberError::AccessError(inner) => Some(inner),
20645            UpdateFolderMemberError::MemberError(inner) => Some(inner),
20646            UpdateFolderMemberError::NoExplicitAccess(inner) => Some(inner),
20647            _ => None,
20648        }
20649    }
20650}
20651
20652impl ::std::fmt::Display for UpdateFolderMemberError {
20653    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
20654        match self {
20655            UpdateFolderMemberError::AccessError(inner) => write!(f, "UpdateFolderMemberError: {}", inner),
20656            UpdateFolderMemberError::MemberError(inner) => write!(f, "UpdateFolderMemberError: {}", inner),
20657            UpdateFolderMemberError::NoExplicitAccess(inner) => write!(f, "If updating the access type required the member to be added to the shared folder and there was an error when adding the member: {}", inner),
20658            UpdateFolderMemberError::InsufficientPlan => f.write_str("The current user's account doesn't support this action. An example of this is when downgrading a member from editor to viewer. This action can only be performed by users that have upgraded to a Pro or Business plan."),
20659            UpdateFolderMemberError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
20660            _ => write!(f, "{:?}", *self),
20661        }
20662    }
20663}
20664
20665/// If any of the policies are unset, then they retain their current setting.
20666#[derive(Debug, Clone, PartialEq, Eq)]
20667#[non_exhaustive] // structs may have more fields added in the future.
20668pub struct UpdateFolderPolicyArg {
20669    /// The ID for the shared folder.
20670    pub shared_folder_id: crate::types::common::SharedFolderId,
20671    /// Who can be a member of this shared folder. Only applicable if the current user is on a team.
20672    pub member_policy: Option<MemberPolicy>,
20673    /// Who can add and remove members of this shared folder.
20674    pub acl_update_policy: Option<AclUpdatePolicy>,
20675    /// Who can enable/disable viewer info for this shared folder.
20676    pub viewer_info_policy: Option<ViewerInfoPolicy>,
20677    /// The policy to apply to shared links created for content inside this shared folder. The
20678    /// current user must be on a team to set this policy to [`SharedLinkPolicy::Members`].
20679    pub shared_link_policy: Option<SharedLinkPolicy>,
20680    /// Settings on the link for this folder.
20681    pub link_settings: Option<LinkSettings>,
20682    /// A list of `FolderAction`s corresponding to `FolderPermission`s that should appear in the
20683    /// response's [`SharedFolderMetadata::permissions`](SharedFolderMetadata) field describing the
20684    /// actions the authenticated user can perform on the folder.
20685    pub actions: Option<Vec<FolderAction>>,
20686}
20687
20688impl UpdateFolderPolicyArg {
20689    pub fn new(shared_folder_id: crate::types::common::SharedFolderId) -> Self {
20690        UpdateFolderPolicyArg {
20691            shared_folder_id,
20692            member_policy: None,
20693            acl_update_policy: None,
20694            viewer_info_policy: None,
20695            shared_link_policy: None,
20696            link_settings: None,
20697            actions: None,
20698        }
20699    }
20700
20701    pub fn with_member_policy(mut self, value: MemberPolicy) -> Self {
20702        self.member_policy = Some(value);
20703        self
20704    }
20705
20706    pub fn with_acl_update_policy(mut self, value: AclUpdatePolicy) -> Self {
20707        self.acl_update_policy = Some(value);
20708        self
20709    }
20710
20711    pub fn with_viewer_info_policy(mut self, value: ViewerInfoPolicy) -> Self {
20712        self.viewer_info_policy = Some(value);
20713        self
20714    }
20715
20716    pub fn with_shared_link_policy(mut self, value: SharedLinkPolicy) -> Self {
20717        self.shared_link_policy = Some(value);
20718        self
20719    }
20720
20721    pub fn with_link_settings(mut self, value: LinkSettings) -> Self {
20722        self.link_settings = Some(value);
20723        self
20724    }
20725
20726    pub fn with_actions(mut self, value: Vec<FolderAction>) -> Self {
20727        self.actions = Some(value);
20728        self
20729    }
20730}
20731
20732const UPDATE_FOLDER_POLICY_ARG_FIELDS: &[&str] = &["shared_folder_id",
20733                                                   "member_policy",
20734                                                   "acl_update_policy",
20735                                                   "viewer_info_policy",
20736                                                   "shared_link_policy",
20737                                                   "link_settings",
20738                                                   "actions"];
20739impl UpdateFolderPolicyArg {
20740    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
20741        map: V,
20742    ) -> Result<UpdateFolderPolicyArg, V::Error> {
20743        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
20744    }
20745
20746    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
20747        mut map: V,
20748        optional: bool,
20749    ) -> Result<Option<UpdateFolderPolicyArg>, V::Error> {
20750        let mut field_shared_folder_id = None;
20751        let mut field_member_policy = None;
20752        let mut field_acl_update_policy = None;
20753        let mut field_viewer_info_policy = None;
20754        let mut field_shared_link_policy = None;
20755        let mut field_link_settings = None;
20756        let mut field_actions = None;
20757        let mut nothing = true;
20758        while let Some(key) = map.next_key::<&str>()? {
20759            nothing = false;
20760            match key {
20761                "shared_folder_id" => {
20762                    if field_shared_folder_id.is_some() {
20763                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
20764                    }
20765                    field_shared_folder_id = Some(map.next_value()?);
20766                }
20767                "member_policy" => {
20768                    if field_member_policy.is_some() {
20769                        return Err(::serde::de::Error::duplicate_field("member_policy"));
20770                    }
20771                    field_member_policy = Some(map.next_value()?);
20772                }
20773                "acl_update_policy" => {
20774                    if field_acl_update_policy.is_some() {
20775                        return Err(::serde::de::Error::duplicate_field("acl_update_policy"));
20776                    }
20777                    field_acl_update_policy = Some(map.next_value()?);
20778                }
20779                "viewer_info_policy" => {
20780                    if field_viewer_info_policy.is_some() {
20781                        return Err(::serde::de::Error::duplicate_field("viewer_info_policy"));
20782                    }
20783                    field_viewer_info_policy = Some(map.next_value()?);
20784                }
20785                "shared_link_policy" => {
20786                    if field_shared_link_policy.is_some() {
20787                        return Err(::serde::de::Error::duplicate_field("shared_link_policy"));
20788                    }
20789                    field_shared_link_policy = Some(map.next_value()?);
20790                }
20791                "link_settings" => {
20792                    if field_link_settings.is_some() {
20793                        return Err(::serde::de::Error::duplicate_field("link_settings"));
20794                    }
20795                    field_link_settings = Some(map.next_value()?);
20796                }
20797                "actions" => {
20798                    if field_actions.is_some() {
20799                        return Err(::serde::de::Error::duplicate_field("actions"));
20800                    }
20801                    field_actions = Some(map.next_value()?);
20802                }
20803                _ => {
20804                    // unknown field allowed and ignored
20805                    map.next_value::<::serde_json::Value>()?;
20806                }
20807            }
20808        }
20809        if optional && nothing {
20810            return Ok(None);
20811        }
20812        let result = UpdateFolderPolicyArg {
20813            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
20814            member_policy: field_member_policy.and_then(Option::flatten),
20815            acl_update_policy: field_acl_update_policy.and_then(Option::flatten),
20816            viewer_info_policy: field_viewer_info_policy.and_then(Option::flatten),
20817            shared_link_policy: field_shared_link_policy.and_then(Option::flatten),
20818            link_settings: field_link_settings.and_then(Option::flatten),
20819            actions: field_actions.and_then(Option::flatten),
20820        };
20821        Ok(Some(result))
20822    }
20823
20824    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
20825        &self,
20826        s: &mut S::SerializeStruct,
20827    ) -> Result<(), S::Error> {
20828        use serde::ser::SerializeStruct;
20829        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
20830        if let Some(val) = &self.member_policy {
20831            s.serialize_field("member_policy", val)?;
20832        }
20833        if let Some(val) = &self.acl_update_policy {
20834            s.serialize_field("acl_update_policy", val)?;
20835        }
20836        if let Some(val) = &self.viewer_info_policy {
20837            s.serialize_field("viewer_info_policy", val)?;
20838        }
20839        if let Some(val) = &self.shared_link_policy {
20840            s.serialize_field("shared_link_policy", val)?;
20841        }
20842        if let Some(val) = &self.link_settings {
20843            s.serialize_field("link_settings", val)?;
20844        }
20845        if let Some(val) = &self.actions {
20846            s.serialize_field("actions", val)?;
20847        }
20848        Ok(())
20849    }
20850}
20851
20852impl<'de> ::serde::de::Deserialize<'de> for UpdateFolderPolicyArg {
20853    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
20854        // struct deserializer
20855        use serde::de::{MapAccess, Visitor};
20856        struct StructVisitor;
20857        impl<'de> Visitor<'de> for StructVisitor {
20858            type Value = UpdateFolderPolicyArg;
20859            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
20860                f.write_str("a UpdateFolderPolicyArg struct")
20861            }
20862            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
20863                UpdateFolderPolicyArg::internal_deserialize(map)
20864            }
20865        }
20866        deserializer.deserialize_struct("UpdateFolderPolicyArg", UPDATE_FOLDER_POLICY_ARG_FIELDS, StructVisitor)
20867    }
20868}
20869
20870impl ::serde::ser::Serialize for UpdateFolderPolicyArg {
20871    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
20872        // struct serializer
20873        use serde::ser::SerializeStruct;
20874        let mut s = serializer.serialize_struct("UpdateFolderPolicyArg", 7)?;
20875        self.internal_serialize::<S>(&mut s)?;
20876        s.end()
20877    }
20878}
20879
20880#[derive(Debug, Clone, PartialEq, Eq)]
20881#[non_exhaustive] // variants may be added in the future
20882pub enum UpdateFolderPolicyError {
20883    AccessError(SharedFolderAccessError),
20884    /// [`UpdateFolderPolicyArg::member_policy`](UpdateFolderPolicyArg) was set even though user is
20885    /// not on a team.
20886    NotOnTeam,
20887    /// Team policy or group sharing settings are more restrictive than
20888    /// [`ShareFolderArg::member_policy`](ShareFolderArg).
20889    TeamPolicyDisallowsMemberPolicy,
20890    /// The current account is not allowed to select the specified
20891    /// [`ShareFolderArg::shared_link_policy`](ShareFolderArg).
20892    DisallowedSharedLinkPolicy,
20893    /// The current user does not have permission to perform this action.
20894    NoPermission,
20895    /// This action cannot be performed on a team shared folder.
20896    TeamFolder,
20897    /// Catch-all used for unrecognized values returned from the server. Encountering this value
20898    /// typically indicates that this SDK version is out of date.
20899    Other,
20900}
20901
20902impl<'de> ::serde::de::Deserialize<'de> for UpdateFolderPolicyError {
20903    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
20904        // union deserializer
20905        use serde::de::{self, MapAccess, Visitor};
20906        struct EnumVisitor;
20907        impl<'de> Visitor<'de> for EnumVisitor {
20908            type Value = UpdateFolderPolicyError;
20909            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
20910                f.write_str("a UpdateFolderPolicyError structure")
20911            }
20912            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
20913                let tag: &str = match map.next_key()? {
20914                    Some(".tag") => map.next_value()?,
20915                    _ => return Err(de::Error::missing_field(".tag"))
20916                };
20917                let value = match tag {
20918                    "access_error" => {
20919                        match map.next_key()? {
20920                            Some("access_error") => UpdateFolderPolicyError::AccessError(map.next_value()?),
20921                            None => return Err(de::Error::missing_field("access_error")),
20922                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
20923                        }
20924                    }
20925                    "not_on_team" => UpdateFolderPolicyError::NotOnTeam,
20926                    "team_policy_disallows_member_policy" => UpdateFolderPolicyError::TeamPolicyDisallowsMemberPolicy,
20927                    "disallowed_shared_link_policy" => UpdateFolderPolicyError::DisallowedSharedLinkPolicy,
20928                    "no_permission" => UpdateFolderPolicyError::NoPermission,
20929                    "team_folder" => UpdateFolderPolicyError::TeamFolder,
20930                    _ => UpdateFolderPolicyError::Other,
20931                };
20932                crate::eat_json_fields(&mut map)?;
20933                Ok(value)
20934            }
20935        }
20936        const VARIANTS: &[&str] = &["access_error",
20937                                    "not_on_team",
20938                                    "team_policy_disallows_member_policy",
20939                                    "disallowed_shared_link_policy",
20940                                    "no_permission",
20941                                    "team_folder",
20942                                    "other"];
20943        deserializer.deserialize_struct("UpdateFolderPolicyError", VARIANTS, EnumVisitor)
20944    }
20945}
20946
20947impl ::serde::ser::Serialize for UpdateFolderPolicyError {
20948    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
20949        // union serializer
20950        use serde::ser::SerializeStruct;
20951        match self {
20952            UpdateFolderPolicyError::AccessError(x) => {
20953                // union or polymporphic struct
20954                let mut s = serializer.serialize_struct("UpdateFolderPolicyError", 2)?;
20955                s.serialize_field(".tag", "access_error")?;
20956                s.serialize_field("access_error", x)?;
20957                s.end()
20958            }
20959            UpdateFolderPolicyError::NotOnTeam => {
20960                // unit
20961                let mut s = serializer.serialize_struct("UpdateFolderPolicyError", 1)?;
20962                s.serialize_field(".tag", "not_on_team")?;
20963                s.end()
20964            }
20965            UpdateFolderPolicyError::TeamPolicyDisallowsMemberPolicy => {
20966                // unit
20967                let mut s = serializer.serialize_struct("UpdateFolderPolicyError", 1)?;
20968                s.serialize_field(".tag", "team_policy_disallows_member_policy")?;
20969                s.end()
20970            }
20971            UpdateFolderPolicyError::DisallowedSharedLinkPolicy => {
20972                // unit
20973                let mut s = serializer.serialize_struct("UpdateFolderPolicyError", 1)?;
20974                s.serialize_field(".tag", "disallowed_shared_link_policy")?;
20975                s.end()
20976            }
20977            UpdateFolderPolicyError::NoPermission => {
20978                // unit
20979                let mut s = serializer.serialize_struct("UpdateFolderPolicyError", 1)?;
20980                s.serialize_field(".tag", "no_permission")?;
20981                s.end()
20982            }
20983            UpdateFolderPolicyError::TeamFolder => {
20984                // unit
20985                let mut s = serializer.serialize_struct("UpdateFolderPolicyError", 1)?;
20986                s.serialize_field(".tag", "team_folder")?;
20987                s.end()
20988            }
20989            UpdateFolderPolicyError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
20990        }
20991    }
20992}
20993
20994impl ::std::error::Error for UpdateFolderPolicyError {
20995    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
20996        match self {
20997            UpdateFolderPolicyError::AccessError(inner) => Some(inner),
20998            _ => None,
20999        }
21000    }
21001}
21002
21003impl ::std::fmt::Display for UpdateFolderPolicyError {
21004    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
21005        match self {
21006            UpdateFolderPolicyError::AccessError(inner) => write!(f, "UpdateFolderPolicyError: {}", inner),
21007            UpdateFolderPolicyError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
21008            UpdateFolderPolicyError::TeamFolder => f.write_str("This action cannot be performed on a team shared folder."),
21009            _ => write!(f, "{:?}", *self),
21010        }
21011    }
21012}
21013
21014/// The information about a user member of the shared content with an appended last seen timestamp.
21015#[derive(Debug, Clone, PartialEq, Eq)]
21016#[non_exhaustive] // structs may have more fields added in the future.
21017pub struct UserFileMembershipInfo {
21018    /// The access type for this member. It contains inherited access type from parent folder, and
21019    /// acquired access type from this folder.
21020    pub access_type: AccessLevel,
21021    /// The account information for the membership user.
21022    pub user: UserInfo,
21023    /// The permissions that requesting user has on this member. The set of permissions corresponds
21024    /// to the MemberActions in the request.
21025    pub permissions: Option<Vec<MemberPermission>>,
21026    /// Field is deprecated. Never set.
21027    #[deprecated]
21028    pub initials: Option<String>,
21029    /// True if the member has access on a parent folder.
21030    pub is_inherited: bool,
21031    /// The UTC timestamp of when the user has last seen the content. Only populated if the user has
21032    /// seen the content and the caller has a plan that includes viewer history.
21033    pub time_last_seen: Option<crate::types::common::DropboxTimestamp>,
21034    /// The platform on which the user has last seen the content, or unknown.
21035    pub platform_type: Option<crate::types::seen_state::PlatformType>,
21036}
21037
21038impl UserFileMembershipInfo {
21039    pub fn new(access_type: AccessLevel, user: UserInfo) -> Self {
21040        UserFileMembershipInfo {
21041            access_type,
21042            user,
21043            permissions: None,
21044            #[allow(deprecated)] initials: None,
21045            is_inherited: false,
21046            time_last_seen: None,
21047            platform_type: None,
21048        }
21049    }
21050
21051    pub fn with_permissions(mut self, value: Vec<MemberPermission>) -> Self {
21052        self.permissions = Some(value);
21053        self
21054    }
21055
21056    #[deprecated]
21057    #[allow(deprecated)]
21058    pub fn with_initials(mut self, value: String) -> Self {
21059        self.initials = Some(value);
21060        self
21061    }
21062
21063    pub fn with_is_inherited(mut self, value: bool) -> Self {
21064        self.is_inherited = value;
21065        self
21066    }
21067
21068    pub fn with_time_last_seen(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
21069        self.time_last_seen = Some(value);
21070        self
21071    }
21072
21073    pub fn with_platform_type(mut self, value: crate::types::seen_state::PlatformType) -> Self {
21074        self.platform_type = Some(value);
21075        self
21076    }
21077}
21078
21079const USER_FILE_MEMBERSHIP_INFO_FIELDS: &[&str] = &["access_type",
21080                                                    "user",
21081                                                    "permissions",
21082                                                    "initials",
21083                                                    "is_inherited",
21084                                                    "time_last_seen",
21085                                                    "platform_type"];
21086impl UserFileMembershipInfo {
21087    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
21088        map: V,
21089    ) -> Result<UserFileMembershipInfo, V::Error> {
21090        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
21091    }
21092
21093    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
21094        mut map: V,
21095        optional: bool,
21096    ) -> Result<Option<UserFileMembershipInfo>, V::Error> {
21097        let mut field_access_type = None;
21098        let mut field_user = None;
21099        let mut field_permissions = None;
21100        let mut field_initials = None;
21101        let mut field_is_inherited = None;
21102        let mut field_time_last_seen = None;
21103        let mut field_platform_type = None;
21104        let mut nothing = true;
21105        while let Some(key) = map.next_key::<&str>()? {
21106            nothing = false;
21107            match key {
21108                "access_type" => {
21109                    if field_access_type.is_some() {
21110                        return Err(::serde::de::Error::duplicate_field("access_type"));
21111                    }
21112                    field_access_type = Some(map.next_value()?);
21113                }
21114                "user" => {
21115                    if field_user.is_some() {
21116                        return Err(::serde::de::Error::duplicate_field("user"));
21117                    }
21118                    field_user = Some(map.next_value()?);
21119                }
21120                "permissions" => {
21121                    if field_permissions.is_some() {
21122                        return Err(::serde::de::Error::duplicate_field("permissions"));
21123                    }
21124                    field_permissions = Some(map.next_value()?);
21125                }
21126                "initials" => {
21127                    if field_initials.is_some() {
21128                        return Err(::serde::de::Error::duplicate_field("initials"));
21129                    }
21130                    field_initials = Some(map.next_value()?);
21131                }
21132                "is_inherited" => {
21133                    if field_is_inherited.is_some() {
21134                        return Err(::serde::de::Error::duplicate_field("is_inherited"));
21135                    }
21136                    field_is_inherited = Some(map.next_value()?);
21137                }
21138                "time_last_seen" => {
21139                    if field_time_last_seen.is_some() {
21140                        return Err(::serde::de::Error::duplicate_field("time_last_seen"));
21141                    }
21142                    field_time_last_seen = Some(map.next_value()?);
21143                }
21144                "platform_type" => {
21145                    if field_platform_type.is_some() {
21146                        return Err(::serde::de::Error::duplicate_field("platform_type"));
21147                    }
21148                    field_platform_type = Some(map.next_value()?);
21149                }
21150                _ => {
21151                    // unknown field allowed and ignored
21152                    map.next_value::<::serde_json::Value>()?;
21153                }
21154            }
21155        }
21156        if optional && nothing {
21157            return Ok(None);
21158        }
21159        let result = UserFileMembershipInfo {
21160            access_type: field_access_type.ok_or_else(|| ::serde::de::Error::missing_field("access_type"))?,
21161            user: field_user.ok_or_else(|| ::serde::de::Error::missing_field("user"))?,
21162            permissions: field_permissions.and_then(Option::flatten),
21163            #[allow(deprecated)] initials: field_initials.and_then(Option::flatten),
21164            is_inherited: field_is_inherited.unwrap_or(false),
21165            time_last_seen: field_time_last_seen.and_then(Option::flatten),
21166            platform_type: field_platform_type.and_then(Option::flatten),
21167        };
21168        Ok(Some(result))
21169    }
21170
21171    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
21172        &self,
21173        s: &mut S::SerializeStruct,
21174    ) -> Result<(), S::Error> {
21175        use serde::ser::SerializeStruct;
21176        s.serialize_field("access_type", &self.access_type)?;
21177        s.serialize_field("user", &self.user)?;
21178        if let Some(val) = &self.permissions {
21179            s.serialize_field("permissions", val)?;
21180        }
21181        #[allow(deprecated)]
21182        if let Some(val) = &self.initials {
21183            s.serialize_field("initials", val)?;
21184        }
21185        if self.is_inherited {
21186            s.serialize_field("is_inherited", &self.is_inherited)?;
21187        }
21188        if let Some(val) = &self.time_last_seen {
21189            s.serialize_field("time_last_seen", val)?;
21190        }
21191        if let Some(val) = &self.platform_type {
21192            s.serialize_field("platform_type", val)?;
21193        }
21194        Ok(())
21195    }
21196}
21197
21198impl<'de> ::serde::de::Deserialize<'de> for UserFileMembershipInfo {
21199    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
21200        // struct deserializer
21201        use serde::de::{MapAccess, Visitor};
21202        struct StructVisitor;
21203        impl<'de> Visitor<'de> for StructVisitor {
21204            type Value = UserFileMembershipInfo;
21205            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
21206                f.write_str("a UserFileMembershipInfo struct")
21207            }
21208            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
21209                UserFileMembershipInfo::internal_deserialize(map)
21210            }
21211        }
21212        deserializer.deserialize_struct("UserFileMembershipInfo", USER_FILE_MEMBERSHIP_INFO_FIELDS, StructVisitor)
21213    }
21214}
21215
21216impl ::serde::ser::Serialize for UserFileMembershipInfo {
21217    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
21218        // struct serializer
21219        use serde::ser::SerializeStruct;
21220        let mut s = serializer.serialize_struct("UserFileMembershipInfo", 7)?;
21221        self.internal_serialize::<S>(&mut s)?;
21222        s.end()
21223    }
21224}
21225
21226// struct extends UserMembershipInfo
21227impl From<UserFileMembershipInfo> for UserMembershipInfo {
21228    fn from(subtype: UserFileMembershipInfo) -> Self {
21229        Self {
21230            access_type: subtype.access_type,
21231            user: subtype.user,
21232            permissions: subtype.permissions,
21233            #[allow(deprecated)] initials: subtype.initials,
21234            is_inherited: subtype.is_inherited,
21235        }
21236    }
21237}
21238/// Basic information about a user. Use [`users::get_account()`](crate::users::get_account) and
21239/// [`users::get_account_batch()`](crate::users::get_account_batch) to obtain more detailed
21240/// information.
21241#[derive(Debug, Clone, PartialEq, Eq)]
21242#[non_exhaustive] // structs may have more fields added in the future.
21243pub struct UserInfo {
21244    /// The account ID of the user.
21245    pub account_id: crate::types::users_common::AccountId,
21246    /// Email address of user.
21247    pub email: String,
21248    /// The display name of the user.
21249    pub display_name: String,
21250    /// If the user is in the same team as current user.
21251    pub same_team: bool,
21252    /// The team member ID of the shared folder member. Only present if `same_team` is true.
21253    pub team_member_id: Option<String>,
21254}
21255
21256impl UserInfo {
21257    pub fn new(
21258        account_id: crate::types::users_common::AccountId,
21259        email: String,
21260        display_name: String,
21261        same_team: bool,
21262    ) -> Self {
21263        UserInfo {
21264            account_id,
21265            email,
21266            display_name,
21267            same_team,
21268            team_member_id: None,
21269        }
21270    }
21271
21272    pub fn with_team_member_id(mut self, value: String) -> Self {
21273        self.team_member_id = Some(value);
21274        self
21275    }
21276}
21277
21278const USER_INFO_FIELDS: &[&str] = &["account_id",
21279                                    "email",
21280                                    "display_name",
21281                                    "same_team",
21282                                    "team_member_id"];
21283impl UserInfo {
21284    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
21285        map: V,
21286    ) -> Result<UserInfo, V::Error> {
21287        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
21288    }
21289
21290    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
21291        mut map: V,
21292        optional: bool,
21293    ) -> Result<Option<UserInfo>, V::Error> {
21294        let mut field_account_id = None;
21295        let mut field_email = None;
21296        let mut field_display_name = None;
21297        let mut field_same_team = None;
21298        let mut field_team_member_id = None;
21299        let mut nothing = true;
21300        while let Some(key) = map.next_key::<&str>()? {
21301            nothing = false;
21302            match key {
21303                "account_id" => {
21304                    if field_account_id.is_some() {
21305                        return Err(::serde::de::Error::duplicate_field("account_id"));
21306                    }
21307                    field_account_id = Some(map.next_value()?);
21308                }
21309                "email" => {
21310                    if field_email.is_some() {
21311                        return Err(::serde::de::Error::duplicate_field("email"));
21312                    }
21313                    field_email = Some(map.next_value()?);
21314                }
21315                "display_name" => {
21316                    if field_display_name.is_some() {
21317                        return Err(::serde::de::Error::duplicate_field("display_name"));
21318                    }
21319                    field_display_name = Some(map.next_value()?);
21320                }
21321                "same_team" => {
21322                    if field_same_team.is_some() {
21323                        return Err(::serde::de::Error::duplicate_field("same_team"));
21324                    }
21325                    field_same_team = Some(map.next_value()?);
21326                }
21327                "team_member_id" => {
21328                    if field_team_member_id.is_some() {
21329                        return Err(::serde::de::Error::duplicate_field("team_member_id"));
21330                    }
21331                    field_team_member_id = Some(map.next_value()?);
21332                }
21333                _ => {
21334                    // unknown field allowed and ignored
21335                    map.next_value::<::serde_json::Value>()?;
21336                }
21337            }
21338        }
21339        if optional && nothing {
21340            return Ok(None);
21341        }
21342        let result = UserInfo {
21343            account_id: field_account_id.ok_or_else(|| ::serde::de::Error::missing_field("account_id"))?,
21344            email: field_email.ok_or_else(|| ::serde::de::Error::missing_field("email"))?,
21345            display_name: field_display_name.ok_or_else(|| ::serde::de::Error::missing_field("display_name"))?,
21346            same_team: field_same_team.ok_or_else(|| ::serde::de::Error::missing_field("same_team"))?,
21347            team_member_id: field_team_member_id.and_then(Option::flatten),
21348        };
21349        Ok(Some(result))
21350    }
21351
21352    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
21353        &self,
21354        s: &mut S::SerializeStruct,
21355    ) -> Result<(), S::Error> {
21356        use serde::ser::SerializeStruct;
21357        s.serialize_field("account_id", &self.account_id)?;
21358        s.serialize_field("email", &self.email)?;
21359        s.serialize_field("display_name", &self.display_name)?;
21360        s.serialize_field("same_team", &self.same_team)?;
21361        if let Some(val) = &self.team_member_id {
21362            s.serialize_field("team_member_id", val)?;
21363        }
21364        Ok(())
21365    }
21366}
21367
21368impl<'de> ::serde::de::Deserialize<'de> for UserInfo {
21369    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
21370        // struct deserializer
21371        use serde::de::{MapAccess, Visitor};
21372        struct StructVisitor;
21373        impl<'de> Visitor<'de> for StructVisitor {
21374            type Value = UserInfo;
21375            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
21376                f.write_str("a UserInfo struct")
21377            }
21378            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
21379                UserInfo::internal_deserialize(map)
21380            }
21381        }
21382        deserializer.deserialize_struct("UserInfo", USER_INFO_FIELDS, StructVisitor)
21383    }
21384}
21385
21386impl ::serde::ser::Serialize for UserInfo {
21387    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
21388        // struct serializer
21389        use serde::ser::SerializeStruct;
21390        let mut s = serializer.serialize_struct("UserInfo", 5)?;
21391        self.internal_serialize::<S>(&mut s)?;
21392        s.end()
21393    }
21394}
21395
21396/// The information about a user member of the shared content.
21397#[derive(Debug, Clone, PartialEq, Eq)]
21398#[non_exhaustive] // structs may have more fields added in the future.
21399pub struct UserMembershipInfo {
21400    /// The access type for this member. It contains inherited access type from parent folder, and
21401    /// acquired access type from this folder.
21402    pub access_type: AccessLevel,
21403    /// The account information for the membership user.
21404    pub user: UserInfo,
21405    /// The permissions that requesting user has on this member. The set of permissions corresponds
21406    /// to the MemberActions in the request.
21407    pub permissions: Option<Vec<MemberPermission>>,
21408    /// Field is deprecated. Never set.
21409    #[deprecated]
21410    pub initials: Option<String>,
21411    /// True if the member has access on a parent folder.
21412    pub is_inherited: bool,
21413}
21414
21415impl UserMembershipInfo {
21416    pub fn new(access_type: AccessLevel, user: UserInfo) -> Self {
21417        UserMembershipInfo {
21418            access_type,
21419            user,
21420            permissions: None,
21421            #[allow(deprecated)] initials: None,
21422            is_inherited: false,
21423        }
21424    }
21425
21426    pub fn with_permissions(mut self, value: Vec<MemberPermission>) -> Self {
21427        self.permissions = Some(value);
21428        self
21429    }
21430
21431    #[deprecated]
21432    #[allow(deprecated)]
21433    pub fn with_initials(mut self, value: String) -> Self {
21434        self.initials = Some(value);
21435        self
21436    }
21437
21438    pub fn with_is_inherited(mut self, value: bool) -> Self {
21439        self.is_inherited = value;
21440        self
21441    }
21442}
21443
21444const USER_MEMBERSHIP_INFO_FIELDS: &[&str] = &["access_type",
21445                                               "user",
21446                                               "permissions",
21447                                               "initials",
21448                                               "is_inherited"];
21449impl UserMembershipInfo {
21450    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
21451        map: V,
21452    ) -> Result<UserMembershipInfo, V::Error> {
21453        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
21454    }
21455
21456    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
21457        mut map: V,
21458        optional: bool,
21459    ) -> Result<Option<UserMembershipInfo>, V::Error> {
21460        let mut field_access_type = None;
21461        let mut field_user = None;
21462        let mut field_permissions = None;
21463        let mut field_initials = None;
21464        let mut field_is_inherited = None;
21465        let mut nothing = true;
21466        while let Some(key) = map.next_key::<&str>()? {
21467            nothing = false;
21468            match key {
21469                "access_type" => {
21470                    if field_access_type.is_some() {
21471                        return Err(::serde::de::Error::duplicate_field("access_type"));
21472                    }
21473                    field_access_type = Some(map.next_value()?);
21474                }
21475                "user" => {
21476                    if field_user.is_some() {
21477                        return Err(::serde::de::Error::duplicate_field("user"));
21478                    }
21479                    field_user = Some(map.next_value()?);
21480                }
21481                "permissions" => {
21482                    if field_permissions.is_some() {
21483                        return Err(::serde::de::Error::duplicate_field("permissions"));
21484                    }
21485                    field_permissions = Some(map.next_value()?);
21486                }
21487                "initials" => {
21488                    if field_initials.is_some() {
21489                        return Err(::serde::de::Error::duplicate_field("initials"));
21490                    }
21491                    field_initials = Some(map.next_value()?);
21492                }
21493                "is_inherited" => {
21494                    if field_is_inherited.is_some() {
21495                        return Err(::serde::de::Error::duplicate_field("is_inherited"));
21496                    }
21497                    field_is_inherited = Some(map.next_value()?);
21498                }
21499                _ => {
21500                    // unknown field allowed and ignored
21501                    map.next_value::<::serde_json::Value>()?;
21502                }
21503            }
21504        }
21505        if optional && nothing {
21506            return Ok(None);
21507        }
21508        let result = UserMembershipInfo {
21509            access_type: field_access_type.ok_or_else(|| ::serde::de::Error::missing_field("access_type"))?,
21510            user: field_user.ok_or_else(|| ::serde::de::Error::missing_field("user"))?,
21511            permissions: field_permissions.and_then(Option::flatten),
21512            #[allow(deprecated)] initials: field_initials.and_then(Option::flatten),
21513            is_inherited: field_is_inherited.unwrap_or(false),
21514        };
21515        Ok(Some(result))
21516    }
21517
21518    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
21519        &self,
21520        s: &mut S::SerializeStruct,
21521    ) -> Result<(), S::Error> {
21522        use serde::ser::SerializeStruct;
21523        s.serialize_field("access_type", &self.access_type)?;
21524        s.serialize_field("user", &self.user)?;
21525        if let Some(val) = &self.permissions {
21526            s.serialize_field("permissions", val)?;
21527        }
21528        #[allow(deprecated)]
21529        if let Some(val) = &self.initials {
21530            s.serialize_field("initials", val)?;
21531        }
21532        if self.is_inherited {
21533            s.serialize_field("is_inherited", &self.is_inherited)?;
21534        }
21535        Ok(())
21536    }
21537}
21538
21539impl<'de> ::serde::de::Deserialize<'de> for UserMembershipInfo {
21540    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
21541        // struct deserializer
21542        use serde::de::{MapAccess, Visitor};
21543        struct StructVisitor;
21544        impl<'de> Visitor<'de> for StructVisitor {
21545            type Value = UserMembershipInfo;
21546            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
21547                f.write_str("a UserMembershipInfo struct")
21548            }
21549            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
21550                UserMembershipInfo::internal_deserialize(map)
21551            }
21552        }
21553        deserializer.deserialize_struct("UserMembershipInfo", USER_MEMBERSHIP_INFO_FIELDS, StructVisitor)
21554    }
21555}
21556
21557impl ::serde::ser::Serialize for UserMembershipInfo {
21558    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
21559        // struct serializer
21560        use serde::ser::SerializeStruct;
21561        let mut s = serializer.serialize_struct("UserMembershipInfo", 5)?;
21562        self.internal_serialize::<S>(&mut s)?;
21563        s.end()
21564    }
21565}
21566
21567// struct extends MembershipInfo
21568impl From<UserMembershipInfo> for MembershipInfo {
21569    fn from(subtype: UserMembershipInfo) -> Self {
21570        Self {
21571            access_type: subtype.access_type,
21572            permissions: subtype.permissions,
21573            #[allow(deprecated)] initials: subtype.initials,
21574            is_inherited: subtype.is_inherited,
21575        }
21576    }
21577}
21578#[derive(Debug, Clone, PartialEq, Eq)]
21579#[non_exhaustive] // variants may be added in the future
21580pub enum ViewerInfoPolicy {
21581    /// Viewer information is available on this file.
21582    Enabled,
21583    /// Viewer information is disabled on this file.
21584    Disabled,
21585    /// Catch-all used for unrecognized values returned from the server. Encountering this value
21586    /// typically indicates that this SDK version is out of date.
21587    Other,
21588}
21589
21590impl<'de> ::serde::de::Deserialize<'de> for ViewerInfoPolicy {
21591    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
21592        // union deserializer
21593        use serde::de::{self, MapAccess, Visitor};
21594        struct EnumVisitor;
21595        impl<'de> Visitor<'de> for EnumVisitor {
21596            type Value = ViewerInfoPolicy;
21597            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
21598                f.write_str("a ViewerInfoPolicy structure")
21599            }
21600            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
21601                let tag: &str = match map.next_key()? {
21602                    Some(".tag") => map.next_value()?,
21603                    _ => return Err(de::Error::missing_field(".tag"))
21604                };
21605                let value = match tag {
21606                    "enabled" => ViewerInfoPolicy::Enabled,
21607                    "disabled" => ViewerInfoPolicy::Disabled,
21608                    _ => ViewerInfoPolicy::Other,
21609                };
21610                crate::eat_json_fields(&mut map)?;
21611                Ok(value)
21612            }
21613        }
21614        const VARIANTS: &[&str] = &["enabled",
21615                                    "disabled",
21616                                    "other"];
21617        deserializer.deserialize_struct("ViewerInfoPolicy", VARIANTS, EnumVisitor)
21618    }
21619}
21620
21621impl ::serde::ser::Serialize for ViewerInfoPolicy {
21622    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
21623        // union serializer
21624        use serde::ser::SerializeStruct;
21625        match self {
21626            ViewerInfoPolicy::Enabled => {
21627                // unit
21628                let mut s = serializer.serialize_struct("ViewerInfoPolicy", 1)?;
21629                s.serialize_field(".tag", "enabled")?;
21630                s.end()
21631            }
21632            ViewerInfoPolicy::Disabled => {
21633                // unit
21634                let mut s = serializer.serialize_struct("ViewerInfoPolicy", 1)?;
21635                s.serialize_field(".tag", "disabled")?;
21636                s.end()
21637            }
21638            ViewerInfoPolicy::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
21639        }
21640    }
21641}
21642
21643/// Who can access a shared link. The most open visibility is [`Public`](Visibility::Public). The
21644/// default depends on many aspects, such as team and user preferences and shared folder settings.
21645#[derive(Debug, Clone, PartialEq, Eq)]
21646#[non_exhaustive] // variants may be added in the future
21647pub enum Visibility {
21648    /// Anyone who has received the link can access it. No login required.
21649    Public,
21650    /// Only members of the same team can access the link. Login is required.
21651    TeamOnly,
21652    /// A link-specific password is required to access the link. Login is not required.
21653    Password,
21654    /// Only members of the same team who have the link-specific password can access the link.
21655    TeamAndPassword,
21656    /// Only members of the shared folder containing the linked file can access the link. Login is
21657    /// required.
21658    SharedFolderOnly,
21659    /// Catch-all used for unrecognized values returned from the server. Encountering this value
21660    /// typically indicates that this SDK version is out of date.
21661    Other,
21662}
21663
21664impl<'de> ::serde::de::Deserialize<'de> for Visibility {
21665    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
21666        // union deserializer
21667        use serde::de::{self, MapAccess, Visitor};
21668        struct EnumVisitor;
21669        impl<'de> Visitor<'de> for EnumVisitor {
21670            type Value = Visibility;
21671            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
21672                f.write_str("a Visibility structure")
21673            }
21674            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
21675                let tag: &str = match map.next_key()? {
21676                    Some(".tag") => map.next_value()?,
21677                    _ => return Err(de::Error::missing_field(".tag"))
21678                };
21679                let value = match tag {
21680                    "public" => Visibility::Public,
21681                    "team_only" => Visibility::TeamOnly,
21682                    "password" => Visibility::Password,
21683                    "team_and_password" => Visibility::TeamAndPassword,
21684                    "shared_folder_only" => Visibility::SharedFolderOnly,
21685                    _ => Visibility::Other,
21686                };
21687                crate::eat_json_fields(&mut map)?;
21688                Ok(value)
21689            }
21690        }
21691        const VARIANTS: &[&str] = &["public",
21692                                    "team_only",
21693                                    "password",
21694                                    "team_and_password",
21695                                    "shared_folder_only",
21696                                    "other"];
21697        deserializer.deserialize_struct("Visibility", VARIANTS, EnumVisitor)
21698    }
21699}
21700
21701impl ::serde::ser::Serialize for Visibility {
21702    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
21703        // union serializer
21704        use serde::ser::SerializeStruct;
21705        match self {
21706            Visibility::Public => {
21707                // unit
21708                let mut s = serializer.serialize_struct("Visibility", 1)?;
21709                s.serialize_field(".tag", "public")?;
21710                s.end()
21711            }
21712            Visibility::TeamOnly => {
21713                // unit
21714                let mut s = serializer.serialize_struct("Visibility", 1)?;
21715                s.serialize_field(".tag", "team_only")?;
21716                s.end()
21717            }
21718            Visibility::Password => {
21719                // unit
21720                let mut s = serializer.serialize_struct("Visibility", 1)?;
21721                s.serialize_field(".tag", "password")?;
21722                s.end()
21723            }
21724            Visibility::TeamAndPassword => {
21725                // unit
21726                let mut s = serializer.serialize_struct("Visibility", 1)?;
21727                s.serialize_field(".tag", "team_and_password")?;
21728                s.end()
21729            }
21730            Visibility::SharedFolderOnly => {
21731                // unit
21732                let mut s = serializer.serialize_struct("Visibility", 1)?;
21733                s.serialize_field(".tag", "shared_folder_only")?;
21734                s.end()
21735            }
21736            Visibility::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
21737        }
21738    }
21739}
21740
21741#[derive(Debug, Clone, PartialEq, Eq)]
21742#[non_exhaustive] // structs may have more fields added in the future.
21743pub struct VisibilityPolicy {
21744    /// This is the value to submit when saving the visibility setting.
21745    pub policy: RequestedVisibility,
21746    /// This is what the effective policy would be, if you selected this option. The resolved policy
21747    /// is obtained after considering external effects such as shared folder settings and team
21748    /// policy. This value is guaranteed to be provided.
21749    pub resolved_policy: AlphaResolvedVisibility,
21750    /// Whether the user is permitted to set the visibility to this policy.
21751    pub allowed: bool,
21752    /// If `allowed` is `false`, this will provide the reason that the user is not permitted to set
21753    /// the visibility to this policy.
21754    pub disallowed_reason: Option<VisibilityPolicyDisallowedReason>,
21755}
21756
21757impl VisibilityPolicy {
21758    pub fn new(
21759        policy: RequestedVisibility,
21760        resolved_policy: AlphaResolvedVisibility,
21761        allowed: bool,
21762    ) -> Self {
21763        VisibilityPolicy {
21764            policy,
21765            resolved_policy,
21766            allowed,
21767            disallowed_reason: None,
21768        }
21769    }
21770
21771    pub fn with_disallowed_reason(mut self, value: VisibilityPolicyDisallowedReason) -> Self {
21772        self.disallowed_reason = Some(value);
21773        self
21774    }
21775}
21776
21777const VISIBILITY_POLICY_FIELDS: &[&str] = &["policy",
21778                                            "resolved_policy",
21779                                            "allowed",
21780                                            "disallowed_reason"];
21781impl VisibilityPolicy {
21782    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
21783        map: V,
21784    ) -> Result<VisibilityPolicy, V::Error> {
21785        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
21786    }
21787
21788    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
21789        mut map: V,
21790        optional: bool,
21791    ) -> Result<Option<VisibilityPolicy>, V::Error> {
21792        let mut field_policy = None;
21793        let mut field_resolved_policy = None;
21794        let mut field_allowed = None;
21795        let mut field_disallowed_reason = None;
21796        let mut nothing = true;
21797        while let Some(key) = map.next_key::<&str>()? {
21798            nothing = false;
21799            match key {
21800                "policy" => {
21801                    if field_policy.is_some() {
21802                        return Err(::serde::de::Error::duplicate_field("policy"));
21803                    }
21804                    field_policy = Some(map.next_value()?);
21805                }
21806                "resolved_policy" => {
21807                    if field_resolved_policy.is_some() {
21808                        return Err(::serde::de::Error::duplicate_field("resolved_policy"));
21809                    }
21810                    field_resolved_policy = Some(map.next_value()?);
21811                }
21812                "allowed" => {
21813                    if field_allowed.is_some() {
21814                        return Err(::serde::de::Error::duplicate_field("allowed"));
21815                    }
21816                    field_allowed = Some(map.next_value()?);
21817                }
21818                "disallowed_reason" => {
21819                    if field_disallowed_reason.is_some() {
21820                        return Err(::serde::de::Error::duplicate_field("disallowed_reason"));
21821                    }
21822                    field_disallowed_reason = Some(map.next_value()?);
21823                }
21824                _ => {
21825                    // unknown field allowed and ignored
21826                    map.next_value::<::serde_json::Value>()?;
21827                }
21828            }
21829        }
21830        if optional && nothing {
21831            return Ok(None);
21832        }
21833        let result = VisibilityPolicy {
21834            policy: field_policy.ok_or_else(|| ::serde::de::Error::missing_field("policy"))?,
21835            resolved_policy: field_resolved_policy.ok_or_else(|| ::serde::de::Error::missing_field("resolved_policy"))?,
21836            allowed: field_allowed.ok_or_else(|| ::serde::de::Error::missing_field("allowed"))?,
21837            disallowed_reason: field_disallowed_reason.and_then(Option::flatten),
21838        };
21839        Ok(Some(result))
21840    }
21841
21842    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
21843        &self,
21844        s: &mut S::SerializeStruct,
21845    ) -> Result<(), S::Error> {
21846        use serde::ser::SerializeStruct;
21847        s.serialize_field("policy", &self.policy)?;
21848        s.serialize_field("resolved_policy", &self.resolved_policy)?;
21849        s.serialize_field("allowed", &self.allowed)?;
21850        if let Some(val) = &self.disallowed_reason {
21851            s.serialize_field("disallowed_reason", val)?;
21852        }
21853        Ok(())
21854    }
21855}
21856
21857impl<'de> ::serde::de::Deserialize<'de> for VisibilityPolicy {
21858    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
21859        // struct deserializer
21860        use serde::de::{MapAccess, Visitor};
21861        struct StructVisitor;
21862        impl<'de> Visitor<'de> for StructVisitor {
21863            type Value = VisibilityPolicy;
21864            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
21865                f.write_str("a VisibilityPolicy struct")
21866            }
21867            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
21868                VisibilityPolicy::internal_deserialize(map)
21869            }
21870        }
21871        deserializer.deserialize_struct("VisibilityPolicy", VISIBILITY_POLICY_FIELDS, StructVisitor)
21872    }
21873}
21874
21875impl ::serde::ser::Serialize for VisibilityPolicy {
21876    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
21877        // struct serializer
21878        use serde::ser::SerializeStruct;
21879        let mut s = serializer.serialize_struct("VisibilityPolicy", 4)?;
21880        self.internal_serialize::<S>(&mut s)?;
21881        s.end()
21882    }
21883}
21884
21885#[derive(Debug, Clone, PartialEq, Eq)]
21886#[non_exhaustive] // variants may be added in the future
21887pub enum VisibilityPolicyDisallowedReason {
21888    /// The user needs to delete and recreate the link to change the visibility policy.
21889    DeleteAndRecreate,
21890    /// The parent shared folder restricts sharing of links outside the shared folder. To change the
21891    /// visibility policy, remove the restriction from the parent shared folder.
21892    RestrictedBySharedFolder,
21893    /// The team policy prevents links being shared outside the team.
21894    RestrictedByTeam,
21895    /// The user needs to be on a team to set this policy.
21896    UserNotOnTeam,
21897    /// The user is a basic user or is on a limited team.
21898    UserAccountType,
21899    /// The user does not have permission.
21900    PermissionDenied,
21901    /// Catch-all used for unrecognized values returned from the server. Encountering this value
21902    /// typically indicates that this SDK version is out of date.
21903    Other,
21904}
21905
21906impl<'de> ::serde::de::Deserialize<'de> for VisibilityPolicyDisallowedReason {
21907    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
21908        // union deserializer
21909        use serde::de::{self, MapAccess, Visitor};
21910        struct EnumVisitor;
21911        impl<'de> Visitor<'de> for EnumVisitor {
21912            type Value = VisibilityPolicyDisallowedReason;
21913            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
21914                f.write_str("a VisibilityPolicyDisallowedReason structure")
21915            }
21916            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
21917                let tag: &str = match map.next_key()? {
21918                    Some(".tag") => map.next_value()?,
21919                    _ => return Err(de::Error::missing_field(".tag"))
21920                };
21921                let value = match tag {
21922                    "delete_and_recreate" => VisibilityPolicyDisallowedReason::DeleteAndRecreate,
21923                    "restricted_by_shared_folder" => VisibilityPolicyDisallowedReason::RestrictedBySharedFolder,
21924                    "restricted_by_team" => VisibilityPolicyDisallowedReason::RestrictedByTeam,
21925                    "user_not_on_team" => VisibilityPolicyDisallowedReason::UserNotOnTeam,
21926                    "user_account_type" => VisibilityPolicyDisallowedReason::UserAccountType,
21927                    "permission_denied" => VisibilityPolicyDisallowedReason::PermissionDenied,
21928                    _ => VisibilityPolicyDisallowedReason::Other,
21929                };
21930                crate::eat_json_fields(&mut map)?;
21931                Ok(value)
21932            }
21933        }
21934        const VARIANTS: &[&str] = &["delete_and_recreate",
21935                                    "restricted_by_shared_folder",
21936                                    "restricted_by_team",
21937                                    "user_not_on_team",
21938                                    "user_account_type",
21939                                    "permission_denied",
21940                                    "other"];
21941        deserializer.deserialize_struct("VisibilityPolicyDisallowedReason", VARIANTS, EnumVisitor)
21942    }
21943}
21944
21945impl ::serde::ser::Serialize for VisibilityPolicyDisallowedReason {
21946    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
21947        // union serializer
21948        use serde::ser::SerializeStruct;
21949        match self {
21950            VisibilityPolicyDisallowedReason::DeleteAndRecreate => {
21951                // unit
21952                let mut s = serializer.serialize_struct("VisibilityPolicyDisallowedReason", 1)?;
21953                s.serialize_field(".tag", "delete_and_recreate")?;
21954                s.end()
21955            }
21956            VisibilityPolicyDisallowedReason::RestrictedBySharedFolder => {
21957                // unit
21958                let mut s = serializer.serialize_struct("VisibilityPolicyDisallowedReason", 1)?;
21959                s.serialize_field(".tag", "restricted_by_shared_folder")?;
21960                s.end()
21961            }
21962            VisibilityPolicyDisallowedReason::RestrictedByTeam => {
21963                // unit
21964                let mut s = serializer.serialize_struct("VisibilityPolicyDisallowedReason", 1)?;
21965                s.serialize_field(".tag", "restricted_by_team")?;
21966                s.end()
21967            }
21968            VisibilityPolicyDisallowedReason::UserNotOnTeam => {
21969                // unit
21970                let mut s = serializer.serialize_struct("VisibilityPolicyDisallowedReason", 1)?;
21971                s.serialize_field(".tag", "user_not_on_team")?;
21972                s.end()
21973            }
21974            VisibilityPolicyDisallowedReason::UserAccountType => {
21975                // unit
21976                let mut s = serializer.serialize_struct("VisibilityPolicyDisallowedReason", 1)?;
21977                s.serialize_field(".tag", "user_account_type")?;
21978                s.end()
21979            }
21980            VisibilityPolicyDisallowedReason::PermissionDenied => {
21981                // unit
21982                let mut s = serializer.serialize_struct("VisibilityPolicyDisallowedReason", 1)?;
21983                s.serialize_field(".tag", "permission_denied")?;
21984                s.end()
21985            }
21986            VisibilityPolicyDisallowedReason::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
21987        }
21988    }
21989}
21990