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    /// Invalid shared folder error will be returned as an access_error.
805    InvalidSharedFolder,
806    /// Catch-all used for unrecognized values returned from the server. Encountering this value
807    /// typically indicates that this SDK version is out of date.
808    Other,
809}
810
811impl<'de> ::serde::de::Deserialize<'de> for AddFolderMemberError {
812    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
813        // union deserializer
814        use serde::de::{self, MapAccess, Visitor};
815        struct EnumVisitor;
816        impl<'de> Visitor<'de> for EnumVisitor {
817            type Value = AddFolderMemberError;
818            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
819                f.write_str("a AddFolderMemberError structure")
820            }
821            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
822                let tag: &str = match map.next_key()? {
823                    Some(".tag") => map.next_value()?,
824                    _ => return Err(de::Error::missing_field(".tag"))
825                };
826                let value = match tag {
827                    "access_error" => {
828                        match map.next_key()? {
829                            Some("access_error") => AddFolderMemberError::AccessError(map.next_value()?),
830                            None => return Err(de::Error::missing_field("access_error")),
831                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
832                        }
833                    }
834                    "email_unverified" => AddFolderMemberError::EmailUnverified,
835                    "banned_member" => AddFolderMemberError::BannedMember,
836                    "bad_member" => {
837                        match map.next_key()? {
838                            Some("bad_member") => AddFolderMemberError::BadMember(map.next_value()?),
839                            None => return Err(de::Error::missing_field("bad_member")),
840                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
841                        }
842                    }
843                    "cant_share_outside_team" => AddFolderMemberError::CantShareOutsideTeam,
844                    "too_many_members" => {
845                        match map.next_key()? {
846                            Some("too_many_members") => AddFolderMemberError::TooManyMembers(map.next_value()?),
847                            None => return Err(de::Error::missing_field("too_many_members")),
848                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
849                        }
850                    }
851                    "too_many_pending_invites" => {
852                        match map.next_key()? {
853                            Some("too_many_pending_invites") => AddFolderMemberError::TooManyPendingInvites(map.next_value()?),
854                            None => return Err(de::Error::missing_field("too_many_pending_invites")),
855                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
856                        }
857                    }
858                    "rate_limit" => AddFolderMemberError::RateLimit,
859                    "too_many_invitees" => AddFolderMemberError::TooManyInvitees,
860                    "insufficient_plan" => AddFolderMemberError::InsufficientPlan,
861                    "team_folder" => AddFolderMemberError::TeamFolder,
862                    "no_permission" => AddFolderMemberError::NoPermission,
863                    "invalid_shared_folder" => AddFolderMemberError::InvalidSharedFolder,
864                    _ => AddFolderMemberError::Other,
865                };
866                crate::eat_json_fields(&mut map)?;
867                Ok(value)
868            }
869        }
870        const VARIANTS: &[&str] = &["access_error",
871                                    "email_unverified",
872                                    "banned_member",
873                                    "bad_member",
874                                    "cant_share_outside_team",
875                                    "too_many_members",
876                                    "too_many_pending_invites",
877                                    "rate_limit",
878                                    "too_many_invitees",
879                                    "insufficient_plan",
880                                    "team_folder",
881                                    "no_permission",
882                                    "invalid_shared_folder",
883                                    "other"];
884        deserializer.deserialize_struct("AddFolderMemberError", VARIANTS, EnumVisitor)
885    }
886}
887
888impl ::serde::ser::Serialize for AddFolderMemberError {
889    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
890        // union serializer
891        use serde::ser::SerializeStruct;
892        match self {
893            AddFolderMemberError::AccessError(x) => {
894                // union or polymporphic struct
895                let mut s = serializer.serialize_struct("AddFolderMemberError", 2)?;
896                s.serialize_field(".tag", "access_error")?;
897                s.serialize_field("access_error", x)?;
898                s.end()
899            }
900            AddFolderMemberError::EmailUnverified => {
901                // unit
902                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
903                s.serialize_field(".tag", "email_unverified")?;
904                s.end()
905            }
906            AddFolderMemberError::BannedMember => {
907                // unit
908                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
909                s.serialize_field(".tag", "banned_member")?;
910                s.end()
911            }
912            AddFolderMemberError::BadMember(x) => {
913                // union or polymporphic struct
914                let mut s = serializer.serialize_struct("AddFolderMemberError", 2)?;
915                s.serialize_field(".tag", "bad_member")?;
916                s.serialize_field("bad_member", x)?;
917                s.end()
918            }
919            AddFolderMemberError::CantShareOutsideTeam => {
920                // unit
921                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
922                s.serialize_field(".tag", "cant_share_outside_team")?;
923                s.end()
924            }
925            AddFolderMemberError::TooManyMembers(x) => {
926                // primitive
927                let mut s = serializer.serialize_struct("AddFolderMemberError", 2)?;
928                s.serialize_field(".tag", "too_many_members")?;
929                s.serialize_field("too_many_members", x)?;
930                s.end()
931            }
932            AddFolderMemberError::TooManyPendingInvites(x) => {
933                // primitive
934                let mut s = serializer.serialize_struct("AddFolderMemberError", 2)?;
935                s.serialize_field(".tag", "too_many_pending_invites")?;
936                s.serialize_field("too_many_pending_invites", x)?;
937                s.end()
938            }
939            AddFolderMemberError::RateLimit => {
940                // unit
941                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
942                s.serialize_field(".tag", "rate_limit")?;
943                s.end()
944            }
945            AddFolderMemberError::TooManyInvitees => {
946                // unit
947                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
948                s.serialize_field(".tag", "too_many_invitees")?;
949                s.end()
950            }
951            AddFolderMemberError::InsufficientPlan => {
952                // unit
953                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
954                s.serialize_field(".tag", "insufficient_plan")?;
955                s.end()
956            }
957            AddFolderMemberError::TeamFolder => {
958                // unit
959                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
960                s.serialize_field(".tag", "team_folder")?;
961                s.end()
962            }
963            AddFolderMemberError::NoPermission => {
964                // unit
965                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
966                s.serialize_field(".tag", "no_permission")?;
967                s.end()
968            }
969            AddFolderMemberError::InvalidSharedFolder => {
970                // unit
971                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
972                s.serialize_field(".tag", "invalid_shared_folder")?;
973                s.end()
974            }
975            AddFolderMemberError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
976        }
977    }
978}
979
980impl ::std::error::Error for AddFolderMemberError {
981    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
982        match self {
983            AddFolderMemberError::AccessError(inner) => Some(inner),
984            AddFolderMemberError::BadMember(inner) => Some(inner),
985            _ => None,
986        }
987    }
988}
989
990impl ::std::fmt::Display for AddFolderMemberError {
991    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
992        match self {
993            AddFolderMemberError::AccessError(inner) => write!(f, "Unable to access shared folder: {}", inner),
994            AddFolderMemberError::BannedMember => f.write_str("The current user has been banned."),
995            AddFolderMemberError::BadMember(inner) => write!(f, "AddFolderMemberError: {}", inner),
996            AddFolderMemberError::CantShareOutsideTeam => f.write_str("Your team policy does not allow sharing outside of the team."),
997            AddFolderMemberError::TooManyMembers(inner) => write!(f, "The value is the member limit that was reached: {:?}", inner),
998            AddFolderMemberError::TooManyPendingInvites(inner) => write!(f, "The value is the pending invite limit that was reached: {:?}", inner),
999            AddFolderMemberError::RateLimit => f.write_str("The current user has hit the limit of invites they can send per day. Try again in 24 hours."),
1000            AddFolderMemberError::TooManyInvitees => f.write_str("The current user is trying to share with too many people at once."),
1001            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."),
1002            AddFolderMemberError::TeamFolder => f.write_str("This action cannot be performed on a team shared folder."),
1003            AddFolderMemberError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
1004            AddFolderMemberError::InvalidSharedFolder => f.write_str("Invalid shared folder error will be returned as an access_error."),
1005            _ => write!(f, "{:?}", *self),
1006        }
1007    }
1008}
1009
1010/// The member and type of access the member should have when added to a shared folder.
1011#[derive(Debug, Clone, PartialEq, Eq)]
1012#[non_exhaustive] // structs may have more fields added in the future.
1013pub struct AddMember {
1014    /// The member to add to the shared folder.
1015    pub member: MemberSelector,
1016    /// The access level to grant `member` to the shared folder.  [`AccessLevel::Owner`] is
1017    /// disallowed.
1018    pub access_level: Option<AccessLevel>,
1019}
1020
1021impl AddMember {
1022    pub fn new(member: MemberSelector) -> Self {
1023        AddMember {
1024            member,
1025            access_level: None,
1026        }
1027    }
1028
1029    pub fn with_access_level(mut self, value: AccessLevel) -> Self {
1030        self.access_level = Some(value);
1031        self
1032    }
1033}
1034
1035const ADD_MEMBER_FIELDS: &[&str] = &["member",
1036                                     "access_level"];
1037impl AddMember {
1038    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
1039        map: V,
1040    ) -> Result<AddMember, V::Error> {
1041        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
1042    }
1043
1044    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
1045        mut map: V,
1046        optional: bool,
1047    ) -> Result<Option<AddMember>, V::Error> {
1048        let mut field_member = None;
1049        let mut field_access_level = None;
1050        let mut nothing = true;
1051        while let Some(key) = map.next_key::<&str>()? {
1052            nothing = false;
1053            match key {
1054                "member" => {
1055                    if field_member.is_some() {
1056                        return Err(::serde::de::Error::duplicate_field("member"));
1057                    }
1058                    field_member = Some(map.next_value()?);
1059                }
1060                "access_level" => {
1061                    if field_access_level.is_some() {
1062                        return Err(::serde::de::Error::duplicate_field("access_level"));
1063                    }
1064                    field_access_level = Some(map.next_value()?);
1065                }
1066                _ => {
1067                    // unknown field allowed and ignored
1068                    map.next_value::<::serde_json::Value>()?;
1069                }
1070            }
1071        }
1072        if optional && nothing {
1073            return Ok(None);
1074        }
1075        let result = AddMember {
1076            member: field_member.ok_or_else(|| ::serde::de::Error::missing_field("member"))?,
1077            access_level: field_access_level.and_then(Option::flatten),
1078        };
1079        Ok(Some(result))
1080    }
1081
1082    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
1083        &self,
1084        s: &mut S::SerializeStruct,
1085    ) -> Result<(), S::Error> {
1086        use serde::ser::SerializeStruct;
1087        s.serialize_field("member", &self.member)?;
1088        if let Some(val) = &self.access_level {
1089            s.serialize_field("access_level", val)?;
1090        }
1091        Ok(())
1092    }
1093}
1094
1095impl<'de> ::serde::de::Deserialize<'de> for AddMember {
1096    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1097        // struct deserializer
1098        use serde::de::{MapAccess, Visitor};
1099        struct StructVisitor;
1100        impl<'de> Visitor<'de> for StructVisitor {
1101            type Value = AddMember;
1102            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1103                f.write_str("a AddMember struct")
1104            }
1105            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
1106                AddMember::internal_deserialize(map)
1107            }
1108        }
1109        deserializer.deserialize_struct("AddMember", ADD_MEMBER_FIELDS, StructVisitor)
1110    }
1111}
1112
1113impl ::serde::ser::Serialize for AddMember {
1114    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1115        // struct serializer
1116        use serde::ser::SerializeStruct;
1117        let mut s = serializer.serialize_struct("AddMember", 2)?;
1118        self.internal_serialize::<S>(&mut s)?;
1119        s.end()
1120    }
1121}
1122
1123#[derive(Debug, Clone, PartialEq, Eq)]
1124#[non_exhaustive] // variants may be added in the future
1125pub enum AddMemberSelectorError {
1126    /// Automatically created groups can only be added to team folders.
1127    AutomaticGroup,
1128    /// The value is the ID that could not be identified.
1129    InvalidDropboxId(DropboxId),
1130    /// The value is the e-email address that is malformed.
1131    InvalidEmail(crate::types::common::EmailAddress),
1132    /// Provided group is invalid.
1133    InvalidGroup,
1134    /// The value is the ID of the Dropbox user with an unverified email address. Invite unverified
1135    /// users by email address instead of by their Dropbox ID.
1136    UnverifiedDropboxId(DropboxId),
1137    /// At least one of the specified groups in [`AddFolderMemberArg::members`](AddFolderMemberArg)
1138    /// is deleted.
1139    GroupDeleted,
1140    /// Sharing to a group that is not on the current user's team.
1141    GroupNotOnTeam,
1142    /// Catch-all used for unrecognized values returned from the server. Encountering this value
1143    /// typically indicates that this SDK version is out of date.
1144    Other,
1145}
1146
1147impl<'de> ::serde::de::Deserialize<'de> for AddMemberSelectorError {
1148    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1149        // union deserializer
1150        use serde::de::{self, MapAccess, Visitor};
1151        struct EnumVisitor;
1152        impl<'de> Visitor<'de> for EnumVisitor {
1153            type Value = AddMemberSelectorError;
1154            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1155                f.write_str("a AddMemberSelectorError structure")
1156            }
1157            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
1158                let tag: &str = match map.next_key()? {
1159                    Some(".tag") => map.next_value()?,
1160                    _ => return Err(de::Error::missing_field(".tag"))
1161                };
1162                let value = match tag {
1163                    "automatic_group" => AddMemberSelectorError::AutomaticGroup,
1164                    "invalid_dropbox_id" => {
1165                        match map.next_key()? {
1166                            Some("invalid_dropbox_id") => AddMemberSelectorError::InvalidDropboxId(map.next_value()?),
1167                            None => return Err(de::Error::missing_field("invalid_dropbox_id")),
1168                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
1169                        }
1170                    }
1171                    "invalid_email" => {
1172                        match map.next_key()? {
1173                            Some("invalid_email") => AddMemberSelectorError::InvalidEmail(map.next_value()?),
1174                            None => return Err(de::Error::missing_field("invalid_email")),
1175                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
1176                        }
1177                    }
1178                    "invalid_group" => AddMemberSelectorError::InvalidGroup,
1179                    "unverified_dropbox_id" => {
1180                        match map.next_key()? {
1181                            Some("unverified_dropbox_id") => AddMemberSelectorError::UnverifiedDropboxId(map.next_value()?),
1182                            None => return Err(de::Error::missing_field("unverified_dropbox_id")),
1183                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
1184                        }
1185                    }
1186                    "group_deleted" => AddMemberSelectorError::GroupDeleted,
1187                    "group_not_on_team" => AddMemberSelectorError::GroupNotOnTeam,
1188                    _ => AddMemberSelectorError::Other,
1189                };
1190                crate::eat_json_fields(&mut map)?;
1191                Ok(value)
1192            }
1193        }
1194        const VARIANTS: &[&str] = &["automatic_group",
1195                                    "invalid_dropbox_id",
1196                                    "invalid_email",
1197                                    "invalid_group",
1198                                    "unverified_dropbox_id",
1199                                    "group_deleted",
1200                                    "group_not_on_team",
1201                                    "other"];
1202        deserializer.deserialize_struct("AddMemberSelectorError", VARIANTS, EnumVisitor)
1203    }
1204}
1205
1206impl ::serde::ser::Serialize for AddMemberSelectorError {
1207    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1208        // union serializer
1209        use serde::ser::SerializeStruct;
1210        match self {
1211            AddMemberSelectorError::AutomaticGroup => {
1212                // unit
1213                let mut s = serializer.serialize_struct("AddMemberSelectorError", 1)?;
1214                s.serialize_field(".tag", "automatic_group")?;
1215                s.end()
1216            }
1217            AddMemberSelectorError::InvalidDropboxId(x) => {
1218                // primitive
1219                let mut s = serializer.serialize_struct("AddMemberSelectorError", 2)?;
1220                s.serialize_field(".tag", "invalid_dropbox_id")?;
1221                s.serialize_field("invalid_dropbox_id", x)?;
1222                s.end()
1223            }
1224            AddMemberSelectorError::InvalidEmail(x) => {
1225                // primitive
1226                let mut s = serializer.serialize_struct("AddMemberSelectorError", 2)?;
1227                s.serialize_field(".tag", "invalid_email")?;
1228                s.serialize_field("invalid_email", x)?;
1229                s.end()
1230            }
1231            AddMemberSelectorError::InvalidGroup => {
1232                // unit
1233                let mut s = serializer.serialize_struct("AddMemberSelectorError", 1)?;
1234                s.serialize_field(".tag", "invalid_group")?;
1235                s.end()
1236            }
1237            AddMemberSelectorError::UnverifiedDropboxId(x) => {
1238                // primitive
1239                let mut s = serializer.serialize_struct("AddMemberSelectorError", 2)?;
1240                s.serialize_field(".tag", "unverified_dropbox_id")?;
1241                s.serialize_field("unverified_dropbox_id", x)?;
1242                s.end()
1243            }
1244            AddMemberSelectorError::GroupDeleted => {
1245                // unit
1246                let mut s = serializer.serialize_struct("AddMemberSelectorError", 1)?;
1247                s.serialize_field(".tag", "group_deleted")?;
1248                s.end()
1249            }
1250            AddMemberSelectorError::GroupNotOnTeam => {
1251                // unit
1252                let mut s = serializer.serialize_struct("AddMemberSelectorError", 1)?;
1253                s.serialize_field(".tag", "group_not_on_team")?;
1254                s.end()
1255            }
1256            AddMemberSelectorError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
1257        }
1258    }
1259}
1260
1261impl ::std::error::Error for AddMemberSelectorError {
1262}
1263
1264impl ::std::fmt::Display for AddMemberSelectorError {
1265    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1266        match self {
1267            AddMemberSelectorError::AutomaticGroup => f.write_str("Automatically created groups can only be added to team folders."),
1268            AddMemberSelectorError::InvalidDropboxId(inner) => write!(f, "The value is the ID that could not be identified: {:?}", inner),
1269            AddMemberSelectorError::InvalidEmail(inner) => write!(f, "The value is the e-email address that is malformed: {:?}", inner),
1270            AddMemberSelectorError::InvalidGroup => f.write_str("Provided group is invalid."),
1271            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),
1272            AddMemberSelectorError::GroupNotOnTeam => f.write_str("Sharing to a group that is not on the current user's team."),
1273            _ => write!(f, "{:?}", *self),
1274        }
1275    }
1276}
1277
1278/// check documentation for ResolvedVisibility.
1279#[derive(Debug, Clone, PartialEq, Eq)]
1280#[non_exhaustive] // variants may be added in the future
1281pub enum AlphaResolvedVisibility {
1282    /// Anyone who has received the link can access it. No login required.
1283    Public,
1284    /// Only members of the same team can access the link. Login is required.
1285    TeamOnly,
1286    /// A link-specific password is required to access the link. Login is not required.
1287    Password,
1288    /// Only members of the same team who have the link-specific password can access the link. Login
1289    /// is required.
1290    TeamAndPassword,
1291    /// Only members of the shared folder containing the linked file can access the link. Login is
1292    /// required.
1293    SharedFolderOnly,
1294    /// The link merely points the user to the content, and does not grant any additional rights.
1295    /// Existing members of the content who use this link can only access the content with their
1296    /// pre-existing access rights. Either on the file directly, or inherited from a parent folder.
1297    NoOne,
1298    /// Only the current user can view this link.
1299    OnlyYou,
1300    /// Catch-all used for unrecognized values returned from the server. Encountering this value
1301    /// typically indicates that this SDK version is out of date.
1302    Other,
1303}
1304
1305impl<'de> ::serde::de::Deserialize<'de> for AlphaResolvedVisibility {
1306    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1307        // union deserializer
1308        use serde::de::{self, MapAccess, Visitor};
1309        struct EnumVisitor;
1310        impl<'de> Visitor<'de> for EnumVisitor {
1311            type Value = AlphaResolvedVisibility;
1312            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1313                f.write_str("a AlphaResolvedVisibility structure")
1314            }
1315            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
1316                let tag: &str = match map.next_key()? {
1317                    Some(".tag") => map.next_value()?,
1318                    _ => return Err(de::Error::missing_field(".tag"))
1319                };
1320                let value = match tag {
1321                    "public" => AlphaResolvedVisibility::Public,
1322                    "team_only" => AlphaResolvedVisibility::TeamOnly,
1323                    "password" => AlphaResolvedVisibility::Password,
1324                    "team_and_password" => AlphaResolvedVisibility::TeamAndPassword,
1325                    "shared_folder_only" => AlphaResolvedVisibility::SharedFolderOnly,
1326                    "no_one" => AlphaResolvedVisibility::NoOne,
1327                    "only_you" => AlphaResolvedVisibility::OnlyYou,
1328                    _ => AlphaResolvedVisibility::Other,
1329                };
1330                crate::eat_json_fields(&mut map)?;
1331                Ok(value)
1332            }
1333        }
1334        const VARIANTS: &[&str] = &["public",
1335                                    "team_only",
1336                                    "password",
1337                                    "team_and_password",
1338                                    "shared_folder_only",
1339                                    "no_one",
1340                                    "only_you",
1341                                    "other"];
1342        deserializer.deserialize_struct("AlphaResolvedVisibility", VARIANTS, EnumVisitor)
1343    }
1344}
1345
1346impl ::serde::ser::Serialize for AlphaResolvedVisibility {
1347    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1348        // union serializer
1349        use serde::ser::SerializeStruct;
1350        match self {
1351            AlphaResolvedVisibility::Public => {
1352                // unit
1353                let mut s = serializer.serialize_struct("AlphaResolvedVisibility", 1)?;
1354                s.serialize_field(".tag", "public")?;
1355                s.end()
1356            }
1357            AlphaResolvedVisibility::TeamOnly => {
1358                // unit
1359                let mut s = serializer.serialize_struct("AlphaResolvedVisibility", 1)?;
1360                s.serialize_field(".tag", "team_only")?;
1361                s.end()
1362            }
1363            AlphaResolvedVisibility::Password => {
1364                // unit
1365                let mut s = serializer.serialize_struct("AlphaResolvedVisibility", 1)?;
1366                s.serialize_field(".tag", "password")?;
1367                s.end()
1368            }
1369            AlphaResolvedVisibility::TeamAndPassword => {
1370                // unit
1371                let mut s = serializer.serialize_struct("AlphaResolvedVisibility", 1)?;
1372                s.serialize_field(".tag", "team_and_password")?;
1373                s.end()
1374            }
1375            AlphaResolvedVisibility::SharedFolderOnly => {
1376                // unit
1377                let mut s = serializer.serialize_struct("AlphaResolvedVisibility", 1)?;
1378                s.serialize_field(".tag", "shared_folder_only")?;
1379                s.end()
1380            }
1381            AlphaResolvedVisibility::NoOne => {
1382                // unit
1383                let mut s = serializer.serialize_struct("AlphaResolvedVisibility", 1)?;
1384                s.serialize_field(".tag", "no_one")?;
1385                s.end()
1386            }
1387            AlphaResolvedVisibility::OnlyYou => {
1388                // unit
1389                let mut s = serializer.serialize_struct("AlphaResolvedVisibility", 1)?;
1390                s.serialize_field(".tag", "only_you")?;
1391                s.end()
1392            }
1393            AlphaResolvedVisibility::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
1394        }
1395    }
1396}
1397
1398// union extends ResolvedVisibility
1399impl From<ResolvedVisibility> for AlphaResolvedVisibility {
1400    fn from(parent: ResolvedVisibility) -> Self {
1401        match parent {
1402            ResolvedVisibility::Public => AlphaResolvedVisibility::Public,
1403            ResolvedVisibility::TeamOnly => AlphaResolvedVisibility::TeamOnly,
1404            ResolvedVisibility::Password => AlphaResolvedVisibility::Password,
1405            ResolvedVisibility::TeamAndPassword => AlphaResolvedVisibility::TeamAndPassword,
1406            ResolvedVisibility::SharedFolderOnly => AlphaResolvedVisibility::SharedFolderOnly,
1407            ResolvedVisibility::NoOne => AlphaResolvedVisibility::NoOne,
1408            ResolvedVisibility::OnlyYou => AlphaResolvedVisibility::OnlyYou,
1409            ResolvedVisibility::Other => AlphaResolvedVisibility::Other,
1410        }
1411    }
1412}
1413/// Information about the content that has a link audience different than that of this folder.
1414#[derive(Debug, Clone, PartialEq, Eq)]
1415#[non_exhaustive] // structs may have more fields added in the future.
1416pub struct AudienceExceptionContentInfo {
1417    /// The name of the content, which is either a file or a folder.
1418    pub name: String,
1419}
1420
1421impl AudienceExceptionContentInfo {
1422    pub fn new(name: String) -> Self {
1423        AudienceExceptionContentInfo {
1424            name,
1425        }
1426    }
1427}
1428
1429const AUDIENCE_EXCEPTION_CONTENT_INFO_FIELDS: &[&str] = &["name"];
1430impl AudienceExceptionContentInfo {
1431    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
1432        map: V,
1433    ) -> Result<AudienceExceptionContentInfo, V::Error> {
1434        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
1435    }
1436
1437    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
1438        mut map: V,
1439        optional: bool,
1440    ) -> Result<Option<AudienceExceptionContentInfo>, V::Error> {
1441        let mut field_name = None;
1442        let mut nothing = true;
1443        while let Some(key) = map.next_key::<&str>()? {
1444            nothing = false;
1445            match key {
1446                "name" => {
1447                    if field_name.is_some() {
1448                        return Err(::serde::de::Error::duplicate_field("name"));
1449                    }
1450                    field_name = Some(map.next_value()?);
1451                }
1452                _ => {
1453                    // unknown field allowed and ignored
1454                    map.next_value::<::serde_json::Value>()?;
1455                }
1456            }
1457        }
1458        if optional && nothing {
1459            return Ok(None);
1460        }
1461        let result = AudienceExceptionContentInfo {
1462            name: field_name.ok_or_else(|| ::serde::de::Error::missing_field("name"))?,
1463        };
1464        Ok(Some(result))
1465    }
1466
1467    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
1468        &self,
1469        s: &mut S::SerializeStruct,
1470    ) -> Result<(), S::Error> {
1471        use serde::ser::SerializeStruct;
1472        s.serialize_field("name", &self.name)?;
1473        Ok(())
1474    }
1475}
1476
1477impl<'de> ::serde::de::Deserialize<'de> for AudienceExceptionContentInfo {
1478    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1479        // struct deserializer
1480        use serde::de::{MapAccess, Visitor};
1481        struct StructVisitor;
1482        impl<'de> Visitor<'de> for StructVisitor {
1483            type Value = AudienceExceptionContentInfo;
1484            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1485                f.write_str("a AudienceExceptionContentInfo struct")
1486            }
1487            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
1488                AudienceExceptionContentInfo::internal_deserialize(map)
1489            }
1490        }
1491        deserializer.deserialize_struct("AudienceExceptionContentInfo", AUDIENCE_EXCEPTION_CONTENT_INFO_FIELDS, StructVisitor)
1492    }
1493}
1494
1495impl ::serde::ser::Serialize for AudienceExceptionContentInfo {
1496    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1497        // struct serializer
1498        use serde::ser::SerializeStruct;
1499        let mut s = serializer.serialize_struct("AudienceExceptionContentInfo", 1)?;
1500        self.internal_serialize::<S>(&mut s)?;
1501        s.end()
1502    }
1503}
1504
1505/// The total count and truncated list of information of content inside this folder that has a
1506/// different audience than the link on this folder. This is only returned for folders.
1507#[derive(Debug, Clone, PartialEq, Eq)]
1508#[non_exhaustive] // structs may have more fields added in the future.
1509pub struct AudienceExceptions {
1510    pub count: u32,
1511    /// A truncated list of some of the content that is an exception. The length of this list could
1512    /// be smaller than the count since it is only a sample but will not be empty as long as count
1513    /// is not 0.
1514    pub exceptions: Vec<AudienceExceptionContentInfo>,
1515}
1516
1517impl AudienceExceptions {
1518    pub fn new(count: u32, exceptions: Vec<AudienceExceptionContentInfo>) -> Self {
1519        AudienceExceptions {
1520            count,
1521            exceptions,
1522        }
1523    }
1524}
1525
1526const AUDIENCE_EXCEPTIONS_FIELDS: &[&str] = &["count",
1527                                              "exceptions"];
1528impl AudienceExceptions {
1529    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
1530        map: V,
1531    ) -> Result<AudienceExceptions, V::Error> {
1532        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
1533    }
1534
1535    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
1536        mut map: V,
1537        optional: bool,
1538    ) -> Result<Option<AudienceExceptions>, V::Error> {
1539        let mut field_count = None;
1540        let mut field_exceptions = None;
1541        let mut nothing = true;
1542        while let Some(key) = map.next_key::<&str>()? {
1543            nothing = false;
1544            match key {
1545                "count" => {
1546                    if field_count.is_some() {
1547                        return Err(::serde::de::Error::duplicate_field("count"));
1548                    }
1549                    field_count = Some(map.next_value()?);
1550                }
1551                "exceptions" => {
1552                    if field_exceptions.is_some() {
1553                        return Err(::serde::de::Error::duplicate_field("exceptions"));
1554                    }
1555                    field_exceptions = Some(map.next_value()?);
1556                }
1557                _ => {
1558                    // unknown field allowed and ignored
1559                    map.next_value::<::serde_json::Value>()?;
1560                }
1561            }
1562        }
1563        if optional && nothing {
1564            return Ok(None);
1565        }
1566        let result = AudienceExceptions {
1567            count: field_count.ok_or_else(|| ::serde::de::Error::missing_field("count"))?,
1568            exceptions: field_exceptions.ok_or_else(|| ::serde::de::Error::missing_field("exceptions"))?,
1569        };
1570        Ok(Some(result))
1571    }
1572
1573    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
1574        &self,
1575        s: &mut S::SerializeStruct,
1576    ) -> Result<(), S::Error> {
1577        use serde::ser::SerializeStruct;
1578        s.serialize_field("count", &self.count)?;
1579        s.serialize_field("exceptions", &self.exceptions)?;
1580        Ok(())
1581    }
1582}
1583
1584impl<'de> ::serde::de::Deserialize<'de> for AudienceExceptions {
1585    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1586        // struct deserializer
1587        use serde::de::{MapAccess, Visitor};
1588        struct StructVisitor;
1589        impl<'de> Visitor<'de> for StructVisitor {
1590            type Value = AudienceExceptions;
1591            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1592                f.write_str("a AudienceExceptions struct")
1593            }
1594            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
1595                AudienceExceptions::internal_deserialize(map)
1596            }
1597        }
1598        deserializer.deserialize_struct("AudienceExceptions", AUDIENCE_EXCEPTIONS_FIELDS, StructVisitor)
1599    }
1600}
1601
1602impl ::serde::ser::Serialize for AudienceExceptions {
1603    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1604        // struct serializer
1605        use serde::ser::SerializeStruct;
1606        let mut s = serializer.serialize_struct("AudienceExceptions", 2)?;
1607        self.internal_serialize::<S>(&mut s)?;
1608        s.end()
1609    }
1610}
1611
1612/// Information about the shared folder that prevents the link audience for this link from being
1613/// more restrictive.
1614#[derive(Debug, Clone, PartialEq, Eq)]
1615#[non_exhaustive] // structs may have more fields added in the future.
1616pub struct AudienceRestrictingSharedFolder {
1617    /// The ID of the shared folder.
1618    pub shared_folder_id: crate::types::common::SharedFolderId,
1619    /// The name of the shared folder.
1620    pub name: String,
1621    /// The link audience of the shared folder.
1622    pub audience: LinkAudience,
1623}
1624
1625impl AudienceRestrictingSharedFolder {
1626    pub fn new(
1627        shared_folder_id: crate::types::common::SharedFolderId,
1628        name: String,
1629        audience: LinkAudience,
1630    ) -> Self {
1631        AudienceRestrictingSharedFolder {
1632            shared_folder_id,
1633            name,
1634            audience,
1635        }
1636    }
1637}
1638
1639const AUDIENCE_RESTRICTING_SHARED_FOLDER_FIELDS: &[&str] = &["shared_folder_id",
1640                                                             "name",
1641                                                             "audience"];
1642impl AudienceRestrictingSharedFolder {
1643    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
1644        map: V,
1645    ) -> Result<AudienceRestrictingSharedFolder, V::Error> {
1646        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
1647    }
1648
1649    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
1650        mut map: V,
1651        optional: bool,
1652    ) -> Result<Option<AudienceRestrictingSharedFolder>, V::Error> {
1653        let mut field_shared_folder_id = None;
1654        let mut field_name = None;
1655        let mut field_audience = None;
1656        let mut nothing = true;
1657        while let Some(key) = map.next_key::<&str>()? {
1658            nothing = false;
1659            match key {
1660                "shared_folder_id" => {
1661                    if field_shared_folder_id.is_some() {
1662                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
1663                    }
1664                    field_shared_folder_id = Some(map.next_value()?);
1665                }
1666                "name" => {
1667                    if field_name.is_some() {
1668                        return Err(::serde::de::Error::duplicate_field("name"));
1669                    }
1670                    field_name = Some(map.next_value()?);
1671                }
1672                "audience" => {
1673                    if field_audience.is_some() {
1674                        return Err(::serde::de::Error::duplicate_field("audience"));
1675                    }
1676                    field_audience = Some(map.next_value()?);
1677                }
1678                _ => {
1679                    // unknown field allowed and ignored
1680                    map.next_value::<::serde_json::Value>()?;
1681                }
1682            }
1683        }
1684        if optional && nothing {
1685            return Ok(None);
1686        }
1687        let result = AudienceRestrictingSharedFolder {
1688            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
1689            name: field_name.ok_or_else(|| ::serde::de::Error::missing_field("name"))?,
1690            audience: field_audience.ok_or_else(|| ::serde::de::Error::missing_field("audience"))?,
1691        };
1692        Ok(Some(result))
1693    }
1694
1695    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
1696        &self,
1697        s: &mut S::SerializeStruct,
1698    ) -> Result<(), S::Error> {
1699        use serde::ser::SerializeStruct;
1700        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
1701        s.serialize_field("name", &self.name)?;
1702        s.serialize_field("audience", &self.audience)?;
1703        Ok(())
1704    }
1705}
1706
1707impl<'de> ::serde::de::Deserialize<'de> for AudienceRestrictingSharedFolder {
1708    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1709        // struct deserializer
1710        use serde::de::{MapAccess, Visitor};
1711        struct StructVisitor;
1712        impl<'de> Visitor<'de> for StructVisitor {
1713            type Value = AudienceRestrictingSharedFolder;
1714            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1715                f.write_str("a AudienceRestrictingSharedFolder struct")
1716            }
1717            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
1718                AudienceRestrictingSharedFolder::internal_deserialize(map)
1719            }
1720        }
1721        deserializer.deserialize_struct("AudienceRestrictingSharedFolder", AUDIENCE_RESTRICTING_SHARED_FOLDER_FIELDS, StructVisitor)
1722    }
1723}
1724
1725impl ::serde::ser::Serialize for AudienceRestrictingSharedFolder {
1726    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1727        // struct serializer
1728        use serde::ser::SerializeStruct;
1729        let mut s = serializer.serialize_struct("AudienceRestrictingSharedFolder", 3)?;
1730        self.internal_serialize::<S>(&mut s)?;
1731        s.end()
1732    }
1733}
1734
1735/// Enumerates acceptable values for team's ChangeLinkExpirationPolicy setting.
1736#[derive(Debug, Clone, PartialEq, Eq)]
1737#[non_exhaustive] // variants may be added in the future
1738pub enum ChangeLinkExpirationPolicy {
1739    Allowed,
1740    NotAllowed,
1741    /// Catch-all used for unrecognized values returned from the server. Encountering this value
1742    /// typically indicates that this SDK version is out of date.
1743    Other,
1744}
1745
1746impl<'de> ::serde::de::Deserialize<'de> for ChangeLinkExpirationPolicy {
1747    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1748        // union deserializer
1749        use serde::de::{self, MapAccess, Visitor};
1750        struct EnumVisitor;
1751        impl<'de> Visitor<'de> for EnumVisitor {
1752            type Value = ChangeLinkExpirationPolicy;
1753            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1754                f.write_str("a ChangeLinkExpirationPolicy structure")
1755            }
1756            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
1757                let tag: &str = match map.next_key()? {
1758                    Some(".tag") => map.next_value()?,
1759                    _ => return Err(de::Error::missing_field(".tag"))
1760                };
1761                let value = match tag {
1762                    "allowed" => ChangeLinkExpirationPolicy::Allowed,
1763                    "not_allowed" => ChangeLinkExpirationPolicy::NotAllowed,
1764                    _ => ChangeLinkExpirationPolicy::Other,
1765                };
1766                crate::eat_json_fields(&mut map)?;
1767                Ok(value)
1768            }
1769        }
1770        const VARIANTS: &[&str] = &["allowed",
1771                                    "not_allowed",
1772                                    "other"];
1773        deserializer.deserialize_struct("ChangeLinkExpirationPolicy", VARIANTS, EnumVisitor)
1774    }
1775}
1776
1777impl ::serde::ser::Serialize for ChangeLinkExpirationPolicy {
1778    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1779        // union serializer
1780        use serde::ser::SerializeStruct;
1781        match self {
1782            ChangeLinkExpirationPolicy::Allowed => {
1783                // unit
1784                let mut s = serializer.serialize_struct("ChangeLinkExpirationPolicy", 1)?;
1785                s.serialize_field(".tag", "allowed")?;
1786                s.end()
1787            }
1788            ChangeLinkExpirationPolicy::NotAllowed => {
1789                // unit
1790                let mut s = serializer.serialize_struct("ChangeLinkExpirationPolicy", 1)?;
1791                s.serialize_field(".tag", "not_allowed")?;
1792                s.end()
1793            }
1794            ChangeLinkExpirationPolicy::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
1795        }
1796    }
1797}
1798
1799/// Metadata for a collection-based shared link.
1800#[derive(Debug, Clone, PartialEq, Eq)]
1801#[non_exhaustive] // structs may have more fields added in the future.
1802pub struct CollectionLinkMetadata {
1803    /// URL of the shared link.
1804    pub url: String,
1805    /// Who can access the link.
1806    pub visibility: Visibility,
1807    /// Expiration time, if set. By default the link won't expire.
1808    pub expires: Option<crate::types::common::DropboxTimestamp>,
1809}
1810
1811impl CollectionLinkMetadata {
1812    pub fn new(url: String, visibility: Visibility) -> Self {
1813        CollectionLinkMetadata {
1814            url,
1815            visibility,
1816            expires: None,
1817        }
1818    }
1819
1820    pub fn with_expires(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
1821        self.expires = Some(value);
1822        self
1823    }
1824}
1825
1826const COLLECTION_LINK_METADATA_FIELDS: &[&str] = &["url",
1827                                                   "visibility",
1828                                                   "expires"];
1829impl CollectionLinkMetadata {
1830    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
1831        map: V,
1832    ) -> Result<CollectionLinkMetadata, V::Error> {
1833        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
1834    }
1835
1836    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
1837        mut map: V,
1838        optional: bool,
1839    ) -> Result<Option<CollectionLinkMetadata>, V::Error> {
1840        let mut field_url = None;
1841        let mut field_visibility = None;
1842        let mut field_expires = None;
1843        let mut nothing = true;
1844        while let Some(key) = map.next_key::<&str>()? {
1845            nothing = false;
1846            match key {
1847                "url" => {
1848                    if field_url.is_some() {
1849                        return Err(::serde::de::Error::duplicate_field("url"));
1850                    }
1851                    field_url = Some(map.next_value()?);
1852                }
1853                "visibility" => {
1854                    if field_visibility.is_some() {
1855                        return Err(::serde::de::Error::duplicate_field("visibility"));
1856                    }
1857                    field_visibility = Some(map.next_value()?);
1858                }
1859                "expires" => {
1860                    if field_expires.is_some() {
1861                        return Err(::serde::de::Error::duplicate_field("expires"));
1862                    }
1863                    field_expires = Some(map.next_value()?);
1864                }
1865                _ => {
1866                    // unknown field allowed and ignored
1867                    map.next_value::<::serde_json::Value>()?;
1868                }
1869            }
1870        }
1871        if optional && nothing {
1872            return Ok(None);
1873        }
1874        let result = CollectionLinkMetadata {
1875            url: field_url.ok_or_else(|| ::serde::de::Error::missing_field("url"))?,
1876            visibility: field_visibility.ok_or_else(|| ::serde::de::Error::missing_field("visibility"))?,
1877            expires: field_expires.and_then(Option::flatten),
1878        };
1879        Ok(Some(result))
1880    }
1881
1882    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
1883        &self,
1884        s: &mut S::SerializeStruct,
1885    ) -> Result<(), S::Error> {
1886        use serde::ser::SerializeStruct;
1887        s.serialize_field("url", &self.url)?;
1888        s.serialize_field("visibility", &self.visibility)?;
1889        if let Some(val) = &self.expires {
1890            s.serialize_field("expires", val)?;
1891        }
1892        Ok(())
1893    }
1894}
1895
1896impl<'de> ::serde::de::Deserialize<'de> for CollectionLinkMetadata {
1897    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1898        // struct deserializer
1899        use serde::de::{MapAccess, Visitor};
1900        struct StructVisitor;
1901        impl<'de> Visitor<'de> for StructVisitor {
1902            type Value = CollectionLinkMetadata;
1903            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1904                f.write_str("a CollectionLinkMetadata struct")
1905            }
1906            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
1907                CollectionLinkMetadata::internal_deserialize(map)
1908            }
1909        }
1910        deserializer.deserialize_struct("CollectionLinkMetadata", COLLECTION_LINK_METADATA_FIELDS, StructVisitor)
1911    }
1912}
1913
1914impl ::serde::ser::Serialize for CollectionLinkMetadata {
1915    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1916        // struct serializer
1917        use serde::ser::SerializeStruct;
1918        let mut s = serializer.serialize_struct("CollectionLinkMetadata", 3)?;
1919        self.internal_serialize::<S>(&mut s)?;
1920        s.end()
1921    }
1922}
1923
1924// struct extends polymorphic struct LinkMetadata
1925impl From<CollectionLinkMetadata> for LinkMetadata {
1926    fn from(subtype: CollectionLinkMetadata) -> Self {
1927        LinkMetadata::Collection(subtype)
1928    }
1929}
1930#[derive(Debug, Clone, PartialEq, Eq)]
1931#[non_exhaustive] // structs may have more fields added in the future.
1932pub struct CreateSharedLinkArg {
1933    /// The path to share.
1934    pub path: String,
1935    pub short_url: bool,
1936    /// If it's okay to share a path that does not yet exist, set this to either
1937    /// [`PendingUploadMode::File`] or [`PendingUploadMode::Folder`] to indicate whether to assume
1938    /// it's a file or folder.
1939    pub pending_upload: Option<PendingUploadMode>,
1940}
1941
1942impl CreateSharedLinkArg {
1943    pub fn new(path: String) -> Self {
1944        CreateSharedLinkArg {
1945            path,
1946            short_url: false,
1947            pending_upload: None,
1948        }
1949    }
1950
1951    pub fn with_short_url(mut self, value: bool) -> Self {
1952        self.short_url = value;
1953        self
1954    }
1955
1956    pub fn with_pending_upload(mut self, value: PendingUploadMode) -> Self {
1957        self.pending_upload = Some(value);
1958        self
1959    }
1960}
1961
1962const CREATE_SHARED_LINK_ARG_FIELDS: &[&str] = &["path",
1963                                                 "short_url",
1964                                                 "pending_upload"];
1965impl CreateSharedLinkArg {
1966    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
1967        map: V,
1968    ) -> Result<CreateSharedLinkArg, V::Error> {
1969        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
1970    }
1971
1972    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
1973        mut map: V,
1974        optional: bool,
1975    ) -> Result<Option<CreateSharedLinkArg>, V::Error> {
1976        let mut field_path = None;
1977        let mut field_short_url = None;
1978        let mut field_pending_upload = None;
1979        let mut nothing = true;
1980        while let Some(key) = map.next_key::<&str>()? {
1981            nothing = false;
1982            match key {
1983                "path" => {
1984                    if field_path.is_some() {
1985                        return Err(::serde::de::Error::duplicate_field("path"));
1986                    }
1987                    field_path = Some(map.next_value()?);
1988                }
1989                "short_url" => {
1990                    if field_short_url.is_some() {
1991                        return Err(::serde::de::Error::duplicate_field("short_url"));
1992                    }
1993                    field_short_url = Some(map.next_value()?);
1994                }
1995                "pending_upload" => {
1996                    if field_pending_upload.is_some() {
1997                        return Err(::serde::de::Error::duplicate_field("pending_upload"));
1998                    }
1999                    field_pending_upload = Some(map.next_value()?);
2000                }
2001                _ => {
2002                    // unknown field allowed and ignored
2003                    map.next_value::<::serde_json::Value>()?;
2004                }
2005            }
2006        }
2007        if optional && nothing {
2008            return Ok(None);
2009        }
2010        let result = CreateSharedLinkArg {
2011            path: field_path.ok_or_else(|| ::serde::de::Error::missing_field("path"))?,
2012            short_url: field_short_url.unwrap_or(false),
2013            pending_upload: field_pending_upload.and_then(Option::flatten),
2014        };
2015        Ok(Some(result))
2016    }
2017
2018    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
2019        &self,
2020        s: &mut S::SerializeStruct,
2021    ) -> Result<(), S::Error> {
2022        use serde::ser::SerializeStruct;
2023        s.serialize_field("path", &self.path)?;
2024        if self.short_url {
2025            s.serialize_field("short_url", &self.short_url)?;
2026        }
2027        if let Some(val) = &self.pending_upload {
2028            s.serialize_field("pending_upload", val)?;
2029        }
2030        Ok(())
2031    }
2032}
2033
2034impl<'de> ::serde::de::Deserialize<'de> for CreateSharedLinkArg {
2035    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2036        // struct deserializer
2037        use serde::de::{MapAccess, Visitor};
2038        struct StructVisitor;
2039        impl<'de> Visitor<'de> for StructVisitor {
2040            type Value = CreateSharedLinkArg;
2041            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
2042                f.write_str("a CreateSharedLinkArg struct")
2043            }
2044            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
2045                CreateSharedLinkArg::internal_deserialize(map)
2046            }
2047        }
2048        deserializer.deserialize_struct("CreateSharedLinkArg", CREATE_SHARED_LINK_ARG_FIELDS, StructVisitor)
2049    }
2050}
2051
2052impl ::serde::ser::Serialize for CreateSharedLinkArg {
2053    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
2054        // struct serializer
2055        use serde::ser::SerializeStruct;
2056        let mut s = serializer.serialize_struct("CreateSharedLinkArg", 3)?;
2057        self.internal_serialize::<S>(&mut s)?;
2058        s.end()
2059    }
2060}
2061
2062#[derive(Debug, Clone, PartialEq, Eq)]
2063#[non_exhaustive] // variants may be added in the future
2064pub enum CreateSharedLinkError {
2065    Path(crate::types::files::LookupError),
2066    /// Catch-all used for unrecognized values returned from the server. Encountering this value
2067    /// typically indicates that this SDK version is out of date.
2068    Other,
2069}
2070
2071impl<'de> ::serde::de::Deserialize<'de> for CreateSharedLinkError {
2072    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2073        // union deserializer
2074        use serde::de::{self, MapAccess, Visitor};
2075        struct EnumVisitor;
2076        impl<'de> Visitor<'de> for EnumVisitor {
2077            type Value = CreateSharedLinkError;
2078            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
2079                f.write_str("a CreateSharedLinkError structure")
2080            }
2081            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
2082                let tag: &str = match map.next_key()? {
2083                    Some(".tag") => map.next_value()?,
2084                    _ => return Err(de::Error::missing_field(".tag"))
2085                };
2086                let value = match tag {
2087                    "path" => {
2088                        match map.next_key()? {
2089                            Some("path") => CreateSharedLinkError::Path(map.next_value()?),
2090                            None => return Err(de::Error::missing_field("path")),
2091                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
2092                        }
2093                    }
2094                    _ => CreateSharedLinkError::Other,
2095                };
2096                crate::eat_json_fields(&mut map)?;
2097                Ok(value)
2098            }
2099        }
2100        const VARIANTS: &[&str] = &["path",
2101                                    "other"];
2102        deserializer.deserialize_struct("CreateSharedLinkError", VARIANTS, EnumVisitor)
2103    }
2104}
2105
2106impl ::serde::ser::Serialize for CreateSharedLinkError {
2107    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
2108        // union serializer
2109        use serde::ser::SerializeStruct;
2110        match self {
2111            CreateSharedLinkError::Path(x) => {
2112                // union or polymporphic struct
2113                let mut s = serializer.serialize_struct("CreateSharedLinkError", 2)?;
2114                s.serialize_field(".tag", "path")?;
2115                s.serialize_field("path", x)?;
2116                s.end()
2117            }
2118            CreateSharedLinkError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
2119        }
2120    }
2121}
2122
2123impl ::std::error::Error for CreateSharedLinkError {
2124    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
2125        match self {
2126            CreateSharedLinkError::Path(inner) => Some(inner),
2127            _ => None,
2128        }
2129    }
2130}
2131
2132impl ::std::fmt::Display for CreateSharedLinkError {
2133    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
2134        match self {
2135            CreateSharedLinkError::Path(inner) => write!(f, "CreateSharedLinkError: {}", inner),
2136            _ => write!(f, "{:?}", *self),
2137        }
2138    }
2139}
2140
2141#[derive(Debug, Clone, PartialEq, Eq)]
2142#[non_exhaustive] // structs may have more fields added in the future.
2143pub struct CreateSharedLinkWithSettingsArg {
2144    /// The path to be shared by the shared link.
2145    pub path: ReadPath,
2146    /// The requested settings for the newly created shared link.
2147    pub settings: Option<SharedLinkSettings>,
2148}
2149
2150impl CreateSharedLinkWithSettingsArg {
2151    pub fn new(path: ReadPath) -> Self {
2152        CreateSharedLinkWithSettingsArg {
2153            path,
2154            settings: None,
2155        }
2156    }
2157
2158    pub fn with_settings(mut self, value: SharedLinkSettings) -> Self {
2159        self.settings = Some(value);
2160        self
2161    }
2162}
2163
2164const CREATE_SHARED_LINK_WITH_SETTINGS_ARG_FIELDS: &[&str] = &["path",
2165                                                               "settings"];
2166impl CreateSharedLinkWithSettingsArg {
2167    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
2168        map: V,
2169    ) -> Result<CreateSharedLinkWithSettingsArg, V::Error> {
2170        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
2171    }
2172
2173    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
2174        mut map: V,
2175        optional: bool,
2176    ) -> Result<Option<CreateSharedLinkWithSettingsArg>, V::Error> {
2177        let mut field_path = None;
2178        let mut field_settings = None;
2179        let mut nothing = true;
2180        while let Some(key) = map.next_key::<&str>()? {
2181            nothing = false;
2182            match key {
2183                "path" => {
2184                    if field_path.is_some() {
2185                        return Err(::serde::de::Error::duplicate_field("path"));
2186                    }
2187                    field_path = Some(map.next_value()?);
2188                }
2189                "settings" => {
2190                    if field_settings.is_some() {
2191                        return Err(::serde::de::Error::duplicate_field("settings"));
2192                    }
2193                    field_settings = Some(map.next_value()?);
2194                }
2195                _ => {
2196                    // unknown field allowed and ignored
2197                    map.next_value::<::serde_json::Value>()?;
2198                }
2199            }
2200        }
2201        if optional && nothing {
2202            return Ok(None);
2203        }
2204        let result = CreateSharedLinkWithSettingsArg {
2205            path: field_path.ok_or_else(|| ::serde::de::Error::missing_field("path"))?,
2206            settings: field_settings.and_then(Option::flatten),
2207        };
2208        Ok(Some(result))
2209    }
2210
2211    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
2212        &self,
2213        s: &mut S::SerializeStruct,
2214    ) -> Result<(), S::Error> {
2215        use serde::ser::SerializeStruct;
2216        s.serialize_field("path", &self.path)?;
2217        if let Some(val) = &self.settings {
2218            s.serialize_field("settings", val)?;
2219        }
2220        Ok(())
2221    }
2222}
2223
2224impl<'de> ::serde::de::Deserialize<'de> for CreateSharedLinkWithSettingsArg {
2225    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2226        // struct deserializer
2227        use serde::de::{MapAccess, Visitor};
2228        struct StructVisitor;
2229        impl<'de> Visitor<'de> for StructVisitor {
2230            type Value = CreateSharedLinkWithSettingsArg;
2231            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
2232                f.write_str("a CreateSharedLinkWithSettingsArg struct")
2233            }
2234            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
2235                CreateSharedLinkWithSettingsArg::internal_deserialize(map)
2236            }
2237        }
2238        deserializer.deserialize_struct("CreateSharedLinkWithSettingsArg", CREATE_SHARED_LINK_WITH_SETTINGS_ARG_FIELDS, StructVisitor)
2239    }
2240}
2241
2242impl ::serde::ser::Serialize for CreateSharedLinkWithSettingsArg {
2243    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
2244        // struct serializer
2245        use serde::ser::SerializeStruct;
2246        let mut s = serializer.serialize_struct("CreateSharedLinkWithSettingsArg", 2)?;
2247        self.internal_serialize::<S>(&mut s)?;
2248        s.end()
2249    }
2250}
2251
2252#[derive(Debug, Clone, PartialEq, Eq)]
2253pub enum CreateSharedLinkWithSettingsError {
2254    Path(crate::types::files::LookupError),
2255    /// This user's email address is not verified. This functionality is only available on accounts
2256    /// with a verified email address. Users can verify their email address
2257    /// [here](https://www.dropbox.com/help/317).
2258    EmailNotVerified,
2259    /// The shared link already exists. You can call
2260    /// [`list_shared_links()`](crate::sharing::list_shared_links) to get the existing link, or use
2261    /// the provided metadata if it is returned. Existing link metadata will not be returned if
2262    /// custom settings were specified in the request that could make the existing link incompatible
2263    /// with the requested settings.
2264    SharedLinkAlreadyExists(Option<SharedLinkAlreadyExistsMetadata>),
2265    /// There is an error with the given settings.
2266    SettingsError(SharedLinkSettingsError),
2267    /// The user is not allowed to create a shared link to the specified file. For example, this can
2268    /// occur if the file is restricted or if the user's links are
2269    /// [banned](https://help.dropbox.com/files-folders/share/banned-links).
2270    AccessDenied,
2271    /// The current user has been
2272    /// [banned](https://help.dropbox.com/files-folders/share/banned-links) for abuse reasons.
2273    BannedMember,
2274    /// Your Dropbox folder will have too many shared folders after the operation.
2275    /// https://help.dropbox.com/share/shared-folder-faq#Is-there-a-limit-to-the-number-of-shared-folders-I-can-create
2276    TooManySharedFolders,
2277}
2278
2279impl<'de> ::serde::de::Deserialize<'de> for CreateSharedLinkWithSettingsError {
2280    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2281        // union deserializer
2282        use serde::de::{self, MapAccess, Visitor};
2283        struct EnumVisitor;
2284        impl<'de> Visitor<'de> for EnumVisitor {
2285            type Value = CreateSharedLinkWithSettingsError;
2286            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
2287                f.write_str("a CreateSharedLinkWithSettingsError structure")
2288            }
2289            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
2290                let tag: &str = match map.next_key()? {
2291                    Some(".tag") => map.next_value()?,
2292                    _ => return Err(de::Error::missing_field(".tag"))
2293                };
2294                let value = match tag {
2295                    "path" => {
2296                        match map.next_key()? {
2297                            Some("path") => CreateSharedLinkWithSettingsError::Path(map.next_value()?),
2298                            None => return Err(de::Error::missing_field("path")),
2299                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
2300                        }
2301                    }
2302                    "email_not_verified" => CreateSharedLinkWithSettingsError::EmailNotVerified,
2303                    "shared_link_already_exists" => {
2304                        match map.next_key()? {
2305                            Some("shared_link_already_exists") => CreateSharedLinkWithSettingsError::SharedLinkAlreadyExists(map.next_value()?),
2306                            None => CreateSharedLinkWithSettingsError::SharedLinkAlreadyExists(None),
2307                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
2308                        }
2309                    }
2310                    "settings_error" => {
2311                        match map.next_key()? {
2312                            Some("settings_error") => CreateSharedLinkWithSettingsError::SettingsError(map.next_value()?),
2313                            None => return Err(de::Error::missing_field("settings_error")),
2314                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
2315                        }
2316                    }
2317                    "access_denied" => CreateSharedLinkWithSettingsError::AccessDenied,
2318                    "banned_member" => CreateSharedLinkWithSettingsError::BannedMember,
2319                    "too_many_shared_folders" => CreateSharedLinkWithSettingsError::TooManySharedFolders,
2320                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
2321                };
2322                crate::eat_json_fields(&mut map)?;
2323                Ok(value)
2324            }
2325        }
2326        const VARIANTS: &[&str] = &["path",
2327                                    "email_not_verified",
2328                                    "shared_link_already_exists",
2329                                    "settings_error",
2330                                    "access_denied",
2331                                    "banned_member",
2332                                    "too_many_shared_folders"];
2333        deserializer.deserialize_struct("CreateSharedLinkWithSettingsError", VARIANTS, EnumVisitor)
2334    }
2335}
2336
2337impl ::serde::ser::Serialize for CreateSharedLinkWithSettingsError {
2338    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
2339        // union serializer
2340        use serde::ser::SerializeStruct;
2341        match self {
2342            CreateSharedLinkWithSettingsError::Path(x) => {
2343                // union or polymporphic struct
2344                let mut s = serializer.serialize_struct("CreateSharedLinkWithSettingsError", 2)?;
2345                s.serialize_field(".tag", "path")?;
2346                s.serialize_field("path", x)?;
2347                s.end()
2348            }
2349            CreateSharedLinkWithSettingsError::EmailNotVerified => {
2350                // unit
2351                let mut s = serializer.serialize_struct("CreateSharedLinkWithSettingsError", 1)?;
2352                s.serialize_field(".tag", "email_not_verified")?;
2353                s.end()
2354            }
2355            CreateSharedLinkWithSettingsError::SharedLinkAlreadyExists(x) => {
2356                // union or polymporphic struct
2357                let mut s = serializer.serialize_struct("CreateSharedLinkWithSettingsError", 2)?;
2358                s.serialize_field(".tag", "shared_link_already_exists")?;
2359                s.serialize_field("shared_link_already_exists", x)?;
2360                s.end()
2361            }
2362            CreateSharedLinkWithSettingsError::SettingsError(x) => {
2363                // union or polymporphic struct
2364                let mut s = serializer.serialize_struct("CreateSharedLinkWithSettingsError", 2)?;
2365                s.serialize_field(".tag", "settings_error")?;
2366                s.serialize_field("settings_error", x)?;
2367                s.end()
2368            }
2369            CreateSharedLinkWithSettingsError::AccessDenied => {
2370                // unit
2371                let mut s = serializer.serialize_struct("CreateSharedLinkWithSettingsError", 1)?;
2372                s.serialize_field(".tag", "access_denied")?;
2373                s.end()
2374            }
2375            CreateSharedLinkWithSettingsError::BannedMember => {
2376                // unit
2377                let mut s = serializer.serialize_struct("CreateSharedLinkWithSettingsError", 1)?;
2378                s.serialize_field(".tag", "banned_member")?;
2379                s.end()
2380            }
2381            CreateSharedLinkWithSettingsError::TooManySharedFolders => {
2382                // unit
2383                let mut s = serializer.serialize_struct("CreateSharedLinkWithSettingsError", 1)?;
2384                s.serialize_field(".tag", "too_many_shared_folders")?;
2385                s.end()
2386            }
2387        }
2388    }
2389}
2390
2391impl ::std::error::Error for CreateSharedLinkWithSettingsError {
2392    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
2393        match self {
2394            CreateSharedLinkWithSettingsError::Path(inner) => Some(inner),
2395            CreateSharedLinkWithSettingsError::SettingsError(inner) => Some(inner),
2396            _ => None,
2397        }
2398    }
2399}
2400
2401impl ::std::fmt::Display for CreateSharedLinkWithSettingsError {
2402    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
2403        match self {
2404            CreateSharedLinkWithSettingsError::Path(inner) => write!(f, "CreateSharedLinkWithSettingsError: {}", inner),
2405            CreateSharedLinkWithSettingsError::SharedLinkAlreadyExists(None) => f.write_str("shared_link_already_exists"),
2406            CreateSharedLinkWithSettingsError::SharedLinkAlreadyExists(Some(inner)) => write!(f, "shared_link_already_exists: {:?}", inner),
2407            CreateSharedLinkWithSettingsError::SettingsError(inner) => write!(f, "There is an error with the given settings: {}", inner),
2408            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"),
2409            _ => write!(f, "{:?}", *self),
2410        }
2411    }
2412}
2413
2414/// The expected metadata of a shared link for a file or folder when a link is first created for the
2415/// content. Absent if the link already exists.
2416#[derive(Debug, Clone, PartialEq, Eq)]
2417#[non_exhaustive] // structs may have more fields added in the future.
2418pub struct ExpectedSharedContentLinkMetadata {
2419    /// The audience options that are available for the content. Some audience options may be
2420    /// unavailable. For example, team_only may be unavailable if the content is not owned by a user
2421    /// on a team. The 'default' audience option is always available if the user can modify link
2422    /// settings.
2423    pub audience_options: Vec<LinkAudience>,
2424    /// The current audience of the link.
2425    pub current_audience: LinkAudience,
2426    /// A list of permissions for actions you can perform on the link.
2427    pub link_permissions: Vec<LinkPermission>,
2428    /// Whether the link is protected by a password.
2429    pub password_protected: bool,
2430    /// The access level on the link for this file.
2431    pub access_level: Option<AccessLevel>,
2432    /// The shared folder that prevents the link audience for this link from being more restrictive.
2433    pub audience_restricting_shared_folder: Option<AudienceRestrictingSharedFolder>,
2434    /// Whether the link has an expiry set on it. A link with an expiry will have its audience
2435    /// changed to members when the expiry is reached.
2436    pub expiry: Option<crate::types::common::DropboxTimestamp>,
2437}
2438
2439impl ExpectedSharedContentLinkMetadata {
2440    pub fn new(
2441        audience_options: Vec<LinkAudience>,
2442        current_audience: LinkAudience,
2443        link_permissions: Vec<LinkPermission>,
2444        password_protected: bool,
2445    ) -> Self {
2446        ExpectedSharedContentLinkMetadata {
2447            audience_options,
2448            current_audience,
2449            link_permissions,
2450            password_protected,
2451            access_level: None,
2452            audience_restricting_shared_folder: None,
2453            expiry: None,
2454        }
2455    }
2456
2457    pub fn with_access_level(mut self, value: AccessLevel) -> Self {
2458        self.access_level = Some(value);
2459        self
2460    }
2461
2462    pub fn with_audience_restricting_shared_folder(
2463        mut self,
2464        value: AudienceRestrictingSharedFolder,
2465    ) -> Self {
2466        self.audience_restricting_shared_folder = Some(value);
2467        self
2468    }
2469
2470    pub fn with_expiry(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
2471        self.expiry = Some(value);
2472        self
2473    }
2474}
2475
2476const EXPECTED_SHARED_CONTENT_LINK_METADATA_FIELDS: &[&str] = &["audience_options",
2477                                                                "current_audience",
2478                                                                "link_permissions",
2479                                                                "password_protected",
2480                                                                "access_level",
2481                                                                "audience_restricting_shared_folder",
2482                                                                "expiry"];
2483impl ExpectedSharedContentLinkMetadata {
2484    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
2485        map: V,
2486    ) -> Result<ExpectedSharedContentLinkMetadata, V::Error> {
2487        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
2488    }
2489
2490    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
2491        mut map: V,
2492        optional: bool,
2493    ) -> Result<Option<ExpectedSharedContentLinkMetadata>, V::Error> {
2494        let mut field_audience_options = None;
2495        let mut field_current_audience = None;
2496        let mut field_link_permissions = None;
2497        let mut field_password_protected = None;
2498        let mut field_access_level = None;
2499        let mut field_audience_restricting_shared_folder = None;
2500        let mut field_expiry = None;
2501        let mut nothing = true;
2502        while let Some(key) = map.next_key::<&str>()? {
2503            nothing = false;
2504            match key {
2505                "audience_options" => {
2506                    if field_audience_options.is_some() {
2507                        return Err(::serde::de::Error::duplicate_field("audience_options"));
2508                    }
2509                    field_audience_options = Some(map.next_value()?);
2510                }
2511                "current_audience" => {
2512                    if field_current_audience.is_some() {
2513                        return Err(::serde::de::Error::duplicate_field("current_audience"));
2514                    }
2515                    field_current_audience = Some(map.next_value()?);
2516                }
2517                "link_permissions" => {
2518                    if field_link_permissions.is_some() {
2519                        return Err(::serde::de::Error::duplicate_field("link_permissions"));
2520                    }
2521                    field_link_permissions = Some(map.next_value()?);
2522                }
2523                "password_protected" => {
2524                    if field_password_protected.is_some() {
2525                        return Err(::serde::de::Error::duplicate_field("password_protected"));
2526                    }
2527                    field_password_protected = Some(map.next_value()?);
2528                }
2529                "access_level" => {
2530                    if field_access_level.is_some() {
2531                        return Err(::serde::de::Error::duplicate_field("access_level"));
2532                    }
2533                    field_access_level = Some(map.next_value()?);
2534                }
2535                "audience_restricting_shared_folder" => {
2536                    if field_audience_restricting_shared_folder.is_some() {
2537                        return Err(::serde::de::Error::duplicate_field("audience_restricting_shared_folder"));
2538                    }
2539                    field_audience_restricting_shared_folder = Some(map.next_value()?);
2540                }
2541                "expiry" => {
2542                    if field_expiry.is_some() {
2543                        return Err(::serde::de::Error::duplicate_field("expiry"));
2544                    }
2545                    field_expiry = Some(map.next_value()?);
2546                }
2547                _ => {
2548                    // unknown field allowed and ignored
2549                    map.next_value::<::serde_json::Value>()?;
2550                }
2551            }
2552        }
2553        if optional && nothing {
2554            return Ok(None);
2555        }
2556        let result = ExpectedSharedContentLinkMetadata {
2557            audience_options: field_audience_options.ok_or_else(|| ::serde::de::Error::missing_field("audience_options"))?,
2558            current_audience: field_current_audience.ok_or_else(|| ::serde::de::Error::missing_field("current_audience"))?,
2559            link_permissions: field_link_permissions.ok_or_else(|| ::serde::de::Error::missing_field("link_permissions"))?,
2560            password_protected: field_password_protected.ok_or_else(|| ::serde::de::Error::missing_field("password_protected"))?,
2561            access_level: field_access_level.and_then(Option::flatten),
2562            audience_restricting_shared_folder: field_audience_restricting_shared_folder.and_then(Option::flatten),
2563            expiry: field_expiry.and_then(Option::flatten),
2564        };
2565        Ok(Some(result))
2566    }
2567
2568    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
2569        &self,
2570        s: &mut S::SerializeStruct,
2571    ) -> Result<(), S::Error> {
2572        use serde::ser::SerializeStruct;
2573        s.serialize_field("audience_options", &self.audience_options)?;
2574        s.serialize_field("current_audience", &self.current_audience)?;
2575        s.serialize_field("link_permissions", &self.link_permissions)?;
2576        s.serialize_field("password_protected", &self.password_protected)?;
2577        if let Some(val) = &self.access_level {
2578            s.serialize_field("access_level", val)?;
2579        }
2580        if let Some(val) = &self.audience_restricting_shared_folder {
2581            s.serialize_field("audience_restricting_shared_folder", val)?;
2582        }
2583        if let Some(val) = &self.expiry {
2584            s.serialize_field("expiry", val)?;
2585        }
2586        Ok(())
2587    }
2588}
2589
2590impl<'de> ::serde::de::Deserialize<'de> for ExpectedSharedContentLinkMetadata {
2591    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2592        // struct deserializer
2593        use serde::de::{MapAccess, Visitor};
2594        struct StructVisitor;
2595        impl<'de> Visitor<'de> for StructVisitor {
2596            type Value = ExpectedSharedContentLinkMetadata;
2597            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
2598                f.write_str("a ExpectedSharedContentLinkMetadata struct")
2599            }
2600            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
2601                ExpectedSharedContentLinkMetadata::internal_deserialize(map)
2602            }
2603        }
2604        deserializer.deserialize_struct("ExpectedSharedContentLinkMetadata", EXPECTED_SHARED_CONTENT_LINK_METADATA_FIELDS, StructVisitor)
2605    }
2606}
2607
2608impl ::serde::ser::Serialize for ExpectedSharedContentLinkMetadata {
2609    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
2610        // struct serializer
2611        use serde::ser::SerializeStruct;
2612        let mut s = serializer.serialize_struct("ExpectedSharedContentLinkMetadata", 7)?;
2613        self.internal_serialize::<S>(&mut s)?;
2614        s.end()
2615    }
2616}
2617
2618// struct extends SharedContentLinkMetadataBase
2619impl From<ExpectedSharedContentLinkMetadata> for SharedContentLinkMetadataBase {
2620    fn from(subtype: ExpectedSharedContentLinkMetadata) -> Self {
2621        Self {
2622            audience_options: subtype.audience_options,
2623            current_audience: subtype.current_audience,
2624            link_permissions: subtype.link_permissions,
2625            password_protected: subtype.password_protected,
2626            access_level: subtype.access_level,
2627            audience_restricting_shared_folder: subtype.audience_restricting_shared_folder,
2628            expiry: subtype.expiry,
2629        }
2630    }
2631}
2632/// Sharing actions that may be taken on files.
2633#[derive(Debug, Clone, PartialEq, Eq)]
2634#[non_exhaustive] // variants may be added in the future
2635pub enum FileAction {
2636    /// Disable viewer information on the file.
2637    DisableViewerInfo,
2638    /// Change or edit contents of the file.
2639    EditContents,
2640    /// Enable viewer information on the file.
2641    EnableViewerInfo,
2642    /// Add a member with view permissions.
2643    InviteViewer,
2644    /// Add a member with view permissions but no comment permissions.
2645    InviteViewerNoComment,
2646    /// Add a member with edit permissions.
2647    InviteEditor,
2648    /// Stop sharing this file.
2649    Unshare,
2650    /// Relinquish one's own membership to the file.
2651    RelinquishMembership,
2652    /// Use create_view_link and create_edit_link instead.
2653    ShareLink,
2654    /// Use create_view_link and create_edit_link instead.
2655    CreateLink,
2656    /// Create a shared link to a file that only allows users to view the content.
2657    CreateViewLink,
2658    /// Create a shared link to a file that allows users to edit the content.
2659    CreateEditLink,
2660    /// Catch-all used for unrecognized values returned from the server. Encountering this value
2661    /// typically indicates that this SDK version is out of date.
2662    Other,
2663}
2664
2665impl<'de> ::serde::de::Deserialize<'de> for FileAction {
2666    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2667        // union deserializer
2668        use serde::de::{self, MapAccess, Visitor};
2669        struct EnumVisitor;
2670        impl<'de> Visitor<'de> for EnumVisitor {
2671            type Value = FileAction;
2672            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
2673                f.write_str("a FileAction structure")
2674            }
2675            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
2676                let tag: &str = match map.next_key()? {
2677                    Some(".tag") => map.next_value()?,
2678                    _ => return Err(de::Error::missing_field(".tag"))
2679                };
2680                let value = match tag {
2681                    "disable_viewer_info" => FileAction::DisableViewerInfo,
2682                    "edit_contents" => FileAction::EditContents,
2683                    "enable_viewer_info" => FileAction::EnableViewerInfo,
2684                    "invite_viewer" => FileAction::InviteViewer,
2685                    "invite_viewer_no_comment" => FileAction::InviteViewerNoComment,
2686                    "invite_editor" => FileAction::InviteEditor,
2687                    "unshare" => FileAction::Unshare,
2688                    "relinquish_membership" => FileAction::RelinquishMembership,
2689                    "share_link" => FileAction::ShareLink,
2690                    "create_link" => FileAction::CreateLink,
2691                    "create_view_link" => FileAction::CreateViewLink,
2692                    "create_edit_link" => FileAction::CreateEditLink,
2693                    _ => FileAction::Other,
2694                };
2695                crate::eat_json_fields(&mut map)?;
2696                Ok(value)
2697            }
2698        }
2699        const VARIANTS: &[&str] = &["disable_viewer_info",
2700                                    "edit_contents",
2701                                    "enable_viewer_info",
2702                                    "invite_viewer",
2703                                    "invite_viewer_no_comment",
2704                                    "invite_editor",
2705                                    "unshare",
2706                                    "relinquish_membership",
2707                                    "share_link",
2708                                    "create_link",
2709                                    "create_view_link",
2710                                    "create_edit_link",
2711                                    "other"];
2712        deserializer.deserialize_struct("FileAction", VARIANTS, EnumVisitor)
2713    }
2714}
2715
2716impl ::serde::ser::Serialize for FileAction {
2717    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
2718        // union serializer
2719        use serde::ser::SerializeStruct;
2720        match self {
2721            FileAction::DisableViewerInfo => {
2722                // unit
2723                let mut s = serializer.serialize_struct("FileAction", 1)?;
2724                s.serialize_field(".tag", "disable_viewer_info")?;
2725                s.end()
2726            }
2727            FileAction::EditContents => {
2728                // unit
2729                let mut s = serializer.serialize_struct("FileAction", 1)?;
2730                s.serialize_field(".tag", "edit_contents")?;
2731                s.end()
2732            }
2733            FileAction::EnableViewerInfo => {
2734                // unit
2735                let mut s = serializer.serialize_struct("FileAction", 1)?;
2736                s.serialize_field(".tag", "enable_viewer_info")?;
2737                s.end()
2738            }
2739            FileAction::InviteViewer => {
2740                // unit
2741                let mut s = serializer.serialize_struct("FileAction", 1)?;
2742                s.serialize_field(".tag", "invite_viewer")?;
2743                s.end()
2744            }
2745            FileAction::InviteViewerNoComment => {
2746                // unit
2747                let mut s = serializer.serialize_struct("FileAction", 1)?;
2748                s.serialize_field(".tag", "invite_viewer_no_comment")?;
2749                s.end()
2750            }
2751            FileAction::InviteEditor => {
2752                // unit
2753                let mut s = serializer.serialize_struct("FileAction", 1)?;
2754                s.serialize_field(".tag", "invite_editor")?;
2755                s.end()
2756            }
2757            FileAction::Unshare => {
2758                // unit
2759                let mut s = serializer.serialize_struct("FileAction", 1)?;
2760                s.serialize_field(".tag", "unshare")?;
2761                s.end()
2762            }
2763            FileAction::RelinquishMembership => {
2764                // unit
2765                let mut s = serializer.serialize_struct("FileAction", 1)?;
2766                s.serialize_field(".tag", "relinquish_membership")?;
2767                s.end()
2768            }
2769            FileAction::ShareLink => {
2770                // unit
2771                let mut s = serializer.serialize_struct("FileAction", 1)?;
2772                s.serialize_field(".tag", "share_link")?;
2773                s.end()
2774            }
2775            FileAction::CreateLink => {
2776                // unit
2777                let mut s = serializer.serialize_struct("FileAction", 1)?;
2778                s.serialize_field(".tag", "create_link")?;
2779                s.end()
2780            }
2781            FileAction::CreateViewLink => {
2782                // unit
2783                let mut s = serializer.serialize_struct("FileAction", 1)?;
2784                s.serialize_field(".tag", "create_view_link")?;
2785                s.end()
2786            }
2787            FileAction::CreateEditLink => {
2788                // unit
2789                let mut s = serializer.serialize_struct("FileAction", 1)?;
2790                s.serialize_field(".tag", "create_edit_link")?;
2791                s.end()
2792            }
2793            FileAction::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
2794        }
2795    }
2796}
2797
2798#[derive(Debug, Clone, PartialEq, Eq)]
2799#[non_exhaustive] // variants may be added in the future
2800pub enum FileErrorResult {
2801    /// File specified by id was not found.
2802    FileNotFoundError(crate::types::files::Id),
2803    /// User does not have permission to take the specified action on the file.
2804    InvalidFileActionError(crate::types::files::Id),
2805    /// User does not have permission to access file specified by file.Id.
2806    PermissionDeniedError(crate::types::files::Id),
2807    /// Catch-all used for unrecognized values returned from the server. Encountering this value
2808    /// typically indicates that this SDK version is out of date.
2809    Other,
2810}
2811
2812impl<'de> ::serde::de::Deserialize<'de> for FileErrorResult {
2813    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2814        // union deserializer
2815        use serde::de::{self, MapAccess, Visitor};
2816        struct EnumVisitor;
2817        impl<'de> Visitor<'de> for EnumVisitor {
2818            type Value = FileErrorResult;
2819            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
2820                f.write_str("a FileErrorResult structure")
2821            }
2822            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
2823                let tag: &str = match map.next_key()? {
2824                    Some(".tag") => map.next_value()?,
2825                    _ => return Err(de::Error::missing_field(".tag"))
2826                };
2827                let value = match tag {
2828                    "file_not_found_error" => {
2829                        match map.next_key()? {
2830                            Some("file_not_found_error") => FileErrorResult::FileNotFoundError(map.next_value()?),
2831                            None => return Err(de::Error::missing_field("file_not_found_error")),
2832                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
2833                        }
2834                    }
2835                    "invalid_file_action_error" => {
2836                        match map.next_key()? {
2837                            Some("invalid_file_action_error") => FileErrorResult::InvalidFileActionError(map.next_value()?),
2838                            None => return Err(de::Error::missing_field("invalid_file_action_error")),
2839                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
2840                        }
2841                    }
2842                    "permission_denied_error" => {
2843                        match map.next_key()? {
2844                            Some("permission_denied_error") => FileErrorResult::PermissionDeniedError(map.next_value()?),
2845                            None => return Err(de::Error::missing_field("permission_denied_error")),
2846                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
2847                        }
2848                    }
2849                    _ => FileErrorResult::Other,
2850                };
2851                crate::eat_json_fields(&mut map)?;
2852                Ok(value)
2853            }
2854        }
2855        const VARIANTS: &[&str] = &["file_not_found_error",
2856                                    "invalid_file_action_error",
2857                                    "permission_denied_error",
2858                                    "other"];
2859        deserializer.deserialize_struct("FileErrorResult", VARIANTS, EnumVisitor)
2860    }
2861}
2862
2863impl ::serde::ser::Serialize for FileErrorResult {
2864    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
2865        // union serializer
2866        use serde::ser::SerializeStruct;
2867        match self {
2868            FileErrorResult::FileNotFoundError(x) => {
2869                // primitive
2870                let mut s = serializer.serialize_struct("FileErrorResult", 2)?;
2871                s.serialize_field(".tag", "file_not_found_error")?;
2872                s.serialize_field("file_not_found_error", x)?;
2873                s.end()
2874            }
2875            FileErrorResult::InvalidFileActionError(x) => {
2876                // primitive
2877                let mut s = serializer.serialize_struct("FileErrorResult", 2)?;
2878                s.serialize_field(".tag", "invalid_file_action_error")?;
2879                s.serialize_field("invalid_file_action_error", x)?;
2880                s.end()
2881            }
2882            FileErrorResult::PermissionDeniedError(x) => {
2883                // primitive
2884                let mut s = serializer.serialize_struct("FileErrorResult", 2)?;
2885                s.serialize_field(".tag", "permission_denied_error")?;
2886                s.serialize_field("permission_denied_error", x)?;
2887                s.end()
2888            }
2889            FileErrorResult::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
2890        }
2891    }
2892}
2893
2894/// The metadata of a file shared link.
2895#[derive(Debug, Clone, PartialEq, Eq)]
2896#[non_exhaustive] // structs may have more fields added in the future.
2897pub struct FileLinkMetadata {
2898    /// URL of the shared link.
2899    pub url: String,
2900    /// The linked file name (including extension). This never contains a slash.
2901    pub name: String,
2902    /// The link's access permissions.
2903    pub link_permissions: LinkPermissions,
2904    /// The modification time set by the desktop client when the file was added to Dropbox. Since
2905    /// this time is not verified (the Dropbox server stores whatever the desktop client sends up),
2906    /// this should only be used for display purposes (such as sorting) and not, for example, to
2907    /// determine if a file has changed or not.
2908    pub client_modified: crate::types::common::DropboxTimestamp,
2909    /// The last time the file was modified on Dropbox.
2910    pub server_modified: crate::types::common::DropboxTimestamp,
2911    /// A unique identifier for the current revision of a file. This field is the same rev as
2912    /// elsewhere in the API and can be used to detect changes and avoid conflicts.
2913    pub rev: Rev,
2914    /// The file size in bytes.
2915    pub size: u64,
2916    /// A unique identifier for the linked file.
2917    pub id: Option<Id>,
2918    /// Expiration time, if set. By default the link won't expire.
2919    pub expires: Option<crate::types::common::DropboxTimestamp>,
2920    /// The lowercased full path in the user's Dropbox. This always starts with a slash. This field
2921    /// will only be present only if the linked file is in the authenticated user's dropbox and the
2922    /// user is the owner of the link.
2923    pub path_lower: Option<String>,
2924    /// The team membership information of the link's owner.  This field will only be present if the
2925    /// link's owner is a team member.
2926    pub team_member_info: Option<TeamMemberInfo>,
2927    /// The team information of the content's owner. This field will only be present if the
2928    /// content's owner is a team member and the content's owner team is different from the link's
2929    /// owner team.
2930    pub content_owner_team_info: Option<TeamInfo>,
2931}
2932
2933impl FileLinkMetadata {
2934    pub fn new(
2935        url: String,
2936        name: String,
2937        link_permissions: LinkPermissions,
2938        client_modified: crate::types::common::DropboxTimestamp,
2939        server_modified: crate::types::common::DropboxTimestamp,
2940        rev: Rev,
2941        size: u64,
2942    ) -> Self {
2943        FileLinkMetadata {
2944            url,
2945            name,
2946            link_permissions,
2947            client_modified,
2948            server_modified,
2949            rev,
2950            size,
2951            id: None,
2952            expires: None,
2953            path_lower: None,
2954            team_member_info: None,
2955            content_owner_team_info: None,
2956        }
2957    }
2958
2959    pub fn with_id(mut self, value: Id) -> Self {
2960        self.id = Some(value);
2961        self
2962    }
2963
2964    pub fn with_expires(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
2965        self.expires = Some(value);
2966        self
2967    }
2968
2969    pub fn with_path_lower(mut self, value: String) -> Self {
2970        self.path_lower = Some(value);
2971        self
2972    }
2973
2974    pub fn with_team_member_info(mut self, value: TeamMemberInfo) -> Self {
2975        self.team_member_info = Some(value);
2976        self
2977    }
2978
2979    pub fn with_content_owner_team_info(mut self, value: TeamInfo) -> Self {
2980        self.content_owner_team_info = Some(value);
2981        self
2982    }
2983}
2984
2985const FILE_LINK_METADATA_FIELDS: &[&str] = &["url",
2986                                             "name",
2987                                             "link_permissions",
2988                                             "client_modified",
2989                                             "server_modified",
2990                                             "rev",
2991                                             "size",
2992                                             "id",
2993                                             "expires",
2994                                             "path_lower",
2995                                             "team_member_info",
2996                                             "content_owner_team_info"];
2997impl FileLinkMetadata {
2998    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
2999        map: V,
3000    ) -> Result<FileLinkMetadata, V::Error> {
3001        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
3002    }
3003
3004    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
3005        mut map: V,
3006        optional: bool,
3007    ) -> Result<Option<FileLinkMetadata>, V::Error> {
3008        let mut field_url = None;
3009        let mut field_name = None;
3010        let mut field_link_permissions = None;
3011        let mut field_client_modified = None;
3012        let mut field_server_modified = None;
3013        let mut field_rev = None;
3014        let mut field_size = None;
3015        let mut field_id = None;
3016        let mut field_expires = None;
3017        let mut field_path_lower = None;
3018        let mut field_team_member_info = None;
3019        let mut field_content_owner_team_info = None;
3020        let mut nothing = true;
3021        while let Some(key) = map.next_key::<&str>()? {
3022            nothing = false;
3023            match key {
3024                "url" => {
3025                    if field_url.is_some() {
3026                        return Err(::serde::de::Error::duplicate_field("url"));
3027                    }
3028                    field_url = Some(map.next_value()?);
3029                }
3030                "name" => {
3031                    if field_name.is_some() {
3032                        return Err(::serde::de::Error::duplicate_field("name"));
3033                    }
3034                    field_name = Some(map.next_value()?);
3035                }
3036                "link_permissions" => {
3037                    if field_link_permissions.is_some() {
3038                        return Err(::serde::de::Error::duplicate_field("link_permissions"));
3039                    }
3040                    field_link_permissions = Some(map.next_value()?);
3041                }
3042                "client_modified" => {
3043                    if field_client_modified.is_some() {
3044                        return Err(::serde::de::Error::duplicate_field("client_modified"));
3045                    }
3046                    field_client_modified = Some(map.next_value()?);
3047                }
3048                "server_modified" => {
3049                    if field_server_modified.is_some() {
3050                        return Err(::serde::de::Error::duplicate_field("server_modified"));
3051                    }
3052                    field_server_modified = Some(map.next_value()?);
3053                }
3054                "rev" => {
3055                    if field_rev.is_some() {
3056                        return Err(::serde::de::Error::duplicate_field("rev"));
3057                    }
3058                    field_rev = Some(map.next_value()?);
3059                }
3060                "size" => {
3061                    if field_size.is_some() {
3062                        return Err(::serde::de::Error::duplicate_field("size"));
3063                    }
3064                    field_size = Some(map.next_value()?);
3065                }
3066                "id" => {
3067                    if field_id.is_some() {
3068                        return Err(::serde::de::Error::duplicate_field("id"));
3069                    }
3070                    field_id = Some(map.next_value()?);
3071                }
3072                "expires" => {
3073                    if field_expires.is_some() {
3074                        return Err(::serde::de::Error::duplicate_field("expires"));
3075                    }
3076                    field_expires = Some(map.next_value()?);
3077                }
3078                "path_lower" => {
3079                    if field_path_lower.is_some() {
3080                        return Err(::serde::de::Error::duplicate_field("path_lower"));
3081                    }
3082                    field_path_lower = Some(map.next_value()?);
3083                }
3084                "team_member_info" => {
3085                    if field_team_member_info.is_some() {
3086                        return Err(::serde::de::Error::duplicate_field("team_member_info"));
3087                    }
3088                    field_team_member_info = Some(map.next_value()?);
3089                }
3090                "content_owner_team_info" => {
3091                    if field_content_owner_team_info.is_some() {
3092                        return Err(::serde::de::Error::duplicate_field("content_owner_team_info"));
3093                    }
3094                    field_content_owner_team_info = Some(map.next_value()?);
3095                }
3096                _ => {
3097                    // unknown field allowed and ignored
3098                    map.next_value::<::serde_json::Value>()?;
3099                }
3100            }
3101        }
3102        if optional && nothing {
3103            return Ok(None);
3104        }
3105        let result = FileLinkMetadata {
3106            url: field_url.ok_or_else(|| ::serde::de::Error::missing_field("url"))?,
3107            name: field_name.ok_or_else(|| ::serde::de::Error::missing_field("name"))?,
3108            link_permissions: field_link_permissions.ok_or_else(|| ::serde::de::Error::missing_field("link_permissions"))?,
3109            client_modified: field_client_modified.ok_or_else(|| ::serde::de::Error::missing_field("client_modified"))?,
3110            server_modified: field_server_modified.ok_or_else(|| ::serde::de::Error::missing_field("server_modified"))?,
3111            rev: field_rev.ok_or_else(|| ::serde::de::Error::missing_field("rev"))?,
3112            size: field_size.ok_or_else(|| ::serde::de::Error::missing_field("size"))?,
3113            id: field_id.and_then(Option::flatten),
3114            expires: field_expires.and_then(Option::flatten),
3115            path_lower: field_path_lower.and_then(Option::flatten),
3116            team_member_info: field_team_member_info.and_then(Option::flatten),
3117            content_owner_team_info: field_content_owner_team_info.and_then(Option::flatten),
3118        };
3119        Ok(Some(result))
3120    }
3121
3122    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
3123        &self,
3124        s: &mut S::SerializeStruct,
3125    ) -> Result<(), S::Error> {
3126        use serde::ser::SerializeStruct;
3127        s.serialize_field("url", &self.url)?;
3128        s.serialize_field("name", &self.name)?;
3129        s.serialize_field("link_permissions", &self.link_permissions)?;
3130        s.serialize_field("client_modified", &self.client_modified)?;
3131        s.serialize_field("server_modified", &self.server_modified)?;
3132        s.serialize_field("rev", &self.rev)?;
3133        s.serialize_field("size", &self.size)?;
3134        if let Some(val) = &self.id {
3135            s.serialize_field("id", val)?;
3136        }
3137        if let Some(val) = &self.expires {
3138            s.serialize_field("expires", val)?;
3139        }
3140        if let Some(val) = &self.path_lower {
3141            s.serialize_field("path_lower", val)?;
3142        }
3143        if let Some(val) = &self.team_member_info {
3144            s.serialize_field("team_member_info", val)?;
3145        }
3146        if let Some(val) = &self.content_owner_team_info {
3147            s.serialize_field("content_owner_team_info", val)?;
3148        }
3149        Ok(())
3150    }
3151}
3152
3153impl<'de> ::serde::de::Deserialize<'de> for FileLinkMetadata {
3154    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3155        // struct deserializer
3156        use serde::de::{MapAccess, Visitor};
3157        struct StructVisitor;
3158        impl<'de> Visitor<'de> for StructVisitor {
3159            type Value = FileLinkMetadata;
3160            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
3161                f.write_str("a FileLinkMetadata struct")
3162            }
3163            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
3164                FileLinkMetadata::internal_deserialize(map)
3165            }
3166        }
3167        deserializer.deserialize_struct("FileLinkMetadata", FILE_LINK_METADATA_FIELDS, StructVisitor)
3168    }
3169}
3170
3171impl ::serde::ser::Serialize for FileLinkMetadata {
3172    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3173        // struct serializer
3174        use serde::ser::SerializeStruct;
3175        let mut s = serializer.serialize_struct("FileLinkMetadata", 12)?;
3176        self.internal_serialize::<S>(&mut s)?;
3177        s.end()
3178    }
3179}
3180
3181// struct extends polymorphic struct SharedLinkMetadata
3182impl From<FileLinkMetadata> for SharedLinkMetadata {
3183    fn from(subtype: FileLinkMetadata) -> Self {
3184        SharedLinkMetadata::File(subtype)
3185    }
3186}
3187#[derive(Debug, Clone, PartialEq, Eq)]
3188#[non_exhaustive] // variants may be added in the future
3189pub enum FileMemberActionError {
3190    /// Specified member was not found.
3191    InvalidMember,
3192    /// User does not have permission to perform this action on this member.
3193    NoPermission,
3194    /// Specified file was invalid or user does not have access.
3195    AccessError(SharingFileAccessError),
3196    /// The action cannot be completed because the target member does not have explicit access to
3197    /// the file. The return value is the access that the member has to the file from a parent
3198    /// folder.
3199    NoExplicitAccess(MemberAccessLevelResult),
3200    /// Catch-all used for unrecognized values returned from the server. Encountering this value
3201    /// typically indicates that this SDK version is out of date.
3202    Other,
3203}
3204
3205impl<'de> ::serde::de::Deserialize<'de> for FileMemberActionError {
3206    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3207        // union deserializer
3208        use serde::de::{self, MapAccess, Visitor};
3209        struct EnumVisitor;
3210        impl<'de> Visitor<'de> for EnumVisitor {
3211            type Value = FileMemberActionError;
3212            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
3213                f.write_str("a FileMemberActionError structure")
3214            }
3215            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
3216                let tag: &str = match map.next_key()? {
3217                    Some(".tag") => map.next_value()?,
3218                    _ => return Err(de::Error::missing_field(".tag"))
3219                };
3220                let value = match tag {
3221                    "invalid_member" => FileMemberActionError::InvalidMember,
3222                    "no_permission" => FileMemberActionError::NoPermission,
3223                    "access_error" => {
3224                        match map.next_key()? {
3225                            Some("access_error") => FileMemberActionError::AccessError(map.next_value()?),
3226                            None => return Err(de::Error::missing_field("access_error")),
3227                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
3228                        }
3229                    }
3230                    "no_explicit_access" => FileMemberActionError::NoExplicitAccess(MemberAccessLevelResult::internal_deserialize(&mut map)?),
3231                    _ => FileMemberActionError::Other,
3232                };
3233                crate::eat_json_fields(&mut map)?;
3234                Ok(value)
3235            }
3236        }
3237        const VARIANTS: &[&str] = &["invalid_member",
3238                                    "no_permission",
3239                                    "access_error",
3240                                    "no_explicit_access",
3241                                    "other"];
3242        deserializer.deserialize_struct("FileMemberActionError", VARIANTS, EnumVisitor)
3243    }
3244}
3245
3246impl ::serde::ser::Serialize for FileMemberActionError {
3247    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3248        // union serializer
3249        use serde::ser::SerializeStruct;
3250        match self {
3251            FileMemberActionError::InvalidMember => {
3252                // unit
3253                let mut s = serializer.serialize_struct("FileMemberActionError", 1)?;
3254                s.serialize_field(".tag", "invalid_member")?;
3255                s.end()
3256            }
3257            FileMemberActionError::NoPermission => {
3258                // unit
3259                let mut s = serializer.serialize_struct("FileMemberActionError", 1)?;
3260                s.serialize_field(".tag", "no_permission")?;
3261                s.end()
3262            }
3263            FileMemberActionError::AccessError(x) => {
3264                // union or polymporphic struct
3265                let mut s = serializer.serialize_struct("FileMemberActionError", 2)?;
3266                s.serialize_field(".tag", "access_error")?;
3267                s.serialize_field("access_error", x)?;
3268                s.end()
3269            }
3270            FileMemberActionError::NoExplicitAccess(x) => {
3271                // struct
3272                let mut s = serializer.serialize_struct("FileMemberActionError", 4)?;
3273                s.serialize_field(".tag", "no_explicit_access")?;
3274                x.internal_serialize::<S>(&mut s)?;
3275                s.end()
3276            }
3277            FileMemberActionError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
3278        }
3279    }
3280}
3281
3282impl ::std::error::Error for FileMemberActionError {
3283    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
3284        match self {
3285            FileMemberActionError::AccessError(inner) => Some(inner),
3286            _ => None,
3287        }
3288    }
3289}
3290
3291impl ::std::fmt::Display for FileMemberActionError {
3292    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
3293        match self {
3294            FileMemberActionError::InvalidMember => f.write_str("Specified member was not found."),
3295            FileMemberActionError::NoPermission => f.write_str("User does not have permission to perform this action on this member."),
3296            FileMemberActionError::AccessError(inner) => write!(f, "Specified file was invalid or user does not have access: {}", inner),
3297            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),
3298            _ => write!(f, "{:?}", *self),
3299        }
3300    }
3301}
3302
3303#[derive(Debug, Clone, PartialEq, Eq)]
3304pub enum FileMemberActionIndividualResult {
3305    /// Part of the response for both add_file_member and remove_file_member_v1 (deprecated). For
3306    /// add_file_member, indicates giving access was successful and at what AccessLevel. For
3307    /// remove_file_member_v1, indicates member was successfully removed from the file. If
3308    /// AccessLevel is given, the member still has access via a parent shared folder.
3309    Success(Option<AccessLevel>),
3310    /// User was not able to perform this action.
3311    MemberError(FileMemberActionError),
3312}
3313
3314impl<'de> ::serde::de::Deserialize<'de> for FileMemberActionIndividualResult {
3315    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3316        // union deserializer
3317        use serde::de::{self, MapAccess, Visitor};
3318        struct EnumVisitor;
3319        impl<'de> Visitor<'de> for EnumVisitor {
3320            type Value = FileMemberActionIndividualResult;
3321            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
3322                f.write_str("a FileMemberActionIndividualResult structure")
3323            }
3324            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
3325                let tag: &str = match map.next_key()? {
3326                    Some(".tag") => map.next_value()?,
3327                    _ => return Err(de::Error::missing_field(".tag"))
3328                };
3329                let value = match tag {
3330                    "success" => {
3331                        match map.next_key()? {
3332                            Some("success") => FileMemberActionIndividualResult::Success(map.next_value()?),
3333                            None => FileMemberActionIndividualResult::Success(None),
3334                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
3335                        }
3336                    }
3337                    "member_error" => {
3338                        match map.next_key()? {
3339                            Some("member_error") => FileMemberActionIndividualResult::MemberError(map.next_value()?),
3340                            None => return Err(de::Error::missing_field("member_error")),
3341                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
3342                        }
3343                    }
3344                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
3345                };
3346                crate::eat_json_fields(&mut map)?;
3347                Ok(value)
3348            }
3349        }
3350        const VARIANTS: &[&str] = &["success",
3351                                    "member_error"];
3352        deserializer.deserialize_struct("FileMemberActionIndividualResult", VARIANTS, EnumVisitor)
3353    }
3354}
3355
3356impl ::serde::ser::Serialize for FileMemberActionIndividualResult {
3357    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3358        // union serializer
3359        use serde::ser::SerializeStruct;
3360        match self {
3361            FileMemberActionIndividualResult::Success(x) => {
3362                // union or polymporphic struct
3363                let mut s = serializer.serialize_struct("FileMemberActionIndividualResult", 2)?;
3364                s.serialize_field(".tag", "success")?;
3365                s.serialize_field("success", x)?;
3366                s.end()
3367            }
3368            FileMemberActionIndividualResult::MemberError(x) => {
3369                // union or polymporphic struct
3370                let mut s = serializer.serialize_struct("FileMemberActionIndividualResult", 2)?;
3371                s.serialize_field(".tag", "member_error")?;
3372                s.serialize_field("member_error", x)?;
3373                s.end()
3374            }
3375        }
3376    }
3377}
3378
3379/// Per-member result for [`add_file_member()`](crate::sharing::add_file_member).
3380#[derive(Debug, Clone, PartialEq, Eq)]
3381#[non_exhaustive] // structs may have more fields added in the future.
3382pub struct FileMemberActionResult {
3383    /// One of specified input members.
3384    pub member: MemberSelector,
3385    /// The outcome of the action on this member.
3386    pub result: FileMemberActionIndividualResult,
3387    /// The SHA-1 encrypted shared content key.
3388    pub sckey_sha1: Option<String>,
3389    /// The sharing sender-recipient invitation signatures for the input member_id. A member_id can
3390    /// be a group and thus have multiple users and multiple invitation signatures.
3391    pub invitation_signature: Option<Vec<String>>,
3392}
3393
3394impl FileMemberActionResult {
3395    pub fn new(member: MemberSelector, result: FileMemberActionIndividualResult) -> Self {
3396        FileMemberActionResult {
3397            member,
3398            result,
3399            sckey_sha1: None,
3400            invitation_signature: None,
3401        }
3402    }
3403
3404    pub fn with_sckey_sha1(mut self, value: String) -> Self {
3405        self.sckey_sha1 = Some(value);
3406        self
3407    }
3408
3409    pub fn with_invitation_signature(mut self, value: Vec<String>) -> Self {
3410        self.invitation_signature = Some(value);
3411        self
3412    }
3413}
3414
3415const FILE_MEMBER_ACTION_RESULT_FIELDS: &[&str] = &["member",
3416                                                    "result",
3417                                                    "sckey_sha1",
3418                                                    "invitation_signature"];
3419impl FileMemberActionResult {
3420    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
3421        map: V,
3422    ) -> Result<FileMemberActionResult, V::Error> {
3423        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
3424    }
3425
3426    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
3427        mut map: V,
3428        optional: bool,
3429    ) -> Result<Option<FileMemberActionResult>, V::Error> {
3430        let mut field_member = None;
3431        let mut field_result = None;
3432        let mut field_sckey_sha1 = None;
3433        let mut field_invitation_signature = None;
3434        let mut nothing = true;
3435        while let Some(key) = map.next_key::<&str>()? {
3436            nothing = false;
3437            match key {
3438                "member" => {
3439                    if field_member.is_some() {
3440                        return Err(::serde::de::Error::duplicate_field("member"));
3441                    }
3442                    field_member = Some(map.next_value()?);
3443                }
3444                "result" => {
3445                    if field_result.is_some() {
3446                        return Err(::serde::de::Error::duplicate_field("result"));
3447                    }
3448                    field_result = Some(map.next_value()?);
3449                }
3450                "sckey_sha1" => {
3451                    if field_sckey_sha1.is_some() {
3452                        return Err(::serde::de::Error::duplicate_field("sckey_sha1"));
3453                    }
3454                    field_sckey_sha1 = Some(map.next_value()?);
3455                }
3456                "invitation_signature" => {
3457                    if field_invitation_signature.is_some() {
3458                        return Err(::serde::de::Error::duplicate_field("invitation_signature"));
3459                    }
3460                    field_invitation_signature = Some(map.next_value()?);
3461                }
3462                _ => {
3463                    // unknown field allowed and ignored
3464                    map.next_value::<::serde_json::Value>()?;
3465                }
3466            }
3467        }
3468        if optional && nothing {
3469            return Ok(None);
3470        }
3471        let result = FileMemberActionResult {
3472            member: field_member.ok_or_else(|| ::serde::de::Error::missing_field("member"))?,
3473            result: field_result.ok_or_else(|| ::serde::de::Error::missing_field("result"))?,
3474            sckey_sha1: field_sckey_sha1.and_then(Option::flatten),
3475            invitation_signature: field_invitation_signature.and_then(Option::flatten),
3476        };
3477        Ok(Some(result))
3478    }
3479
3480    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
3481        &self,
3482        s: &mut S::SerializeStruct,
3483    ) -> Result<(), S::Error> {
3484        use serde::ser::SerializeStruct;
3485        s.serialize_field("member", &self.member)?;
3486        s.serialize_field("result", &self.result)?;
3487        if let Some(val) = &self.sckey_sha1 {
3488            s.serialize_field("sckey_sha1", val)?;
3489        }
3490        if let Some(val) = &self.invitation_signature {
3491            s.serialize_field("invitation_signature", val)?;
3492        }
3493        Ok(())
3494    }
3495}
3496
3497impl<'de> ::serde::de::Deserialize<'de> for FileMemberActionResult {
3498    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3499        // struct deserializer
3500        use serde::de::{MapAccess, Visitor};
3501        struct StructVisitor;
3502        impl<'de> Visitor<'de> for StructVisitor {
3503            type Value = FileMemberActionResult;
3504            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
3505                f.write_str("a FileMemberActionResult struct")
3506            }
3507            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
3508                FileMemberActionResult::internal_deserialize(map)
3509            }
3510        }
3511        deserializer.deserialize_struct("FileMemberActionResult", FILE_MEMBER_ACTION_RESULT_FIELDS, StructVisitor)
3512    }
3513}
3514
3515impl ::serde::ser::Serialize for FileMemberActionResult {
3516    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3517        // struct serializer
3518        use serde::ser::SerializeStruct;
3519        let mut s = serializer.serialize_struct("FileMemberActionResult", 4)?;
3520        self.internal_serialize::<S>(&mut s)?;
3521        s.end()
3522    }
3523}
3524
3525#[derive(Debug, Clone, PartialEq, Eq)]
3526#[non_exhaustive] // variants may be added in the future
3527pub enum FileMemberRemoveActionResult {
3528    /// Member was successfully removed from this file.
3529    Success(MemberAccessLevelResult),
3530    /// User was not able to remove this member.
3531    MemberError(FileMemberActionError),
3532    /// Catch-all used for unrecognized values returned from the server. Encountering this value
3533    /// typically indicates that this SDK version is out of date.
3534    Other,
3535}
3536
3537impl<'de> ::serde::de::Deserialize<'de> for FileMemberRemoveActionResult {
3538    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3539        // union deserializer
3540        use serde::de::{self, MapAccess, Visitor};
3541        struct EnumVisitor;
3542        impl<'de> Visitor<'de> for EnumVisitor {
3543            type Value = FileMemberRemoveActionResult;
3544            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
3545                f.write_str("a FileMemberRemoveActionResult structure")
3546            }
3547            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
3548                let tag: &str = match map.next_key()? {
3549                    Some(".tag") => map.next_value()?,
3550                    _ => return Err(de::Error::missing_field(".tag"))
3551                };
3552                let value = match tag {
3553                    "success" => FileMemberRemoveActionResult::Success(MemberAccessLevelResult::internal_deserialize(&mut map)?),
3554                    "member_error" => {
3555                        match map.next_key()? {
3556                            Some("member_error") => FileMemberRemoveActionResult::MemberError(map.next_value()?),
3557                            None => return Err(de::Error::missing_field("member_error")),
3558                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
3559                        }
3560                    }
3561                    _ => FileMemberRemoveActionResult::Other,
3562                };
3563                crate::eat_json_fields(&mut map)?;
3564                Ok(value)
3565            }
3566        }
3567        const VARIANTS: &[&str] = &["success",
3568                                    "member_error",
3569                                    "other"];
3570        deserializer.deserialize_struct("FileMemberRemoveActionResult", VARIANTS, EnumVisitor)
3571    }
3572}
3573
3574impl ::serde::ser::Serialize for FileMemberRemoveActionResult {
3575    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3576        // union serializer
3577        use serde::ser::SerializeStruct;
3578        match self {
3579            FileMemberRemoveActionResult::Success(x) => {
3580                // struct
3581                let mut s = serializer.serialize_struct("FileMemberRemoveActionResult", 4)?;
3582                s.serialize_field(".tag", "success")?;
3583                x.internal_serialize::<S>(&mut s)?;
3584                s.end()
3585            }
3586            FileMemberRemoveActionResult::MemberError(x) => {
3587                // union or polymporphic struct
3588                let mut s = serializer.serialize_struct("FileMemberRemoveActionResult", 2)?;
3589                s.serialize_field(".tag", "member_error")?;
3590                s.serialize_field("member_error", x)?;
3591                s.end()
3592            }
3593            FileMemberRemoveActionResult::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
3594        }
3595    }
3596}
3597
3598/// Whether the user is allowed to take the sharing action on the file.
3599#[derive(Debug, Clone, PartialEq, Eq)]
3600#[non_exhaustive] // structs may have more fields added in the future.
3601pub struct FilePermission {
3602    /// The action that the user may wish to take on the file.
3603    pub action: FileAction,
3604    /// True if the user is allowed to take the action.
3605    pub allow: bool,
3606    /// The reason why the user is denied the permission. Not present if the action is allowed.
3607    pub reason: Option<PermissionDeniedReason>,
3608}
3609
3610impl FilePermission {
3611    pub fn new(action: FileAction, allow: bool) -> Self {
3612        FilePermission {
3613            action,
3614            allow,
3615            reason: None,
3616        }
3617    }
3618
3619    pub fn with_reason(mut self, value: PermissionDeniedReason) -> Self {
3620        self.reason = Some(value);
3621        self
3622    }
3623}
3624
3625const FILE_PERMISSION_FIELDS: &[&str] = &["action",
3626                                          "allow",
3627                                          "reason"];
3628impl FilePermission {
3629    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
3630        map: V,
3631    ) -> Result<FilePermission, V::Error> {
3632        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
3633    }
3634
3635    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
3636        mut map: V,
3637        optional: bool,
3638    ) -> Result<Option<FilePermission>, V::Error> {
3639        let mut field_action = None;
3640        let mut field_allow = None;
3641        let mut field_reason = None;
3642        let mut nothing = true;
3643        while let Some(key) = map.next_key::<&str>()? {
3644            nothing = false;
3645            match key {
3646                "action" => {
3647                    if field_action.is_some() {
3648                        return Err(::serde::de::Error::duplicate_field("action"));
3649                    }
3650                    field_action = Some(map.next_value()?);
3651                }
3652                "allow" => {
3653                    if field_allow.is_some() {
3654                        return Err(::serde::de::Error::duplicate_field("allow"));
3655                    }
3656                    field_allow = Some(map.next_value()?);
3657                }
3658                "reason" => {
3659                    if field_reason.is_some() {
3660                        return Err(::serde::de::Error::duplicate_field("reason"));
3661                    }
3662                    field_reason = Some(map.next_value()?);
3663                }
3664                _ => {
3665                    // unknown field allowed and ignored
3666                    map.next_value::<::serde_json::Value>()?;
3667                }
3668            }
3669        }
3670        if optional && nothing {
3671            return Ok(None);
3672        }
3673        let result = FilePermission {
3674            action: field_action.ok_or_else(|| ::serde::de::Error::missing_field("action"))?,
3675            allow: field_allow.ok_or_else(|| ::serde::de::Error::missing_field("allow"))?,
3676            reason: field_reason.and_then(Option::flatten),
3677        };
3678        Ok(Some(result))
3679    }
3680
3681    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
3682        &self,
3683        s: &mut S::SerializeStruct,
3684    ) -> Result<(), S::Error> {
3685        use serde::ser::SerializeStruct;
3686        s.serialize_field("action", &self.action)?;
3687        s.serialize_field("allow", &self.allow)?;
3688        if let Some(val) = &self.reason {
3689            s.serialize_field("reason", val)?;
3690        }
3691        Ok(())
3692    }
3693}
3694
3695impl<'de> ::serde::de::Deserialize<'de> for FilePermission {
3696    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3697        // struct deserializer
3698        use serde::de::{MapAccess, Visitor};
3699        struct StructVisitor;
3700        impl<'de> Visitor<'de> for StructVisitor {
3701            type Value = FilePermission;
3702            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
3703                f.write_str("a FilePermission struct")
3704            }
3705            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
3706                FilePermission::internal_deserialize(map)
3707            }
3708        }
3709        deserializer.deserialize_struct("FilePermission", FILE_PERMISSION_FIELDS, StructVisitor)
3710    }
3711}
3712
3713impl ::serde::ser::Serialize for FilePermission {
3714    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3715        // struct serializer
3716        use serde::ser::SerializeStruct;
3717        let mut s = serializer.serialize_struct("FilePermission", 3)?;
3718        self.internal_serialize::<S>(&mut s)?;
3719        s.end()
3720    }
3721}
3722
3723/// Actions that may be taken on shared folders.
3724#[derive(Debug, Clone, PartialEq, Eq)]
3725#[non_exhaustive] // variants may be added in the future
3726pub enum FolderAction {
3727    /// Change folder options, such as who can be invited to join the folder.
3728    ChangeOptions,
3729    /// Disable viewer information for this folder.
3730    DisableViewerInfo,
3731    /// Change or edit contents of the folder.
3732    EditContents,
3733    /// Enable viewer information on the folder.
3734    EnableViewerInfo,
3735    /// Invite a user or group to join the folder with read and write permission.
3736    InviteEditor,
3737    /// Invite a user or group to join the folder with read permission.
3738    InviteViewer,
3739    /// Invite a user or group to join the folder with read permission but no comment permissions.
3740    InviteViewerNoComment,
3741    /// Relinquish one's own membership in the folder.
3742    RelinquishMembership,
3743    /// Unmount the folder.
3744    Unmount,
3745    /// Stop sharing this folder.
3746    Unshare,
3747    /// Keep a copy of the contents upon leaving or being kicked from the folder.
3748    LeaveACopy,
3749    /// Use create_view_link and create_edit_link instead.
3750    ShareLink,
3751    /// Use create_view_link and create_edit_link instead.
3752    CreateLink,
3753    /// Create a shared link that only allows users to view the content.
3754    CreateViewLink,
3755    /// Create a shared link that allows users to edit the content.
3756    CreateEditLink,
3757    /// Set whether the folder inherits permissions from its parent.
3758    SetAccessInheritance,
3759    /// Catch-all used for unrecognized values returned from the server. Encountering this value
3760    /// typically indicates that this SDK version is out of date.
3761    Other,
3762}
3763
3764impl<'de> ::serde::de::Deserialize<'de> for FolderAction {
3765    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3766        // union deserializer
3767        use serde::de::{self, MapAccess, Visitor};
3768        struct EnumVisitor;
3769        impl<'de> Visitor<'de> for EnumVisitor {
3770            type Value = FolderAction;
3771            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
3772                f.write_str("a FolderAction structure")
3773            }
3774            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
3775                let tag: &str = match map.next_key()? {
3776                    Some(".tag") => map.next_value()?,
3777                    _ => return Err(de::Error::missing_field(".tag"))
3778                };
3779                let value = match tag {
3780                    "change_options" => FolderAction::ChangeOptions,
3781                    "disable_viewer_info" => FolderAction::DisableViewerInfo,
3782                    "edit_contents" => FolderAction::EditContents,
3783                    "enable_viewer_info" => FolderAction::EnableViewerInfo,
3784                    "invite_editor" => FolderAction::InviteEditor,
3785                    "invite_viewer" => FolderAction::InviteViewer,
3786                    "invite_viewer_no_comment" => FolderAction::InviteViewerNoComment,
3787                    "relinquish_membership" => FolderAction::RelinquishMembership,
3788                    "unmount" => FolderAction::Unmount,
3789                    "unshare" => FolderAction::Unshare,
3790                    "leave_a_copy" => FolderAction::LeaveACopy,
3791                    "share_link" => FolderAction::ShareLink,
3792                    "create_link" => FolderAction::CreateLink,
3793                    "create_view_link" => FolderAction::CreateViewLink,
3794                    "create_edit_link" => FolderAction::CreateEditLink,
3795                    "set_access_inheritance" => FolderAction::SetAccessInheritance,
3796                    _ => FolderAction::Other,
3797                };
3798                crate::eat_json_fields(&mut map)?;
3799                Ok(value)
3800            }
3801        }
3802        const VARIANTS: &[&str] = &["change_options",
3803                                    "disable_viewer_info",
3804                                    "edit_contents",
3805                                    "enable_viewer_info",
3806                                    "invite_editor",
3807                                    "invite_viewer",
3808                                    "invite_viewer_no_comment",
3809                                    "relinquish_membership",
3810                                    "unmount",
3811                                    "unshare",
3812                                    "leave_a_copy",
3813                                    "share_link",
3814                                    "create_link",
3815                                    "create_view_link",
3816                                    "create_edit_link",
3817                                    "set_access_inheritance",
3818                                    "other"];
3819        deserializer.deserialize_struct("FolderAction", VARIANTS, EnumVisitor)
3820    }
3821}
3822
3823impl ::serde::ser::Serialize for FolderAction {
3824    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3825        // union serializer
3826        use serde::ser::SerializeStruct;
3827        match self {
3828            FolderAction::ChangeOptions => {
3829                // unit
3830                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3831                s.serialize_field(".tag", "change_options")?;
3832                s.end()
3833            }
3834            FolderAction::DisableViewerInfo => {
3835                // unit
3836                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3837                s.serialize_field(".tag", "disable_viewer_info")?;
3838                s.end()
3839            }
3840            FolderAction::EditContents => {
3841                // unit
3842                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3843                s.serialize_field(".tag", "edit_contents")?;
3844                s.end()
3845            }
3846            FolderAction::EnableViewerInfo => {
3847                // unit
3848                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3849                s.serialize_field(".tag", "enable_viewer_info")?;
3850                s.end()
3851            }
3852            FolderAction::InviteEditor => {
3853                // unit
3854                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3855                s.serialize_field(".tag", "invite_editor")?;
3856                s.end()
3857            }
3858            FolderAction::InviteViewer => {
3859                // unit
3860                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3861                s.serialize_field(".tag", "invite_viewer")?;
3862                s.end()
3863            }
3864            FolderAction::InviteViewerNoComment => {
3865                // unit
3866                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3867                s.serialize_field(".tag", "invite_viewer_no_comment")?;
3868                s.end()
3869            }
3870            FolderAction::RelinquishMembership => {
3871                // unit
3872                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3873                s.serialize_field(".tag", "relinquish_membership")?;
3874                s.end()
3875            }
3876            FolderAction::Unmount => {
3877                // unit
3878                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3879                s.serialize_field(".tag", "unmount")?;
3880                s.end()
3881            }
3882            FolderAction::Unshare => {
3883                // unit
3884                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3885                s.serialize_field(".tag", "unshare")?;
3886                s.end()
3887            }
3888            FolderAction::LeaveACopy => {
3889                // unit
3890                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3891                s.serialize_field(".tag", "leave_a_copy")?;
3892                s.end()
3893            }
3894            FolderAction::ShareLink => {
3895                // unit
3896                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3897                s.serialize_field(".tag", "share_link")?;
3898                s.end()
3899            }
3900            FolderAction::CreateLink => {
3901                // unit
3902                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3903                s.serialize_field(".tag", "create_link")?;
3904                s.end()
3905            }
3906            FolderAction::CreateViewLink => {
3907                // unit
3908                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3909                s.serialize_field(".tag", "create_view_link")?;
3910                s.end()
3911            }
3912            FolderAction::CreateEditLink => {
3913                // unit
3914                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3915                s.serialize_field(".tag", "create_edit_link")?;
3916                s.end()
3917            }
3918            FolderAction::SetAccessInheritance => {
3919                // unit
3920                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3921                s.serialize_field(".tag", "set_access_inheritance")?;
3922                s.end()
3923            }
3924            FolderAction::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
3925        }
3926    }
3927}
3928
3929/// The metadata of a folder shared link.
3930#[derive(Debug, Clone, PartialEq, Eq)]
3931#[non_exhaustive] // structs may have more fields added in the future.
3932pub struct FolderLinkMetadata {
3933    /// URL of the shared link.
3934    pub url: String,
3935    /// The linked file name (including extension). This never contains a slash.
3936    pub name: String,
3937    /// The link's access permissions.
3938    pub link_permissions: LinkPermissions,
3939    /// A unique identifier for the linked file.
3940    pub id: Option<Id>,
3941    /// Expiration time, if set. By default the link won't expire.
3942    pub expires: Option<crate::types::common::DropboxTimestamp>,
3943    /// The lowercased full path in the user's Dropbox. This always starts with a slash. This field
3944    /// will only be present only if the linked file is in the authenticated user's dropbox and the
3945    /// user is the owner of the link.
3946    pub path_lower: Option<String>,
3947    /// The team membership information of the link's owner.  This field will only be present if the
3948    /// link's owner is a team member.
3949    pub team_member_info: Option<TeamMemberInfo>,
3950    /// The team information of the content's owner. This field will only be present if the
3951    /// content's owner is a team member and the content's owner team is different from the link's
3952    /// owner team.
3953    pub content_owner_team_info: Option<TeamInfo>,
3954}
3955
3956impl FolderLinkMetadata {
3957    pub fn new(url: String, name: String, link_permissions: LinkPermissions) -> Self {
3958        FolderLinkMetadata {
3959            url,
3960            name,
3961            link_permissions,
3962            id: None,
3963            expires: None,
3964            path_lower: None,
3965            team_member_info: None,
3966            content_owner_team_info: None,
3967        }
3968    }
3969
3970    pub fn with_id(mut self, value: Id) -> Self {
3971        self.id = Some(value);
3972        self
3973    }
3974
3975    pub fn with_expires(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
3976        self.expires = Some(value);
3977        self
3978    }
3979
3980    pub fn with_path_lower(mut self, value: String) -> Self {
3981        self.path_lower = Some(value);
3982        self
3983    }
3984
3985    pub fn with_team_member_info(mut self, value: TeamMemberInfo) -> Self {
3986        self.team_member_info = Some(value);
3987        self
3988    }
3989
3990    pub fn with_content_owner_team_info(mut self, value: TeamInfo) -> Self {
3991        self.content_owner_team_info = Some(value);
3992        self
3993    }
3994}
3995
3996const FOLDER_LINK_METADATA_FIELDS: &[&str] = &["url",
3997                                               "name",
3998                                               "link_permissions",
3999                                               "id",
4000                                               "expires",
4001                                               "path_lower",
4002                                               "team_member_info",
4003                                               "content_owner_team_info"];
4004impl FolderLinkMetadata {
4005    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
4006        map: V,
4007    ) -> Result<FolderLinkMetadata, V::Error> {
4008        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
4009    }
4010
4011    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
4012        mut map: V,
4013        optional: bool,
4014    ) -> Result<Option<FolderLinkMetadata>, V::Error> {
4015        let mut field_url = None;
4016        let mut field_name = None;
4017        let mut field_link_permissions = None;
4018        let mut field_id = None;
4019        let mut field_expires = None;
4020        let mut field_path_lower = None;
4021        let mut field_team_member_info = None;
4022        let mut field_content_owner_team_info = None;
4023        let mut nothing = true;
4024        while let Some(key) = map.next_key::<&str>()? {
4025            nothing = false;
4026            match key {
4027                "url" => {
4028                    if field_url.is_some() {
4029                        return Err(::serde::de::Error::duplicate_field("url"));
4030                    }
4031                    field_url = Some(map.next_value()?);
4032                }
4033                "name" => {
4034                    if field_name.is_some() {
4035                        return Err(::serde::de::Error::duplicate_field("name"));
4036                    }
4037                    field_name = Some(map.next_value()?);
4038                }
4039                "link_permissions" => {
4040                    if field_link_permissions.is_some() {
4041                        return Err(::serde::de::Error::duplicate_field("link_permissions"));
4042                    }
4043                    field_link_permissions = Some(map.next_value()?);
4044                }
4045                "id" => {
4046                    if field_id.is_some() {
4047                        return Err(::serde::de::Error::duplicate_field("id"));
4048                    }
4049                    field_id = Some(map.next_value()?);
4050                }
4051                "expires" => {
4052                    if field_expires.is_some() {
4053                        return Err(::serde::de::Error::duplicate_field("expires"));
4054                    }
4055                    field_expires = Some(map.next_value()?);
4056                }
4057                "path_lower" => {
4058                    if field_path_lower.is_some() {
4059                        return Err(::serde::de::Error::duplicate_field("path_lower"));
4060                    }
4061                    field_path_lower = Some(map.next_value()?);
4062                }
4063                "team_member_info" => {
4064                    if field_team_member_info.is_some() {
4065                        return Err(::serde::de::Error::duplicate_field("team_member_info"));
4066                    }
4067                    field_team_member_info = Some(map.next_value()?);
4068                }
4069                "content_owner_team_info" => {
4070                    if field_content_owner_team_info.is_some() {
4071                        return Err(::serde::de::Error::duplicate_field("content_owner_team_info"));
4072                    }
4073                    field_content_owner_team_info = Some(map.next_value()?);
4074                }
4075                _ => {
4076                    // unknown field allowed and ignored
4077                    map.next_value::<::serde_json::Value>()?;
4078                }
4079            }
4080        }
4081        if optional && nothing {
4082            return Ok(None);
4083        }
4084        let result = FolderLinkMetadata {
4085            url: field_url.ok_or_else(|| ::serde::de::Error::missing_field("url"))?,
4086            name: field_name.ok_or_else(|| ::serde::de::Error::missing_field("name"))?,
4087            link_permissions: field_link_permissions.ok_or_else(|| ::serde::de::Error::missing_field("link_permissions"))?,
4088            id: field_id.and_then(Option::flatten),
4089            expires: field_expires.and_then(Option::flatten),
4090            path_lower: field_path_lower.and_then(Option::flatten),
4091            team_member_info: field_team_member_info.and_then(Option::flatten),
4092            content_owner_team_info: field_content_owner_team_info.and_then(Option::flatten),
4093        };
4094        Ok(Some(result))
4095    }
4096
4097    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
4098        &self,
4099        s: &mut S::SerializeStruct,
4100    ) -> Result<(), S::Error> {
4101        use serde::ser::SerializeStruct;
4102        s.serialize_field("url", &self.url)?;
4103        s.serialize_field("name", &self.name)?;
4104        s.serialize_field("link_permissions", &self.link_permissions)?;
4105        if let Some(val) = &self.id {
4106            s.serialize_field("id", val)?;
4107        }
4108        if let Some(val) = &self.expires {
4109            s.serialize_field("expires", val)?;
4110        }
4111        if let Some(val) = &self.path_lower {
4112            s.serialize_field("path_lower", val)?;
4113        }
4114        if let Some(val) = &self.team_member_info {
4115            s.serialize_field("team_member_info", val)?;
4116        }
4117        if let Some(val) = &self.content_owner_team_info {
4118            s.serialize_field("content_owner_team_info", val)?;
4119        }
4120        Ok(())
4121    }
4122}
4123
4124impl<'de> ::serde::de::Deserialize<'de> for FolderLinkMetadata {
4125    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4126        // struct deserializer
4127        use serde::de::{MapAccess, Visitor};
4128        struct StructVisitor;
4129        impl<'de> Visitor<'de> for StructVisitor {
4130            type Value = FolderLinkMetadata;
4131            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4132                f.write_str("a FolderLinkMetadata struct")
4133            }
4134            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
4135                FolderLinkMetadata::internal_deserialize(map)
4136            }
4137        }
4138        deserializer.deserialize_struct("FolderLinkMetadata", FOLDER_LINK_METADATA_FIELDS, StructVisitor)
4139    }
4140}
4141
4142impl ::serde::ser::Serialize for FolderLinkMetadata {
4143    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4144        // struct serializer
4145        use serde::ser::SerializeStruct;
4146        let mut s = serializer.serialize_struct("FolderLinkMetadata", 8)?;
4147        self.internal_serialize::<S>(&mut s)?;
4148        s.end()
4149    }
4150}
4151
4152// struct extends polymorphic struct SharedLinkMetadata
4153impl From<FolderLinkMetadata> for SharedLinkMetadata {
4154    fn from(subtype: FolderLinkMetadata) -> Self {
4155        SharedLinkMetadata::Folder(subtype)
4156    }
4157}
4158/// Whether the user is allowed to take the action on the shared folder.
4159#[derive(Debug, Clone, PartialEq, Eq)]
4160#[non_exhaustive] // structs may have more fields added in the future.
4161pub struct FolderPermission {
4162    /// The action that the user may wish to take on the folder.
4163    pub action: FolderAction,
4164    /// True if the user is allowed to take the action.
4165    pub allow: bool,
4166    /// The reason why the user is denied the permission. Not present if the action is allowed, or
4167    /// if no reason is available.
4168    pub reason: Option<PermissionDeniedReason>,
4169}
4170
4171impl FolderPermission {
4172    pub fn new(action: FolderAction, allow: bool) -> Self {
4173        FolderPermission {
4174            action,
4175            allow,
4176            reason: None,
4177        }
4178    }
4179
4180    pub fn with_reason(mut self, value: PermissionDeniedReason) -> Self {
4181        self.reason = Some(value);
4182        self
4183    }
4184}
4185
4186const FOLDER_PERMISSION_FIELDS: &[&str] = &["action",
4187                                            "allow",
4188                                            "reason"];
4189impl FolderPermission {
4190    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
4191        map: V,
4192    ) -> Result<FolderPermission, V::Error> {
4193        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
4194    }
4195
4196    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
4197        mut map: V,
4198        optional: bool,
4199    ) -> Result<Option<FolderPermission>, V::Error> {
4200        let mut field_action = None;
4201        let mut field_allow = None;
4202        let mut field_reason = None;
4203        let mut nothing = true;
4204        while let Some(key) = map.next_key::<&str>()? {
4205            nothing = false;
4206            match key {
4207                "action" => {
4208                    if field_action.is_some() {
4209                        return Err(::serde::de::Error::duplicate_field("action"));
4210                    }
4211                    field_action = Some(map.next_value()?);
4212                }
4213                "allow" => {
4214                    if field_allow.is_some() {
4215                        return Err(::serde::de::Error::duplicate_field("allow"));
4216                    }
4217                    field_allow = Some(map.next_value()?);
4218                }
4219                "reason" => {
4220                    if field_reason.is_some() {
4221                        return Err(::serde::de::Error::duplicate_field("reason"));
4222                    }
4223                    field_reason = Some(map.next_value()?);
4224                }
4225                _ => {
4226                    // unknown field allowed and ignored
4227                    map.next_value::<::serde_json::Value>()?;
4228                }
4229            }
4230        }
4231        if optional && nothing {
4232            return Ok(None);
4233        }
4234        let result = FolderPermission {
4235            action: field_action.ok_or_else(|| ::serde::de::Error::missing_field("action"))?,
4236            allow: field_allow.ok_or_else(|| ::serde::de::Error::missing_field("allow"))?,
4237            reason: field_reason.and_then(Option::flatten),
4238        };
4239        Ok(Some(result))
4240    }
4241
4242    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
4243        &self,
4244        s: &mut S::SerializeStruct,
4245    ) -> Result<(), S::Error> {
4246        use serde::ser::SerializeStruct;
4247        s.serialize_field("action", &self.action)?;
4248        s.serialize_field("allow", &self.allow)?;
4249        if let Some(val) = &self.reason {
4250            s.serialize_field("reason", val)?;
4251        }
4252        Ok(())
4253    }
4254}
4255
4256impl<'de> ::serde::de::Deserialize<'de> for FolderPermission {
4257    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4258        // struct deserializer
4259        use serde::de::{MapAccess, Visitor};
4260        struct StructVisitor;
4261        impl<'de> Visitor<'de> for StructVisitor {
4262            type Value = FolderPermission;
4263            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4264                f.write_str("a FolderPermission struct")
4265            }
4266            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
4267                FolderPermission::internal_deserialize(map)
4268            }
4269        }
4270        deserializer.deserialize_struct("FolderPermission", FOLDER_PERMISSION_FIELDS, StructVisitor)
4271    }
4272}
4273
4274impl ::serde::ser::Serialize for FolderPermission {
4275    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4276        // struct serializer
4277        use serde::ser::SerializeStruct;
4278        let mut s = serializer.serialize_struct("FolderPermission", 3)?;
4279        self.internal_serialize::<S>(&mut s)?;
4280        s.end()
4281    }
4282}
4283
4284/// A set of policies governing membership and privileges for a shared folder.
4285#[derive(Debug, Clone, PartialEq, Eq)]
4286#[non_exhaustive] // structs may have more fields added in the future.
4287pub struct FolderPolicy {
4288    /// Who can add and remove members from this shared folder.
4289    pub acl_update_policy: AclUpdatePolicy,
4290    /// Who links can be shared with.
4291    pub shared_link_policy: SharedLinkPolicy,
4292    /// Who can be a member of this shared folder, as set on the folder itself. The effective policy
4293    /// may differ from this value if the team-wide policy is more restrictive. Present only if the
4294    /// folder is owned by a team.
4295    pub member_policy: Option<MemberPolicy>,
4296    /// Who can be a member of this shared folder, taking into account both the folder and the
4297    /// team-wide policy. This value may differ from that of member_policy if the team-wide policy
4298    /// is more restrictive than the folder policy. Present only if the folder is owned by a team.
4299    pub resolved_member_policy: Option<MemberPolicy>,
4300    /// Who can enable/disable viewer info for this shared folder.
4301    pub viewer_info_policy: Option<ViewerInfoPolicy>,
4302}
4303
4304impl FolderPolicy {
4305    pub fn new(acl_update_policy: AclUpdatePolicy, shared_link_policy: SharedLinkPolicy) -> Self {
4306        FolderPolicy {
4307            acl_update_policy,
4308            shared_link_policy,
4309            member_policy: None,
4310            resolved_member_policy: None,
4311            viewer_info_policy: None,
4312        }
4313    }
4314
4315    pub fn with_member_policy(mut self, value: MemberPolicy) -> Self {
4316        self.member_policy = Some(value);
4317        self
4318    }
4319
4320    pub fn with_resolved_member_policy(mut self, value: MemberPolicy) -> Self {
4321        self.resolved_member_policy = Some(value);
4322        self
4323    }
4324
4325    pub fn with_viewer_info_policy(mut self, value: ViewerInfoPolicy) -> Self {
4326        self.viewer_info_policy = Some(value);
4327        self
4328    }
4329}
4330
4331const FOLDER_POLICY_FIELDS: &[&str] = &["acl_update_policy",
4332                                        "shared_link_policy",
4333                                        "member_policy",
4334                                        "resolved_member_policy",
4335                                        "viewer_info_policy"];
4336impl FolderPolicy {
4337    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
4338        map: V,
4339    ) -> Result<FolderPolicy, V::Error> {
4340        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
4341    }
4342
4343    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
4344        mut map: V,
4345        optional: bool,
4346    ) -> Result<Option<FolderPolicy>, V::Error> {
4347        let mut field_acl_update_policy = None;
4348        let mut field_shared_link_policy = None;
4349        let mut field_member_policy = None;
4350        let mut field_resolved_member_policy = None;
4351        let mut field_viewer_info_policy = None;
4352        let mut nothing = true;
4353        while let Some(key) = map.next_key::<&str>()? {
4354            nothing = false;
4355            match key {
4356                "acl_update_policy" => {
4357                    if field_acl_update_policy.is_some() {
4358                        return Err(::serde::de::Error::duplicate_field("acl_update_policy"));
4359                    }
4360                    field_acl_update_policy = Some(map.next_value()?);
4361                }
4362                "shared_link_policy" => {
4363                    if field_shared_link_policy.is_some() {
4364                        return Err(::serde::de::Error::duplicate_field("shared_link_policy"));
4365                    }
4366                    field_shared_link_policy = Some(map.next_value()?);
4367                }
4368                "member_policy" => {
4369                    if field_member_policy.is_some() {
4370                        return Err(::serde::de::Error::duplicate_field("member_policy"));
4371                    }
4372                    field_member_policy = Some(map.next_value()?);
4373                }
4374                "resolved_member_policy" => {
4375                    if field_resolved_member_policy.is_some() {
4376                        return Err(::serde::de::Error::duplicate_field("resolved_member_policy"));
4377                    }
4378                    field_resolved_member_policy = Some(map.next_value()?);
4379                }
4380                "viewer_info_policy" => {
4381                    if field_viewer_info_policy.is_some() {
4382                        return Err(::serde::de::Error::duplicate_field("viewer_info_policy"));
4383                    }
4384                    field_viewer_info_policy = Some(map.next_value()?);
4385                }
4386                _ => {
4387                    // unknown field allowed and ignored
4388                    map.next_value::<::serde_json::Value>()?;
4389                }
4390            }
4391        }
4392        if optional && nothing {
4393            return Ok(None);
4394        }
4395        let result = FolderPolicy {
4396            acl_update_policy: field_acl_update_policy.ok_or_else(|| ::serde::de::Error::missing_field("acl_update_policy"))?,
4397            shared_link_policy: field_shared_link_policy.ok_or_else(|| ::serde::de::Error::missing_field("shared_link_policy"))?,
4398            member_policy: field_member_policy.and_then(Option::flatten),
4399            resolved_member_policy: field_resolved_member_policy.and_then(Option::flatten),
4400            viewer_info_policy: field_viewer_info_policy.and_then(Option::flatten),
4401        };
4402        Ok(Some(result))
4403    }
4404
4405    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
4406        &self,
4407        s: &mut S::SerializeStruct,
4408    ) -> Result<(), S::Error> {
4409        use serde::ser::SerializeStruct;
4410        s.serialize_field("acl_update_policy", &self.acl_update_policy)?;
4411        s.serialize_field("shared_link_policy", &self.shared_link_policy)?;
4412        if let Some(val) = &self.member_policy {
4413            s.serialize_field("member_policy", val)?;
4414        }
4415        if let Some(val) = &self.resolved_member_policy {
4416            s.serialize_field("resolved_member_policy", val)?;
4417        }
4418        if let Some(val) = &self.viewer_info_policy {
4419            s.serialize_field("viewer_info_policy", val)?;
4420        }
4421        Ok(())
4422    }
4423}
4424
4425impl<'de> ::serde::de::Deserialize<'de> for FolderPolicy {
4426    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4427        // struct deserializer
4428        use serde::de::{MapAccess, Visitor};
4429        struct StructVisitor;
4430        impl<'de> Visitor<'de> for StructVisitor {
4431            type Value = FolderPolicy;
4432            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4433                f.write_str("a FolderPolicy struct")
4434            }
4435            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
4436                FolderPolicy::internal_deserialize(map)
4437            }
4438        }
4439        deserializer.deserialize_struct("FolderPolicy", FOLDER_POLICY_FIELDS, StructVisitor)
4440    }
4441}
4442
4443impl ::serde::ser::Serialize for FolderPolicy {
4444    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4445        // struct serializer
4446        use serde::ser::SerializeStruct;
4447        let mut s = serializer.serialize_struct("FolderPolicy", 5)?;
4448        self.internal_serialize::<S>(&mut s)?;
4449        s.end()
4450    }
4451}
4452
4453/// Arguments of [`get_file_metadata()`](crate::sharing::get_file_metadata).
4454#[derive(Debug, Clone, PartialEq, Eq)]
4455#[non_exhaustive] // structs may have more fields added in the future.
4456pub struct GetFileMetadataArg {
4457    /// The file to query.
4458    pub file: PathOrId,
4459    /// A list of `FileAction`s corresponding to `FilePermission`s that should appear in the
4460    /// response's [`SharedFileMetadata::permissions`](SharedFileMetadata) field describing the
4461    /// actions the authenticated user can perform on the file.
4462    pub actions: Option<Vec<FileAction>>,
4463}
4464
4465impl GetFileMetadataArg {
4466    pub fn new(file: PathOrId) -> Self {
4467        GetFileMetadataArg {
4468            file,
4469            actions: None,
4470        }
4471    }
4472
4473    pub fn with_actions(mut self, value: Vec<FileAction>) -> Self {
4474        self.actions = Some(value);
4475        self
4476    }
4477}
4478
4479const GET_FILE_METADATA_ARG_FIELDS: &[&str] = &["file",
4480                                                "actions"];
4481impl GetFileMetadataArg {
4482    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
4483        map: V,
4484    ) -> Result<GetFileMetadataArg, V::Error> {
4485        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
4486    }
4487
4488    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
4489        mut map: V,
4490        optional: bool,
4491    ) -> Result<Option<GetFileMetadataArg>, V::Error> {
4492        let mut field_file = None;
4493        let mut field_actions = None;
4494        let mut nothing = true;
4495        while let Some(key) = map.next_key::<&str>()? {
4496            nothing = false;
4497            match key {
4498                "file" => {
4499                    if field_file.is_some() {
4500                        return Err(::serde::de::Error::duplicate_field("file"));
4501                    }
4502                    field_file = Some(map.next_value()?);
4503                }
4504                "actions" => {
4505                    if field_actions.is_some() {
4506                        return Err(::serde::de::Error::duplicate_field("actions"));
4507                    }
4508                    field_actions = Some(map.next_value()?);
4509                }
4510                _ => {
4511                    // unknown field allowed and ignored
4512                    map.next_value::<::serde_json::Value>()?;
4513                }
4514            }
4515        }
4516        if optional && nothing {
4517            return Ok(None);
4518        }
4519        let result = GetFileMetadataArg {
4520            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
4521            actions: field_actions.and_then(Option::flatten),
4522        };
4523        Ok(Some(result))
4524    }
4525
4526    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
4527        &self,
4528        s: &mut S::SerializeStruct,
4529    ) -> Result<(), S::Error> {
4530        use serde::ser::SerializeStruct;
4531        s.serialize_field("file", &self.file)?;
4532        if let Some(val) = &self.actions {
4533            s.serialize_field("actions", val)?;
4534        }
4535        Ok(())
4536    }
4537}
4538
4539impl<'de> ::serde::de::Deserialize<'de> for GetFileMetadataArg {
4540    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4541        // struct deserializer
4542        use serde::de::{MapAccess, Visitor};
4543        struct StructVisitor;
4544        impl<'de> Visitor<'de> for StructVisitor {
4545            type Value = GetFileMetadataArg;
4546            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4547                f.write_str("a GetFileMetadataArg struct")
4548            }
4549            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
4550                GetFileMetadataArg::internal_deserialize(map)
4551            }
4552        }
4553        deserializer.deserialize_struct("GetFileMetadataArg", GET_FILE_METADATA_ARG_FIELDS, StructVisitor)
4554    }
4555}
4556
4557impl ::serde::ser::Serialize for GetFileMetadataArg {
4558    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4559        // struct serializer
4560        use serde::ser::SerializeStruct;
4561        let mut s = serializer.serialize_struct("GetFileMetadataArg", 2)?;
4562        self.internal_serialize::<S>(&mut s)?;
4563        s.end()
4564    }
4565}
4566
4567/// Arguments of [`get_file_metadata_batch()`](crate::sharing::get_file_metadata_batch).
4568#[derive(Debug, Clone, PartialEq, Eq)]
4569#[non_exhaustive] // structs may have more fields added in the future.
4570pub struct GetFileMetadataBatchArg {
4571    /// The files to query.
4572    pub files: Vec<PathOrId>,
4573    /// A list of `FileAction`s corresponding to `FilePermission`s that should appear in the
4574    /// response's [`SharedFileMetadata::permissions`](SharedFileMetadata) field describing the
4575    /// actions the authenticated user can perform on the file.
4576    pub actions: Option<Vec<FileAction>>,
4577}
4578
4579impl GetFileMetadataBatchArg {
4580    pub fn new(files: Vec<PathOrId>) -> Self {
4581        GetFileMetadataBatchArg {
4582            files,
4583            actions: None,
4584        }
4585    }
4586
4587    pub fn with_actions(mut self, value: Vec<FileAction>) -> Self {
4588        self.actions = Some(value);
4589        self
4590    }
4591}
4592
4593const GET_FILE_METADATA_BATCH_ARG_FIELDS: &[&str] = &["files",
4594                                                      "actions"];
4595impl GetFileMetadataBatchArg {
4596    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
4597        map: V,
4598    ) -> Result<GetFileMetadataBatchArg, V::Error> {
4599        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
4600    }
4601
4602    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
4603        mut map: V,
4604        optional: bool,
4605    ) -> Result<Option<GetFileMetadataBatchArg>, V::Error> {
4606        let mut field_files = None;
4607        let mut field_actions = None;
4608        let mut nothing = true;
4609        while let Some(key) = map.next_key::<&str>()? {
4610            nothing = false;
4611            match key {
4612                "files" => {
4613                    if field_files.is_some() {
4614                        return Err(::serde::de::Error::duplicate_field("files"));
4615                    }
4616                    field_files = Some(map.next_value()?);
4617                }
4618                "actions" => {
4619                    if field_actions.is_some() {
4620                        return Err(::serde::de::Error::duplicate_field("actions"));
4621                    }
4622                    field_actions = Some(map.next_value()?);
4623                }
4624                _ => {
4625                    // unknown field allowed and ignored
4626                    map.next_value::<::serde_json::Value>()?;
4627                }
4628            }
4629        }
4630        if optional && nothing {
4631            return Ok(None);
4632        }
4633        let result = GetFileMetadataBatchArg {
4634            files: field_files.ok_or_else(|| ::serde::de::Error::missing_field("files"))?,
4635            actions: field_actions.and_then(Option::flatten),
4636        };
4637        Ok(Some(result))
4638    }
4639
4640    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
4641        &self,
4642        s: &mut S::SerializeStruct,
4643    ) -> Result<(), S::Error> {
4644        use serde::ser::SerializeStruct;
4645        s.serialize_field("files", &self.files)?;
4646        if let Some(val) = &self.actions {
4647            s.serialize_field("actions", val)?;
4648        }
4649        Ok(())
4650    }
4651}
4652
4653impl<'de> ::serde::de::Deserialize<'de> for GetFileMetadataBatchArg {
4654    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4655        // struct deserializer
4656        use serde::de::{MapAccess, Visitor};
4657        struct StructVisitor;
4658        impl<'de> Visitor<'de> for StructVisitor {
4659            type Value = GetFileMetadataBatchArg;
4660            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4661                f.write_str("a GetFileMetadataBatchArg struct")
4662            }
4663            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
4664                GetFileMetadataBatchArg::internal_deserialize(map)
4665            }
4666        }
4667        deserializer.deserialize_struct("GetFileMetadataBatchArg", GET_FILE_METADATA_BATCH_ARG_FIELDS, StructVisitor)
4668    }
4669}
4670
4671impl ::serde::ser::Serialize for GetFileMetadataBatchArg {
4672    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4673        // struct serializer
4674        use serde::ser::SerializeStruct;
4675        let mut s = serializer.serialize_struct("GetFileMetadataBatchArg", 2)?;
4676        self.internal_serialize::<S>(&mut s)?;
4677        s.end()
4678    }
4679}
4680
4681/// Per file results of [`get_file_metadata_batch()`](crate::sharing::get_file_metadata_batch).
4682#[derive(Debug, Clone, PartialEq, Eq)]
4683#[non_exhaustive] // structs may have more fields added in the future.
4684pub struct GetFileMetadataBatchResult {
4685    /// This is the input file identifier corresponding to one of
4686    /// [`GetFileMetadataBatchArg::files`](GetFileMetadataBatchArg).
4687    pub file: PathOrId,
4688    /// The result for this particular file.
4689    pub result: GetFileMetadataIndividualResult,
4690}
4691
4692impl GetFileMetadataBatchResult {
4693    pub fn new(file: PathOrId, result: GetFileMetadataIndividualResult) -> Self {
4694        GetFileMetadataBatchResult {
4695            file,
4696            result,
4697        }
4698    }
4699}
4700
4701const GET_FILE_METADATA_BATCH_RESULT_FIELDS: &[&str] = &["file",
4702                                                         "result"];
4703impl GetFileMetadataBatchResult {
4704    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
4705        map: V,
4706    ) -> Result<GetFileMetadataBatchResult, V::Error> {
4707        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
4708    }
4709
4710    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
4711        mut map: V,
4712        optional: bool,
4713    ) -> Result<Option<GetFileMetadataBatchResult>, V::Error> {
4714        let mut field_file = None;
4715        let mut field_result = None;
4716        let mut nothing = true;
4717        while let Some(key) = map.next_key::<&str>()? {
4718            nothing = false;
4719            match key {
4720                "file" => {
4721                    if field_file.is_some() {
4722                        return Err(::serde::de::Error::duplicate_field("file"));
4723                    }
4724                    field_file = Some(map.next_value()?);
4725                }
4726                "result" => {
4727                    if field_result.is_some() {
4728                        return Err(::serde::de::Error::duplicate_field("result"));
4729                    }
4730                    field_result = Some(map.next_value()?);
4731                }
4732                _ => {
4733                    // unknown field allowed and ignored
4734                    map.next_value::<::serde_json::Value>()?;
4735                }
4736            }
4737        }
4738        if optional && nothing {
4739            return Ok(None);
4740        }
4741        let result = GetFileMetadataBatchResult {
4742            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
4743            result: field_result.ok_or_else(|| ::serde::de::Error::missing_field("result"))?,
4744        };
4745        Ok(Some(result))
4746    }
4747
4748    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
4749        &self,
4750        s: &mut S::SerializeStruct,
4751    ) -> Result<(), S::Error> {
4752        use serde::ser::SerializeStruct;
4753        s.serialize_field("file", &self.file)?;
4754        s.serialize_field("result", &self.result)?;
4755        Ok(())
4756    }
4757}
4758
4759impl<'de> ::serde::de::Deserialize<'de> for GetFileMetadataBatchResult {
4760    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4761        // struct deserializer
4762        use serde::de::{MapAccess, Visitor};
4763        struct StructVisitor;
4764        impl<'de> Visitor<'de> for StructVisitor {
4765            type Value = GetFileMetadataBatchResult;
4766            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4767                f.write_str("a GetFileMetadataBatchResult struct")
4768            }
4769            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
4770                GetFileMetadataBatchResult::internal_deserialize(map)
4771            }
4772        }
4773        deserializer.deserialize_struct("GetFileMetadataBatchResult", GET_FILE_METADATA_BATCH_RESULT_FIELDS, StructVisitor)
4774    }
4775}
4776
4777impl ::serde::ser::Serialize for GetFileMetadataBatchResult {
4778    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4779        // struct serializer
4780        use serde::ser::SerializeStruct;
4781        let mut s = serializer.serialize_struct("GetFileMetadataBatchResult", 2)?;
4782        self.internal_serialize::<S>(&mut s)?;
4783        s.end()
4784    }
4785}
4786
4787/// Error result for [`get_file_metadata()`](crate::sharing::get_file_metadata).
4788#[derive(Debug, Clone, PartialEq, Eq)]
4789#[non_exhaustive] // variants may be added in the future
4790pub enum GetFileMetadataError {
4791    UserError(SharingUserError),
4792    AccessError(SharingFileAccessError),
4793    /// Catch-all used for unrecognized values returned from the server. Encountering this value
4794    /// typically indicates that this SDK version is out of date.
4795    Other,
4796}
4797
4798impl<'de> ::serde::de::Deserialize<'de> for GetFileMetadataError {
4799    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4800        // union deserializer
4801        use serde::de::{self, MapAccess, Visitor};
4802        struct EnumVisitor;
4803        impl<'de> Visitor<'de> for EnumVisitor {
4804            type Value = GetFileMetadataError;
4805            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4806                f.write_str("a GetFileMetadataError structure")
4807            }
4808            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
4809                let tag: &str = match map.next_key()? {
4810                    Some(".tag") => map.next_value()?,
4811                    _ => return Err(de::Error::missing_field(".tag"))
4812                };
4813                let value = match tag {
4814                    "user_error" => {
4815                        match map.next_key()? {
4816                            Some("user_error") => GetFileMetadataError::UserError(map.next_value()?),
4817                            None => return Err(de::Error::missing_field("user_error")),
4818                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
4819                        }
4820                    }
4821                    "access_error" => {
4822                        match map.next_key()? {
4823                            Some("access_error") => GetFileMetadataError::AccessError(map.next_value()?),
4824                            None => return Err(de::Error::missing_field("access_error")),
4825                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
4826                        }
4827                    }
4828                    _ => GetFileMetadataError::Other,
4829                };
4830                crate::eat_json_fields(&mut map)?;
4831                Ok(value)
4832            }
4833        }
4834        const VARIANTS: &[&str] = &["user_error",
4835                                    "access_error",
4836                                    "other"];
4837        deserializer.deserialize_struct("GetFileMetadataError", VARIANTS, EnumVisitor)
4838    }
4839}
4840
4841impl ::serde::ser::Serialize for GetFileMetadataError {
4842    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4843        // union serializer
4844        use serde::ser::SerializeStruct;
4845        match self {
4846            GetFileMetadataError::UserError(x) => {
4847                // union or polymporphic struct
4848                let mut s = serializer.serialize_struct("GetFileMetadataError", 2)?;
4849                s.serialize_field(".tag", "user_error")?;
4850                s.serialize_field("user_error", x)?;
4851                s.end()
4852            }
4853            GetFileMetadataError::AccessError(x) => {
4854                // union or polymporphic struct
4855                let mut s = serializer.serialize_struct("GetFileMetadataError", 2)?;
4856                s.serialize_field(".tag", "access_error")?;
4857                s.serialize_field("access_error", x)?;
4858                s.end()
4859            }
4860            GetFileMetadataError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
4861        }
4862    }
4863}
4864
4865impl ::std::error::Error for GetFileMetadataError {
4866    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
4867        match self {
4868            GetFileMetadataError::UserError(inner) => Some(inner),
4869            GetFileMetadataError::AccessError(inner) => Some(inner),
4870            _ => None,
4871        }
4872    }
4873}
4874
4875impl ::std::fmt::Display for GetFileMetadataError {
4876    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4877        match self {
4878            GetFileMetadataError::UserError(inner) => write!(f, "GetFileMetadataError: {}", inner),
4879            GetFileMetadataError::AccessError(inner) => write!(f, "GetFileMetadataError: {}", inner),
4880            _ => write!(f, "{:?}", *self),
4881        }
4882    }
4883}
4884
4885#[derive(Debug, Clone, PartialEq, Eq)]
4886#[non_exhaustive] // variants may be added in the future
4887pub enum GetFileMetadataIndividualResult {
4888    /// The result for this file if it was successful.
4889    Metadata(SharedFileMetadata),
4890    /// The result for this file if it was an error.
4891    AccessError(SharingFileAccessError),
4892    /// Catch-all used for unrecognized values returned from the server. Encountering this value
4893    /// typically indicates that this SDK version is out of date.
4894    Other,
4895}
4896
4897impl<'de> ::serde::de::Deserialize<'de> for GetFileMetadataIndividualResult {
4898    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4899        // union deserializer
4900        use serde::de::{self, MapAccess, Visitor};
4901        struct EnumVisitor;
4902        impl<'de> Visitor<'de> for EnumVisitor {
4903            type Value = GetFileMetadataIndividualResult;
4904            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4905                f.write_str("a GetFileMetadataIndividualResult structure")
4906            }
4907            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
4908                let tag: &str = match map.next_key()? {
4909                    Some(".tag") => map.next_value()?,
4910                    _ => return Err(de::Error::missing_field(".tag"))
4911                };
4912                let value = match tag {
4913                    "metadata" => GetFileMetadataIndividualResult::Metadata(SharedFileMetadata::internal_deserialize(&mut map)?),
4914                    "access_error" => {
4915                        match map.next_key()? {
4916                            Some("access_error") => GetFileMetadataIndividualResult::AccessError(map.next_value()?),
4917                            None => return Err(de::Error::missing_field("access_error")),
4918                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
4919                        }
4920                    }
4921                    _ => GetFileMetadataIndividualResult::Other,
4922                };
4923                crate::eat_json_fields(&mut map)?;
4924                Ok(value)
4925            }
4926        }
4927        const VARIANTS: &[&str] = &["metadata",
4928                                    "access_error",
4929                                    "other"];
4930        deserializer.deserialize_struct("GetFileMetadataIndividualResult", VARIANTS, EnumVisitor)
4931    }
4932}
4933
4934impl ::serde::ser::Serialize for GetFileMetadataIndividualResult {
4935    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4936        // union serializer
4937        use serde::ser::SerializeStruct;
4938        match self {
4939            GetFileMetadataIndividualResult::Metadata(x) => {
4940                // struct
4941                let mut s = serializer.serialize_struct("GetFileMetadataIndividualResult", 15)?;
4942                s.serialize_field(".tag", "metadata")?;
4943                x.internal_serialize::<S>(&mut s)?;
4944                s.end()
4945            }
4946            GetFileMetadataIndividualResult::AccessError(x) => {
4947                // union or polymporphic struct
4948                let mut s = serializer.serialize_struct("GetFileMetadataIndividualResult", 2)?;
4949                s.serialize_field(".tag", "access_error")?;
4950                s.serialize_field("access_error", x)?;
4951                s.end()
4952            }
4953            GetFileMetadataIndividualResult::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
4954        }
4955    }
4956}
4957
4958#[derive(Debug, Clone, PartialEq, Eq)]
4959#[non_exhaustive] // structs may have more fields added in the future.
4960pub struct GetMetadataArgs {
4961    /// The ID for the shared folder.
4962    pub shared_folder_id: crate::types::common::SharedFolderId,
4963    /// A list of `FolderAction`s corresponding to `FolderPermission`s that should appear in the
4964    /// response's [`SharedFolderMetadata::permissions`](SharedFolderMetadata) field describing the
4965    /// actions the authenticated user can perform on the folder.
4966    pub actions: Option<Vec<FolderAction>>,
4967}
4968
4969impl GetMetadataArgs {
4970    pub fn new(shared_folder_id: crate::types::common::SharedFolderId) -> Self {
4971        GetMetadataArgs {
4972            shared_folder_id,
4973            actions: None,
4974        }
4975    }
4976
4977    pub fn with_actions(mut self, value: Vec<FolderAction>) -> Self {
4978        self.actions = Some(value);
4979        self
4980    }
4981}
4982
4983const GET_METADATA_ARGS_FIELDS: &[&str] = &["shared_folder_id",
4984                                            "actions"];
4985impl GetMetadataArgs {
4986    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
4987        map: V,
4988    ) -> Result<GetMetadataArgs, V::Error> {
4989        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
4990    }
4991
4992    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
4993        mut map: V,
4994        optional: bool,
4995    ) -> Result<Option<GetMetadataArgs>, V::Error> {
4996        let mut field_shared_folder_id = None;
4997        let mut field_actions = None;
4998        let mut nothing = true;
4999        while let Some(key) = map.next_key::<&str>()? {
5000            nothing = false;
5001            match key {
5002                "shared_folder_id" => {
5003                    if field_shared_folder_id.is_some() {
5004                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
5005                    }
5006                    field_shared_folder_id = Some(map.next_value()?);
5007                }
5008                "actions" => {
5009                    if field_actions.is_some() {
5010                        return Err(::serde::de::Error::duplicate_field("actions"));
5011                    }
5012                    field_actions = Some(map.next_value()?);
5013                }
5014                _ => {
5015                    // unknown field allowed and ignored
5016                    map.next_value::<::serde_json::Value>()?;
5017                }
5018            }
5019        }
5020        if optional && nothing {
5021            return Ok(None);
5022        }
5023        let result = GetMetadataArgs {
5024            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
5025            actions: field_actions.and_then(Option::flatten),
5026        };
5027        Ok(Some(result))
5028    }
5029
5030    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
5031        &self,
5032        s: &mut S::SerializeStruct,
5033    ) -> Result<(), S::Error> {
5034        use serde::ser::SerializeStruct;
5035        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
5036        if let Some(val) = &self.actions {
5037            s.serialize_field("actions", val)?;
5038        }
5039        Ok(())
5040    }
5041}
5042
5043impl<'de> ::serde::de::Deserialize<'de> for GetMetadataArgs {
5044    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5045        // struct deserializer
5046        use serde::de::{MapAccess, Visitor};
5047        struct StructVisitor;
5048        impl<'de> Visitor<'de> for StructVisitor {
5049            type Value = GetMetadataArgs;
5050            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5051                f.write_str("a GetMetadataArgs struct")
5052            }
5053            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
5054                GetMetadataArgs::internal_deserialize(map)
5055            }
5056        }
5057        deserializer.deserialize_struct("GetMetadataArgs", GET_METADATA_ARGS_FIELDS, StructVisitor)
5058    }
5059}
5060
5061impl ::serde::ser::Serialize for GetMetadataArgs {
5062    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5063        // struct serializer
5064        use serde::ser::SerializeStruct;
5065        let mut s = serializer.serialize_struct("GetMetadataArgs", 2)?;
5066        self.internal_serialize::<S>(&mut s)?;
5067        s.end()
5068    }
5069}
5070
5071#[derive(Debug, Clone, PartialEq, Eq)]
5072#[non_exhaustive] // variants may be added in the future
5073pub enum GetSharedLinkFileError {
5074    /// The shared link wasn't found.
5075    SharedLinkNotFound,
5076    /// The caller is not allowed to access this shared link.
5077    SharedLinkAccessDenied,
5078    /// This type of link is not supported; use [`files::export()`](crate::files::export) instead.
5079    UnsupportedLinkType,
5080    /// Private shared links do not support `path` or `link_password` parameter fields.
5081    UnsupportedParameterField,
5082    /// Directories cannot be retrieved by this endpoint.
5083    SharedLinkIsDirectory,
5084    /// Catch-all used for unrecognized values returned from the server. Encountering this value
5085    /// typically indicates that this SDK version is out of date.
5086    Other,
5087}
5088
5089impl<'de> ::serde::de::Deserialize<'de> for GetSharedLinkFileError {
5090    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5091        // union deserializer
5092        use serde::de::{self, MapAccess, Visitor};
5093        struct EnumVisitor;
5094        impl<'de> Visitor<'de> for EnumVisitor {
5095            type Value = GetSharedLinkFileError;
5096            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5097                f.write_str("a GetSharedLinkFileError structure")
5098            }
5099            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
5100                let tag: &str = match map.next_key()? {
5101                    Some(".tag") => map.next_value()?,
5102                    _ => return Err(de::Error::missing_field(".tag"))
5103                };
5104                let value = match tag {
5105                    "shared_link_not_found" => GetSharedLinkFileError::SharedLinkNotFound,
5106                    "shared_link_access_denied" => GetSharedLinkFileError::SharedLinkAccessDenied,
5107                    "unsupported_link_type" => GetSharedLinkFileError::UnsupportedLinkType,
5108                    "unsupported_parameter_field" => GetSharedLinkFileError::UnsupportedParameterField,
5109                    "shared_link_is_directory" => GetSharedLinkFileError::SharedLinkIsDirectory,
5110                    _ => GetSharedLinkFileError::Other,
5111                };
5112                crate::eat_json_fields(&mut map)?;
5113                Ok(value)
5114            }
5115        }
5116        const VARIANTS: &[&str] = &["shared_link_not_found",
5117                                    "shared_link_access_denied",
5118                                    "unsupported_link_type",
5119                                    "unsupported_parameter_field",
5120                                    "other",
5121                                    "shared_link_is_directory"];
5122        deserializer.deserialize_struct("GetSharedLinkFileError", VARIANTS, EnumVisitor)
5123    }
5124}
5125
5126impl ::serde::ser::Serialize for GetSharedLinkFileError {
5127    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5128        // union serializer
5129        use serde::ser::SerializeStruct;
5130        match self {
5131            GetSharedLinkFileError::SharedLinkNotFound => {
5132                // unit
5133                let mut s = serializer.serialize_struct("GetSharedLinkFileError", 1)?;
5134                s.serialize_field(".tag", "shared_link_not_found")?;
5135                s.end()
5136            }
5137            GetSharedLinkFileError::SharedLinkAccessDenied => {
5138                // unit
5139                let mut s = serializer.serialize_struct("GetSharedLinkFileError", 1)?;
5140                s.serialize_field(".tag", "shared_link_access_denied")?;
5141                s.end()
5142            }
5143            GetSharedLinkFileError::UnsupportedLinkType => {
5144                // unit
5145                let mut s = serializer.serialize_struct("GetSharedLinkFileError", 1)?;
5146                s.serialize_field(".tag", "unsupported_link_type")?;
5147                s.end()
5148            }
5149            GetSharedLinkFileError::UnsupportedParameterField => {
5150                // unit
5151                let mut s = serializer.serialize_struct("GetSharedLinkFileError", 1)?;
5152                s.serialize_field(".tag", "unsupported_parameter_field")?;
5153                s.end()
5154            }
5155            GetSharedLinkFileError::SharedLinkIsDirectory => {
5156                // unit
5157                let mut s = serializer.serialize_struct("GetSharedLinkFileError", 1)?;
5158                s.serialize_field(".tag", "shared_link_is_directory")?;
5159                s.end()
5160            }
5161            GetSharedLinkFileError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
5162        }
5163    }
5164}
5165
5166impl ::std::error::Error for GetSharedLinkFileError {
5167}
5168
5169impl ::std::fmt::Display for GetSharedLinkFileError {
5170    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5171        match self {
5172            GetSharedLinkFileError::SharedLinkNotFound => f.write_str("The shared link wasn't found."),
5173            GetSharedLinkFileError::SharedLinkAccessDenied => f.write_str("The caller is not allowed to access this shared link."),
5174            GetSharedLinkFileError::UnsupportedParameterField => f.write_str("Private shared links do not support `path` or `link_password` parameter fields."),
5175            GetSharedLinkFileError::SharedLinkIsDirectory => f.write_str("Directories cannot be retrieved by this endpoint."),
5176            _ => write!(f, "{:?}", *self),
5177        }
5178    }
5179}
5180
5181// union extends SharedLinkError
5182impl From<SharedLinkError> for GetSharedLinkFileError {
5183    fn from(parent: SharedLinkError) -> Self {
5184        match parent {
5185            SharedLinkError::SharedLinkNotFound => GetSharedLinkFileError::SharedLinkNotFound,
5186            SharedLinkError::SharedLinkAccessDenied => GetSharedLinkFileError::SharedLinkAccessDenied,
5187            SharedLinkError::UnsupportedLinkType => GetSharedLinkFileError::UnsupportedLinkType,
5188            SharedLinkError::UnsupportedParameterField => GetSharedLinkFileError::UnsupportedParameterField,
5189            SharedLinkError::Other => GetSharedLinkFileError::Other,
5190        }
5191    }
5192}
5193#[derive(Debug, Clone, PartialEq, Eq)]
5194#[non_exhaustive] // structs may have more fields added in the future.
5195pub struct GetSharedLinkMetadataArg {
5196    /// URL of the shared link.
5197    pub url: String,
5198    /// If the shared link is to a folder, this parameter can be used to retrieve the metadata for a
5199    /// specific file or sub-folder in this folder. A relative path should be used.
5200    pub path: Option<Path>,
5201    /// If the shared link has a password, this parameter can be used.
5202    pub link_password: Option<String>,
5203}
5204
5205impl GetSharedLinkMetadataArg {
5206    pub fn new(url: String) -> Self {
5207        GetSharedLinkMetadataArg {
5208            url,
5209            path: None,
5210            link_password: None,
5211        }
5212    }
5213
5214    pub fn with_path(mut self, value: Path) -> Self {
5215        self.path = Some(value);
5216        self
5217    }
5218
5219    pub fn with_link_password(mut self, value: String) -> Self {
5220        self.link_password = Some(value);
5221        self
5222    }
5223}
5224
5225const GET_SHARED_LINK_METADATA_ARG_FIELDS: &[&str] = &["url",
5226                                                       "path",
5227                                                       "link_password"];
5228impl GetSharedLinkMetadataArg {
5229    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
5230        map: V,
5231    ) -> Result<GetSharedLinkMetadataArg, V::Error> {
5232        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
5233    }
5234
5235    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
5236        mut map: V,
5237        optional: bool,
5238    ) -> Result<Option<GetSharedLinkMetadataArg>, V::Error> {
5239        let mut field_url = None;
5240        let mut field_path = None;
5241        let mut field_link_password = None;
5242        let mut nothing = true;
5243        while let Some(key) = map.next_key::<&str>()? {
5244            nothing = false;
5245            match key {
5246                "url" => {
5247                    if field_url.is_some() {
5248                        return Err(::serde::de::Error::duplicate_field("url"));
5249                    }
5250                    field_url = Some(map.next_value()?);
5251                }
5252                "path" => {
5253                    if field_path.is_some() {
5254                        return Err(::serde::de::Error::duplicate_field("path"));
5255                    }
5256                    field_path = Some(map.next_value()?);
5257                }
5258                "link_password" => {
5259                    if field_link_password.is_some() {
5260                        return Err(::serde::de::Error::duplicate_field("link_password"));
5261                    }
5262                    field_link_password = Some(map.next_value()?);
5263                }
5264                _ => {
5265                    // unknown field allowed and ignored
5266                    map.next_value::<::serde_json::Value>()?;
5267                }
5268            }
5269        }
5270        if optional && nothing {
5271            return Ok(None);
5272        }
5273        let result = GetSharedLinkMetadataArg {
5274            url: field_url.ok_or_else(|| ::serde::de::Error::missing_field("url"))?,
5275            path: field_path.and_then(Option::flatten),
5276            link_password: field_link_password.and_then(Option::flatten),
5277        };
5278        Ok(Some(result))
5279    }
5280
5281    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
5282        &self,
5283        s: &mut S::SerializeStruct,
5284    ) -> Result<(), S::Error> {
5285        use serde::ser::SerializeStruct;
5286        s.serialize_field("url", &self.url)?;
5287        if let Some(val) = &self.path {
5288            s.serialize_field("path", val)?;
5289        }
5290        if let Some(val) = &self.link_password {
5291            s.serialize_field("link_password", val)?;
5292        }
5293        Ok(())
5294    }
5295}
5296
5297impl<'de> ::serde::de::Deserialize<'de> for GetSharedLinkMetadataArg {
5298    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5299        // struct deserializer
5300        use serde::de::{MapAccess, Visitor};
5301        struct StructVisitor;
5302        impl<'de> Visitor<'de> for StructVisitor {
5303            type Value = GetSharedLinkMetadataArg;
5304            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5305                f.write_str("a GetSharedLinkMetadataArg struct")
5306            }
5307            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
5308                GetSharedLinkMetadataArg::internal_deserialize(map)
5309            }
5310        }
5311        deserializer.deserialize_struct("GetSharedLinkMetadataArg", GET_SHARED_LINK_METADATA_ARG_FIELDS, StructVisitor)
5312    }
5313}
5314
5315impl ::serde::ser::Serialize for GetSharedLinkMetadataArg {
5316    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5317        // struct serializer
5318        use serde::ser::SerializeStruct;
5319        let mut s = serializer.serialize_struct("GetSharedLinkMetadataArg", 3)?;
5320        self.internal_serialize::<S>(&mut s)?;
5321        s.end()
5322    }
5323}
5324
5325#[derive(Debug, Clone, PartialEq, Eq, Default)]
5326#[non_exhaustive] // structs may have more fields added in the future.
5327pub struct GetSharedLinksArg {
5328    /// See [`get_shared_links()`](crate::sharing::get_shared_links) description.
5329    pub path: Option<String>,
5330}
5331
5332impl GetSharedLinksArg {
5333    pub fn with_path(mut self, value: String) -> Self {
5334        self.path = Some(value);
5335        self
5336    }
5337}
5338
5339const GET_SHARED_LINKS_ARG_FIELDS: &[&str] = &["path"];
5340impl GetSharedLinksArg {
5341    // no _opt deserializer
5342    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
5343        mut map: V,
5344    ) -> Result<GetSharedLinksArg, V::Error> {
5345        let mut field_path = None;
5346        while let Some(key) = map.next_key::<&str>()? {
5347            match key {
5348                "path" => {
5349                    if field_path.is_some() {
5350                        return Err(::serde::de::Error::duplicate_field("path"));
5351                    }
5352                    field_path = Some(map.next_value()?);
5353                }
5354                _ => {
5355                    // unknown field allowed and ignored
5356                    map.next_value::<::serde_json::Value>()?;
5357                }
5358            }
5359        }
5360        let result = GetSharedLinksArg {
5361            path: field_path.and_then(Option::flatten),
5362        };
5363        Ok(result)
5364    }
5365
5366    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
5367        &self,
5368        s: &mut S::SerializeStruct,
5369    ) -> Result<(), S::Error> {
5370        use serde::ser::SerializeStruct;
5371        if let Some(val) = &self.path {
5372            s.serialize_field("path", val)?;
5373        }
5374        Ok(())
5375    }
5376}
5377
5378impl<'de> ::serde::de::Deserialize<'de> for GetSharedLinksArg {
5379    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5380        // struct deserializer
5381        use serde::de::{MapAccess, Visitor};
5382        struct StructVisitor;
5383        impl<'de> Visitor<'de> for StructVisitor {
5384            type Value = GetSharedLinksArg;
5385            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5386                f.write_str("a GetSharedLinksArg struct")
5387            }
5388            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
5389                GetSharedLinksArg::internal_deserialize(map)
5390            }
5391        }
5392        deserializer.deserialize_struct("GetSharedLinksArg", GET_SHARED_LINKS_ARG_FIELDS, StructVisitor)
5393    }
5394}
5395
5396impl ::serde::ser::Serialize for GetSharedLinksArg {
5397    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5398        // struct serializer
5399        use serde::ser::SerializeStruct;
5400        let mut s = serializer.serialize_struct("GetSharedLinksArg", 1)?;
5401        self.internal_serialize::<S>(&mut s)?;
5402        s.end()
5403    }
5404}
5405
5406#[derive(Debug, Clone, PartialEq, Eq)]
5407#[non_exhaustive] // variants may be added in the future
5408pub enum GetSharedLinksError {
5409    Path(crate::types::files::MalformedPathError),
5410    /// Catch-all used for unrecognized values returned from the server. Encountering this value
5411    /// typically indicates that this SDK version is out of date.
5412    Other,
5413}
5414
5415impl<'de> ::serde::de::Deserialize<'de> for GetSharedLinksError {
5416    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5417        // union deserializer
5418        use serde::de::{self, MapAccess, Visitor};
5419        struct EnumVisitor;
5420        impl<'de> Visitor<'de> for EnumVisitor {
5421            type Value = GetSharedLinksError;
5422            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5423                f.write_str("a GetSharedLinksError structure")
5424            }
5425            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
5426                let tag: &str = match map.next_key()? {
5427                    Some(".tag") => map.next_value()?,
5428                    _ => return Err(de::Error::missing_field(".tag"))
5429                };
5430                let value = match tag {
5431                    "path" => {
5432                        match map.next_key()? {
5433                            Some("path") => GetSharedLinksError::Path(map.next_value()?),
5434                            None => GetSharedLinksError::Path(None),
5435                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
5436                        }
5437                    }
5438                    _ => GetSharedLinksError::Other,
5439                };
5440                crate::eat_json_fields(&mut map)?;
5441                Ok(value)
5442            }
5443        }
5444        const VARIANTS: &[&str] = &["path",
5445                                    "other"];
5446        deserializer.deserialize_struct("GetSharedLinksError", VARIANTS, EnumVisitor)
5447    }
5448}
5449
5450impl ::serde::ser::Serialize for GetSharedLinksError {
5451    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5452        // union serializer
5453        use serde::ser::SerializeStruct;
5454        match self {
5455            GetSharedLinksError::Path(x) => {
5456                // nullable (struct or primitive)
5457                let n = if x.is_some() { 2 } else { 1 };
5458                let mut s = serializer.serialize_struct("GetSharedLinksError", n)?;
5459                s.serialize_field(".tag", "path")?;
5460                if let Some(x) = x {
5461                    s.serialize_field("path", &x)?;
5462                }
5463                s.end()
5464            }
5465            GetSharedLinksError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
5466        }
5467    }
5468}
5469
5470impl ::std::error::Error for GetSharedLinksError {
5471}
5472
5473impl ::std::fmt::Display for GetSharedLinksError {
5474    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5475        match self {
5476            GetSharedLinksError::Path(inner) => write!(f, "path: {:?}", inner),
5477            _ => write!(f, "{:?}", *self),
5478        }
5479    }
5480}
5481
5482#[derive(Debug, Clone, PartialEq, Eq)]
5483#[non_exhaustive] // structs may have more fields added in the future.
5484pub struct GetSharedLinksResult {
5485    /// Shared links applicable to the path argument.
5486    pub links: Vec<LinkMetadata>,
5487}
5488
5489impl GetSharedLinksResult {
5490    pub fn new(links: Vec<LinkMetadata>) -> Self {
5491        GetSharedLinksResult {
5492            links,
5493        }
5494    }
5495}
5496
5497const GET_SHARED_LINKS_RESULT_FIELDS: &[&str] = &["links"];
5498impl GetSharedLinksResult {
5499    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
5500        map: V,
5501    ) -> Result<GetSharedLinksResult, V::Error> {
5502        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
5503    }
5504
5505    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
5506        mut map: V,
5507        optional: bool,
5508    ) -> Result<Option<GetSharedLinksResult>, V::Error> {
5509        let mut field_links = None;
5510        let mut nothing = true;
5511        while let Some(key) = map.next_key::<&str>()? {
5512            nothing = false;
5513            match key {
5514                "links" => {
5515                    if field_links.is_some() {
5516                        return Err(::serde::de::Error::duplicate_field("links"));
5517                    }
5518                    field_links = Some(map.next_value()?);
5519                }
5520                _ => {
5521                    // unknown field allowed and ignored
5522                    map.next_value::<::serde_json::Value>()?;
5523                }
5524            }
5525        }
5526        if optional && nothing {
5527            return Ok(None);
5528        }
5529        let result = GetSharedLinksResult {
5530            links: field_links.ok_or_else(|| ::serde::de::Error::missing_field("links"))?,
5531        };
5532        Ok(Some(result))
5533    }
5534
5535    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
5536        &self,
5537        s: &mut S::SerializeStruct,
5538    ) -> Result<(), S::Error> {
5539        use serde::ser::SerializeStruct;
5540        s.serialize_field("links", &self.links)?;
5541        Ok(())
5542    }
5543}
5544
5545impl<'de> ::serde::de::Deserialize<'de> for GetSharedLinksResult {
5546    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5547        // struct deserializer
5548        use serde::de::{MapAccess, Visitor};
5549        struct StructVisitor;
5550        impl<'de> Visitor<'de> for StructVisitor {
5551            type Value = GetSharedLinksResult;
5552            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5553                f.write_str("a GetSharedLinksResult struct")
5554            }
5555            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
5556                GetSharedLinksResult::internal_deserialize(map)
5557            }
5558        }
5559        deserializer.deserialize_struct("GetSharedLinksResult", GET_SHARED_LINKS_RESULT_FIELDS, StructVisitor)
5560    }
5561}
5562
5563impl ::serde::ser::Serialize for GetSharedLinksResult {
5564    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5565        // struct serializer
5566        use serde::ser::SerializeStruct;
5567        let mut s = serializer.serialize_struct("GetSharedLinksResult", 1)?;
5568        self.internal_serialize::<S>(&mut s)?;
5569        s.end()
5570    }
5571}
5572
5573/// The information about a group. Groups is a way to manage a list of users who need same access
5574/// permission to the shared folder.
5575#[derive(Debug, Clone, PartialEq, Eq)]
5576#[non_exhaustive] // structs may have more fields added in the future.
5577pub struct GroupInfo {
5578    pub group_name: String,
5579    pub group_id: crate::types::team_common::GroupId,
5580    /// Who is allowed to manage the group.
5581    pub group_management_type: crate::types::team_common::GroupManagementType,
5582    /// The type of group.
5583    pub group_type: crate::types::team_common::GroupType,
5584    /// If the current user is a member of the group.
5585    pub is_member: bool,
5586    /// If the current user is an owner of the group.
5587    pub is_owner: bool,
5588    /// If the group is owned by the current user's team.
5589    pub same_team: bool,
5590    /// External ID of group. This is an arbitrary ID that an admin can attach to a group.
5591    pub group_external_id: Option<crate::types::team_common::GroupExternalId>,
5592    /// The number of members in the group.
5593    pub member_count: Option<u32>,
5594}
5595
5596impl GroupInfo {
5597    pub fn new(
5598        group_name: String,
5599        group_id: crate::types::team_common::GroupId,
5600        group_management_type: crate::types::team_common::GroupManagementType,
5601        group_type: crate::types::team_common::GroupType,
5602        is_member: bool,
5603        is_owner: bool,
5604        same_team: bool,
5605    ) -> Self {
5606        GroupInfo {
5607            group_name,
5608            group_id,
5609            group_management_type,
5610            group_type,
5611            is_member,
5612            is_owner,
5613            same_team,
5614            group_external_id: None,
5615            member_count: None,
5616        }
5617    }
5618
5619    pub fn with_group_external_id(
5620        mut self,
5621        value: crate::types::team_common::GroupExternalId,
5622    ) -> Self {
5623        self.group_external_id = Some(value);
5624        self
5625    }
5626
5627    pub fn with_member_count(mut self, value: u32) -> Self {
5628        self.member_count = Some(value);
5629        self
5630    }
5631}
5632
5633const GROUP_INFO_FIELDS: &[&str] = &["group_name",
5634                                     "group_id",
5635                                     "group_management_type",
5636                                     "group_type",
5637                                     "is_member",
5638                                     "is_owner",
5639                                     "same_team",
5640                                     "group_external_id",
5641                                     "member_count"];
5642impl GroupInfo {
5643    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
5644        map: V,
5645    ) -> Result<GroupInfo, V::Error> {
5646        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
5647    }
5648
5649    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
5650        mut map: V,
5651        optional: bool,
5652    ) -> Result<Option<GroupInfo>, V::Error> {
5653        let mut field_group_name = None;
5654        let mut field_group_id = None;
5655        let mut field_group_management_type = None;
5656        let mut field_group_type = None;
5657        let mut field_is_member = None;
5658        let mut field_is_owner = None;
5659        let mut field_same_team = None;
5660        let mut field_group_external_id = None;
5661        let mut field_member_count = None;
5662        let mut nothing = true;
5663        while let Some(key) = map.next_key::<&str>()? {
5664            nothing = false;
5665            match key {
5666                "group_name" => {
5667                    if field_group_name.is_some() {
5668                        return Err(::serde::de::Error::duplicate_field("group_name"));
5669                    }
5670                    field_group_name = Some(map.next_value()?);
5671                }
5672                "group_id" => {
5673                    if field_group_id.is_some() {
5674                        return Err(::serde::de::Error::duplicate_field("group_id"));
5675                    }
5676                    field_group_id = Some(map.next_value()?);
5677                }
5678                "group_management_type" => {
5679                    if field_group_management_type.is_some() {
5680                        return Err(::serde::de::Error::duplicate_field("group_management_type"));
5681                    }
5682                    field_group_management_type = Some(map.next_value()?);
5683                }
5684                "group_type" => {
5685                    if field_group_type.is_some() {
5686                        return Err(::serde::de::Error::duplicate_field("group_type"));
5687                    }
5688                    field_group_type = Some(map.next_value()?);
5689                }
5690                "is_member" => {
5691                    if field_is_member.is_some() {
5692                        return Err(::serde::de::Error::duplicate_field("is_member"));
5693                    }
5694                    field_is_member = Some(map.next_value()?);
5695                }
5696                "is_owner" => {
5697                    if field_is_owner.is_some() {
5698                        return Err(::serde::de::Error::duplicate_field("is_owner"));
5699                    }
5700                    field_is_owner = Some(map.next_value()?);
5701                }
5702                "same_team" => {
5703                    if field_same_team.is_some() {
5704                        return Err(::serde::de::Error::duplicate_field("same_team"));
5705                    }
5706                    field_same_team = Some(map.next_value()?);
5707                }
5708                "group_external_id" => {
5709                    if field_group_external_id.is_some() {
5710                        return Err(::serde::de::Error::duplicate_field("group_external_id"));
5711                    }
5712                    field_group_external_id = Some(map.next_value()?);
5713                }
5714                "member_count" => {
5715                    if field_member_count.is_some() {
5716                        return Err(::serde::de::Error::duplicate_field("member_count"));
5717                    }
5718                    field_member_count = Some(map.next_value()?);
5719                }
5720                _ => {
5721                    // unknown field allowed and ignored
5722                    map.next_value::<::serde_json::Value>()?;
5723                }
5724            }
5725        }
5726        if optional && nothing {
5727            return Ok(None);
5728        }
5729        let result = GroupInfo {
5730            group_name: field_group_name.ok_or_else(|| ::serde::de::Error::missing_field("group_name"))?,
5731            group_id: field_group_id.ok_or_else(|| ::serde::de::Error::missing_field("group_id"))?,
5732            group_management_type: field_group_management_type.ok_or_else(|| ::serde::de::Error::missing_field("group_management_type"))?,
5733            group_type: field_group_type.ok_or_else(|| ::serde::de::Error::missing_field("group_type"))?,
5734            is_member: field_is_member.ok_or_else(|| ::serde::de::Error::missing_field("is_member"))?,
5735            is_owner: field_is_owner.ok_or_else(|| ::serde::de::Error::missing_field("is_owner"))?,
5736            same_team: field_same_team.ok_or_else(|| ::serde::de::Error::missing_field("same_team"))?,
5737            group_external_id: field_group_external_id.and_then(Option::flatten),
5738            member_count: field_member_count.and_then(Option::flatten),
5739        };
5740        Ok(Some(result))
5741    }
5742
5743    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
5744        &self,
5745        s: &mut S::SerializeStruct,
5746    ) -> Result<(), S::Error> {
5747        use serde::ser::SerializeStruct;
5748        s.serialize_field("group_name", &self.group_name)?;
5749        s.serialize_field("group_id", &self.group_id)?;
5750        s.serialize_field("group_management_type", &self.group_management_type)?;
5751        s.serialize_field("group_type", &self.group_type)?;
5752        s.serialize_field("is_member", &self.is_member)?;
5753        s.serialize_field("is_owner", &self.is_owner)?;
5754        s.serialize_field("same_team", &self.same_team)?;
5755        if let Some(val) = &self.group_external_id {
5756            s.serialize_field("group_external_id", val)?;
5757        }
5758        if let Some(val) = &self.member_count {
5759            s.serialize_field("member_count", val)?;
5760        }
5761        Ok(())
5762    }
5763}
5764
5765impl<'de> ::serde::de::Deserialize<'de> for GroupInfo {
5766    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5767        // struct deserializer
5768        use serde::de::{MapAccess, Visitor};
5769        struct StructVisitor;
5770        impl<'de> Visitor<'de> for StructVisitor {
5771            type Value = GroupInfo;
5772            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5773                f.write_str("a GroupInfo struct")
5774            }
5775            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
5776                GroupInfo::internal_deserialize(map)
5777            }
5778        }
5779        deserializer.deserialize_struct("GroupInfo", GROUP_INFO_FIELDS, StructVisitor)
5780    }
5781}
5782
5783impl ::serde::ser::Serialize for GroupInfo {
5784    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5785        // struct serializer
5786        use serde::ser::SerializeStruct;
5787        let mut s = serializer.serialize_struct("GroupInfo", 9)?;
5788        self.internal_serialize::<S>(&mut s)?;
5789        s.end()
5790    }
5791}
5792
5793// struct extends crate::types::team_common::GroupSummary
5794impl From<GroupInfo> for crate::types::team_common::GroupSummary {
5795    fn from(subtype: GroupInfo) -> Self {
5796        Self {
5797            group_name: subtype.group_name,
5798            group_id: subtype.group_id,
5799            group_management_type: subtype.group_management_type,
5800            group_external_id: subtype.group_external_id,
5801            member_count: subtype.member_count,
5802        }
5803    }
5804}
5805/// The information about a group member of the shared content.
5806#[derive(Debug, Clone, PartialEq, Eq)]
5807#[non_exhaustive] // structs may have more fields added in the future.
5808pub struct GroupMembershipInfo {
5809    /// The access type for this member. It contains inherited access type from parent folder, and
5810    /// acquired access type from this folder.
5811    pub access_type: AccessLevel,
5812    /// The information about the membership group.
5813    pub group: GroupInfo,
5814    /// The permissions that requesting user has on this member. The set of permissions corresponds
5815    /// to the MemberActions in the request.
5816    pub permissions: Option<Vec<MemberPermission>>,
5817    /// Never set.
5818    pub initials: Option<String>,
5819    /// True if the member has access on a parent folder.
5820    pub is_inherited: bool,
5821}
5822
5823impl GroupMembershipInfo {
5824    pub fn new(access_type: AccessLevel, group: GroupInfo) -> Self {
5825        GroupMembershipInfo {
5826            access_type,
5827            group,
5828            permissions: None,
5829            initials: None,
5830            is_inherited: false,
5831        }
5832    }
5833
5834    pub fn with_permissions(mut self, value: Vec<MemberPermission>) -> Self {
5835        self.permissions = Some(value);
5836        self
5837    }
5838
5839    pub fn with_initials(mut self, value: String) -> Self {
5840        self.initials = Some(value);
5841        self
5842    }
5843
5844    pub fn with_is_inherited(mut self, value: bool) -> Self {
5845        self.is_inherited = value;
5846        self
5847    }
5848}
5849
5850const GROUP_MEMBERSHIP_INFO_FIELDS: &[&str] = &["access_type",
5851                                                "group",
5852                                                "permissions",
5853                                                "initials",
5854                                                "is_inherited"];
5855impl GroupMembershipInfo {
5856    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
5857        map: V,
5858    ) -> Result<GroupMembershipInfo, V::Error> {
5859        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
5860    }
5861
5862    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
5863        mut map: V,
5864        optional: bool,
5865    ) -> Result<Option<GroupMembershipInfo>, V::Error> {
5866        let mut field_access_type = None;
5867        let mut field_group = None;
5868        let mut field_permissions = None;
5869        let mut field_initials = None;
5870        let mut field_is_inherited = None;
5871        let mut nothing = true;
5872        while let Some(key) = map.next_key::<&str>()? {
5873            nothing = false;
5874            match key {
5875                "access_type" => {
5876                    if field_access_type.is_some() {
5877                        return Err(::serde::de::Error::duplicate_field("access_type"));
5878                    }
5879                    field_access_type = Some(map.next_value()?);
5880                }
5881                "group" => {
5882                    if field_group.is_some() {
5883                        return Err(::serde::de::Error::duplicate_field("group"));
5884                    }
5885                    field_group = Some(map.next_value()?);
5886                }
5887                "permissions" => {
5888                    if field_permissions.is_some() {
5889                        return Err(::serde::de::Error::duplicate_field("permissions"));
5890                    }
5891                    field_permissions = Some(map.next_value()?);
5892                }
5893                "initials" => {
5894                    if field_initials.is_some() {
5895                        return Err(::serde::de::Error::duplicate_field("initials"));
5896                    }
5897                    field_initials = Some(map.next_value()?);
5898                }
5899                "is_inherited" => {
5900                    if field_is_inherited.is_some() {
5901                        return Err(::serde::de::Error::duplicate_field("is_inherited"));
5902                    }
5903                    field_is_inherited = Some(map.next_value()?);
5904                }
5905                _ => {
5906                    // unknown field allowed and ignored
5907                    map.next_value::<::serde_json::Value>()?;
5908                }
5909            }
5910        }
5911        if optional && nothing {
5912            return Ok(None);
5913        }
5914        let result = GroupMembershipInfo {
5915            access_type: field_access_type.ok_or_else(|| ::serde::de::Error::missing_field("access_type"))?,
5916            group: field_group.ok_or_else(|| ::serde::de::Error::missing_field("group"))?,
5917            permissions: field_permissions.and_then(Option::flatten),
5918            initials: field_initials.and_then(Option::flatten),
5919            is_inherited: field_is_inherited.unwrap_or(false),
5920        };
5921        Ok(Some(result))
5922    }
5923
5924    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
5925        &self,
5926        s: &mut S::SerializeStruct,
5927    ) -> Result<(), S::Error> {
5928        use serde::ser::SerializeStruct;
5929        s.serialize_field("access_type", &self.access_type)?;
5930        s.serialize_field("group", &self.group)?;
5931        if let Some(val) = &self.permissions {
5932            s.serialize_field("permissions", val)?;
5933        }
5934        if let Some(val) = &self.initials {
5935            s.serialize_field("initials", val)?;
5936        }
5937        if self.is_inherited {
5938            s.serialize_field("is_inherited", &self.is_inherited)?;
5939        }
5940        Ok(())
5941    }
5942}
5943
5944impl<'de> ::serde::de::Deserialize<'de> for GroupMembershipInfo {
5945    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5946        // struct deserializer
5947        use serde::de::{MapAccess, Visitor};
5948        struct StructVisitor;
5949        impl<'de> Visitor<'de> for StructVisitor {
5950            type Value = GroupMembershipInfo;
5951            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5952                f.write_str("a GroupMembershipInfo struct")
5953            }
5954            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
5955                GroupMembershipInfo::internal_deserialize(map)
5956            }
5957        }
5958        deserializer.deserialize_struct("GroupMembershipInfo", GROUP_MEMBERSHIP_INFO_FIELDS, StructVisitor)
5959    }
5960}
5961
5962impl ::serde::ser::Serialize for GroupMembershipInfo {
5963    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5964        // struct serializer
5965        use serde::ser::SerializeStruct;
5966        let mut s = serializer.serialize_struct("GroupMembershipInfo", 5)?;
5967        self.internal_serialize::<S>(&mut s)?;
5968        s.end()
5969    }
5970}
5971
5972// struct extends MembershipInfo
5973impl From<GroupMembershipInfo> for MembershipInfo {
5974    fn from(subtype: GroupMembershipInfo) -> Self {
5975        Self {
5976            access_type: subtype.access_type,
5977            permissions: subtype.permissions,
5978            initials: subtype.initials,
5979            is_inherited: subtype.is_inherited,
5980        }
5981    }
5982}
5983#[derive(Debug, Clone, PartialEq, Eq)]
5984#[non_exhaustive] // structs may have more fields added in the future.
5985pub struct InsufficientPlan {
5986    /// A message to tell the user to upgrade in order to support expected action.
5987    pub message: String,
5988    /// A URL to send the user to in order to obtain the account type they need, e.g. upgrading.
5989    /// Absent if there is no action the user can take to upgrade.
5990    pub upsell_url: Option<String>,
5991}
5992
5993impl InsufficientPlan {
5994    pub fn new(message: String) -> Self {
5995        InsufficientPlan {
5996            message,
5997            upsell_url: None,
5998        }
5999    }
6000
6001    pub fn with_upsell_url(mut self, value: String) -> Self {
6002        self.upsell_url = Some(value);
6003        self
6004    }
6005}
6006
6007const INSUFFICIENT_PLAN_FIELDS: &[&str] = &["message",
6008                                            "upsell_url"];
6009impl InsufficientPlan {
6010    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
6011        map: V,
6012    ) -> Result<InsufficientPlan, V::Error> {
6013        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
6014    }
6015
6016    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
6017        mut map: V,
6018        optional: bool,
6019    ) -> Result<Option<InsufficientPlan>, V::Error> {
6020        let mut field_message = None;
6021        let mut field_upsell_url = None;
6022        let mut nothing = true;
6023        while let Some(key) = map.next_key::<&str>()? {
6024            nothing = false;
6025            match key {
6026                "message" => {
6027                    if field_message.is_some() {
6028                        return Err(::serde::de::Error::duplicate_field("message"));
6029                    }
6030                    field_message = Some(map.next_value()?);
6031                }
6032                "upsell_url" => {
6033                    if field_upsell_url.is_some() {
6034                        return Err(::serde::de::Error::duplicate_field("upsell_url"));
6035                    }
6036                    field_upsell_url = Some(map.next_value()?);
6037                }
6038                _ => {
6039                    // unknown field allowed and ignored
6040                    map.next_value::<::serde_json::Value>()?;
6041                }
6042            }
6043        }
6044        if optional && nothing {
6045            return Ok(None);
6046        }
6047        let result = InsufficientPlan {
6048            message: field_message.ok_or_else(|| ::serde::de::Error::missing_field("message"))?,
6049            upsell_url: field_upsell_url.and_then(Option::flatten),
6050        };
6051        Ok(Some(result))
6052    }
6053
6054    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
6055        &self,
6056        s: &mut S::SerializeStruct,
6057    ) -> Result<(), S::Error> {
6058        use serde::ser::SerializeStruct;
6059        s.serialize_field("message", &self.message)?;
6060        if let Some(val) = &self.upsell_url {
6061            s.serialize_field("upsell_url", val)?;
6062        }
6063        Ok(())
6064    }
6065}
6066
6067impl<'de> ::serde::de::Deserialize<'de> for InsufficientPlan {
6068    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6069        // struct deserializer
6070        use serde::de::{MapAccess, Visitor};
6071        struct StructVisitor;
6072        impl<'de> Visitor<'de> for StructVisitor {
6073            type Value = InsufficientPlan;
6074            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6075                f.write_str("a InsufficientPlan struct")
6076            }
6077            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
6078                InsufficientPlan::internal_deserialize(map)
6079            }
6080        }
6081        deserializer.deserialize_struct("InsufficientPlan", INSUFFICIENT_PLAN_FIELDS, StructVisitor)
6082    }
6083}
6084
6085impl ::serde::ser::Serialize for InsufficientPlan {
6086    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6087        // struct serializer
6088        use serde::ser::SerializeStruct;
6089        let mut s = serializer.serialize_struct("InsufficientPlan", 2)?;
6090        self.internal_serialize::<S>(&mut s)?;
6091        s.end()
6092    }
6093}
6094
6095#[derive(Debug, Clone, PartialEq, Eq)]
6096#[non_exhaustive] // structs may have more fields added in the future.
6097pub struct InsufficientQuotaAmounts {
6098    /// The amount of space needed to add the item (the size of the item).
6099    pub space_needed: u64,
6100    /// The amount of extra space needed to add the item.
6101    pub space_shortage: u64,
6102    /// The amount of space left in the user's Dropbox, less than space_needed.
6103    pub space_left: u64,
6104}
6105
6106impl InsufficientQuotaAmounts {
6107    pub fn new(space_needed: u64, space_shortage: u64, space_left: u64) -> Self {
6108        InsufficientQuotaAmounts {
6109            space_needed,
6110            space_shortage,
6111            space_left,
6112        }
6113    }
6114}
6115
6116const INSUFFICIENT_QUOTA_AMOUNTS_FIELDS: &[&str] = &["space_needed",
6117                                                     "space_shortage",
6118                                                     "space_left"];
6119impl InsufficientQuotaAmounts {
6120    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
6121        map: V,
6122    ) -> Result<InsufficientQuotaAmounts, V::Error> {
6123        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
6124    }
6125
6126    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
6127        mut map: V,
6128        optional: bool,
6129    ) -> Result<Option<InsufficientQuotaAmounts>, V::Error> {
6130        let mut field_space_needed = None;
6131        let mut field_space_shortage = None;
6132        let mut field_space_left = None;
6133        let mut nothing = true;
6134        while let Some(key) = map.next_key::<&str>()? {
6135            nothing = false;
6136            match key {
6137                "space_needed" => {
6138                    if field_space_needed.is_some() {
6139                        return Err(::serde::de::Error::duplicate_field("space_needed"));
6140                    }
6141                    field_space_needed = Some(map.next_value()?);
6142                }
6143                "space_shortage" => {
6144                    if field_space_shortage.is_some() {
6145                        return Err(::serde::de::Error::duplicate_field("space_shortage"));
6146                    }
6147                    field_space_shortage = Some(map.next_value()?);
6148                }
6149                "space_left" => {
6150                    if field_space_left.is_some() {
6151                        return Err(::serde::de::Error::duplicate_field("space_left"));
6152                    }
6153                    field_space_left = Some(map.next_value()?);
6154                }
6155                _ => {
6156                    // unknown field allowed and ignored
6157                    map.next_value::<::serde_json::Value>()?;
6158                }
6159            }
6160        }
6161        if optional && nothing {
6162            return Ok(None);
6163        }
6164        let result = InsufficientQuotaAmounts {
6165            space_needed: field_space_needed.ok_or_else(|| ::serde::de::Error::missing_field("space_needed"))?,
6166            space_shortage: field_space_shortage.ok_or_else(|| ::serde::de::Error::missing_field("space_shortage"))?,
6167            space_left: field_space_left.ok_or_else(|| ::serde::de::Error::missing_field("space_left"))?,
6168        };
6169        Ok(Some(result))
6170    }
6171
6172    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
6173        &self,
6174        s: &mut S::SerializeStruct,
6175    ) -> Result<(), S::Error> {
6176        use serde::ser::SerializeStruct;
6177        s.serialize_field("space_needed", &self.space_needed)?;
6178        s.serialize_field("space_shortage", &self.space_shortage)?;
6179        s.serialize_field("space_left", &self.space_left)?;
6180        Ok(())
6181    }
6182}
6183
6184impl<'de> ::serde::de::Deserialize<'de> for InsufficientQuotaAmounts {
6185    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6186        // struct deserializer
6187        use serde::de::{MapAccess, Visitor};
6188        struct StructVisitor;
6189        impl<'de> Visitor<'de> for StructVisitor {
6190            type Value = InsufficientQuotaAmounts;
6191            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6192                f.write_str("a InsufficientQuotaAmounts struct")
6193            }
6194            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
6195                InsufficientQuotaAmounts::internal_deserialize(map)
6196            }
6197        }
6198        deserializer.deserialize_struct("InsufficientQuotaAmounts", INSUFFICIENT_QUOTA_AMOUNTS_FIELDS, StructVisitor)
6199    }
6200}
6201
6202impl ::serde::ser::Serialize for InsufficientQuotaAmounts {
6203    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6204        // struct serializer
6205        use serde::ser::SerializeStruct;
6206        let mut s = serializer.serialize_struct("InsufficientQuotaAmounts", 3)?;
6207        self.internal_serialize::<S>(&mut s)?;
6208        s.end()
6209    }
6210}
6211
6212/// Information about the recipient of a shared content invitation.
6213#[derive(Debug, Clone, PartialEq, Eq)]
6214#[non_exhaustive] // variants may be added in the future
6215pub enum InviteeInfo {
6216    /// Email address of invited user.
6217    Email(crate::types::common::EmailAddress),
6218    /// Catch-all used for unrecognized values returned from the server. Encountering this value
6219    /// typically indicates that this SDK version is out of date.
6220    Other,
6221}
6222
6223impl<'de> ::serde::de::Deserialize<'de> for InviteeInfo {
6224    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6225        // union deserializer
6226        use serde::de::{self, MapAccess, Visitor};
6227        struct EnumVisitor;
6228        impl<'de> Visitor<'de> for EnumVisitor {
6229            type Value = InviteeInfo;
6230            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6231                f.write_str("a InviteeInfo structure")
6232            }
6233            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
6234                let tag: &str = match map.next_key()? {
6235                    Some(".tag") => map.next_value()?,
6236                    _ => return Err(de::Error::missing_field(".tag"))
6237                };
6238                let value = match tag {
6239                    "email" => {
6240                        match map.next_key()? {
6241                            Some("email") => InviteeInfo::Email(map.next_value()?),
6242                            None => return Err(de::Error::missing_field("email")),
6243                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
6244                        }
6245                    }
6246                    _ => InviteeInfo::Other,
6247                };
6248                crate::eat_json_fields(&mut map)?;
6249                Ok(value)
6250            }
6251        }
6252        const VARIANTS: &[&str] = &["email",
6253                                    "other"];
6254        deserializer.deserialize_struct("InviteeInfo", VARIANTS, EnumVisitor)
6255    }
6256}
6257
6258impl ::serde::ser::Serialize for InviteeInfo {
6259    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6260        // union serializer
6261        use serde::ser::SerializeStruct;
6262        match self {
6263            InviteeInfo::Email(x) => {
6264                // primitive
6265                let mut s = serializer.serialize_struct("InviteeInfo", 2)?;
6266                s.serialize_field(".tag", "email")?;
6267                s.serialize_field("email", x)?;
6268                s.end()
6269            }
6270            InviteeInfo::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
6271        }
6272    }
6273}
6274
6275/// Information about an invited member of a shared content.
6276#[derive(Debug, Clone, PartialEq, Eq)]
6277#[non_exhaustive] // structs may have more fields added in the future.
6278pub struct InviteeMembershipInfo {
6279    /// The access type for this member. It contains inherited access type from parent folder, and
6280    /// acquired access type from this folder.
6281    pub access_type: AccessLevel,
6282    /// Recipient of the invitation.
6283    pub invitee: InviteeInfo,
6284    /// The permissions that requesting user has on this member. The set of permissions corresponds
6285    /// to the MemberActions in the request.
6286    pub permissions: Option<Vec<MemberPermission>>,
6287    /// Never set.
6288    pub initials: Option<String>,
6289    /// True if the member has access on a parent folder.
6290    pub is_inherited: bool,
6291    /// The user this invitation is tied to, if available.
6292    pub user: Option<UserInfo>,
6293}
6294
6295impl InviteeMembershipInfo {
6296    pub fn new(access_type: AccessLevel, invitee: InviteeInfo) -> Self {
6297        InviteeMembershipInfo {
6298            access_type,
6299            invitee,
6300            permissions: None,
6301            initials: None,
6302            is_inherited: false,
6303            user: None,
6304        }
6305    }
6306
6307    pub fn with_permissions(mut self, value: Vec<MemberPermission>) -> Self {
6308        self.permissions = Some(value);
6309        self
6310    }
6311
6312    pub fn with_initials(mut self, value: String) -> Self {
6313        self.initials = Some(value);
6314        self
6315    }
6316
6317    pub fn with_is_inherited(mut self, value: bool) -> Self {
6318        self.is_inherited = value;
6319        self
6320    }
6321
6322    pub fn with_user(mut self, value: UserInfo) -> Self {
6323        self.user = Some(value);
6324        self
6325    }
6326}
6327
6328const INVITEE_MEMBERSHIP_INFO_FIELDS: &[&str] = &["access_type",
6329                                                  "invitee",
6330                                                  "permissions",
6331                                                  "initials",
6332                                                  "is_inherited",
6333                                                  "user"];
6334impl InviteeMembershipInfo {
6335    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
6336        map: V,
6337    ) -> Result<InviteeMembershipInfo, V::Error> {
6338        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
6339    }
6340
6341    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
6342        mut map: V,
6343        optional: bool,
6344    ) -> Result<Option<InviteeMembershipInfo>, V::Error> {
6345        let mut field_access_type = None;
6346        let mut field_invitee = None;
6347        let mut field_permissions = None;
6348        let mut field_initials = None;
6349        let mut field_is_inherited = None;
6350        let mut field_user = None;
6351        let mut nothing = true;
6352        while let Some(key) = map.next_key::<&str>()? {
6353            nothing = false;
6354            match key {
6355                "access_type" => {
6356                    if field_access_type.is_some() {
6357                        return Err(::serde::de::Error::duplicate_field("access_type"));
6358                    }
6359                    field_access_type = Some(map.next_value()?);
6360                }
6361                "invitee" => {
6362                    if field_invitee.is_some() {
6363                        return Err(::serde::de::Error::duplicate_field("invitee"));
6364                    }
6365                    field_invitee = Some(map.next_value()?);
6366                }
6367                "permissions" => {
6368                    if field_permissions.is_some() {
6369                        return Err(::serde::de::Error::duplicate_field("permissions"));
6370                    }
6371                    field_permissions = Some(map.next_value()?);
6372                }
6373                "initials" => {
6374                    if field_initials.is_some() {
6375                        return Err(::serde::de::Error::duplicate_field("initials"));
6376                    }
6377                    field_initials = Some(map.next_value()?);
6378                }
6379                "is_inherited" => {
6380                    if field_is_inherited.is_some() {
6381                        return Err(::serde::de::Error::duplicate_field("is_inherited"));
6382                    }
6383                    field_is_inherited = Some(map.next_value()?);
6384                }
6385                "user" => {
6386                    if field_user.is_some() {
6387                        return Err(::serde::de::Error::duplicate_field("user"));
6388                    }
6389                    field_user = Some(map.next_value()?);
6390                }
6391                _ => {
6392                    // unknown field allowed and ignored
6393                    map.next_value::<::serde_json::Value>()?;
6394                }
6395            }
6396        }
6397        if optional && nothing {
6398            return Ok(None);
6399        }
6400        let result = InviteeMembershipInfo {
6401            access_type: field_access_type.ok_or_else(|| ::serde::de::Error::missing_field("access_type"))?,
6402            invitee: field_invitee.ok_or_else(|| ::serde::de::Error::missing_field("invitee"))?,
6403            permissions: field_permissions.and_then(Option::flatten),
6404            initials: field_initials.and_then(Option::flatten),
6405            is_inherited: field_is_inherited.unwrap_or(false),
6406            user: field_user.and_then(Option::flatten),
6407        };
6408        Ok(Some(result))
6409    }
6410
6411    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
6412        &self,
6413        s: &mut S::SerializeStruct,
6414    ) -> Result<(), S::Error> {
6415        use serde::ser::SerializeStruct;
6416        s.serialize_field("access_type", &self.access_type)?;
6417        s.serialize_field("invitee", &self.invitee)?;
6418        if let Some(val) = &self.permissions {
6419            s.serialize_field("permissions", val)?;
6420        }
6421        if let Some(val) = &self.initials {
6422            s.serialize_field("initials", val)?;
6423        }
6424        if self.is_inherited {
6425            s.serialize_field("is_inherited", &self.is_inherited)?;
6426        }
6427        if let Some(val) = &self.user {
6428            s.serialize_field("user", val)?;
6429        }
6430        Ok(())
6431    }
6432}
6433
6434impl<'de> ::serde::de::Deserialize<'de> for InviteeMembershipInfo {
6435    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6436        // struct deserializer
6437        use serde::de::{MapAccess, Visitor};
6438        struct StructVisitor;
6439        impl<'de> Visitor<'de> for StructVisitor {
6440            type Value = InviteeMembershipInfo;
6441            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6442                f.write_str("a InviteeMembershipInfo struct")
6443            }
6444            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
6445                InviteeMembershipInfo::internal_deserialize(map)
6446            }
6447        }
6448        deserializer.deserialize_struct("InviteeMembershipInfo", INVITEE_MEMBERSHIP_INFO_FIELDS, StructVisitor)
6449    }
6450}
6451
6452impl ::serde::ser::Serialize for InviteeMembershipInfo {
6453    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6454        // struct serializer
6455        use serde::ser::SerializeStruct;
6456        let mut s = serializer.serialize_struct("InviteeMembershipInfo", 6)?;
6457        self.internal_serialize::<S>(&mut s)?;
6458        s.end()
6459    }
6460}
6461
6462// struct extends MembershipInfo
6463impl From<InviteeMembershipInfo> for MembershipInfo {
6464    fn from(subtype: InviteeMembershipInfo) -> Self {
6465        Self {
6466            access_type: subtype.access_type,
6467            permissions: subtype.permissions,
6468            initials: subtype.initials,
6469            is_inherited: subtype.is_inherited,
6470        }
6471    }
6472}
6473/// Error occurred while performing an asynchronous job from
6474/// [`unshare_folder()`](crate::sharing::unshare_folder) or
6475/// [`remove_folder_member()`](crate::sharing::remove_folder_member).
6476#[derive(Debug, Clone, PartialEq, Eq)]
6477#[non_exhaustive] // variants may be added in the future
6478pub enum JobError {
6479    /// Error occurred while performing [`unshare_folder()`](crate::sharing::unshare_folder) action.
6480    UnshareFolderError(UnshareFolderError),
6481    /// Error occurred while performing
6482    /// [`remove_folder_member()`](crate::sharing::remove_folder_member) action.
6483    RemoveFolderMemberError(RemoveFolderMemberError),
6484    /// Error occurred while performing
6485    /// [`relinquish_folder_membership()`](crate::sharing::relinquish_folder_membership) action.
6486    RelinquishFolderMembershipError(RelinquishFolderMembershipError),
6487    /// Catch-all used for unrecognized values returned from the server. Encountering this value
6488    /// typically indicates that this SDK version is out of date.
6489    Other,
6490}
6491
6492impl<'de> ::serde::de::Deserialize<'de> for JobError {
6493    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6494        // union deserializer
6495        use serde::de::{self, MapAccess, Visitor};
6496        struct EnumVisitor;
6497        impl<'de> Visitor<'de> for EnumVisitor {
6498            type Value = JobError;
6499            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6500                f.write_str("a JobError structure")
6501            }
6502            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
6503                let tag: &str = match map.next_key()? {
6504                    Some(".tag") => map.next_value()?,
6505                    _ => return Err(de::Error::missing_field(".tag"))
6506                };
6507                let value = match tag {
6508                    "unshare_folder_error" => {
6509                        match map.next_key()? {
6510                            Some("unshare_folder_error") => JobError::UnshareFolderError(map.next_value()?),
6511                            None => return Err(de::Error::missing_field("unshare_folder_error")),
6512                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
6513                        }
6514                    }
6515                    "remove_folder_member_error" => {
6516                        match map.next_key()? {
6517                            Some("remove_folder_member_error") => JobError::RemoveFolderMemberError(map.next_value()?),
6518                            None => return Err(de::Error::missing_field("remove_folder_member_error")),
6519                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
6520                        }
6521                    }
6522                    "relinquish_folder_membership_error" => {
6523                        match map.next_key()? {
6524                            Some("relinquish_folder_membership_error") => JobError::RelinquishFolderMembershipError(map.next_value()?),
6525                            None => return Err(de::Error::missing_field("relinquish_folder_membership_error")),
6526                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
6527                        }
6528                    }
6529                    _ => JobError::Other,
6530                };
6531                crate::eat_json_fields(&mut map)?;
6532                Ok(value)
6533            }
6534        }
6535        const VARIANTS: &[&str] = &["unshare_folder_error",
6536                                    "remove_folder_member_error",
6537                                    "relinquish_folder_membership_error",
6538                                    "other"];
6539        deserializer.deserialize_struct("JobError", VARIANTS, EnumVisitor)
6540    }
6541}
6542
6543impl ::serde::ser::Serialize for JobError {
6544    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6545        // union serializer
6546        use serde::ser::SerializeStruct;
6547        match self {
6548            JobError::UnshareFolderError(x) => {
6549                // union or polymporphic struct
6550                let mut s = serializer.serialize_struct("JobError", 2)?;
6551                s.serialize_field(".tag", "unshare_folder_error")?;
6552                s.serialize_field("unshare_folder_error", x)?;
6553                s.end()
6554            }
6555            JobError::RemoveFolderMemberError(x) => {
6556                // union or polymporphic struct
6557                let mut s = serializer.serialize_struct("JobError", 2)?;
6558                s.serialize_field(".tag", "remove_folder_member_error")?;
6559                s.serialize_field("remove_folder_member_error", x)?;
6560                s.end()
6561            }
6562            JobError::RelinquishFolderMembershipError(x) => {
6563                // union or polymporphic struct
6564                let mut s = serializer.serialize_struct("JobError", 2)?;
6565                s.serialize_field(".tag", "relinquish_folder_membership_error")?;
6566                s.serialize_field("relinquish_folder_membership_error", x)?;
6567                s.end()
6568            }
6569            JobError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
6570        }
6571    }
6572}
6573
6574impl ::std::error::Error for JobError {
6575    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
6576        match self {
6577            JobError::UnshareFolderError(inner) => Some(inner),
6578            JobError::RemoveFolderMemberError(inner) => Some(inner),
6579            JobError::RelinquishFolderMembershipError(inner) => Some(inner),
6580            _ => None,
6581        }
6582    }
6583}
6584
6585impl ::std::fmt::Display for JobError {
6586    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6587        match self {
6588            JobError::UnshareFolderError(inner) => write!(f, "JobError: {}", inner),
6589            JobError::RemoveFolderMemberError(inner) => write!(f, "JobError: {}", inner),
6590            JobError::RelinquishFolderMembershipError(inner) => write!(f, "JobError: {}", inner),
6591            _ => write!(f, "{:?}", *self),
6592        }
6593    }
6594}
6595
6596#[derive(Debug, Clone, PartialEq, Eq)]
6597pub enum JobStatus {
6598    /// The asynchronous job is still in progress.
6599    InProgress,
6600    /// The asynchronous job has finished.
6601    Complete,
6602    /// The asynchronous job returned an error.
6603    Failed(JobError),
6604}
6605
6606impl<'de> ::serde::de::Deserialize<'de> for JobStatus {
6607    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6608        // union deserializer
6609        use serde::de::{self, MapAccess, Visitor};
6610        struct EnumVisitor;
6611        impl<'de> Visitor<'de> for EnumVisitor {
6612            type Value = JobStatus;
6613            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6614                f.write_str("a JobStatus structure")
6615            }
6616            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
6617                let tag: &str = match map.next_key()? {
6618                    Some(".tag") => map.next_value()?,
6619                    _ => return Err(de::Error::missing_field(".tag"))
6620                };
6621                let value = match tag {
6622                    "in_progress" => JobStatus::InProgress,
6623                    "complete" => JobStatus::Complete,
6624                    "failed" => {
6625                        match map.next_key()? {
6626                            Some("failed") => JobStatus::Failed(map.next_value()?),
6627                            None => return Err(de::Error::missing_field("failed")),
6628                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
6629                        }
6630                    }
6631                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
6632                };
6633                crate::eat_json_fields(&mut map)?;
6634                Ok(value)
6635            }
6636        }
6637        const VARIANTS: &[&str] = &["in_progress",
6638                                    "complete",
6639                                    "failed"];
6640        deserializer.deserialize_struct("JobStatus", VARIANTS, EnumVisitor)
6641    }
6642}
6643
6644impl ::serde::ser::Serialize for JobStatus {
6645    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6646        // union serializer
6647        use serde::ser::SerializeStruct;
6648        match self {
6649            JobStatus::InProgress => {
6650                // unit
6651                let mut s = serializer.serialize_struct("JobStatus", 1)?;
6652                s.serialize_field(".tag", "in_progress")?;
6653                s.end()
6654            }
6655            JobStatus::Complete => {
6656                // unit
6657                let mut s = serializer.serialize_struct("JobStatus", 1)?;
6658                s.serialize_field(".tag", "complete")?;
6659                s.end()
6660            }
6661            JobStatus::Failed(x) => {
6662                // union or polymporphic struct
6663                let mut s = serializer.serialize_struct("JobStatus", 2)?;
6664                s.serialize_field(".tag", "failed")?;
6665                s.serialize_field("failed", x)?;
6666                s.end()
6667            }
6668        }
6669    }
6670}
6671
6672// union extends crate::types::dbx_async::PollResultBase
6673impl From<crate::types::dbx_async::PollResultBase> for JobStatus {
6674    fn from(parent: crate::types::dbx_async::PollResultBase) -> Self {
6675        match parent {
6676            crate::types::dbx_async::PollResultBase::InProgress => JobStatus::InProgress,
6677        }
6678    }
6679}
6680#[derive(Debug, Clone, PartialEq, Eq)]
6681#[non_exhaustive] // variants may be added in the future
6682pub enum LinkAccessLevel {
6683    /// Users who use the link can view and comment on the content.
6684    Viewer,
6685    /// Users who use the link can edit, view and comment on the content.
6686    Editor,
6687    /// Catch-all used for unrecognized values returned from the server. Encountering this value
6688    /// typically indicates that this SDK version is out of date.
6689    Other,
6690}
6691
6692impl<'de> ::serde::de::Deserialize<'de> for LinkAccessLevel {
6693    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6694        // union deserializer
6695        use serde::de::{self, MapAccess, Visitor};
6696        struct EnumVisitor;
6697        impl<'de> Visitor<'de> for EnumVisitor {
6698            type Value = LinkAccessLevel;
6699            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6700                f.write_str("a LinkAccessLevel structure")
6701            }
6702            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
6703                let tag: &str = match map.next_key()? {
6704                    Some(".tag") => map.next_value()?,
6705                    _ => return Err(de::Error::missing_field(".tag"))
6706                };
6707                let value = match tag {
6708                    "viewer" => LinkAccessLevel::Viewer,
6709                    "editor" => LinkAccessLevel::Editor,
6710                    _ => LinkAccessLevel::Other,
6711                };
6712                crate::eat_json_fields(&mut map)?;
6713                Ok(value)
6714            }
6715        }
6716        const VARIANTS: &[&str] = &["viewer",
6717                                    "editor",
6718                                    "other"];
6719        deserializer.deserialize_struct("LinkAccessLevel", VARIANTS, EnumVisitor)
6720    }
6721}
6722
6723impl ::serde::ser::Serialize for LinkAccessLevel {
6724    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6725        // union serializer
6726        use serde::ser::SerializeStruct;
6727        match self {
6728            LinkAccessLevel::Viewer => {
6729                // unit
6730                let mut s = serializer.serialize_struct("LinkAccessLevel", 1)?;
6731                s.serialize_field(".tag", "viewer")?;
6732                s.end()
6733            }
6734            LinkAccessLevel::Editor => {
6735                // unit
6736                let mut s = serializer.serialize_struct("LinkAccessLevel", 1)?;
6737                s.serialize_field(".tag", "editor")?;
6738                s.end()
6739            }
6740            LinkAccessLevel::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
6741        }
6742    }
6743}
6744
6745/// Actions that can be performed on a link.
6746#[derive(Debug, Clone, PartialEq, Eq)]
6747#[non_exhaustive] // variants may be added in the future
6748pub enum LinkAction {
6749    /// Change the access level of the link.
6750    ChangeAccessLevel,
6751    /// Change the audience of the link.
6752    ChangeAudience,
6753    /// Remove the expiry date of the link.
6754    RemoveExpiry,
6755    /// Remove the password of the link.
6756    RemovePassword,
6757    /// Create or modify the expiry date of the link.
6758    SetExpiry,
6759    /// Create or modify the password of the link.
6760    SetPassword,
6761    /// Catch-all used for unrecognized values returned from the server. Encountering this value
6762    /// typically indicates that this SDK version is out of date.
6763    Other,
6764}
6765
6766impl<'de> ::serde::de::Deserialize<'de> for LinkAction {
6767    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6768        // union deserializer
6769        use serde::de::{self, MapAccess, Visitor};
6770        struct EnumVisitor;
6771        impl<'de> Visitor<'de> for EnumVisitor {
6772            type Value = LinkAction;
6773            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6774                f.write_str("a LinkAction structure")
6775            }
6776            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
6777                let tag: &str = match map.next_key()? {
6778                    Some(".tag") => map.next_value()?,
6779                    _ => return Err(de::Error::missing_field(".tag"))
6780                };
6781                let value = match tag {
6782                    "change_access_level" => LinkAction::ChangeAccessLevel,
6783                    "change_audience" => LinkAction::ChangeAudience,
6784                    "remove_expiry" => LinkAction::RemoveExpiry,
6785                    "remove_password" => LinkAction::RemovePassword,
6786                    "set_expiry" => LinkAction::SetExpiry,
6787                    "set_password" => LinkAction::SetPassword,
6788                    _ => LinkAction::Other,
6789                };
6790                crate::eat_json_fields(&mut map)?;
6791                Ok(value)
6792            }
6793        }
6794        const VARIANTS: &[&str] = &["change_access_level",
6795                                    "change_audience",
6796                                    "remove_expiry",
6797                                    "remove_password",
6798                                    "set_expiry",
6799                                    "set_password",
6800                                    "other"];
6801        deserializer.deserialize_struct("LinkAction", VARIANTS, EnumVisitor)
6802    }
6803}
6804
6805impl ::serde::ser::Serialize for LinkAction {
6806    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6807        // union serializer
6808        use serde::ser::SerializeStruct;
6809        match self {
6810            LinkAction::ChangeAccessLevel => {
6811                // unit
6812                let mut s = serializer.serialize_struct("LinkAction", 1)?;
6813                s.serialize_field(".tag", "change_access_level")?;
6814                s.end()
6815            }
6816            LinkAction::ChangeAudience => {
6817                // unit
6818                let mut s = serializer.serialize_struct("LinkAction", 1)?;
6819                s.serialize_field(".tag", "change_audience")?;
6820                s.end()
6821            }
6822            LinkAction::RemoveExpiry => {
6823                // unit
6824                let mut s = serializer.serialize_struct("LinkAction", 1)?;
6825                s.serialize_field(".tag", "remove_expiry")?;
6826                s.end()
6827            }
6828            LinkAction::RemovePassword => {
6829                // unit
6830                let mut s = serializer.serialize_struct("LinkAction", 1)?;
6831                s.serialize_field(".tag", "remove_password")?;
6832                s.end()
6833            }
6834            LinkAction::SetExpiry => {
6835                // unit
6836                let mut s = serializer.serialize_struct("LinkAction", 1)?;
6837                s.serialize_field(".tag", "set_expiry")?;
6838                s.end()
6839            }
6840            LinkAction::SetPassword => {
6841                // unit
6842                let mut s = serializer.serialize_struct("LinkAction", 1)?;
6843                s.serialize_field(".tag", "set_password")?;
6844                s.end()
6845            }
6846            LinkAction::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
6847        }
6848    }
6849}
6850
6851#[derive(Debug, Clone, PartialEq, Eq)]
6852#[non_exhaustive] // variants may be added in the future
6853pub enum LinkAudience {
6854    /// Link is accessible by anyone.
6855    Public,
6856    /// Link is accessible only by team members.
6857    Team,
6858    /// The link can be used by no one. The link merely points the user to the content, and does not
6859    /// grant additional rights to the user. Members of the content who use this link can only
6860    /// access the content with their pre-existing access rights.
6861    NoOne,
6862    /// Use `require_password` instead. A link-specific password is required to access the link.
6863    /// Login is not required.
6864    Password,
6865    /// Link is accessible only by members of the content.
6866    Members,
6867    /// Catch-all used for unrecognized values returned from the server. Encountering this value
6868    /// typically indicates that this SDK version is out of date.
6869    Other,
6870}
6871
6872impl<'de> ::serde::de::Deserialize<'de> for LinkAudience {
6873    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6874        // union deserializer
6875        use serde::de::{self, MapAccess, Visitor};
6876        struct EnumVisitor;
6877        impl<'de> Visitor<'de> for EnumVisitor {
6878            type Value = LinkAudience;
6879            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6880                f.write_str("a LinkAudience structure")
6881            }
6882            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
6883                let tag: &str = match map.next_key()? {
6884                    Some(".tag") => map.next_value()?,
6885                    _ => return Err(de::Error::missing_field(".tag"))
6886                };
6887                let value = match tag {
6888                    "public" => LinkAudience::Public,
6889                    "team" => LinkAudience::Team,
6890                    "no_one" => LinkAudience::NoOne,
6891                    "password" => LinkAudience::Password,
6892                    "members" => LinkAudience::Members,
6893                    _ => LinkAudience::Other,
6894                };
6895                crate::eat_json_fields(&mut map)?;
6896                Ok(value)
6897            }
6898        }
6899        const VARIANTS: &[&str] = &["public",
6900                                    "team",
6901                                    "no_one",
6902                                    "password",
6903                                    "members",
6904                                    "other"];
6905        deserializer.deserialize_struct("LinkAudience", VARIANTS, EnumVisitor)
6906    }
6907}
6908
6909impl ::serde::ser::Serialize for LinkAudience {
6910    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6911        // union serializer
6912        use serde::ser::SerializeStruct;
6913        match self {
6914            LinkAudience::Public => {
6915                // unit
6916                let mut s = serializer.serialize_struct("LinkAudience", 1)?;
6917                s.serialize_field(".tag", "public")?;
6918                s.end()
6919            }
6920            LinkAudience::Team => {
6921                // unit
6922                let mut s = serializer.serialize_struct("LinkAudience", 1)?;
6923                s.serialize_field(".tag", "team")?;
6924                s.end()
6925            }
6926            LinkAudience::NoOne => {
6927                // unit
6928                let mut s = serializer.serialize_struct("LinkAudience", 1)?;
6929                s.serialize_field(".tag", "no_one")?;
6930                s.end()
6931            }
6932            LinkAudience::Password => {
6933                // unit
6934                let mut s = serializer.serialize_struct("LinkAudience", 1)?;
6935                s.serialize_field(".tag", "password")?;
6936                s.end()
6937            }
6938            LinkAudience::Members => {
6939                // unit
6940                let mut s = serializer.serialize_struct("LinkAudience", 1)?;
6941                s.serialize_field(".tag", "members")?;
6942                s.end()
6943            }
6944            LinkAudience::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
6945        }
6946    }
6947}
6948
6949/// check documentation for VisibilityPolicyDisallowedReason.
6950#[derive(Debug, Clone, PartialEq, Eq)]
6951#[non_exhaustive] // variants may be added in the future
6952pub enum LinkAudienceDisallowedReason {
6953    /// The user needs to delete and recreate the link to change the visibility policy.
6954    DeleteAndRecreate,
6955    /// The parent shared folder restricts sharing of links outside the shared folder. To change the
6956    /// visibility policy, remove the restriction from the parent shared folder.
6957    RestrictedBySharedFolder,
6958    /// The team policy prevents links being shared outside the team.
6959    RestrictedByTeam,
6960    /// The user needs to be on a team to set this policy.
6961    UserNotOnTeam,
6962    /// The user is a basic user or is on a limited team.
6963    UserAccountType,
6964    /// The user does not have permission.
6965    PermissionDenied,
6966    /// Catch-all used for unrecognized values returned from the server. Encountering this value
6967    /// typically indicates that this SDK version is out of date.
6968    Other,
6969}
6970
6971impl<'de> ::serde::de::Deserialize<'de> for LinkAudienceDisallowedReason {
6972    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6973        // union deserializer
6974        use serde::de::{self, MapAccess, Visitor};
6975        struct EnumVisitor;
6976        impl<'de> Visitor<'de> for EnumVisitor {
6977            type Value = LinkAudienceDisallowedReason;
6978            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6979                f.write_str("a LinkAudienceDisallowedReason structure")
6980            }
6981            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
6982                let tag: &str = match map.next_key()? {
6983                    Some(".tag") => map.next_value()?,
6984                    _ => return Err(de::Error::missing_field(".tag"))
6985                };
6986                let value = match tag {
6987                    "delete_and_recreate" => LinkAudienceDisallowedReason::DeleteAndRecreate,
6988                    "restricted_by_shared_folder" => LinkAudienceDisallowedReason::RestrictedBySharedFolder,
6989                    "restricted_by_team" => LinkAudienceDisallowedReason::RestrictedByTeam,
6990                    "user_not_on_team" => LinkAudienceDisallowedReason::UserNotOnTeam,
6991                    "user_account_type" => LinkAudienceDisallowedReason::UserAccountType,
6992                    "permission_denied" => LinkAudienceDisallowedReason::PermissionDenied,
6993                    _ => LinkAudienceDisallowedReason::Other,
6994                };
6995                crate::eat_json_fields(&mut map)?;
6996                Ok(value)
6997            }
6998        }
6999        const VARIANTS: &[&str] = &["delete_and_recreate",
7000                                    "restricted_by_shared_folder",
7001                                    "restricted_by_team",
7002                                    "user_not_on_team",
7003                                    "user_account_type",
7004                                    "permission_denied",
7005                                    "other"];
7006        deserializer.deserialize_struct("LinkAudienceDisallowedReason", VARIANTS, EnumVisitor)
7007    }
7008}
7009
7010impl ::serde::ser::Serialize for LinkAudienceDisallowedReason {
7011    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7012        // union serializer
7013        use serde::ser::SerializeStruct;
7014        match self {
7015            LinkAudienceDisallowedReason::DeleteAndRecreate => {
7016                // unit
7017                let mut s = serializer.serialize_struct("LinkAudienceDisallowedReason", 1)?;
7018                s.serialize_field(".tag", "delete_and_recreate")?;
7019                s.end()
7020            }
7021            LinkAudienceDisallowedReason::RestrictedBySharedFolder => {
7022                // unit
7023                let mut s = serializer.serialize_struct("LinkAudienceDisallowedReason", 1)?;
7024                s.serialize_field(".tag", "restricted_by_shared_folder")?;
7025                s.end()
7026            }
7027            LinkAudienceDisallowedReason::RestrictedByTeam => {
7028                // unit
7029                let mut s = serializer.serialize_struct("LinkAudienceDisallowedReason", 1)?;
7030                s.serialize_field(".tag", "restricted_by_team")?;
7031                s.end()
7032            }
7033            LinkAudienceDisallowedReason::UserNotOnTeam => {
7034                // unit
7035                let mut s = serializer.serialize_struct("LinkAudienceDisallowedReason", 1)?;
7036                s.serialize_field(".tag", "user_not_on_team")?;
7037                s.end()
7038            }
7039            LinkAudienceDisallowedReason::UserAccountType => {
7040                // unit
7041                let mut s = serializer.serialize_struct("LinkAudienceDisallowedReason", 1)?;
7042                s.serialize_field(".tag", "user_account_type")?;
7043                s.end()
7044            }
7045            LinkAudienceDisallowedReason::PermissionDenied => {
7046                // unit
7047                let mut s = serializer.serialize_struct("LinkAudienceDisallowedReason", 1)?;
7048                s.serialize_field(".tag", "permission_denied")?;
7049                s.end()
7050            }
7051            LinkAudienceDisallowedReason::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
7052        }
7053    }
7054}
7055
7056// union extends VisibilityPolicyDisallowedReason
7057impl From<VisibilityPolicyDisallowedReason> for LinkAudienceDisallowedReason {
7058    fn from(parent: VisibilityPolicyDisallowedReason) -> Self {
7059        match parent {
7060            VisibilityPolicyDisallowedReason::DeleteAndRecreate => LinkAudienceDisallowedReason::DeleteAndRecreate,
7061            VisibilityPolicyDisallowedReason::RestrictedBySharedFolder => LinkAudienceDisallowedReason::RestrictedBySharedFolder,
7062            VisibilityPolicyDisallowedReason::RestrictedByTeam => LinkAudienceDisallowedReason::RestrictedByTeam,
7063            VisibilityPolicyDisallowedReason::UserNotOnTeam => LinkAudienceDisallowedReason::UserNotOnTeam,
7064            VisibilityPolicyDisallowedReason::UserAccountType => LinkAudienceDisallowedReason::UserAccountType,
7065            VisibilityPolicyDisallowedReason::PermissionDenied => LinkAudienceDisallowedReason::PermissionDenied,
7066            VisibilityPolicyDisallowedReason::Other => LinkAudienceDisallowedReason::Other,
7067        }
7068    }
7069}
7070#[derive(Debug, Clone, PartialEq, Eq)]
7071#[non_exhaustive] // structs may have more fields added in the future.
7072pub struct LinkAudienceOption {
7073    /// Specifies who can access the link.
7074    pub audience: LinkAudience,
7075    /// Whether the user calling this API can select this audience option.
7076    pub allowed: bool,
7077    /// If `allowed` is `false`, this will provide the reason that the user is not permitted to set
7078    /// the visibility to this policy.
7079    pub disallowed_reason: Option<LinkAudienceDisallowedReason>,
7080}
7081
7082impl LinkAudienceOption {
7083    pub fn new(audience: LinkAudience, allowed: bool) -> Self {
7084        LinkAudienceOption {
7085            audience,
7086            allowed,
7087            disallowed_reason: None,
7088        }
7089    }
7090
7091    pub fn with_disallowed_reason(mut self, value: LinkAudienceDisallowedReason) -> Self {
7092        self.disallowed_reason = Some(value);
7093        self
7094    }
7095}
7096
7097const LINK_AUDIENCE_OPTION_FIELDS: &[&str] = &["audience",
7098                                               "allowed",
7099                                               "disallowed_reason"];
7100impl LinkAudienceOption {
7101    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
7102        map: V,
7103    ) -> Result<LinkAudienceOption, V::Error> {
7104        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
7105    }
7106
7107    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
7108        mut map: V,
7109        optional: bool,
7110    ) -> Result<Option<LinkAudienceOption>, V::Error> {
7111        let mut field_audience = None;
7112        let mut field_allowed = None;
7113        let mut field_disallowed_reason = None;
7114        let mut nothing = true;
7115        while let Some(key) = map.next_key::<&str>()? {
7116            nothing = false;
7117            match key {
7118                "audience" => {
7119                    if field_audience.is_some() {
7120                        return Err(::serde::de::Error::duplicate_field("audience"));
7121                    }
7122                    field_audience = Some(map.next_value()?);
7123                }
7124                "allowed" => {
7125                    if field_allowed.is_some() {
7126                        return Err(::serde::de::Error::duplicate_field("allowed"));
7127                    }
7128                    field_allowed = Some(map.next_value()?);
7129                }
7130                "disallowed_reason" => {
7131                    if field_disallowed_reason.is_some() {
7132                        return Err(::serde::de::Error::duplicate_field("disallowed_reason"));
7133                    }
7134                    field_disallowed_reason = Some(map.next_value()?);
7135                }
7136                _ => {
7137                    // unknown field allowed and ignored
7138                    map.next_value::<::serde_json::Value>()?;
7139                }
7140            }
7141        }
7142        if optional && nothing {
7143            return Ok(None);
7144        }
7145        let result = LinkAudienceOption {
7146            audience: field_audience.ok_or_else(|| ::serde::de::Error::missing_field("audience"))?,
7147            allowed: field_allowed.ok_or_else(|| ::serde::de::Error::missing_field("allowed"))?,
7148            disallowed_reason: field_disallowed_reason.and_then(Option::flatten),
7149        };
7150        Ok(Some(result))
7151    }
7152
7153    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
7154        &self,
7155        s: &mut S::SerializeStruct,
7156    ) -> Result<(), S::Error> {
7157        use serde::ser::SerializeStruct;
7158        s.serialize_field("audience", &self.audience)?;
7159        s.serialize_field("allowed", &self.allowed)?;
7160        if let Some(val) = &self.disallowed_reason {
7161            s.serialize_field("disallowed_reason", val)?;
7162        }
7163        Ok(())
7164    }
7165}
7166
7167impl<'de> ::serde::de::Deserialize<'de> for LinkAudienceOption {
7168    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
7169        // struct deserializer
7170        use serde::de::{MapAccess, Visitor};
7171        struct StructVisitor;
7172        impl<'de> Visitor<'de> for StructVisitor {
7173            type Value = LinkAudienceOption;
7174            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
7175                f.write_str("a LinkAudienceOption struct")
7176            }
7177            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
7178                LinkAudienceOption::internal_deserialize(map)
7179            }
7180        }
7181        deserializer.deserialize_struct("LinkAudienceOption", LINK_AUDIENCE_OPTION_FIELDS, StructVisitor)
7182    }
7183}
7184
7185impl ::serde::ser::Serialize for LinkAudienceOption {
7186    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7187        // struct serializer
7188        use serde::ser::SerializeStruct;
7189        let mut s = serializer.serialize_struct("LinkAudienceOption", 3)?;
7190        self.internal_serialize::<S>(&mut s)?;
7191        s.end()
7192    }
7193}
7194
7195#[derive(Debug, Clone, PartialEq, Eq)]
7196#[non_exhaustive] // variants may be added in the future
7197pub enum LinkExpiry {
7198    /// Remove the currently set expiry for the link.
7199    RemoveExpiry,
7200    /// Set a new expiry or change an existing expiry.
7201    SetExpiry(crate::types::common::DropboxTimestamp),
7202    /// Catch-all used for unrecognized values returned from the server. Encountering this value
7203    /// typically indicates that this SDK version is out of date.
7204    Other,
7205}
7206
7207impl<'de> ::serde::de::Deserialize<'de> for LinkExpiry {
7208    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
7209        // union deserializer
7210        use serde::de::{self, MapAccess, Visitor};
7211        struct EnumVisitor;
7212        impl<'de> Visitor<'de> for EnumVisitor {
7213            type Value = LinkExpiry;
7214            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
7215                f.write_str("a LinkExpiry structure")
7216            }
7217            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
7218                let tag: &str = match map.next_key()? {
7219                    Some(".tag") => map.next_value()?,
7220                    _ => return Err(de::Error::missing_field(".tag"))
7221                };
7222                let value = match tag {
7223                    "remove_expiry" => LinkExpiry::RemoveExpiry,
7224                    "set_expiry" => {
7225                        match map.next_key()? {
7226                            Some("set_expiry") => LinkExpiry::SetExpiry(map.next_value()?),
7227                            None => return Err(de::Error::missing_field("set_expiry")),
7228                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
7229                        }
7230                    }
7231                    _ => LinkExpiry::Other,
7232                };
7233                crate::eat_json_fields(&mut map)?;
7234                Ok(value)
7235            }
7236        }
7237        const VARIANTS: &[&str] = &["remove_expiry",
7238                                    "set_expiry",
7239                                    "other"];
7240        deserializer.deserialize_struct("LinkExpiry", VARIANTS, EnumVisitor)
7241    }
7242}
7243
7244impl ::serde::ser::Serialize for LinkExpiry {
7245    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7246        // union serializer
7247        use serde::ser::SerializeStruct;
7248        match self {
7249            LinkExpiry::RemoveExpiry => {
7250                // unit
7251                let mut s = serializer.serialize_struct("LinkExpiry", 1)?;
7252                s.serialize_field(".tag", "remove_expiry")?;
7253                s.end()
7254            }
7255            LinkExpiry::SetExpiry(x) => {
7256                // primitive
7257                let mut s = serializer.serialize_struct("LinkExpiry", 2)?;
7258                s.serialize_field(".tag", "set_expiry")?;
7259                s.serialize_field("set_expiry", x)?;
7260                s.end()
7261            }
7262            LinkExpiry::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
7263        }
7264    }
7265}
7266
7267/// Metadata for a shared link. This can be either a [`PathLinkMetadata`] or
7268/// [`CollectionLinkMetadata`].
7269#[derive(Debug, Clone, PartialEq, Eq)]
7270#[non_exhaustive] // variants may be added in the future
7271pub enum LinkMetadata {
7272    Path(PathLinkMetadata),
7273    Collection(CollectionLinkMetadata),
7274    /// Catch-all used for unrecognized values returned from the server. Encountering this value
7275    /// typically indicates that this SDK version is out of date.
7276    Other,
7277}
7278
7279impl<'de> ::serde::de::Deserialize<'de> for LinkMetadata {
7280    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
7281        // polymorphic struct deserializer
7282        use serde::de::{self, MapAccess, Visitor};
7283        struct EnumVisitor;
7284        impl<'de> Visitor<'de> for EnumVisitor {
7285            type Value = LinkMetadata;
7286            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
7287                f.write_str("a LinkMetadata structure")
7288            }
7289            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
7290                let tag = match map.next_key()? {
7291                    Some(".tag") => map.next_value()?,
7292                    _ => return Err(de::Error::missing_field(".tag"))
7293                };
7294                match tag {
7295                    "path" => Ok(LinkMetadata::Path(PathLinkMetadata::internal_deserialize(map)?)),
7296                    "collection" => Ok(LinkMetadata::Collection(CollectionLinkMetadata::internal_deserialize(map)?)),
7297                    _ => {
7298                        crate::eat_json_fields(&mut map)?;
7299                        Ok(LinkMetadata::Other)
7300                    }
7301                }
7302            }
7303        }
7304        const VARIANTS: &[&str] = &["path",
7305                                    "collection"];
7306        deserializer.deserialize_struct("LinkMetadata", VARIANTS, EnumVisitor)
7307    }
7308}
7309
7310impl ::serde::ser::Serialize for LinkMetadata {
7311    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7312        // polymorphic struct serializer
7313        use serde::ser::SerializeStruct;
7314        match self {
7315            LinkMetadata::Path(x) => {
7316                let mut s = serializer.serialize_struct("LinkMetadata", 5)?;
7317                s.serialize_field(".tag", "path")?;
7318                x.internal_serialize::<S>(&mut s)?;
7319                s.end()
7320            }
7321            LinkMetadata::Collection(x) => {
7322                let mut s = serializer.serialize_struct("LinkMetadata", 4)?;
7323                s.serialize_field(".tag", "collection")?;
7324                x.internal_serialize::<S>(&mut s)?;
7325                s.end()
7326            }
7327            LinkMetadata::Other => Err(::serde::ser::Error::custom("cannot serialize unknown variant"))
7328        }
7329    }
7330}
7331
7332#[derive(Debug, Clone, PartialEq, Eq)]
7333#[non_exhaustive] // variants may be added in the future
7334pub enum LinkPassword {
7335    /// Remove the currently set password for the link.
7336    RemovePassword,
7337    /// Set a new password or change an existing password.
7338    SetPassword(String),
7339    /// Catch-all used for unrecognized values returned from the server. Encountering this value
7340    /// typically indicates that this SDK version is out of date.
7341    Other,
7342}
7343
7344impl<'de> ::serde::de::Deserialize<'de> for LinkPassword {
7345    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
7346        // union deserializer
7347        use serde::de::{self, MapAccess, Visitor};
7348        struct EnumVisitor;
7349        impl<'de> Visitor<'de> for EnumVisitor {
7350            type Value = LinkPassword;
7351            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
7352                f.write_str("a LinkPassword structure")
7353            }
7354            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
7355                let tag: &str = match map.next_key()? {
7356                    Some(".tag") => map.next_value()?,
7357                    _ => return Err(de::Error::missing_field(".tag"))
7358                };
7359                let value = match tag {
7360                    "remove_password" => LinkPassword::RemovePassword,
7361                    "set_password" => {
7362                        match map.next_key()? {
7363                            Some("set_password") => LinkPassword::SetPassword(map.next_value()?),
7364                            None => return Err(de::Error::missing_field("set_password")),
7365                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
7366                        }
7367                    }
7368                    _ => LinkPassword::Other,
7369                };
7370                crate::eat_json_fields(&mut map)?;
7371                Ok(value)
7372            }
7373        }
7374        const VARIANTS: &[&str] = &["remove_password",
7375                                    "set_password",
7376                                    "other"];
7377        deserializer.deserialize_struct("LinkPassword", VARIANTS, EnumVisitor)
7378    }
7379}
7380
7381impl ::serde::ser::Serialize for LinkPassword {
7382    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7383        // union serializer
7384        use serde::ser::SerializeStruct;
7385        match self {
7386            LinkPassword::RemovePassword => {
7387                // unit
7388                let mut s = serializer.serialize_struct("LinkPassword", 1)?;
7389                s.serialize_field(".tag", "remove_password")?;
7390                s.end()
7391            }
7392            LinkPassword::SetPassword(x) => {
7393                // primitive
7394                let mut s = serializer.serialize_struct("LinkPassword", 2)?;
7395                s.serialize_field(".tag", "set_password")?;
7396                s.serialize_field("set_password", x)?;
7397                s.end()
7398            }
7399            LinkPassword::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
7400        }
7401    }
7402}
7403
7404/// Permissions for actions that can be performed on a link.
7405#[derive(Debug, Clone, PartialEq, Eq)]
7406#[non_exhaustive] // structs may have more fields added in the future.
7407pub struct LinkPermission {
7408    pub action: LinkAction,
7409    pub allow: bool,
7410    pub reason: Option<PermissionDeniedReason>,
7411}
7412
7413impl LinkPermission {
7414    pub fn new(action: LinkAction, allow: bool) -> Self {
7415        LinkPermission {
7416            action,
7417            allow,
7418            reason: None,
7419        }
7420    }
7421
7422    pub fn with_reason(mut self, value: PermissionDeniedReason) -> Self {
7423        self.reason = Some(value);
7424        self
7425    }
7426}
7427
7428const LINK_PERMISSION_FIELDS: &[&str] = &["action",
7429                                          "allow",
7430                                          "reason"];
7431impl LinkPermission {
7432    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
7433        map: V,
7434    ) -> Result<LinkPermission, V::Error> {
7435        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
7436    }
7437
7438    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
7439        mut map: V,
7440        optional: bool,
7441    ) -> Result<Option<LinkPermission>, V::Error> {
7442        let mut field_action = None;
7443        let mut field_allow = None;
7444        let mut field_reason = None;
7445        let mut nothing = true;
7446        while let Some(key) = map.next_key::<&str>()? {
7447            nothing = false;
7448            match key {
7449                "action" => {
7450                    if field_action.is_some() {
7451                        return Err(::serde::de::Error::duplicate_field("action"));
7452                    }
7453                    field_action = Some(map.next_value()?);
7454                }
7455                "allow" => {
7456                    if field_allow.is_some() {
7457                        return Err(::serde::de::Error::duplicate_field("allow"));
7458                    }
7459                    field_allow = Some(map.next_value()?);
7460                }
7461                "reason" => {
7462                    if field_reason.is_some() {
7463                        return Err(::serde::de::Error::duplicate_field("reason"));
7464                    }
7465                    field_reason = Some(map.next_value()?);
7466                }
7467                _ => {
7468                    // unknown field allowed and ignored
7469                    map.next_value::<::serde_json::Value>()?;
7470                }
7471            }
7472        }
7473        if optional && nothing {
7474            return Ok(None);
7475        }
7476        let result = LinkPermission {
7477            action: field_action.ok_or_else(|| ::serde::de::Error::missing_field("action"))?,
7478            allow: field_allow.ok_or_else(|| ::serde::de::Error::missing_field("allow"))?,
7479            reason: field_reason.and_then(Option::flatten),
7480        };
7481        Ok(Some(result))
7482    }
7483
7484    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
7485        &self,
7486        s: &mut S::SerializeStruct,
7487    ) -> Result<(), S::Error> {
7488        use serde::ser::SerializeStruct;
7489        s.serialize_field("action", &self.action)?;
7490        s.serialize_field("allow", &self.allow)?;
7491        if let Some(val) = &self.reason {
7492            s.serialize_field("reason", val)?;
7493        }
7494        Ok(())
7495    }
7496}
7497
7498impl<'de> ::serde::de::Deserialize<'de> for LinkPermission {
7499    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
7500        // struct deserializer
7501        use serde::de::{MapAccess, Visitor};
7502        struct StructVisitor;
7503        impl<'de> Visitor<'de> for StructVisitor {
7504            type Value = LinkPermission;
7505            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
7506                f.write_str("a LinkPermission struct")
7507            }
7508            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
7509                LinkPermission::internal_deserialize(map)
7510            }
7511        }
7512        deserializer.deserialize_struct("LinkPermission", LINK_PERMISSION_FIELDS, StructVisitor)
7513    }
7514}
7515
7516impl ::serde::ser::Serialize for LinkPermission {
7517    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7518        // struct serializer
7519        use serde::ser::SerializeStruct;
7520        let mut s = serializer.serialize_struct("LinkPermission", 3)?;
7521        self.internal_serialize::<S>(&mut s)?;
7522        s.end()
7523    }
7524}
7525
7526#[derive(Debug, Clone, PartialEq, Eq)]
7527#[non_exhaustive] // structs may have more fields added in the future.
7528pub struct LinkPermissions {
7529    /// Whether the caller can revoke the shared link.
7530    pub can_revoke: bool,
7531    /// A list of policies that the user might be able to set for the visibility.
7532    pub visibility_policies: Vec<VisibilityPolicy>,
7533    /// Whether the user can set the expiry settings of the link. This refers to the ability to
7534    /// create a new expiry and modify an existing expiry.
7535    pub can_set_expiry: bool,
7536    /// Whether the user can remove the expiry of the link.
7537    pub can_remove_expiry: bool,
7538    /// Whether the link can be downloaded or not.
7539    pub allow_download: bool,
7540    /// Whether the user can allow downloads via the link. This refers to the ability to remove a
7541    /// no-download restriction on the link.
7542    pub can_allow_download: bool,
7543    /// Whether the user can disallow downloads via the link. This refers to the ability to impose a
7544    /// no-download restriction on the link.
7545    pub can_disallow_download: bool,
7546    /// Whether comments are enabled for the linked file. This takes the team commenting policy into
7547    /// account.
7548    pub allow_comments: bool,
7549    /// Whether the team has disabled commenting globally.
7550    pub team_restricts_comments: bool,
7551    /// The current visibility of the link after considering the shared links policies of the the
7552    /// team (in case the link's owner is part of a team) and the shared folder (in case the linked
7553    /// file is part of a shared folder). This field is shown only if the caller has access to this
7554    /// info (the link's owner always has access to this data). For some links, an
7555    /// effective_audience value is returned instead.
7556    pub resolved_visibility: Option<ResolvedVisibility>,
7557    /// The shared link's requested visibility. This can be overridden by the team and shared folder
7558    /// policies. The final visibility, after considering these policies, can be found in
7559    /// `resolved_visibility`. This is shown only if the caller is the link's owner and
7560    /// resolved_visibility is returned instead of effective_audience.
7561    pub requested_visibility: Option<RequestedVisibility>,
7562    /// The failure reason for revoking the link. This field will only be present if the
7563    /// `can_revoke` is `false`.
7564    pub revoke_failure_reason: Option<SharedLinkAccessFailureReason>,
7565    /// The type of audience who can benefit from the access level specified by the
7566    /// `link_access_level` field.
7567    pub effective_audience: Option<LinkAudience>,
7568    /// The access level that the link will grant to its users. A link can grant additional rights
7569    /// to a user beyond their current access level. For example, if a user was invited as a viewer
7570    /// to a file, and then opens a link with `link_access_level` set to `editor`, then they will
7571    /// gain editor privileges. The `link_access_level` is a property of the link, and does not
7572    /// depend on who is calling this API. In particular, `link_access_level` does not take into
7573    /// account the API caller's current permissions to the content.
7574    pub link_access_level: Option<LinkAccessLevel>,
7575    /// A list of link audience options the user might be able to set as the new audience.
7576    pub audience_options: Option<Vec<LinkAudienceOption>>,
7577    /// Whether the user can set a password for the link.
7578    pub can_set_password: Option<bool>,
7579    /// Whether the user can remove the password of the link.
7580    pub can_remove_password: Option<bool>,
7581    /// Whether the user is required to provide a password to view the link.
7582    pub require_password: Option<bool>,
7583    /// Whether the user can use extended sharing controls, based on their account type.
7584    pub can_use_extended_sharing_controls: Option<bool>,
7585    /// Whether a user can save the content to their Dropbox account.
7586    pub can_sync: Option<bool>,
7587    /// Whether the user can request access to the content.
7588    pub can_request_access: Option<bool>,
7589    /// Whether the updated externally available shared link must have password set. Not provided if
7590    /// the link is not team owned.
7591    pub enforce_shared_link_password_policy: Option<crate::types::team_policies::EnforceLinkPasswordPolicy>,
7592    /// Existing owning team's policy for default number of days from today to link's expiration.
7593    /// Not provided if the link is not team owned.
7594    pub days_to_expire_policy: Option<crate::types::team_policies::DefaultLinkExpirationDaysPolicy>,
7595    /// When owning team's policy `change_shared_link_expiration_policy` is
7596    /// [`ChangeLinkExpirationPolicy::NotAllowed`], the updated externally available shared link
7597    /// expiration value cannot be less strict than `days_to_expire_policy`. In this case
7598    /// `days_to_expire_policy` is expected to be different from `none`. Not provided if the link is
7599    /// not team owned.
7600    pub change_shared_link_expiration_policy: Option<ChangeLinkExpirationPolicy>,
7601}
7602
7603impl LinkPermissions {
7604    pub fn new(
7605        can_revoke: bool,
7606        visibility_policies: Vec<VisibilityPolicy>,
7607        can_set_expiry: bool,
7608        can_remove_expiry: bool,
7609        allow_download: bool,
7610        can_allow_download: bool,
7611        can_disallow_download: bool,
7612        allow_comments: bool,
7613        team_restricts_comments: bool,
7614    ) -> Self {
7615        LinkPermissions {
7616            can_revoke,
7617            visibility_policies,
7618            can_set_expiry,
7619            can_remove_expiry,
7620            allow_download,
7621            can_allow_download,
7622            can_disallow_download,
7623            allow_comments,
7624            team_restricts_comments,
7625            resolved_visibility: None,
7626            requested_visibility: None,
7627            revoke_failure_reason: None,
7628            effective_audience: None,
7629            link_access_level: None,
7630            audience_options: None,
7631            can_set_password: None,
7632            can_remove_password: None,
7633            require_password: None,
7634            can_use_extended_sharing_controls: None,
7635            can_sync: None,
7636            can_request_access: None,
7637            enforce_shared_link_password_policy: None,
7638            days_to_expire_policy: None,
7639            change_shared_link_expiration_policy: None,
7640        }
7641    }
7642
7643    pub fn with_resolved_visibility(mut self, value: ResolvedVisibility) -> Self {
7644        self.resolved_visibility = Some(value);
7645        self
7646    }
7647
7648    pub fn with_requested_visibility(mut self, value: RequestedVisibility) -> Self {
7649        self.requested_visibility = Some(value);
7650        self
7651    }
7652
7653    pub fn with_revoke_failure_reason(mut self, value: SharedLinkAccessFailureReason) -> Self {
7654        self.revoke_failure_reason = Some(value);
7655        self
7656    }
7657
7658    pub fn with_effective_audience(mut self, value: LinkAudience) -> Self {
7659        self.effective_audience = Some(value);
7660        self
7661    }
7662
7663    pub fn with_link_access_level(mut self, value: LinkAccessLevel) -> Self {
7664        self.link_access_level = Some(value);
7665        self
7666    }
7667
7668    pub fn with_audience_options(mut self, value: Vec<LinkAudienceOption>) -> Self {
7669        self.audience_options = Some(value);
7670        self
7671    }
7672
7673    pub fn with_can_set_password(mut self, value: bool) -> Self {
7674        self.can_set_password = Some(value);
7675        self
7676    }
7677
7678    pub fn with_can_remove_password(mut self, value: bool) -> Self {
7679        self.can_remove_password = Some(value);
7680        self
7681    }
7682
7683    pub fn with_require_password(mut self, value: bool) -> Self {
7684        self.require_password = Some(value);
7685        self
7686    }
7687
7688    pub fn with_can_use_extended_sharing_controls(mut self, value: bool) -> Self {
7689        self.can_use_extended_sharing_controls = Some(value);
7690        self
7691    }
7692
7693    pub fn with_can_sync(mut self, value: bool) -> Self {
7694        self.can_sync = Some(value);
7695        self
7696    }
7697
7698    pub fn with_can_request_access(mut self, value: bool) -> Self {
7699        self.can_request_access = Some(value);
7700        self
7701    }
7702
7703    pub fn with_enforce_shared_link_password_policy(
7704        mut self,
7705        value: crate::types::team_policies::EnforceLinkPasswordPolicy,
7706    ) -> Self {
7707        self.enforce_shared_link_password_policy = Some(value);
7708        self
7709    }
7710
7711    pub fn with_days_to_expire_policy(
7712        mut self,
7713        value: crate::types::team_policies::DefaultLinkExpirationDaysPolicy,
7714    ) -> Self {
7715        self.days_to_expire_policy = Some(value);
7716        self
7717    }
7718
7719    pub fn with_change_shared_link_expiration_policy(
7720        mut self,
7721        value: ChangeLinkExpirationPolicy,
7722    ) -> Self {
7723        self.change_shared_link_expiration_policy = Some(value);
7724        self
7725    }
7726}
7727
7728const LINK_PERMISSIONS_FIELDS: &[&str] = &["can_revoke",
7729                                           "visibility_policies",
7730                                           "can_set_expiry",
7731                                           "can_remove_expiry",
7732                                           "allow_download",
7733                                           "can_allow_download",
7734                                           "can_disallow_download",
7735                                           "allow_comments",
7736                                           "team_restricts_comments",
7737                                           "resolved_visibility",
7738                                           "requested_visibility",
7739                                           "revoke_failure_reason",
7740                                           "effective_audience",
7741                                           "link_access_level",
7742                                           "audience_options",
7743                                           "can_set_password",
7744                                           "can_remove_password",
7745                                           "require_password",
7746                                           "can_use_extended_sharing_controls",
7747                                           "can_sync",
7748                                           "can_request_access",
7749                                           "enforce_shared_link_password_policy",
7750                                           "days_to_expire_policy",
7751                                           "change_shared_link_expiration_policy"];
7752impl LinkPermissions {
7753    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
7754        map: V,
7755    ) -> Result<LinkPermissions, V::Error> {
7756        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
7757    }
7758
7759    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
7760        mut map: V,
7761        optional: bool,
7762    ) -> Result<Option<LinkPermissions>, V::Error> {
7763        let mut field_can_revoke = None;
7764        let mut field_visibility_policies = None;
7765        let mut field_can_set_expiry = None;
7766        let mut field_can_remove_expiry = None;
7767        let mut field_allow_download = None;
7768        let mut field_can_allow_download = None;
7769        let mut field_can_disallow_download = None;
7770        let mut field_allow_comments = None;
7771        let mut field_team_restricts_comments = None;
7772        let mut field_resolved_visibility = None;
7773        let mut field_requested_visibility = None;
7774        let mut field_revoke_failure_reason = None;
7775        let mut field_effective_audience = None;
7776        let mut field_link_access_level = None;
7777        let mut field_audience_options = None;
7778        let mut field_can_set_password = None;
7779        let mut field_can_remove_password = None;
7780        let mut field_require_password = None;
7781        let mut field_can_use_extended_sharing_controls = None;
7782        let mut field_can_sync = None;
7783        let mut field_can_request_access = None;
7784        let mut field_enforce_shared_link_password_policy = None;
7785        let mut field_days_to_expire_policy = None;
7786        let mut field_change_shared_link_expiration_policy = None;
7787        let mut nothing = true;
7788        while let Some(key) = map.next_key::<&str>()? {
7789            nothing = false;
7790            match key {
7791                "can_revoke" => {
7792                    if field_can_revoke.is_some() {
7793                        return Err(::serde::de::Error::duplicate_field("can_revoke"));
7794                    }
7795                    field_can_revoke = Some(map.next_value()?);
7796                }
7797                "visibility_policies" => {
7798                    if field_visibility_policies.is_some() {
7799                        return Err(::serde::de::Error::duplicate_field("visibility_policies"));
7800                    }
7801                    field_visibility_policies = Some(map.next_value()?);
7802                }
7803                "can_set_expiry" => {
7804                    if field_can_set_expiry.is_some() {
7805                        return Err(::serde::de::Error::duplicate_field("can_set_expiry"));
7806                    }
7807                    field_can_set_expiry = Some(map.next_value()?);
7808                }
7809                "can_remove_expiry" => {
7810                    if field_can_remove_expiry.is_some() {
7811                        return Err(::serde::de::Error::duplicate_field("can_remove_expiry"));
7812                    }
7813                    field_can_remove_expiry = Some(map.next_value()?);
7814                }
7815                "allow_download" => {
7816                    if field_allow_download.is_some() {
7817                        return Err(::serde::de::Error::duplicate_field("allow_download"));
7818                    }
7819                    field_allow_download = Some(map.next_value()?);
7820                }
7821                "can_allow_download" => {
7822                    if field_can_allow_download.is_some() {
7823                        return Err(::serde::de::Error::duplicate_field("can_allow_download"));
7824                    }
7825                    field_can_allow_download = Some(map.next_value()?);
7826                }
7827                "can_disallow_download" => {
7828                    if field_can_disallow_download.is_some() {
7829                        return Err(::serde::de::Error::duplicate_field("can_disallow_download"));
7830                    }
7831                    field_can_disallow_download = Some(map.next_value()?);
7832                }
7833                "allow_comments" => {
7834                    if field_allow_comments.is_some() {
7835                        return Err(::serde::de::Error::duplicate_field("allow_comments"));
7836                    }
7837                    field_allow_comments = Some(map.next_value()?);
7838                }
7839                "team_restricts_comments" => {
7840                    if field_team_restricts_comments.is_some() {
7841                        return Err(::serde::de::Error::duplicate_field("team_restricts_comments"));
7842                    }
7843                    field_team_restricts_comments = Some(map.next_value()?);
7844                }
7845                "resolved_visibility" => {
7846                    if field_resolved_visibility.is_some() {
7847                        return Err(::serde::de::Error::duplicate_field("resolved_visibility"));
7848                    }
7849                    field_resolved_visibility = Some(map.next_value()?);
7850                }
7851                "requested_visibility" => {
7852                    if field_requested_visibility.is_some() {
7853                        return Err(::serde::de::Error::duplicate_field("requested_visibility"));
7854                    }
7855                    field_requested_visibility = Some(map.next_value()?);
7856                }
7857                "revoke_failure_reason" => {
7858                    if field_revoke_failure_reason.is_some() {
7859                        return Err(::serde::de::Error::duplicate_field("revoke_failure_reason"));
7860                    }
7861                    field_revoke_failure_reason = Some(map.next_value()?);
7862                }
7863                "effective_audience" => {
7864                    if field_effective_audience.is_some() {
7865                        return Err(::serde::de::Error::duplicate_field("effective_audience"));
7866                    }
7867                    field_effective_audience = Some(map.next_value()?);
7868                }
7869                "link_access_level" => {
7870                    if field_link_access_level.is_some() {
7871                        return Err(::serde::de::Error::duplicate_field("link_access_level"));
7872                    }
7873                    field_link_access_level = Some(map.next_value()?);
7874                }
7875                "audience_options" => {
7876                    if field_audience_options.is_some() {
7877                        return Err(::serde::de::Error::duplicate_field("audience_options"));
7878                    }
7879                    field_audience_options = Some(map.next_value()?);
7880                }
7881                "can_set_password" => {
7882                    if field_can_set_password.is_some() {
7883                        return Err(::serde::de::Error::duplicate_field("can_set_password"));
7884                    }
7885                    field_can_set_password = Some(map.next_value()?);
7886                }
7887                "can_remove_password" => {
7888                    if field_can_remove_password.is_some() {
7889                        return Err(::serde::de::Error::duplicate_field("can_remove_password"));
7890                    }
7891                    field_can_remove_password = Some(map.next_value()?);
7892                }
7893                "require_password" => {
7894                    if field_require_password.is_some() {
7895                        return Err(::serde::de::Error::duplicate_field("require_password"));
7896                    }
7897                    field_require_password = Some(map.next_value()?);
7898                }
7899                "can_use_extended_sharing_controls" => {
7900                    if field_can_use_extended_sharing_controls.is_some() {
7901                        return Err(::serde::de::Error::duplicate_field("can_use_extended_sharing_controls"));
7902                    }
7903                    field_can_use_extended_sharing_controls = Some(map.next_value()?);
7904                }
7905                "can_sync" => {
7906                    if field_can_sync.is_some() {
7907                        return Err(::serde::de::Error::duplicate_field("can_sync"));
7908                    }
7909                    field_can_sync = Some(map.next_value()?);
7910                }
7911                "can_request_access" => {
7912                    if field_can_request_access.is_some() {
7913                        return Err(::serde::de::Error::duplicate_field("can_request_access"));
7914                    }
7915                    field_can_request_access = Some(map.next_value()?);
7916                }
7917                "enforce_shared_link_password_policy" => {
7918                    if field_enforce_shared_link_password_policy.is_some() {
7919                        return Err(::serde::de::Error::duplicate_field("enforce_shared_link_password_policy"));
7920                    }
7921                    field_enforce_shared_link_password_policy = Some(map.next_value()?);
7922                }
7923                "days_to_expire_policy" => {
7924                    if field_days_to_expire_policy.is_some() {
7925                        return Err(::serde::de::Error::duplicate_field("days_to_expire_policy"));
7926                    }
7927                    field_days_to_expire_policy = Some(map.next_value()?);
7928                }
7929                "change_shared_link_expiration_policy" => {
7930                    if field_change_shared_link_expiration_policy.is_some() {
7931                        return Err(::serde::de::Error::duplicate_field("change_shared_link_expiration_policy"));
7932                    }
7933                    field_change_shared_link_expiration_policy = Some(map.next_value()?);
7934                }
7935                _ => {
7936                    // unknown field allowed and ignored
7937                    map.next_value::<::serde_json::Value>()?;
7938                }
7939            }
7940        }
7941        if optional && nothing {
7942            return Ok(None);
7943        }
7944        let result = LinkPermissions {
7945            can_revoke: field_can_revoke.ok_or_else(|| ::serde::de::Error::missing_field("can_revoke"))?,
7946            visibility_policies: field_visibility_policies.ok_or_else(|| ::serde::de::Error::missing_field("visibility_policies"))?,
7947            can_set_expiry: field_can_set_expiry.ok_or_else(|| ::serde::de::Error::missing_field("can_set_expiry"))?,
7948            can_remove_expiry: field_can_remove_expiry.ok_or_else(|| ::serde::de::Error::missing_field("can_remove_expiry"))?,
7949            allow_download: field_allow_download.ok_or_else(|| ::serde::de::Error::missing_field("allow_download"))?,
7950            can_allow_download: field_can_allow_download.ok_or_else(|| ::serde::de::Error::missing_field("can_allow_download"))?,
7951            can_disallow_download: field_can_disallow_download.ok_or_else(|| ::serde::de::Error::missing_field("can_disallow_download"))?,
7952            allow_comments: field_allow_comments.ok_or_else(|| ::serde::de::Error::missing_field("allow_comments"))?,
7953            team_restricts_comments: field_team_restricts_comments.ok_or_else(|| ::serde::de::Error::missing_field("team_restricts_comments"))?,
7954            resolved_visibility: field_resolved_visibility.and_then(Option::flatten),
7955            requested_visibility: field_requested_visibility.and_then(Option::flatten),
7956            revoke_failure_reason: field_revoke_failure_reason.and_then(Option::flatten),
7957            effective_audience: field_effective_audience.and_then(Option::flatten),
7958            link_access_level: field_link_access_level.and_then(Option::flatten),
7959            audience_options: field_audience_options.and_then(Option::flatten),
7960            can_set_password: field_can_set_password.and_then(Option::flatten),
7961            can_remove_password: field_can_remove_password.and_then(Option::flatten),
7962            require_password: field_require_password.and_then(Option::flatten),
7963            can_use_extended_sharing_controls: field_can_use_extended_sharing_controls.and_then(Option::flatten),
7964            can_sync: field_can_sync.and_then(Option::flatten),
7965            can_request_access: field_can_request_access.and_then(Option::flatten),
7966            enforce_shared_link_password_policy: field_enforce_shared_link_password_policy.and_then(Option::flatten),
7967            days_to_expire_policy: field_days_to_expire_policy.and_then(Option::flatten),
7968            change_shared_link_expiration_policy: field_change_shared_link_expiration_policy.and_then(Option::flatten),
7969        };
7970        Ok(Some(result))
7971    }
7972
7973    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
7974        &self,
7975        s: &mut S::SerializeStruct,
7976    ) -> Result<(), S::Error> {
7977        use serde::ser::SerializeStruct;
7978        s.serialize_field("can_revoke", &self.can_revoke)?;
7979        s.serialize_field("visibility_policies", &self.visibility_policies)?;
7980        s.serialize_field("can_set_expiry", &self.can_set_expiry)?;
7981        s.serialize_field("can_remove_expiry", &self.can_remove_expiry)?;
7982        s.serialize_field("allow_download", &self.allow_download)?;
7983        s.serialize_field("can_allow_download", &self.can_allow_download)?;
7984        s.serialize_field("can_disallow_download", &self.can_disallow_download)?;
7985        s.serialize_field("allow_comments", &self.allow_comments)?;
7986        s.serialize_field("team_restricts_comments", &self.team_restricts_comments)?;
7987        if let Some(val) = &self.resolved_visibility {
7988            s.serialize_field("resolved_visibility", val)?;
7989        }
7990        if let Some(val) = &self.requested_visibility {
7991            s.serialize_field("requested_visibility", val)?;
7992        }
7993        if let Some(val) = &self.revoke_failure_reason {
7994            s.serialize_field("revoke_failure_reason", val)?;
7995        }
7996        if let Some(val) = &self.effective_audience {
7997            s.serialize_field("effective_audience", val)?;
7998        }
7999        if let Some(val) = &self.link_access_level {
8000            s.serialize_field("link_access_level", val)?;
8001        }
8002        if let Some(val) = &self.audience_options {
8003            s.serialize_field("audience_options", val)?;
8004        }
8005        if let Some(val) = &self.can_set_password {
8006            s.serialize_field("can_set_password", val)?;
8007        }
8008        if let Some(val) = &self.can_remove_password {
8009            s.serialize_field("can_remove_password", val)?;
8010        }
8011        if let Some(val) = &self.require_password {
8012            s.serialize_field("require_password", val)?;
8013        }
8014        if let Some(val) = &self.can_use_extended_sharing_controls {
8015            s.serialize_field("can_use_extended_sharing_controls", val)?;
8016        }
8017        if let Some(val) = &self.can_sync {
8018            s.serialize_field("can_sync", val)?;
8019        }
8020        if let Some(val) = &self.can_request_access {
8021            s.serialize_field("can_request_access", val)?;
8022        }
8023        if let Some(val) = &self.enforce_shared_link_password_policy {
8024            s.serialize_field("enforce_shared_link_password_policy", val)?;
8025        }
8026        if let Some(val) = &self.days_to_expire_policy {
8027            s.serialize_field("days_to_expire_policy", val)?;
8028        }
8029        if let Some(val) = &self.change_shared_link_expiration_policy {
8030            s.serialize_field("change_shared_link_expiration_policy", val)?;
8031        }
8032        Ok(())
8033    }
8034}
8035
8036impl<'de> ::serde::de::Deserialize<'de> for LinkPermissions {
8037    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8038        // struct deserializer
8039        use serde::de::{MapAccess, Visitor};
8040        struct StructVisitor;
8041        impl<'de> Visitor<'de> for StructVisitor {
8042            type Value = LinkPermissions;
8043            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8044                f.write_str("a LinkPermissions struct")
8045            }
8046            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
8047                LinkPermissions::internal_deserialize(map)
8048            }
8049        }
8050        deserializer.deserialize_struct("LinkPermissions", LINK_PERMISSIONS_FIELDS, StructVisitor)
8051    }
8052}
8053
8054impl ::serde::ser::Serialize for LinkPermissions {
8055    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8056        // struct serializer
8057        use serde::ser::SerializeStruct;
8058        let mut s = serializer.serialize_struct("LinkPermissions", 24)?;
8059        self.internal_serialize::<S>(&mut s)?;
8060        s.end()
8061    }
8062}
8063
8064/// Settings that apply to a link.
8065#[derive(Debug, Clone, PartialEq, Eq, Default)]
8066#[non_exhaustive] // structs may have more fields added in the future.
8067pub struct LinkSettings {
8068    /// The access level on the link for this file. Currently, it only accepts 'viewer' and
8069    /// 'viewer_no_comment'.
8070    pub access_level: Option<AccessLevel>,
8071    /// The type of audience on the link for this file.
8072    pub audience: Option<LinkAudience>,
8073    /// An expiry timestamp to set on a link.
8074    pub expiry: Option<LinkExpiry>,
8075    /// The password for the link.
8076    pub password: Option<LinkPassword>,
8077}
8078
8079impl LinkSettings {
8080    pub fn with_access_level(mut self, value: AccessLevel) -> Self {
8081        self.access_level = Some(value);
8082        self
8083    }
8084
8085    pub fn with_audience(mut self, value: LinkAudience) -> Self {
8086        self.audience = Some(value);
8087        self
8088    }
8089
8090    pub fn with_expiry(mut self, value: LinkExpiry) -> Self {
8091        self.expiry = Some(value);
8092        self
8093    }
8094
8095    pub fn with_password(mut self, value: LinkPassword) -> Self {
8096        self.password = Some(value);
8097        self
8098    }
8099}
8100
8101const LINK_SETTINGS_FIELDS: &[&str] = &["access_level",
8102                                        "audience",
8103                                        "expiry",
8104                                        "password"];
8105impl LinkSettings {
8106    // no _opt deserializer
8107    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
8108        mut map: V,
8109    ) -> Result<LinkSettings, V::Error> {
8110        let mut field_access_level = None;
8111        let mut field_audience = None;
8112        let mut field_expiry = None;
8113        let mut field_password = None;
8114        while let Some(key) = map.next_key::<&str>()? {
8115            match key {
8116                "access_level" => {
8117                    if field_access_level.is_some() {
8118                        return Err(::serde::de::Error::duplicate_field("access_level"));
8119                    }
8120                    field_access_level = Some(map.next_value()?);
8121                }
8122                "audience" => {
8123                    if field_audience.is_some() {
8124                        return Err(::serde::de::Error::duplicate_field("audience"));
8125                    }
8126                    field_audience = Some(map.next_value()?);
8127                }
8128                "expiry" => {
8129                    if field_expiry.is_some() {
8130                        return Err(::serde::de::Error::duplicate_field("expiry"));
8131                    }
8132                    field_expiry = Some(map.next_value()?);
8133                }
8134                "password" => {
8135                    if field_password.is_some() {
8136                        return Err(::serde::de::Error::duplicate_field("password"));
8137                    }
8138                    field_password = Some(map.next_value()?);
8139                }
8140                _ => {
8141                    // unknown field allowed and ignored
8142                    map.next_value::<::serde_json::Value>()?;
8143                }
8144            }
8145        }
8146        let result = LinkSettings {
8147            access_level: field_access_level.and_then(Option::flatten),
8148            audience: field_audience.and_then(Option::flatten),
8149            expiry: field_expiry.and_then(Option::flatten),
8150            password: field_password.and_then(Option::flatten),
8151        };
8152        Ok(result)
8153    }
8154
8155    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
8156        &self,
8157        s: &mut S::SerializeStruct,
8158    ) -> Result<(), S::Error> {
8159        use serde::ser::SerializeStruct;
8160        if let Some(val) = &self.access_level {
8161            s.serialize_field("access_level", val)?;
8162        }
8163        if let Some(val) = &self.audience {
8164            s.serialize_field("audience", val)?;
8165        }
8166        if let Some(val) = &self.expiry {
8167            s.serialize_field("expiry", val)?;
8168        }
8169        if let Some(val) = &self.password {
8170            s.serialize_field("password", val)?;
8171        }
8172        Ok(())
8173    }
8174}
8175
8176impl<'de> ::serde::de::Deserialize<'de> for LinkSettings {
8177    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8178        // struct deserializer
8179        use serde::de::{MapAccess, Visitor};
8180        struct StructVisitor;
8181        impl<'de> Visitor<'de> for StructVisitor {
8182            type Value = LinkSettings;
8183            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8184                f.write_str("a LinkSettings struct")
8185            }
8186            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
8187                LinkSettings::internal_deserialize(map)
8188            }
8189        }
8190        deserializer.deserialize_struct("LinkSettings", LINK_SETTINGS_FIELDS, StructVisitor)
8191    }
8192}
8193
8194impl ::serde::ser::Serialize for LinkSettings {
8195    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8196        // struct serializer
8197        use serde::ser::SerializeStruct;
8198        let mut s = serializer.serialize_struct("LinkSettings", 4)?;
8199        self.internal_serialize::<S>(&mut s)?;
8200        s.end()
8201    }
8202}
8203
8204/// Arguments for [`list_file_members()`](crate::sharing::list_file_members).
8205#[derive(Debug, Clone, PartialEq, Eq)]
8206#[non_exhaustive] // structs may have more fields added in the future.
8207pub struct ListFileMembersArg {
8208    /// The file for which you want to see members.
8209    pub file: PathOrId,
8210    /// The actions for which to return permissions on a member.
8211    pub actions: Option<Vec<MemberAction>>,
8212    /// Whether to include members who only have access from a parent shared folder.
8213    pub include_inherited: bool,
8214    /// Number of members to return max per query. Defaults to 100 if no limit is specified.
8215    pub limit: u32,
8216}
8217
8218impl ListFileMembersArg {
8219    pub fn new(file: PathOrId) -> Self {
8220        ListFileMembersArg {
8221            file,
8222            actions: None,
8223            include_inherited: true,
8224            limit: 100,
8225        }
8226    }
8227
8228    pub fn with_actions(mut self, value: Vec<MemberAction>) -> Self {
8229        self.actions = Some(value);
8230        self
8231    }
8232
8233    pub fn with_include_inherited(mut self, value: bool) -> Self {
8234        self.include_inherited = value;
8235        self
8236    }
8237
8238    pub fn with_limit(mut self, value: u32) -> Self {
8239        self.limit = value;
8240        self
8241    }
8242}
8243
8244const LIST_FILE_MEMBERS_ARG_FIELDS: &[&str] = &["file",
8245                                                "actions",
8246                                                "include_inherited",
8247                                                "limit"];
8248impl ListFileMembersArg {
8249    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
8250        map: V,
8251    ) -> Result<ListFileMembersArg, V::Error> {
8252        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
8253    }
8254
8255    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
8256        mut map: V,
8257        optional: bool,
8258    ) -> Result<Option<ListFileMembersArg>, V::Error> {
8259        let mut field_file = None;
8260        let mut field_actions = None;
8261        let mut field_include_inherited = None;
8262        let mut field_limit = None;
8263        let mut nothing = true;
8264        while let Some(key) = map.next_key::<&str>()? {
8265            nothing = false;
8266            match key {
8267                "file" => {
8268                    if field_file.is_some() {
8269                        return Err(::serde::de::Error::duplicate_field("file"));
8270                    }
8271                    field_file = Some(map.next_value()?);
8272                }
8273                "actions" => {
8274                    if field_actions.is_some() {
8275                        return Err(::serde::de::Error::duplicate_field("actions"));
8276                    }
8277                    field_actions = Some(map.next_value()?);
8278                }
8279                "include_inherited" => {
8280                    if field_include_inherited.is_some() {
8281                        return Err(::serde::de::Error::duplicate_field("include_inherited"));
8282                    }
8283                    field_include_inherited = Some(map.next_value()?);
8284                }
8285                "limit" => {
8286                    if field_limit.is_some() {
8287                        return Err(::serde::de::Error::duplicate_field("limit"));
8288                    }
8289                    field_limit = Some(map.next_value()?);
8290                }
8291                _ => {
8292                    // unknown field allowed and ignored
8293                    map.next_value::<::serde_json::Value>()?;
8294                }
8295            }
8296        }
8297        if optional && nothing {
8298            return Ok(None);
8299        }
8300        let result = ListFileMembersArg {
8301            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
8302            actions: field_actions.and_then(Option::flatten),
8303            include_inherited: field_include_inherited.unwrap_or(true),
8304            limit: field_limit.unwrap_or(100),
8305        };
8306        Ok(Some(result))
8307    }
8308
8309    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
8310        &self,
8311        s: &mut S::SerializeStruct,
8312    ) -> Result<(), S::Error> {
8313        use serde::ser::SerializeStruct;
8314        s.serialize_field("file", &self.file)?;
8315        if let Some(val) = &self.actions {
8316            s.serialize_field("actions", val)?;
8317        }
8318        if !self.include_inherited {
8319            s.serialize_field("include_inherited", &self.include_inherited)?;
8320        }
8321        if self.limit != 100 {
8322            s.serialize_field("limit", &self.limit)?;
8323        }
8324        Ok(())
8325    }
8326}
8327
8328impl<'de> ::serde::de::Deserialize<'de> for ListFileMembersArg {
8329    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8330        // struct deserializer
8331        use serde::de::{MapAccess, Visitor};
8332        struct StructVisitor;
8333        impl<'de> Visitor<'de> for StructVisitor {
8334            type Value = ListFileMembersArg;
8335            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8336                f.write_str("a ListFileMembersArg struct")
8337            }
8338            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
8339                ListFileMembersArg::internal_deserialize(map)
8340            }
8341        }
8342        deserializer.deserialize_struct("ListFileMembersArg", LIST_FILE_MEMBERS_ARG_FIELDS, StructVisitor)
8343    }
8344}
8345
8346impl ::serde::ser::Serialize for ListFileMembersArg {
8347    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8348        // struct serializer
8349        use serde::ser::SerializeStruct;
8350        let mut s = serializer.serialize_struct("ListFileMembersArg", 4)?;
8351        self.internal_serialize::<S>(&mut s)?;
8352        s.end()
8353    }
8354}
8355
8356/// Arguments for [`list_file_members_batch()`](crate::sharing::list_file_members_batch).
8357#[derive(Debug, Clone, PartialEq, Eq)]
8358#[non_exhaustive] // structs may have more fields added in the future.
8359pub struct ListFileMembersBatchArg {
8360    /// Files for which to return members.
8361    pub files: Vec<PathOrId>,
8362    /// Number of members to return max per query. Defaults to 1000 if no limit is specified.
8363    pub limit: u32,
8364}
8365
8366impl ListFileMembersBatchArg {
8367    pub fn new(files: Vec<PathOrId>) -> Self {
8368        ListFileMembersBatchArg {
8369            files,
8370            limit: 1000,
8371        }
8372    }
8373
8374    pub fn with_limit(mut self, value: u32) -> Self {
8375        self.limit = value;
8376        self
8377    }
8378}
8379
8380const LIST_FILE_MEMBERS_BATCH_ARG_FIELDS: &[&str] = &["files",
8381                                                      "limit"];
8382impl ListFileMembersBatchArg {
8383    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
8384        map: V,
8385    ) -> Result<ListFileMembersBatchArg, V::Error> {
8386        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
8387    }
8388
8389    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
8390        mut map: V,
8391        optional: bool,
8392    ) -> Result<Option<ListFileMembersBatchArg>, V::Error> {
8393        let mut field_files = None;
8394        let mut field_limit = None;
8395        let mut nothing = true;
8396        while let Some(key) = map.next_key::<&str>()? {
8397            nothing = false;
8398            match key {
8399                "files" => {
8400                    if field_files.is_some() {
8401                        return Err(::serde::de::Error::duplicate_field("files"));
8402                    }
8403                    field_files = Some(map.next_value()?);
8404                }
8405                "limit" => {
8406                    if field_limit.is_some() {
8407                        return Err(::serde::de::Error::duplicate_field("limit"));
8408                    }
8409                    field_limit = Some(map.next_value()?);
8410                }
8411                _ => {
8412                    // unknown field allowed and ignored
8413                    map.next_value::<::serde_json::Value>()?;
8414                }
8415            }
8416        }
8417        if optional && nothing {
8418            return Ok(None);
8419        }
8420        let result = ListFileMembersBatchArg {
8421            files: field_files.ok_or_else(|| ::serde::de::Error::missing_field("files"))?,
8422            limit: field_limit.unwrap_or(1000),
8423        };
8424        Ok(Some(result))
8425    }
8426
8427    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
8428        &self,
8429        s: &mut S::SerializeStruct,
8430    ) -> Result<(), S::Error> {
8431        use serde::ser::SerializeStruct;
8432        s.serialize_field("files", &self.files)?;
8433        if self.limit != 1000 {
8434            s.serialize_field("limit", &self.limit)?;
8435        }
8436        Ok(())
8437    }
8438}
8439
8440impl<'de> ::serde::de::Deserialize<'de> for ListFileMembersBatchArg {
8441    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8442        // struct deserializer
8443        use serde::de::{MapAccess, Visitor};
8444        struct StructVisitor;
8445        impl<'de> Visitor<'de> for StructVisitor {
8446            type Value = ListFileMembersBatchArg;
8447            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8448                f.write_str("a ListFileMembersBatchArg struct")
8449            }
8450            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
8451                ListFileMembersBatchArg::internal_deserialize(map)
8452            }
8453        }
8454        deserializer.deserialize_struct("ListFileMembersBatchArg", LIST_FILE_MEMBERS_BATCH_ARG_FIELDS, StructVisitor)
8455    }
8456}
8457
8458impl ::serde::ser::Serialize for ListFileMembersBatchArg {
8459    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8460        // struct serializer
8461        use serde::ser::SerializeStruct;
8462        let mut s = serializer.serialize_struct("ListFileMembersBatchArg", 2)?;
8463        self.internal_serialize::<S>(&mut s)?;
8464        s.end()
8465    }
8466}
8467
8468/// Per-file result for [`list_file_members_batch()`](crate::sharing::list_file_members_batch).
8469#[derive(Debug, Clone, PartialEq, Eq)]
8470#[non_exhaustive] // structs may have more fields added in the future.
8471pub struct ListFileMembersBatchResult {
8472    /// This is the input file identifier, whether an ID or a path.
8473    pub file: PathOrId,
8474    /// The result for this particular file.
8475    pub result: ListFileMembersIndividualResult,
8476}
8477
8478impl ListFileMembersBatchResult {
8479    pub fn new(file: PathOrId, result: ListFileMembersIndividualResult) -> Self {
8480        ListFileMembersBatchResult {
8481            file,
8482            result,
8483        }
8484    }
8485}
8486
8487const LIST_FILE_MEMBERS_BATCH_RESULT_FIELDS: &[&str] = &["file",
8488                                                         "result"];
8489impl ListFileMembersBatchResult {
8490    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
8491        map: V,
8492    ) -> Result<ListFileMembersBatchResult, V::Error> {
8493        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
8494    }
8495
8496    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
8497        mut map: V,
8498        optional: bool,
8499    ) -> Result<Option<ListFileMembersBatchResult>, V::Error> {
8500        let mut field_file = None;
8501        let mut field_result = None;
8502        let mut nothing = true;
8503        while let Some(key) = map.next_key::<&str>()? {
8504            nothing = false;
8505            match key {
8506                "file" => {
8507                    if field_file.is_some() {
8508                        return Err(::serde::de::Error::duplicate_field("file"));
8509                    }
8510                    field_file = Some(map.next_value()?);
8511                }
8512                "result" => {
8513                    if field_result.is_some() {
8514                        return Err(::serde::de::Error::duplicate_field("result"));
8515                    }
8516                    field_result = Some(map.next_value()?);
8517                }
8518                _ => {
8519                    // unknown field allowed and ignored
8520                    map.next_value::<::serde_json::Value>()?;
8521                }
8522            }
8523        }
8524        if optional && nothing {
8525            return Ok(None);
8526        }
8527        let result = ListFileMembersBatchResult {
8528            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
8529            result: field_result.ok_or_else(|| ::serde::de::Error::missing_field("result"))?,
8530        };
8531        Ok(Some(result))
8532    }
8533
8534    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
8535        &self,
8536        s: &mut S::SerializeStruct,
8537    ) -> Result<(), S::Error> {
8538        use serde::ser::SerializeStruct;
8539        s.serialize_field("file", &self.file)?;
8540        s.serialize_field("result", &self.result)?;
8541        Ok(())
8542    }
8543}
8544
8545impl<'de> ::serde::de::Deserialize<'de> for ListFileMembersBatchResult {
8546    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8547        // struct deserializer
8548        use serde::de::{MapAccess, Visitor};
8549        struct StructVisitor;
8550        impl<'de> Visitor<'de> for StructVisitor {
8551            type Value = ListFileMembersBatchResult;
8552            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8553                f.write_str("a ListFileMembersBatchResult struct")
8554            }
8555            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
8556                ListFileMembersBatchResult::internal_deserialize(map)
8557            }
8558        }
8559        deserializer.deserialize_struct("ListFileMembersBatchResult", LIST_FILE_MEMBERS_BATCH_RESULT_FIELDS, StructVisitor)
8560    }
8561}
8562
8563impl ::serde::ser::Serialize for ListFileMembersBatchResult {
8564    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8565        // struct serializer
8566        use serde::ser::SerializeStruct;
8567        let mut s = serializer.serialize_struct("ListFileMembersBatchResult", 2)?;
8568        self.internal_serialize::<S>(&mut s)?;
8569        s.end()
8570    }
8571}
8572
8573/// Arguments for [`list_file_members_continue()`](crate::sharing::list_file_members_continue).
8574#[derive(Debug, Clone, PartialEq, Eq)]
8575#[non_exhaustive] // structs may have more fields added in the future.
8576pub struct ListFileMembersContinueArg {
8577    /// The cursor returned by your last call to
8578    /// [`list_file_members()`](crate::sharing::list_file_members),
8579    /// [`list_file_members_continue()`](crate::sharing::list_file_members_continue), or
8580    /// [`list_file_members_batch()`](crate::sharing::list_file_members_batch).
8581    pub cursor: String,
8582}
8583
8584impl ListFileMembersContinueArg {
8585    pub fn new(cursor: String) -> Self {
8586        ListFileMembersContinueArg {
8587            cursor,
8588        }
8589    }
8590}
8591
8592const LIST_FILE_MEMBERS_CONTINUE_ARG_FIELDS: &[&str] = &["cursor"];
8593impl ListFileMembersContinueArg {
8594    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
8595        map: V,
8596    ) -> Result<ListFileMembersContinueArg, V::Error> {
8597        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
8598    }
8599
8600    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
8601        mut map: V,
8602        optional: bool,
8603    ) -> Result<Option<ListFileMembersContinueArg>, V::Error> {
8604        let mut field_cursor = None;
8605        let mut nothing = true;
8606        while let Some(key) = map.next_key::<&str>()? {
8607            nothing = false;
8608            match key {
8609                "cursor" => {
8610                    if field_cursor.is_some() {
8611                        return Err(::serde::de::Error::duplicate_field("cursor"));
8612                    }
8613                    field_cursor = Some(map.next_value()?);
8614                }
8615                _ => {
8616                    // unknown field allowed and ignored
8617                    map.next_value::<::serde_json::Value>()?;
8618                }
8619            }
8620        }
8621        if optional && nothing {
8622            return Ok(None);
8623        }
8624        let result = ListFileMembersContinueArg {
8625            cursor: field_cursor.ok_or_else(|| ::serde::de::Error::missing_field("cursor"))?,
8626        };
8627        Ok(Some(result))
8628    }
8629
8630    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
8631        &self,
8632        s: &mut S::SerializeStruct,
8633    ) -> Result<(), S::Error> {
8634        use serde::ser::SerializeStruct;
8635        s.serialize_field("cursor", &self.cursor)?;
8636        Ok(())
8637    }
8638}
8639
8640impl<'de> ::serde::de::Deserialize<'de> for ListFileMembersContinueArg {
8641    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8642        // struct deserializer
8643        use serde::de::{MapAccess, Visitor};
8644        struct StructVisitor;
8645        impl<'de> Visitor<'de> for StructVisitor {
8646            type Value = ListFileMembersContinueArg;
8647            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8648                f.write_str("a ListFileMembersContinueArg struct")
8649            }
8650            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
8651                ListFileMembersContinueArg::internal_deserialize(map)
8652            }
8653        }
8654        deserializer.deserialize_struct("ListFileMembersContinueArg", LIST_FILE_MEMBERS_CONTINUE_ARG_FIELDS, StructVisitor)
8655    }
8656}
8657
8658impl ::serde::ser::Serialize for ListFileMembersContinueArg {
8659    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8660        // struct serializer
8661        use serde::ser::SerializeStruct;
8662        let mut s = serializer.serialize_struct("ListFileMembersContinueArg", 1)?;
8663        self.internal_serialize::<S>(&mut s)?;
8664        s.end()
8665    }
8666}
8667
8668/// Error for [`list_file_members_continue()`](crate::sharing::list_file_members_continue).
8669#[derive(Debug, Clone, PartialEq, Eq)]
8670#[non_exhaustive] // variants may be added in the future
8671pub enum ListFileMembersContinueError {
8672    UserError(SharingUserError),
8673    AccessError(SharingFileAccessError),
8674    /// [`ListFileMembersContinueArg::cursor`](ListFileMembersContinueArg) is invalid.
8675    InvalidCursor,
8676    /// Catch-all used for unrecognized values returned from the server. Encountering this value
8677    /// typically indicates that this SDK version is out of date.
8678    Other,
8679}
8680
8681impl<'de> ::serde::de::Deserialize<'de> for ListFileMembersContinueError {
8682    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8683        // union deserializer
8684        use serde::de::{self, MapAccess, Visitor};
8685        struct EnumVisitor;
8686        impl<'de> Visitor<'de> for EnumVisitor {
8687            type Value = ListFileMembersContinueError;
8688            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8689                f.write_str("a ListFileMembersContinueError structure")
8690            }
8691            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
8692                let tag: &str = match map.next_key()? {
8693                    Some(".tag") => map.next_value()?,
8694                    _ => return Err(de::Error::missing_field(".tag"))
8695                };
8696                let value = match tag {
8697                    "user_error" => {
8698                        match map.next_key()? {
8699                            Some("user_error") => ListFileMembersContinueError::UserError(map.next_value()?),
8700                            None => return Err(de::Error::missing_field("user_error")),
8701                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
8702                        }
8703                    }
8704                    "access_error" => {
8705                        match map.next_key()? {
8706                            Some("access_error") => ListFileMembersContinueError::AccessError(map.next_value()?),
8707                            None => return Err(de::Error::missing_field("access_error")),
8708                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
8709                        }
8710                    }
8711                    "invalid_cursor" => ListFileMembersContinueError::InvalidCursor,
8712                    _ => ListFileMembersContinueError::Other,
8713                };
8714                crate::eat_json_fields(&mut map)?;
8715                Ok(value)
8716            }
8717        }
8718        const VARIANTS: &[&str] = &["user_error",
8719                                    "access_error",
8720                                    "invalid_cursor",
8721                                    "other"];
8722        deserializer.deserialize_struct("ListFileMembersContinueError", VARIANTS, EnumVisitor)
8723    }
8724}
8725
8726impl ::serde::ser::Serialize for ListFileMembersContinueError {
8727    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8728        // union serializer
8729        use serde::ser::SerializeStruct;
8730        match self {
8731            ListFileMembersContinueError::UserError(x) => {
8732                // union or polymporphic struct
8733                let mut s = serializer.serialize_struct("ListFileMembersContinueError", 2)?;
8734                s.serialize_field(".tag", "user_error")?;
8735                s.serialize_field("user_error", x)?;
8736                s.end()
8737            }
8738            ListFileMembersContinueError::AccessError(x) => {
8739                // union or polymporphic struct
8740                let mut s = serializer.serialize_struct("ListFileMembersContinueError", 2)?;
8741                s.serialize_field(".tag", "access_error")?;
8742                s.serialize_field("access_error", x)?;
8743                s.end()
8744            }
8745            ListFileMembersContinueError::InvalidCursor => {
8746                // unit
8747                let mut s = serializer.serialize_struct("ListFileMembersContinueError", 1)?;
8748                s.serialize_field(".tag", "invalid_cursor")?;
8749                s.end()
8750            }
8751            ListFileMembersContinueError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
8752        }
8753    }
8754}
8755
8756impl ::std::error::Error for ListFileMembersContinueError {
8757    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
8758        match self {
8759            ListFileMembersContinueError::UserError(inner) => Some(inner),
8760            ListFileMembersContinueError::AccessError(inner) => Some(inner),
8761            _ => None,
8762        }
8763    }
8764}
8765
8766impl ::std::fmt::Display for ListFileMembersContinueError {
8767    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8768        match self {
8769            ListFileMembersContinueError::UserError(inner) => write!(f, "ListFileMembersContinueError: {}", inner),
8770            ListFileMembersContinueError::AccessError(inner) => write!(f, "ListFileMembersContinueError: {}", inner),
8771            _ => write!(f, "{:?}", *self),
8772        }
8773    }
8774}
8775
8776#[derive(Debug, Clone, PartialEq, Eq)]
8777#[non_exhaustive] // structs may have more fields added in the future.
8778pub struct ListFileMembersCountResult {
8779    /// A list of members on this file.
8780    pub members: SharedFileMembers,
8781    /// The number of members on this file. This does not include inherited members.
8782    pub member_count: u32,
8783}
8784
8785impl ListFileMembersCountResult {
8786    pub fn new(members: SharedFileMembers, member_count: u32) -> Self {
8787        ListFileMembersCountResult {
8788            members,
8789            member_count,
8790        }
8791    }
8792}
8793
8794const LIST_FILE_MEMBERS_COUNT_RESULT_FIELDS: &[&str] = &["members",
8795                                                         "member_count"];
8796impl ListFileMembersCountResult {
8797    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
8798        map: V,
8799    ) -> Result<ListFileMembersCountResult, V::Error> {
8800        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
8801    }
8802
8803    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
8804        mut map: V,
8805        optional: bool,
8806    ) -> Result<Option<ListFileMembersCountResult>, V::Error> {
8807        let mut field_members = None;
8808        let mut field_member_count = None;
8809        let mut nothing = true;
8810        while let Some(key) = map.next_key::<&str>()? {
8811            nothing = false;
8812            match key {
8813                "members" => {
8814                    if field_members.is_some() {
8815                        return Err(::serde::de::Error::duplicate_field("members"));
8816                    }
8817                    field_members = Some(map.next_value()?);
8818                }
8819                "member_count" => {
8820                    if field_member_count.is_some() {
8821                        return Err(::serde::de::Error::duplicate_field("member_count"));
8822                    }
8823                    field_member_count = Some(map.next_value()?);
8824                }
8825                _ => {
8826                    // unknown field allowed and ignored
8827                    map.next_value::<::serde_json::Value>()?;
8828                }
8829            }
8830        }
8831        if optional && nothing {
8832            return Ok(None);
8833        }
8834        let result = ListFileMembersCountResult {
8835            members: field_members.ok_or_else(|| ::serde::de::Error::missing_field("members"))?,
8836            member_count: field_member_count.ok_or_else(|| ::serde::de::Error::missing_field("member_count"))?,
8837        };
8838        Ok(Some(result))
8839    }
8840
8841    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
8842        &self,
8843        s: &mut S::SerializeStruct,
8844    ) -> Result<(), S::Error> {
8845        use serde::ser::SerializeStruct;
8846        s.serialize_field("members", &self.members)?;
8847        s.serialize_field("member_count", &self.member_count)?;
8848        Ok(())
8849    }
8850}
8851
8852impl<'de> ::serde::de::Deserialize<'de> for ListFileMembersCountResult {
8853    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8854        // struct deserializer
8855        use serde::de::{MapAccess, Visitor};
8856        struct StructVisitor;
8857        impl<'de> Visitor<'de> for StructVisitor {
8858            type Value = ListFileMembersCountResult;
8859            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8860                f.write_str("a ListFileMembersCountResult struct")
8861            }
8862            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
8863                ListFileMembersCountResult::internal_deserialize(map)
8864            }
8865        }
8866        deserializer.deserialize_struct("ListFileMembersCountResult", LIST_FILE_MEMBERS_COUNT_RESULT_FIELDS, StructVisitor)
8867    }
8868}
8869
8870impl ::serde::ser::Serialize for ListFileMembersCountResult {
8871    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8872        // struct serializer
8873        use serde::ser::SerializeStruct;
8874        let mut s = serializer.serialize_struct("ListFileMembersCountResult", 2)?;
8875        self.internal_serialize::<S>(&mut s)?;
8876        s.end()
8877    }
8878}
8879
8880/// Error for [`list_file_members()`](crate::sharing::list_file_members).
8881#[derive(Debug, Clone, PartialEq, Eq)]
8882#[non_exhaustive] // variants may be added in the future
8883pub enum ListFileMembersError {
8884    UserError(SharingUserError),
8885    AccessError(SharingFileAccessError),
8886    /// Catch-all used for unrecognized values returned from the server. Encountering this value
8887    /// typically indicates that this SDK version is out of date.
8888    Other,
8889}
8890
8891impl<'de> ::serde::de::Deserialize<'de> for ListFileMembersError {
8892    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8893        // union deserializer
8894        use serde::de::{self, MapAccess, Visitor};
8895        struct EnumVisitor;
8896        impl<'de> Visitor<'de> for EnumVisitor {
8897            type Value = ListFileMembersError;
8898            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8899                f.write_str("a ListFileMembersError structure")
8900            }
8901            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
8902                let tag: &str = match map.next_key()? {
8903                    Some(".tag") => map.next_value()?,
8904                    _ => return Err(de::Error::missing_field(".tag"))
8905                };
8906                let value = match tag {
8907                    "user_error" => {
8908                        match map.next_key()? {
8909                            Some("user_error") => ListFileMembersError::UserError(map.next_value()?),
8910                            None => return Err(de::Error::missing_field("user_error")),
8911                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
8912                        }
8913                    }
8914                    "access_error" => {
8915                        match map.next_key()? {
8916                            Some("access_error") => ListFileMembersError::AccessError(map.next_value()?),
8917                            None => return Err(de::Error::missing_field("access_error")),
8918                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
8919                        }
8920                    }
8921                    _ => ListFileMembersError::Other,
8922                };
8923                crate::eat_json_fields(&mut map)?;
8924                Ok(value)
8925            }
8926        }
8927        const VARIANTS: &[&str] = &["user_error",
8928                                    "access_error",
8929                                    "other"];
8930        deserializer.deserialize_struct("ListFileMembersError", VARIANTS, EnumVisitor)
8931    }
8932}
8933
8934impl ::serde::ser::Serialize for ListFileMembersError {
8935    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8936        // union serializer
8937        use serde::ser::SerializeStruct;
8938        match self {
8939            ListFileMembersError::UserError(x) => {
8940                // union or polymporphic struct
8941                let mut s = serializer.serialize_struct("ListFileMembersError", 2)?;
8942                s.serialize_field(".tag", "user_error")?;
8943                s.serialize_field("user_error", x)?;
8944                s.end()
8945            }
8946            ListFileMembersError::AccessError(x) => {
8947                // union or polymporphic struct
8948                let mut s = serializer.serialize_struct("ListFileMembersError", 2)?;
8949                s.serialize_field(".tag", "access_error")?;
8950                s.serialize_field("access_error", x)?;
8951                s.end()
8952            }
8953            ListFileMembersError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
8954        }
8955    }
8956}
8957
8958impl ::std::error::Error for ListFileMembersError {
8959    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
8960        match self {
8961            ListFileMembersError::UserError(inner) => Some(inner),
8962            ListFileMembersError::AccessError(inner) => Some(inner),
8963            _ => None,
8964        }
8965    }
8966}
8967
8968impl ::std::fmt::Display for ListFileMembersError {
8969    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8970        match self {
8971            ListFileMembersError::UserError(inner) => write!(f, "ListFileMembersError: {}", inner),
8972            ListFileMembersError::AccessError(inner) => write!(f, "ListFileMembersError: {}", inner),
8973            _ => write!(f, "{:?}", *self),
8974        }
8975    }
8976}
8977
8978#[derive(Debug, Clone, PartialEq, Eq)]
8979#[non_exhaustive] // variants may be added in the future
8980pub enum ListFileMembersIndividualResult {
8981    /// The results of the query for this file if it was successful.
8982    Result(ListFileMembersCountResult),
8983    /// The result of the query for this file if it was an error.
8984    AccessError(SharingFileAccessError),
8985    /// Catch-all used for unrecognized values returned from the server. Encountering this value
8986    /// typically indicates that this SDK version is out of date.
8987    Other,
8988}
8989
8990impl<'de> ::serde::de::Deserialize<'de> for ListFileMembersIndividualResult {
8991    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8992        // union deserializer
8993        use serde::de::{self, MapAccess, Visitor};
8994        struct EnumVisitor;
8995        impl<'de> Visitor<'de> for EnumVisitor {
8996            type Value = ListFileMembersIndividualResult;
8997            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8998                f.write_str("a ListFileMembersIndividualResult structure")
8999            }
9000            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
9001                let tag: &str = match map.next_key()? {
9002                    Some(".tag") => map.next_value()?,
9003                    _ => return Err(de::Error::missing_field(".tag"))
9004                };
9005                let value = match tag {
9006                    "result" => ListFileMembersIndividualResult::Result(ListFileMembersCountResult::internal_deserialize(&mut map)?),
9007                    "access_error" => {
9008                        match map.next_key()? {
9009                            Some("access_error") => ListFileMembersIndividualResult::AccessError(map.next_value()?),
9010                            None => return Err(de::Error::missing_field("access_error")),
9011                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
9012                        }
9013                    }
9014                    _ => ListFileMembersIndividualResult::Other,
9015                };
9016                crate::eat_json_fields(&mut map)?;
9017                Ok(value)
9018            }
9019        }
9020        const VARIANTS: &[&str] = &["result",
9021                                    "access_error",
9022                                    "other"];
9023        deserializer.deserialize_struct("ListFileMembersIndividualResult", VARIANTS, EnumVisitor)
9024    }
9025}
9026
9027impl ::serde::ser::Serialize for ListFileMembersIndividualResult {
9028    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9029        // union serializer
9030        use serde::ser::SerializeStruct;
9031        match self {
9032            ListFileMembersIndividualResult::Result(x) => {
9033                // struct
9034                let mut s = serializer.serialize_struct("ListFileMembersIndividualResult", 3)?;
9035                s.serialize_field(".tag", "result")?;
9036                x.internal_serialize::<S>(&mut s)?;
9037                s.end()
9038            }
9039            ListFileMembersIndividualResult::AccessError(x) => {
9040                // union or polymporphic struct
9041                let mut s = serializer.serialize_struct("ListFileMembersIndividualResult", 2)?;
9042                s.serialize_field(".tag", "access_error")?;
9043                s.serialize_field("access_error", x)?;
9044                s.end()
9045            }
9046            ListFileMembersIndividualResult::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
9047        }
9048    }
9049}
9050
9051/// Arguments for [`list_received_files()`](crate::sharing::list_received_files).
9052#[derive(Debug, Clone, PartialEq, Eq)]
9053#[non_exhaustive] // structs may have more fields added in the future.
9054pub struct ListFilesArg {
9055    /// Number of files to return max per query. Defaults to 100 if no limit is specified.
9056    pub limit: u32,
9057    /// A list of `FileAction`s corresponding to `FilePermission`s that should appear in the
9058    /// response's [`SharedFileMetadata::permissions`](SharedFileMetadata) field describing the
9059    /// actions the authenticated user can perform on the file.
9060    pub actions: Option<Vec<FileAction>>,
9061}
9062
9063impl Default for ListFilesArg {
9064    fn default() -> Self {
9065        ListFilesArg {
9066            limit: 100,
9067            actions: None,
9068        }
9069    }
9070}
9071
9072impl ListFilesArg {
9073    pub fn with_limit(mut self, value: u32) -> Self {
9074        self.limit = value;
9075        self
9076    }
9077
9078    pub fn with_actions(mut self, value: Vec<FileAction>) -> Self {
9079        self.actions = Some(value);
9080        self
9081    }
9082}
9083
9084const LIST_FILES_ARG_FIELDS: &[&str] = &["limit",
9085                                         "actions"];
9086impl ListFilesArg {
9087    // no _opt deserializer
9088    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
9089        mut map: V,
9090    ) -> Result<ListFilesArg, V::Error> {
9091        let mut field_limit = None;
9092        let mut field_actions = None;
9093        while let Some(key) = map.next_key::<&str>()? {
9094            match key {
9095                "limit" => {
9096                    if field_limit.is_some() {
9097                        return Err(::serde::de::Error::duplicate_field("limit"));
9098                    }
9099                    field_limit = Some(map.next_value()?);
9100                }
9101                "actions" => {
9102                    if field_actions.is_some() {
9103                        return Err(::serde::de::Error::duplicate_field("actions"));
9104                    }
9105                    field_actions = Some(map.next_value()?);
9106                }
9107                _ => {
9108                    // unknown field allowed and ignored
9109                    map.next_value::<::serde_json::Value>()?;
9110                }
9111            }
9112        }
9113        let result = ListFilesArg {
9114            limit: field_limit.unwrap_or(100),
9115            actions: field_actions.and_then(Option::flatten),
9116        };
9117        Ok(result)
9118    }
9119
9120    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
9121        &self,
9122        s: &mut S::SerializeStruct,
9123    ) -> Result<(), S::Error> {
9124        use serde::ser::SerializeStruct;
9125        if self.limit != 100 {
9126            s.serialize_field("limit", &self.limit)?;
9127        }
9128        if let Some(val) = &self.actions {
9129            s.serialize_field("actions", val)?;
9130        }
9131        Ok(())
9132    }
9133}
9134
9135impl<'de> ::serde::de::Deserialize<'de> for ListFilesArg {
9136    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9137        // struct deserializer
9138        use serde::de::{MapAccess, Visitor};
9139        struct StructVisitor;
9140        impl<'de> Visitor<'de> for StructVisitor {
9141            type Value = ListFilesArg;
9142            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9143                f.write_str("a ListFilesArg struct")
9144            }
9145            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
9146                ListFilesArg::internal_deserialize(map)
9147            }
9148        }
9149        deserializer.deserialize_struct("ListFilesArg", LIST_FILES_ARG_FIELDS, StructVisitor)
9150    }
9151}
9152
9153impl ::serde::ser::Serialize for ListFilesArg {
9154    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9155        // struct serializer
9156        use serde::ser::SerializeStruct;
9157        let mut s = serializer.serialize_struct("ListFilesArg", 2)?;
9158        self.internal_serialize::<S>(&mut s)?;
9159        s.end()
9160    }
9161}
9162
9163/// Arguments for [`list_received_files_continue()`](crate::sharing::list_received_files_continue).
9164#[derive(Debug, Clone, PartialEq, Eq)]
9165#[non_exhaustive] // structs may have more fields added in the future.
9166pub struct ListFilesContinueArg {
9167    /// Cursor in [`ListFilesResult::cursor`](ListFilesResult).
9168    pub cursor: String,
9169}
9170
9171impl ListFilesContinueArg {
9172    pub fn new(cursor: String) -> Self {
9173        ListFilesContinueArg {
9174            cursor,
9175        }
9176    }
9177}
9178
9179const LIST_FILES_CONTINUE_ARG_FIELDS: &[&str] = &["cursor"];
9180impl ListFilesContinueArg {
9181    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
9182        map: V,
9183    ) -> Result<ListFilesContinueArg, V::Error> {
9184        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
9185    }
9186
9187    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
9188        mut map: V,
9189        optional: bool,
9190    ) -> Result<Option<ListFilesContinueArg>, V::Error> {
9191        let mut field_cursor = None;
9192        let mut nothing = true;
9193        while let Some(key) = map.next_key::<&str>()? {
9194            nothing = false;
9195            match key {
9196                "cursor" => {
9197                    if field_cursor.is_some() {
9198                        return Err(::serde::de::Error::duplicate_field("cursor"));
9199                    }
9200                    field_cursor = Some(map.next_value()?);
9201                }
9202                _ => {
9203                    // unknown field allowed and ignored
9204                    map.next_value::<::serde_json::Value>()?;
9205                }
9206            }
9207        }
9208        if optional && nothing {
9209            return Ok(None);
9210        }
9211        let result = ListFilesContinueArg {
9212            cursor: field_cursor.ok_or_else(|| ::serde::de::Error::missing_field("cursor"))?,
9213        };
9214        Ok(Some(result))
9215    }
9216
9217    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
9218        &self,
9219        s: &mut S::SerializeStruct,
9220    ) -> Result<(), S::Error> {
9221        use serde::ser::SerializeStruct;
9222        s.serialize_field("cursor", &self.cursor)?;
9223        Ok(())
9224    }
9225}
9226
9227impl<'de> ::serde::de::Deserialize<'de> for ListFilesContinueArg {
9228    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9229        // struct deserializer
9230        use serde::de::{MapAccess, Visitor};
9231        struct StructVisitor;
9232        impl<'de> Visitor<'de> for StructVisitor {
9233            type Value = ListFilesContinueArg;
9234            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9235                f.write_str("a ListFilesContinueArg struct")
9236            }
9237            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
9238                ListFilesContinueArg::internal_deserialize(map)
9239            }
9240        }
9241        deserializer.deserialize_struct("ListFilesContinueArg", LIST_FILES_CONTINUE_ARG_FIELDS, StructVisitor)
9242    }
9243}
9244
9245impl ::serde::ser::Serialize for ListFilesContinueArg {
9246    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9247        // struct serializer
9248        use serde::ser::SerializeStruct;
9249        let mut s = serializer.serialize_struct("ListFilesContinueArg", 1)?;
9250        self.internal_serialize::<S>(&mut s)?;
9251        s.end()
9252    }
9253}
9254
9255/// Error results for
9256/// [`list_received_files_continue()`](crate::sharing::list_received_files_continue).
9257#[derive(Debug, Clone, PartialEq, Eq)]
9258#[non_exhaustive] // variants may be added in the future
9259pub enum ListFilesContinueError {
9260    /// User account had a problem.
9261    UserError(SharingUserError),
9262    /// [`ListFilesContinueArg::cursor`](ListFilesContinueArg) is invalid.
9263    InvalidCursor,
9264    /// Catch-all used for unrecognized values returned from the server. Encountering this value
9265    /// typically indicates that this SDK version is out of date.
9266    Other,
9267}
9268
9269impl<'de> ::serde::de::Deserialize<'de> for ListFilesContinueError {
9270    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9271        // union deserializer
9272        use serde::de::{self, MapAccess, Visitor};
9273        struct EnumVisitor;
9274        impl<'de> Visitor<'de> for EnumVisitor {
9275            type Value = ListFilesContinueError;
9276            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9277                f.write_str("a ListFilesContinueError structure")
9278            }
9279            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
9280                let tag: &str = match map.next_key()? {
9281                    Some(".tag") => map.next_value()?,
9282                    _ => return Err(de::Error::missing_field(".tag"))
9283                };
9284                let value = match tag {
9285                    "user_error" => {
9286                        match map.next_key()? {
9287                            Some("user_error") => ListFilesContinueError::UserError(map.next_value()?),
9288                            None => return Err(de::Error::missing_field("user_error")),
9289                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
9290                        }
9291                    }
9292                    "invalid_cursor" => ListFilesContinueError::InvalidCursor,
9293                    _ => ListFilesContinueError::Other,
9294                };
9295                crate::eat_json_fields(&mut map)?;
9296                Ok(value)
9297            }
9298        }
9299        const VARIANTS: &[&str] = &["user_error",
9300                                    "invalid_cursor",
9301                                    "other"];
9302        deserializer.deserialize_struct("ListFilesContinueError", VARIANTS, EnumVisitor)
9303    }
9304}
9305
9306impl ::serde::ser::Serialize for ListFilesContinueError {
9307    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9308        // union serializer
9309        use serde::ser::SerializeStruct;
9310        match self {
9311            ListFilesContinueError::UserError(x) => {
9312                // union or polymporphic struct
9313                let mut s = serializer.serialize_struct("ListFilesContinueError", 2)?;
9314                s.serialize_field(".tag", "user_error")?;
9315                s.serialize_field("user_error", x)?;
9316                s.end()
9317            }
9318            ListFilesContinueError::InvalidCursor => {
9319                // unit
9320                let mut s = serializer.serialize_struct("ListFilesContinueError", 1)?;
9321                s.serialize_field(".tag", "invalid_cursor")?;
9322                s.end()
9323            }
9324            ListFilesContinueError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
9325        }
9326    }
9327}
9328
9329impl ::std::error::Error for ListFilesContinueError {
9330    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
9331        match self {
9332            ListFilesContinueError::UserError(inner) => Some(inner),
9333            _ => None,
9334        }
9335    }
9336}
9337
9338impl ::std::fmt::Display for ListFilesContinueError {
9339    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9340        match self {
9341            ListFilesContinueError::UserError(inner) => write!(f, "User account had a problem: {}", inner),
9342            _ => write!(f, "{:?}", *self),
9343        }
9344    }
9345}
9346
9347/// Success results for [`list_received_files()`](crate::sharing::list_received_files).
9348#[derive(Debug, Clone, PartialEq, Eq)]
9349#[non_exhaustive] // structs may have more fields added in the future.
9350pub struct ListFilesResult {
9351    /// Information about the files shared with current user.
9352    pub entries: Vec<SharedFileMetadata>,
9353    /// Cursor used to obtain additional shared files.
9354    pub cursor: Option<String>,
9355}
9356
9357impl ListFilesResult {
9358    pub fn new(entries: Vec<SharedFileMetadata>) -> Self {
9359        ListFilesResult {
9360            entries,
9361            cursor: None,
9362        }
9363    }
9364
9365    pub fn with_cursor(mut self, value: String) -> Self {
9366        self.cursor = Some(value);
9367        self
9368    }
9369}
9370
9371const LIST_FILES_RESULT_FIELDS: &[&str] = &["entries",
9372                                            "cursor"];
9373impl ListFilesResult {
9374    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
9375        map: V,
9376    ) -> Result<ListFilesResult, V::Error> {
9377        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
9378    }
9379
9380    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
9381        mut map: V,
9382        optional: bool,
9383    ) -> Result<Option<ListFilesResult>, V::Error> {
9384        let mut field_entries = None;
9385        let mut field_cursor = None;
9386        let mut nothing = true;
9387        while let Some(key) = map.next_key::<&str>()? {
9388            nothing = false;
9389            match key {
9390                "entries" => {
9391                    if field_entries.is_some() {
9392                        return Err(::serde::de::Error::duplicate_field("entries"));
9393                    }
9394                    field_entries = Some(map.next_value()?);
9395                }
9396                "cursor" => {
9397                    if field_cursor.is_some() {
9398                        return Err(::serde::de::Error::duplicate_field("cursor"));
9399                    }
9400                    field_cursor = Some(map.next_value()?);
9401                }
9402                _ => {
9403                    // unknown field allowed and ignored
9404                    map.next_value::<::serde_json::Value>()?;
9405                }
9406            }
9407        }
9408        if optional && nothing {
9409            return Ok(None);
9410        }
9411        let result = ListFilesResult {
9412            entries: field_entries.ok_or_else(|| ::serde::de::Error::missing_field("entries"))?,
9413            cursor: field_cursor.and_then(Option::flatten),
9414        };
9415        Ok(Some(result))
9416    }
9417
9418    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
9419        &self,
9420        s: &mut S::SerializeStruct,
9421    ) -> Result<(), S::Error> {
9422        use serde::ser::SerializeStruct;
9423        s.serialize_field("entries", &self.entries)?;
9424        if let Some(val) = &self.cursor {
9425            s.serialize_field("cursor", val)?;
9426        }
9427        Ok(())
9428    }
9429}
9430
9431impl<'de> ::serde::de::Deserialize<'de> for ListFilesResult {
9432    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9433        // struct deserializer
9434        use serde::de::{MapAccess, Visitor};
9435        struct StructVisitor;
9436        impl<'de> Visitor<'de> for StructVisitor {
9437            type Value = ListFilesResult;
9438            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9439                f.write_str("a ListFilesResult struct")
9440            }
9441            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
9442                ListFilesResult::internal_deserialize(map)
9443            }
9444        }
9445        deserializer.deserialize_struct("ListFilesResult", LIST_FILES_RESULT_FIELDS, StructVisitor)
9446    }
9447}
9448
9449impl ::serde::ser::Serialize for ListFilesResult {
9450    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9451        // struct serializer
9452        use serde::ser::SerializeStruct;
9453        let mut s = serializer.serialize_struct("ListFilesResult", 2)?;
9454        self.internal_serialize::<S>(&mut s)?;
9455        s.end()
9456    }
9457}
9458
9459#[derive(Debug, Clone, PartialEq, Eq)]
9460#[non_exhaustive] // structs may have more fields added in the future.
9461pub struct ListFolderMembersArgs {
9462    /// The ID for the shared folder. When path is provided, the folder ID will be extracted from
9463    /// the path instead.
9464    pub shared_folder_id: crate::types::common::SharedFolderId,
9465    /// This is a list indicating whether each returned member will include a boolean value
9466    /// [`MemberPermission::allow`](MemberPermission) that describes whether the current user can
9467    /// perform the MemberAction on the member.
9468    pub actions: Option<Vec<MemberAction>>,
9469    /// The maximum number of results that include members, groups and invitees to return per
9470    /// request.
9471    pub limit: u32,
9472    /// Optional path to get inherited members. When omitted, uses shared_folder_id to return direct
9473    /// members. When provided, extracts folder ID from this path and returns users who have access
9474    /// through parent shared folder.
9475    pub path: Option<String>,
9476}
9477
9478impl ListFolderMembersArgs {
9479    pub fn new(shared_folder_id: crate::types::common::SharedFolderId) -> Self {
9480        ListFolderMembersArgs {
9481            shared_folder_id,
9482            actions: None,
9483            limit: 1000,
9484            path: None,
9485        }
9486    }
9487
9488    pub fn with_actions(mut self, value: Vec<MemberAction>) -> Self {
9489        self.actions = Some(value);
9490        self
9491    }
9492
9493    pub fn with_limit(mut self, value: u32) -> Self {
9494        self.limit = value;
9495        self
9496    }
9497
9498    pub fn with_path(mut self, value: String) -> Self {
9499        self.path = Some(value);
9500        self
9501    }
9502}
9503
9504const LIST_FOLDER_MEMBERS_ARGS_FIELDS: &[&str] = &["shared_folder_id",
9505                                                   "actions",
9506                                                   "limit",
9507                                                   "path"];
9508impl ListFolderMembersArgs {
9509    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
9510        map: V,
9511    ) -> Result<ListFolderMembersArgs, V::Error> {
9512        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
9513    }
9514
9515    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
9516        mut map: V,
9517        optional: bool,
9518    ) -> Result<Option<ListFolderMembersArgs>, V::Error> {
9519        let mut field_shared_folder_id = None;
9520        let mut field_actions = None;
9521        let mut field_limit = None;
9522        let mut field_path = None;
9523        let mut nothing = true;
9524        while let Some(key) = map.next_key::<&str>()? {
9525            nothing = false;
9526            match key {
9527                "shared_folder_id" => {
9528                    if field_shared_folder_id.is_some() {
9529                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
9530                    }
9531                    field_shared_folder_id = Some(map.next_value()?);
9532                }
9533                "actions" => {
9534                    if field_actions.is_some() {
9535                        return Err(::serde::de::Error::duplicate_field("actions"));
9536                    }
9537                    field_actions = Some(map.next_value()?);
9538                }
9539                "limit" => {
9540                    if field_limit.is_some() {
9541                        return Err(::serde::de::Error::duplicate_field("limit"));
9542                    }
9543                    field_limit = Some(map.next_value()?);
9544                }
9545                "path" => {
9546                    if field_path.is_some() {
9547                        return Err(::serde::de::Error::duplicate_field("path"));
9548                    }
9549                    field_path = Some(map.next_value()?);
9550                }
9551                _ => {
9552                    // unknown field allowed and ignored
9553                    map.next_value::<::serde_json::Value>()?;
9554                }
9555            }
9556        }
9557        if optional && nothing {
9558            return Ok(None);
9559        }
9560        let result = ListFolderMembersArgs {
9561            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
9562            actions: field_actions.and_then(Option::flatten),
9563            limit: field_limit.unwrap_or(1000),
9564            path: field_path.and_then(Option::flatten),
9565        };
9566        Ok(Some(result))
9567    }
9568
9569    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
9570        &self,
9571        s: &mut S::SerializeStruct,
9572    ) -> Result<(), S::Error> {
9573        use serde::ser::SerializeStruct;
9574        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
9575        if let Some(val) = &self.actions {
9576            s.serialize_field("actions", val)?;
9577        }
9578        if self.limit != 1000 {
9579            s.serialize_field("limit", &self.limit)?;
9580        }
9581        if let Some(val) = &self.path {
9582            s.serialize_field("path", val)?;
9583        }
9584        Ok(())
9585    }
9586}
9587
9588impl<'de> ::serde::de::Deserialize<'de> for ListFolderMembersArgs {
9589    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9590        // struct deserializer
9591        use serde::de::{MapAccess, Visitor};
9592        struct StructVisitor;
9593        impl<'de> Visitor<'de> for StructVisitor {
9594            type Value = ListFolderMembersArgs;
9595            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9596                f.write_str("a ListFolderMembersArgs struct")
9597            }
9598            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
9599                ListFolderMembersArgs::internal_deserialize(map)
9600            }
9601        }
9602        deserializer.deserialize_struct("ListFolderMembersArgs", LIST_FOLDER_MEMBERS_ARGS_FIELDS, StructVisitor)
9603    }
9604}
9605
9606impl ::serde::ser::Serialize for ListFolderMembersArgs {
9607    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9608        // struct serializer
9609        use serde::ser::SerializeStruct;
9610        let mut s = serializer.serialize_struct("ListFolderMembersArgs", 4)?;
9611        self.internal_serialize::<S>(&mut s)?;
9612        s.end()
9613    }
9614}
9615
9616// struct extends ListFolderMembersCursorArg
9617impl From<ListFolderMembersArgs> for ListFolderMembersCursorArg {
9618    fn from(subtype: ListFolderMembersArgs) -> Self {
9619        Self {
9620            actions: subtype.actions,
9621            limit: subtype.limit,
9622        }
9623    }
9624}
9625#[derive(Debug, Clone, PartialEq, Eq)]
9626#[non_exhaustive] // structs may have more fields added in the future.
9627pub struct ListFolderMembersContinueArg {
9628    /// The cursor returned by your last call to
9629    /// [`list_folder_members()`](crate::sharing::list_folder_members) or
9630    /// [`list_folder_members_continue()`](crate::sharing::list_folder_members_continue).
9631    pub cursor: String,
9632}
9633
9634impl ListFolderMembersContinueArg {
9635    pub fn new(cursor: String) -> Self {
9636        ListFolderMembersContinueArg {
9637            cursor,
9638        }
9639    }
9640}
9641
9642const LIST_FOLDER_MEMBERS_CONTINUE_ARG_FIELDS: &[&str] = &["cursor"];
9643impl ListFolderMembersContinueArg {
9644    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
9645        map: V,
9646    ) -> Result<ListFolderMembersContinueArg, V::Error> {
9647        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
9648    }
9649
9650    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
9651        mut map: V,
9652        optional: bool,
9653    ) -> Result<Option<ListFolderMembersContinueArg>, V::Error> {
9654        let mut field_cursor = None;
9655        let mut nothing = true;
9656        while let Some(key) = map.next_key::<&str>()? {
9657            nothing = false;
9658            match key {
9659                "cursor" => {
9660                    if field_cursor.is_some() {
9661                        return Err(::serde::de::Error::duplicate_field("cursor"));
9662                    }
9663                    field_cursor = Some(map.next_value()?);
9664                }
9665                _ => {
9666                    // unknown field allowed and ignored
9667                    map.next_value::<::serde_json::Value>()?;
9668                }
9669            }
9670        }
9671        if optional && nothing {
9672            return Ok(None);
9673        }
9674        let result = ListFolderMembersContinueArg {
9675            cursor: field_cursor.ok_or_else(|| ::serde::de::Error::missing_field("cursor"))?,
9676        };
9677        Ok(Some(result))
9678    }
9679
9680    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
9681        &self,
9682        s: &mut S::SerializeStruct,
9683    ) -> Result<(), S::Error> {
9684        use serde::ser::SerializeStruct;
9685        s.serialize_field("cursor", &self.cursor)?;
9686        Ok(())
9687    }
9688}
9689
9690impl<'de> ::serde::de::Deserialize<'de> for ListFolderMembersContinueArg {
9691    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9692        // struct deserializer
9693        use serde::de::{MapAccess, Visitor};
9694        struct StructVisitor;
9695        impl<'de> Visitor<'de> for StructVisitor {
9696            type Value = ListFolderMembersContinueArg;
9697            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9698                f.write_str("a ListFolderMembersContinueArg struct")
9699            }
9700            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
9701                ListFolderMembersContinueArg::internal_deserialize(map)
9702            }
9703        }
9704        deserializer.deserialize_struct("ListFolderMembersContinueArg", LIST_FOLDER_MEMBERS_CONTINUE_ARG_FIELDS, StructVisitor)
9705    }
9706}
9707
9708impl ::serde::ser::Serialize for ListFolderMembersContinueArg {
9709    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9710        // struct serializer
9711        use serde::ser::SerializeStruct;
9712        let mut s = serializer.serialize_struct("ListFolderMembersContinueArg", 1)?;
9713        self.internal_serialize::<S>(&mut s)?;
9714        s.end()
9715    }
9716}
9717
9718#[derive(Debug, Clone, PartialEq, Eq)]
9719#[non_exhaustive] // variants may be added in the future
9720pub enum ListFolderMembersContinueError {
9721    AccessError(SharedFolderAccessError),
9722    /// [`ListFolderMembersContinueArg::cursor`](ListFolderMembersContinueArg) is invalid.
9723    InvalidCursor,
9724    /// Catch-all used for unrecognized values returned from the server. Encountering this value
9725    /// typically indicates that this SDK version is out of date.
9726    Other,
9727}
9728
9729impl<'de> ::serde::de::Deserialize<'de> for ListFolderMembersContinueError {
9730    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9731        // union deserializer
9732        use serde::de::{self, MapAccess, Visitor};
9733        struct EnumVisitor;
9734        impl<'de> Visitor<'de> for EnumVisitor {
9735            type Value = ListFolderMembersContinueError;
9736            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9737                f.write_str("a ListFolderMembersContinueError structure")
9738            }
9739            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
9740                let tag: &str = match map.next_key()? {
9741                    Some(".tag") => map.next_value()?,
9742                    _ => return Err(de::Error::missing_field(".tag"))
9743                };
9744                let value = match tag {
9745                    "access_error" => {
9746                        match map.next_key()? {
9747                            Some("access_error") => ListFolderMembersContinueError::AccessError(map.next_value()?),
9748                            None => return Err(de::Error::missing_field("access_error")),
9749                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
9750                        }
9751                    }
9752                    "invalid_cursor" => ListFolderMembersContinueError::InvalidCursor,
9753                    _ => ListFolderMembersContinueError::Other,
9754                };
9755                crate::eat_json_fields(&mut map)?;
9756                Ok(value)
9757            }
9758        }
9759        const VARIANTS: &[&str] = &["access_error",
9760                                    "invalid_cursor",
9761                                    "other"];
9762        deserializer.deserialize_struct("ListFolderMembersContinueError", VARIANTS, EnumVisitor)
9763    }
9764}
9765
9766impl ::serde::ser::Serialize for ListFolderMembersContinueError {
9767    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9768        // union serializer
9769        use serde::ser::SerializeStruct;
9770        match self {
9771            ListFolderMembersContinueError::AccessError(x) => {
9772                // union or polymporphic struct
9773                let mut s = serializer.serialize_struct("ListFolderMembersContinueError", 2)?;
9774                s.serialize_field(".tag", "access_error")?;
9775                s.serialize_field("access_error", x)?;
9776                s.end()
9777            }
9778            ListFolderMembersContinueError::InvalidCursor => {
9779                // unit
9780                let mut s = serializer.serialize_struct("ListFolderMembersContinueError", 1)?;
9781                s.serialize_field(".tag", "invalid_cursor")?;
9782                s.end()
9783            }
9784            ListFolderMembersContinueError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
9785        }
9786    }
9787}
9788
9789impl ::std::error::Error for ListFolderMembersContinueError {
9790    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
9791        match self {
9792            ListFolderMembersContinueError::AccessError(inner) => Some(inner),
9793            _ => None,
9794        }
9795    }
9796}
9797
9798impl ::std::fmt::Display for ListFolderMembersContinueError {
9799    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9800        match self {
9801            ListFolderMembersContinueError::AccessError(inner) => write!(f, "ListFolderMembersContinueError: {}", inner),
9802            _ => write!(f, "{:?}", *self),
9803        }
9804    }
9805}
9806
9807#[derive(Debug, Clone, PartialEq, Eq)]
9808#[non_exhaustive] // structs may have more fields added in the future.
9809pub struct ListFolderMembersCursorArg {
9810    /// This is a list indicating whether each returned member will include a boolean value
9811    /// [`MemberPermission::allow`](MemberPermission) that describes whether the current user can
9812    /// perform the MemberAction on the member.
9813    pub actions: Option<Vec<MemberAction>>,
9814    /// The maximum number of results that include members, groups and invitees to return per
9815    /// request.
9816    pub limit: u32,
9817}
9818
9819impl Default for ListFolderMembersCursorArg {
9820    fn default() -> Self {
9821        ListFolderMembersCursorArg {
9822            actions: None,
9823            limit: 1000,
9824        }
9825    }
9826}
9827
9828impl ListFolderMembersCursorArg {
9829    pub fn with_actions(mut self, value: Vec<MemberAction>) -> Self {
9830        self.actions = Some(value);
9831        self
9832    }
9833
9834    pub fn with_limit(mut self, value: u32) -> Self {
9835        self.limit = value;
9836        self
9837    }
9838}
9839
9840const LIST_FOLDER_MEMBERS_CURSOR_ARG_FIELDS: &[&str] = &["actions",
9841                                                         "limit"];
9842impl ListFolderMembersCursorArg {
9843    // no _opt deserializer
9844    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
9845        mut map: V,
9846    ) -> Result<ListFolderMembersCursorArg, V::Error> {
9847        let mut field_actions = None;
9848        let mut field_limit = None;
9849        while let Some(key) = map.next_key::<&str>()? {
9850            match key {
9851                "actions" => {
9852                    if field_actions.is_some() {
9853                        return Err(::serde::de::Error::duplicate_field("actions"));
9854                    }
9855                    field_actions = Some(map.next_value()?);
9856                }
9857                "limit" => {
9858                    if field_limit.is_some() {
9859                        return Err(::serde::de::Error::duplicate_field("limit"));
9860                    }
9861                    field_limit = Some(map.next_value()?);
9862                }
9863                _ => {
9864                    // unknown field allowed and ignored
9865                    map.next_value::<::serde_json::Value>()?;
9866                }
9867            }
9868        }
9869        let result = ListFolderMembersCursorArg {
9870            actions: field_actions.and_then(Option::flatten),
9871            limit: field_limit.unwrap_or(1000),
9872        };
9873        Ok(result)
9874    }
9875
9876    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
9877        &self,
9878        s: &mut S::SerializeStruct,
9879    ) -> Result<(), S::Error> {
9880        use serde::ser::SerializeStruct;
9881        if let Some(val) = &self.actions {
9882            s.serialize_field("actions", val)?;
9883        }
9884        if self.limit != 1000 {
9885            s.serialize_field("limit", &self.limit)?;
9886        }
9887        Ok(())
9888    }
9889}
9890
9891impl<'de> ::serde::de::Deserialize<'de> for ListFolderMembersCursorArg {
9892    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9893        // struct deserializer
9894        use serde::de::{MapAccess, Visitor};
9895        struct StructVisitor;
9896        impl<'de> Visitor<'de> for StructVisitor {
9897            type Value = ListFolderMembersCursorArg;
9898            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9899                f.write_str("a ListFolderMembersCursorArg struct")
9900            }
9901            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
9902                ListFolderMembersCursorArg::internal_deserialize(map)
9903            }
9904        }
9905        deserializer.deserialize_struct("ListFolderMembersCursorArg", LIST_FOLDER_MEMBERS_CURSOR_ARG_FIELDS, StructVisitor)
9906    }
9907}
9908
9909impl ::serde::ser::Serialize for ListFolderMembersCursorArg {
9910    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9911        // struct serializer
9912        use serde::ser::SerializeStruct;
9913        let mut s = serializer.serialize_struct("ListFolderMembersCursorArg", 2)?;
9914        self.internal_serialize::<S>(&mut s)?;
9915        s.end()
9916    }
9917}
9918
9919#[derive(Debug, Clone, PartialEq, Eq)]
9920#[non_exhaustive] // structs may have more fields added in the future.
9921pub struct ListFoldersArgs {
9922    /// The maximum number of results to return per request.
9923    pub limit: u32,
9924    /// A list of `FolderAction`s corresponding to `FolderPermission`s that should appear in the
9925    /// response's [`SharedFolderMetadata::permissions`](SharedFolderMetadata) field describing the
9926    /// actions the authenticated user can perform on the folder.
9927    pub actions: Option<Vec<FolderAction>>,
9928}
9929
9930impl Default for ListFoldersArgs {
9931    fn default() -> Self {
9932        ListFoldersArgs {
9933            limit: 1000,
9934            actions: None,
9935        }
9936    }
9937}
9938
9939impl ListFoldersArgs {
9940    pub fn with_limit(mut self, value: u32) -> Self {
9941        self.limit = value;
9942        self
9943    }
9944
9945    pub fn with_actions(mut self, value: Vec<FolderAction>) -> Self {
9946        self.actions = Some(value);
9947        self
9948    }
9949}
9950
9951const LIST_FOLDERS_ARGS_FIELDS: &[&str] = &["limit",
9952                                            "actions"];
9953impl ListFoldersArgs {
9954    // no _opt deserializer
9955    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
9956        mut map: V,
9957    ) -> Result<ListFoldersArgs, V::Error> {
9958        let mut field_limit = None;
9959        let mut field_actions = None;
9960        while let Some(key) = map.next_key::<&str>()? {
9961            match key {
9962                "limit" => {
9963                    if field_limit.is_some() {
9964                        return Err(::serde::de::Error::duplicate_field("limit"));
9965                    }
9966                    field_limit = Some(map.next_value()?);
9967                }
9968                "actions" => {
9969                    if field_actions.is_some() {
9970                        return Err(::serde::de::Error::duplicate_field("actions"));
9971                    }
9972                    field_actions = Some(map.next_value()?);
9973                }
9974                _ => {
9975                    // unknown field allowed and ignored
9976                    map.next_value::<::serde_json::Value>()?;
9977                }
9978            }
9979        }
9980        let result = ListFoldersArgs {
9981            limit: field_limit.unwrap_or(1000),
9982            actions: field_actions.and_then(Option::flatten),
9983        };
9984        Ok(result)
9985    }
9986
9987    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
9988        &self,
9989        s: &mut S::SerializeStruct,
9990    ) -> Result<(), S::Error> {
9991        use serde::ser::SerializeStruct;
9992        if self.limit != 1000 {
9993            s.serialize_field("limit", &self.limit)?;
9994        }
9995        if let Some(val) = &self.actions {
9996            s.serialize_field("actions", val)?;
9997        }
9998        Ok(())
9999    }
10000}
10001
10002impl<'de> ::serde::de::Deserialize<'de> for ListFoldersArgs {
10003    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10004        // struct deserializer
10005        use serde::de::{MapAccess, Visitor};
10006        struct StructVisitor;
10007        impl<'de> Visitor<'de> for StructVisitor {
10008            type Value = ListFoldersArgs;
10009            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10010                f.write_str("a ListFoldersArgs struct")
10011            }
10012            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
10013                ListFoldersArgs::internal_deserialize(map)
10014            }
10015        }
10016        deserializer.deserialize_struct("ListFoldersArgs", LIST_FOLDERS_ARGS_FIELDS, StructVisitor)
10017    }
10018}
10019
10020impl ::serde::ser::Serialize for ListFoldersArgs {
10021    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10022        // struct serializer
10023        use serde::ser::SerializeStruct;
10024        let mut s = serializer.serialize_struct("ListFoldersArgs", 2)?;
10025        self.internal_serialize::<S>(&mut s)?;
10026        s.end()
10027    }
10028}
10029
10030#[derive(Debug, Clone, PartialEq, Eq)]
10031#[non_exhaustive] // structs may have more fields added in the future.
10032pub struct ListFoldersContinueArg {
10033    /// The cursor returned by the previous API call specified in the endpoint description.
10034    pub cursor: String,
10035}
10036
10037impl ListFoldersContinueArg {
10038    pub fn new(cursor: String) -> Self {
10039        ListFoldersContinueArg {
10040            cursor,
10041        }
10042    }
10043}
10044
10045const LIST_FOLDERS_CONTINUE_ARG_FIELDS: &[&str] = &["cursor"];
10046impl ListFoldersContinueArg {
10047    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
10048        map: V,
10049    ) -> Result<ListFoldersContinueArg, V::Error> {
10050        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
10051    }
10052
10053    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
10054        mut map: V,
10055        optional: bool,
10056    ) -> Result<Option<ListFoldersContinueArg>, V::Error> {
10057        let mut field_cursor = None;
10058        let mut nothing = true;
10059        while let Some(key) = map.next_key::<&str>()? {
10060            nothing = false;
10061            match key {
10062                "cursor" => {
10063                    if field_cursor.is_some() {
10064                        return Err(::serde::de::Error::duplicate_field("cursor"));
10065                    }
10066                    field_cursor = Some(map.next_value()?);
10067                }
10068                _ => {
10069                    // unknown field allowed and ignored
10070                    map.next_value::<::serde_json::Value>()?;
10071                }
10072            }
10073        }
10074        if optional && nothing {
10075            return Ok(None);
10076        }
10077        let result = ListFoldersContinueArg {
10078            cursor: field_cursor.ok_or_else(|| ::serde::de::Error::missing_field("cursor"))?,
10079        };
10080        Ok(Some(result))
10081    }
10082
10083    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
10084        &self,
10085        s: &mut S::SerializeStruct,
10086    ) -> Result<(), S::Error> {
10087        use serde::ser::SerializeStruct;
10088        s.serialize_field("cursor", &self.cursor)?;
10089        Ok(())
10090    }
10091}
10092
10093impl<'de> ::serde::de::Deserialize<'de> for ListFoldersContinueArg {
10094    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10095        // struct deserializer
10096        use serde::de::{MapAccess, Visitor};
10097        struct StructVisitor;
10098        impl<'de> Visitor<'de> for StructVisitor {
10099            type Value = ListFoldersContinueArg;
10100            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10101                f.write_str("a ListFoldersContinueArg struct")
10102            }
10103            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
10104                ListFoldersContinueArg::internal_deserialize(map)
10105            }
10106        }
10107        deserializer.deserialize_struct("ListFoldersContinueArg", LIST_FOLDERS_CONTINUE_ARG_FIELDS, StructVisitor)
10108    }
10109}
10110
10111impl ::serde::ser::Serialize for ListFoldersContinueArg {
10112    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10113        // struct serializer
10114        use serde::ser::SerializeStruct;
10115        let mut s = serializer.serialize_struct("ListFoldersContinueArg", 1)?;
10116        self.internal_serialize::<S>(&mut s)?;
10117        s.end()
10118    }
10119}
10120
10121#[derive(Debug, Clone, PartialEq, Eq)]
10122#[non_exhaustive] // variants may be added in the future
10123pub enum ListFoldersContinueError {
10124    /// [`ListFoldersContinueArg::cursor`](ListFoldersContinueArg) is invalid.
10125    InvalidCursor,
10126    /// Catch-all used for unrecognized values returned from the server. Encountering this value
10127    /// typically indicates that this SDK version is out of date.
10128    Other,
10129}
10130
10131impl<'de> ::serde::de::Deserialize<'de> for ListFoldersContinueError {
10132    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10133        // union deserializer
10134        use serde::de::{self, MapAccess, Visitor};
10135        struct EnumVisitor;
10136        impl<'de> Visitor<'de> for EnumVisitor {
10137            type Value = ListFoldersContinueError;
10138            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10139                f.write_str("a ListFoldersContinueError structure")
10140            }
10141            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
10142                let tag: &str = match map.next_key()? {
10143                    Some(".tag") => map.next_value()?,
10144                    _ => return Err(de::Error::missing_field(".tag"))
10145                };
10146                let value = match tag {
10147                    "invalid_cursor" => ListFoldersContinueError::InvalidCursor,
10148                    _ => ListFoldersContinueError::Other,
10149                };
10150                crate::eat_json_fields(&mut map)?;
10151                Ok(value)
10152            }
10153        }
10154        const VARIANTS: &[&str] = &["invalid_cursor",
10155                                    "other"];
10156        deserializer.deserialize_struct("ListFoldersContinueError", VARIANTS, EnumVisitor)
10157    }
10158}
10159
10160impl ::serde::ser::Serialize for ListFoldersContinueError {
10161    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10162        // union serializer
10163        use serde::ser::SerializeStruct;
10164        match self {
10165            ListFoldersContinueError::InvalidCursor => {
10166                // unit
10167                let mut s = serializer.serialize_struct("ListFoldersContinueError", 1)?;
10168                s.serialize_field(".tag", "invalid_cursor")?;
10169                s.end()
10170            }
10171            ListFoldersContinueError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
10172        }
10173    }
10174}
10175
10176impl ::std::error::Error for ListFoldersContinueError {
10177}
10178
10179impl ::std::fmt::Display for ListFoldersContinueError {
10180    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10181        write!(f, "{:?}", *self)
10182    }
10183}
10184
10185/// Result for [`list_folders()`](crate::sharing::list_folders) or
10186/// [`list_mountable_folders()`](crate::sharing::list_mountable_folders), depending on which
10187/// endpoint was requested. Unmounted shared folders can be identified by the absence of
10188/// [`SharedFolderMetadata::path_lower`](SharedFolderMetadata).
10189#[derive(Debug, Clone, PartialEq, Eq)]
10190#[non_exhaustive] // structs may have more fields added in the future.
10191pub struct ListFoldersResult {
10192    /// List of all shared folders the authenticated user has access to.
10193    pub entries: Vec<SharedFolderMetadata>,
10194    /// Present if there are additional shared folders that have not been returned yet. Pass the
10195    /// cursor into the corresponding continue endpoint (either
10196    /// [`list_folders_continue()`](crate::sharing::list_folders_continue) or
10197    /// [`list_mountable_folders_continue()`](crate::sharing::list_mountable_folders_continue)) to
10198    /// list additional folders.
10199    pub cursor: Option<String>,
10200}
10201
10202impl ListFoldersResult {
10203    pub fn new(entries: Vec<SharedFolderMetadata>) -> Self {
10204        ListFoldersResult {
10205            entries,
10206            cursor: None,
10207        }
10208    }
10209
10210    pub fn with_cursor(mut self, value: String) -> Self {
10211        self.cursor = Some(value);
10212        self
10213    }
10214}
10215
10216const LIST_FOLDERS_RESULT_FIELDS: &[&str] = &["entries",
10217                                              "cursor"];
10218impl ListFoldersResult {
10219    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
10220        map: V,
10221    ) -> Result<ListFoldersResult, V::Error> {
10222        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
10223    }
10224
10225    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
10226        mut map: V,
10227        optional: bool,
10228    ) -> Result<Option<ListFoldersResult>, V::Error> {
10229        let mut field_entries = None;
10230        let mut field_cursor = None;
10231        let mut nothing = true;
10232        while let Some(key) = map.next_key::<&str>()? {
10233            nothing = false;
10234            match key {
10235                "entries" => {
10236                    if field_entries.is_some() {
10237                        return Err(::serde::de::Error::duplicate_field("entries"));
10238                    }
10239                    field_entries = Some(map.next_value()?);
10240                }
10241                "cursor" => {
10242                    if field_cursor.is_some() {
10243                        return Err(::serde::de::Error::duplicate_field("cursor"));
10244                    }
10245                    field_cursor = Some(map.next_value()?);
10246                }
10247                _ => {
10248                    // unknown field allowed and ignored
10249                    map.next_value::<::serde_json::Value>()?;
10250                }
10251            }
10252        }
10253        if optional && nothing {
10254            return Ok(None);
10255        }
10256        let result = ListFoldersResult {
10257            entries: field_entries.ok_or_else(|| ::serde::de::Error::missing_field("entries"))?,
10258            cursor: field_cursor.and_then(Option::flatten),
10259        };
10260        Ok(Some(result))
10261    }
10262
10263    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
10264        &self,
10265        s: &mut S::SerializeStruct,
10266    ) -> Result<(), S::Error> {
10267        use serde::ser::SerializeStruct;
10268        s.serialize_field("entries", &self.entries)?;
10269        if let Some(val) = &self.cursor {
10270            s.serialize_field("cursor", val)?;
10271        }
10272        Ok(())
10273    }
10274}
10275
10276impl<'de> ::serde::de::Deserialize<'de> for ListFoldersResult {
10277    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10278        // struct deserializer
10279        use serde::de::{MapAccess, Visitor};
10280        struct StructVisitor;
10281        impl<'de> Visitor<'de> for StructVisitor {
10282            type Value = ListFoldersResult;
10283            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10284                f.write_str("a ListFoldersResult struct")
10285            }
10286            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
10287                ListFoldersResult::internal_deserialize(map)
10288            }
10289        }
10290        deserializer.deserialize_struct("ListFoldersResult", LIST_FOLDERS_RESULT_FIELDS, StructVisitor)
10291    }
10292}
10293
10294impl ::serde::ser::Serialize for ListFoldersResult {
10295    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10296        // struct serializer
10297        use serde::ser::SerializeStruct;
10298        let mut s = serializer.serialize_struct("ListFoldersResult", 2)?;
10299        self.internal_serialize::<S>(&mut s)?;
10300        s.end()
10301    }
10302}
10303
10304#[derive(Debug, Clone, PartialEq, Eq, Default)]
10305#[non_exhaustive] // structs may have more fields added in the future.
10306pub struct ListSharedLinksArg {
10307    /// See [`list_shared_links()`](crate::sharing::list_shared_links) description.
10308    pub path: Option<ReadPath>,
10309    /// The cursor returned by your last call to
10310    /// [`list_shared_links()`](crate::sharing::list_shared_links).
10311    pub cursor: Option<String>,
10312    /// See [`list_shared_links()`](crate::sharing::list_shared_links) description.
10313    pub direct_only: Option<bool>,
10314}
10315
10316impl ListSharedLinksArg {
10317    pub fn with_path(mut self, value: ReadPath) -> Self {
10318        self.path = Some(value);
10319        self
10320    }
10321
10322    pub fn with_cursor(mut self, value: String) -> Self {
10323        self.cursor = Some(value);
10324        self
10325    }
10326
10327    pub fn with_direct_only(mut self, value: bool) -> Self {
10328        self.direct_only = Some(value);
10329        self
10330    }
10331}
10332
10333const LIST_SHARED_LINKS_ARG_FIELDS: &[&str] = &["path",
10334                                                "cursor",
10335                                                "direct_only"];
10336impl ListSharedLinksArg {
10337    // no _opt deserializer
10338    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
10339        mut map: V,
10340    ) -> Result<ListSharedLinksArg, V::Error> {
10341        let mut field_path = None;
10342        let mut field_cursor = None;
10343        let mut field_direct_only = None;
10344        while let Some(key) = map.next_key::<&str>()? {
10345            match key {
10346                "path" => {
10347                    if field_path.is_some() {
10348                        return Err(::serde::de::Error::duplicate_field("path"));
10349                    }
10350                    field_path = Some(map.next_value()?);
10351                }
10352                "cursor" => {
10353                    if field_cursor.is_some() {
10354                        return Err(::serde::de::Error::duplicate_field("cursor"));
10355                    }
10356                    field_cursor = Some(map.next_value()?);
10357                }
10358                "direct_only" => {
10359                    if field_direct_only.is_some() {
10360                        return Err(::serde::de::Error::duplicate_field("direct_only"));
10361                    }
10362                    field_direct_only = Some(map.next_value()?);
10363                }
10364                _ => {
10365                    // unknown field allowed and ignored
10366                    map.next_value::<::serde_json::Value>()?;
10367                }
10368            }
10369        }
10370        let result = ListSharedLinksArg {
10371            path: field_path.and_then(Option::flatten),
10372            cursor: field_cursor.and_then(Option::flatten),
10373            direct_only: field_direct_only.and_then(Option::flatten),
10374        };
10375        Ok(result)
10376    }
10377
10378    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
10379        &self,
10380        s: &mut S::SerializeStruct,
10381    ) -> Result<(), S::Error> {
10382        use serde::ser::SerializeStruct;
10383        if let Some(val) = &self.path {
10384            s.serialize_field("path", val)?;
10385        }
10386        if let Some(val) = &self.cursor {
10387            s.serialize_field("cursor", val)?;
10388        }
10389        if let Some(val) = &self.direct_only {
10390            s.serialize_field("direct_only", val)?;
10391        }
10392        Ok(())
10393    }
10394}
10395
10396impl<'de> ::serde::de::Deserialize<'de> for ListSharedLinksArg {
10397    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10398        // struct deserializer
10399        use serde::de::{MapAccess, Visitor};
10400        struct StructVisitor;
10401        impl<'de> Visitor<'de> for StructVisitor {
10402            type Value = ListSharedLinksArg;
10403            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10404                f.write_str("a ListSharedLinksArg struct")
10405            }
10406            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
10407                ListSharedLinksArg::internal_deserialize(map)
10408            }
10409        }
10410        deserializer.deserialize_struct("ListSharedLinksArg", LIST_SHARED_LINKS_ARG_FIELDS, StructVisitor)
10411    }
10412}
10413
10414impl ::serde::ser::Serialize for ListSharedLinksArg {
10415    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10416        // struct serializer
10417        use serde::ser::SerializeStruct;
10418        let mut s = serializer.serialize_struct("ListSharedLinksArg", 3)?;
10419        self.internal_serialize::<S>(&mut s)?;
10420        s.end()
10421    }
10422}
10423
10424#[derive(Debug, Clone, PartialEq, Eq)]
10425#[non_exhaustive] // variants may be added in the future
10426pub enum ListSharedLinksError {
10427    Path(crate::types::files::LookupError),
10428    /// Indicates that the cursor has been invalidated. Call
10429    /// [`list_shared_links()`](crate::sharing::list_shared_links) to obtain a new cursor.
10430    Reset,
10431    /// Catch-all used for unrecognized values returned from the server. Encountering this value
10432    /// typically indicates that this SDK version is out of date.
10433    Other,
10434}
10435
10436impl<'de> ::serde::de::Deserialize<'de> for ListSharedLinksError {
10437    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10438        // union deserializer
10439        use serde::de::{self, MapAccess, Visitor};
10440        struct EnumVisitor;
10441        impl<'de> Visitor<'de> for EnumVisitor {
10442            type Value = ListSharedLinksError;
10443            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10444                f.write_str("a ListSharedLinksError structure")
10445            }
10446            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
10447                let tag: &str = match map.next_key()? {
10448                    Some(".tag") => map.next_value()?,
10449                    _ => return Err(de::Error::missing_field(".tag"))
10450                };
10451                let value = match tag {
10452                    "path" => {
10453                        match map.next_key()? {
10454                            Some("path") => ListSharedLinksError::Path(map.next_value()?),
10455                            None => return Err(de::Error::missing_field("path")),
10456                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
10457                        }
10458                    }
10459                    "reset" => ListSharedLinksError::Reset,
10460                    _ => ListSharedLinksError::Other,
10461                };
10462                crate::eat_json_fields(&mut map)?;
10463                Ok(value)
10464            }
10465        }
10466        const VARIANTS: &[&str] = &["path",
10467                                    "reset",
10468                                    "other"];
10469        deserializer.deserialize_struct("ListSharedLinksError", VARIANTS, EnumVisitor)
10470    }
10471}
10472
10473impl ::serde::ser::Serialize for ListSharedLinksError {
10474    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10475        // union serializer
10476        use serde::ser::SerializeStruct;
10477        match self {
10478            ListSharedLinksError::Path(x) => {
10479                // union or polymporphic struct
10480                let mut s = serializer.serialize_struct("ListSharedLinksError", 2)?;
10481                s.serialize_field(".tag", "path")?;
10482                s.serialize_field("path", x)?;
10483                s.end()
10484            }
10485            ListSharedLinksError::Reset => {
10486                // unit
10487                let mut s = serializer.serialize_struct("ListSharedLinksError", 1)?;
10488                s.serialize_field(".tag", "reset")?;
10489                s.end()
10490            }
10491            ListSharedLinksError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
10492        }
10493    }
10494}
10495
10496impl ::std::error::Error for ListSharedLinksError {
10497    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
10498        match self {
10499            ListSharedLinksError::Path(inner) => Some(inner),
10500            _ => None,
10501        }
10502    }
10503}
10504
10505impl ::std::fmt::Display for ListSharedLinksError {
10506    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10507        match self {
10508            ListSharedLinksError::Path(inner) => write!(f, "ListSharedLinksError: {}", inner),
10509            _ => write!(f, "{:?}", *self),
10510        }
10511    }
10512}
10513
10514#[derive(Debug, Clone, PartialEq, Eq)]
10515#[non_exhaustive] // structs may have more fields added in the future.
10516pub struct ListSharedLinksResult {
10517    /// Shared links applicable to the path argument.
10518    pub links: Vec<SharedLinkMetadata>,
10519    /// Is true if there are additional shared links that have not been returned yet. Pass the
10520    /// cursor into [`list_shared_links()`](crate::sharing::list_shared_links) to retrieve them.
10521    pub has_more: bool,
10522    /// Pass the cursor into [`list_shared_links()`](crate::sharing::list_shared_links) to obtain
10523    /// the additional links. Cursor is returned only if no path is given.
10524    pub cursor: Option<String>,
10525}
10526
10527impl ListSharedLinksResult {
10528    pub fn new(links: Vec<SharedLinkMetadata>, has_more: bool) -> Self {
10529        ListSharedLinksResult {
10530            links,
10531            has_more,
10532            cursor: None,
10533        }
10534    }
10535
10536    pub fn with_cursor(mut self, value: String) -> Self {
10537        self.cursor = Some(value);
10538        self
10539    }
10540}
10541
10542const LIST_SHARED_LINKS_RESULT_FIELDS: &[&str] = &["links",
10543                                                   "has_more",
10544                                                   "cursor"];
10545impl ListSharedLinksResult {
10546    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
10547        map: V,
10548    ) -> Result<ListSharedLinksResult, V::Error> {
10549        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
10550    }
10551
10552    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
10553        mut map: V,
10554        optional: bool,
10555    ) -> Result<Option<ListSharedLinksResult>, V::Error> {
10556        let mut field_links = None;
10557        let mut field_has_more = None;
10558        let mut field_cursor = None;
10559        let mut nothing = true;
10560        while let Some(key) = map.next_key::<&str>()? {
10561            nothing = false;
10562            match key {
10563                "links" => {
10564                    if field_links.is_some() {
10565                        return Err(::serde::de::Error::duplicate_field("links"));
10566                    }
10567                    field_links = Some(map.next_value()?);
10568                }
10569                "has_more" => {
10570                    if field_has_more.is_some() {
10571                        return Err(::serde::de::Error::duplicate_field("has_more"));
10572                    }
10573                    field_has_more = Some(map.next_value()?);
10574                }
10575                "cursor" => {
10576                    if field_cursor.is_some() {
10577                        return Err(::serde::de::Error::duplicate_field("cursor"));
10578                    }
10579                    field_cursor = Some(map.next_value()?);
10580                }
10581                _ => {
10582                    // unknown field allowed and ignored
10583                    map.next_value::<::serde_json::Value>()?;
10584                }
10585            }
10586        }
10587        if optional && nothing {
10588            return Ok(None);
10589        }
10590        let result = ListSharedLinksResult {
10591            links: field_links.ok_or_else(|| ::serde::de::Error::missing_field("links"))?,
10592            has_more: field_has_more.ok_or_else(|| ::serde::de::Error::missing_field("has_more"))?,
10593            cursor: field_cursor.and_then(Option::flatten),
10594        };
10595        Ok(Some(result))
10596    }
10597
10598    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
10599        &self,
10600        s: &mut S::SerializeStruct,
10601    ) -> Result<(), S::Error> {
10602        use serde::ser::SerializeStruct;
10603        s.serialize_field("links", &self.links)?;
10604        s.serialize_field("has_more", &self.has_more)?;
10605        if let Some(val) = &self.cursor {
10606            s.serialize_field("cursor", val)?;
10607        }
10608        Ok(())
10609    }
10610}
10611
10612impl<'de> ::serde::de::Deserialize<'de> for ListSharedLinksResult {
10613    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10614        // struct deserializer
10615        use serde::de::{MapAccess, Visitor};
10616        struct StructVisitor;
10617        impl<'de> Visitor<'de> for StructVisitor {
10618            type Value = ListSharedLinksResult;
10619            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10620                f.write_str("a ListSharedLinksResult struct")
10621            }
10622            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
10623                ListSharedLinksResult::internal_deserialize(map)
10624            }
10625        }
10626        deserializer.deserialize_struct("ListSharedLinksResult", LIST_SHARED_LINKS_RESULT_FIELDS, StructVisitor)
10627    }
10628}
10629
10630impl ::serde::ser::Serialize for ListSharedLinksResult {
10631    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10632        // struct serializer
10633        use serde::ser::SerializeStruct;
10634        let mut s = serializer.serialize_struct("ListSharedLinksResult", 3)?;
10635        self.internal_serialize::<S>(&mut s)?;
10636        s.end()
10637    }
10638}
10639
10640/// Contains information about a member's access level to content after an operation.
10641#[derive(Debug, Clone, PartialEq, Eq, Default)]
10642#[non_exhaustive] // structs may have more fields added in the future.
10643pub struct MemberAccessLevelResult {
10644    /// The member still has this level of access to the content through a parent folder.
10645    pub access_level: Option<AccessLevel>,
10646    /// A localized string with additional information about why the user has this access level to
10647    /// the content.
10648    pub warning: Option<String>,
10649    /// The parent folders that a member has access to. The field is present if the user has access
10650    /// to the first parent folder where the member gains access.
10651    pub access_details: Option<Vec<ParentFolderAccessInfo>>,
10652}
10653
10654impl MemberAccessLevelResult {
10655    pub fn with_access_level(mut self, value: AccessLevel) -> Self {
10656        self.access_level = Some(value);
10657        self
10658    }
10659
10660    pub fn with_warning(mut self, value: String) -> Self {
10661        self.warning = Some(value);
10662        self
10663    }
10664
10665    pub fn with_access_details(mut self, value: Vec<ParentFolderAccessInfo>) -> Self {
10666        self.access_details = Some(value);
10667        self
10668    }
10669}
10670
10671const MEMBER_ACCESS_LEVEL_RESULT_FIELDS: &[&str] = &["access_level",
10672                                                     "warning",
10673                                                     "access_details"];
10674impl MemberAccessLevelResult {
10675    // no _opt deserializer
10676    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
10677        mut map: V,
10678    ) -> Result<MemberAccessLevelResult, V::Error> {
10679        let mut field_access_level = None;
10680        let mut field_warning = None;
10681        let mut field_access_details = None;
10682        while let Some(key) = map.next_key::<&str>()? {
10683            match key {
10684                "access_level" => {
10685                    if field_access_level.is_some() {
10686                        return Err(::serde::de::Error::duplicate_field("access_level"));
10687                    }
10688                    field_access_level = Some(map.next_value()?);
10689                }
10690                "warning" => {
10691                    if field_warning.is_some() {
10692                        return Err(::serde::de::Error::duplicate_field("warning"));
10693                    }
10694                    field_warning = Some(map.next_value()?);
10695                }
10696                "access_details" => {
10697                    if field_access_details.is_some() {
10698                        return Err(::serde::de::Error::duplicate_field("access_details"));
10699                    }
10700                    field_access_details = Some(map.next_value()?);
10701                }
10702                _ => {
10703                    // unknown field allowed and ignored
10704                    map.next_value::<::serde_json::Value>()?;
10705                }
10706            }
10707        }
10708        let result = MemberAccessLevelResult {
10709            access_level: field_access_level.and_then(Option::flatten),
10710            warning: field_warning.and_then(Option::flatten),
10711            access_details: field_access_details.and_then(Option::flatten),
10712        };
10713        Ok(result)
10714    }
10715
10716    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
10717        &self,
10718        s: &mut S::SerializeStruct,
10719    ) -> Result<(), S::Error> {
10720        use serde::ser::SerializeStruct;
10721        if let Some(val) = &self.access_level {
10722            s.serialize_field("access_level", val)?;
10723        }
10724        if let Some(val) = &self.warning {
10725            s.serialize_field("warning", val)?;
10726        }
10727        if let Some(val) = &self.access_details {
10728            s.serialize_field("access_details", val)?;
10729        }
10730        Ok(())
10731    }
10732}
10733
10734impl<'de> ::serde::de::Deserialize<'de> for MemberAccessLevelResult {
10735    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10736        // struct deserializer
10737        use serde::de::{MapAccess, Visitor};
10738        struct StructVisitor;
10739        impl<'de> Visitor<'de> for StructVisitor {
10740            type Value = MemberAccessLevelResult;
10741            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10742                f.write_str("a MemberAccessLevelResult struct")
10743            }
10744            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
10745                MemberAccessLevelResult::internal_deserialize(map)
10746            }
10747        }
10748        deserializer.deserialize_struct("MemberAccessLevelResult", MEMBER_ACCESS_LEVEL_RESULT_FIELDS, StructVisitor)
10749    }
10750}
10751
10752impl ::serde::ser::Serialize for MemberAccessLevelResult {
10753    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10754        // struct serializer
10755        use serde::ser::SerializeStruct;
10756        let mut s = serializer.serialize_struct("MemberAccessLevelResult", 3)?;
10757        self.internal_serialize::<S>(&mut s)?;
10758        s.end()
10759    }
10760}
10761
10762/// Actions that may be taken on members of a shared folder.
10763#[derive(Debug, Clone, PartialEq, Eq)]
10764#[non_exhaustive] // variants may be added in the future
10765pub enum MemberAction {
10766    /// Allow the member to keep a copy of the folder when removing.
10767    LeaveACopy,
10768    /// Make the member an editor of the folder.
10769    MakeEditor,
10770    /// Make the member an owner of the folder.
10771    MakeOwner,
10772    /// Make the member a viewer of the folder.
10773    MakeViewer,
10774    /// Make the member a viewer of the folder without commenting permissions.
10775    MakeViewerNoComment,
10776    /// Remove the member from the folder.
10777    Remove,
10778    /// Catch-all used for unrecognized values returned from the server. Encountering this value
10779    /// typically indicates that this SDK version is out of date.
10780    Other,
10781}
10782
10783impl<'de> ::serde::de::Deserialize<'de> for MemberAction {
10784    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10785        // union deserializer
10786        use serde::de::{self, MapAccess, Visitor};
10787        struct EnumVisitor;
10788        impl<'de> Visitor<'de> for EnumVisitor {
10789            type Value = MemberAction;
10790            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10791                f.write_str("a MemberAction structure")
10792            }
10793            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
10794                let tag: &str = match map.next_key()? {
10795                    Some(".tag") => map.next_value()?,
10796                    _ => return Err(de::Error::missing_field(".tag"))
10797                };
10798                let value = match tag {
10799                    "leave_a_copy" => MemberAction::LeaveACopy,
10800                    "make_editor" => MemberAction::MakeEditor,
10801                    "make_owner" => MemberAction::MakeOwner,
10802                    "make_viewer" => MemberAction::MakeViewer,
10803                    "make_viewer_no_comment" => MemberAction::MakeViewerNoComment,
10804                    "remove" => MemberAction::Remove,
10805                    _ => MemberAction::Other,
10806                };
10807                crate::eat_json_fields(&mut map)?;
10808                Ok(value)
10809            }
10810        }
10811        const VARIANTS: &[&str] = &["leave_a_copy",
10812                                    "make_editor",
10813                                    "make_owner",
10814                                    "make_viewer",
10815                                    "make_viewer_no_comment",
10816                                    "remove",
10817                                    "other"];
10818        deserializer.deserialize_struct("MemberAction", VARIANTS, EnumVisitor)
10819    }
10820}
10821
10822impl ::serde::ser::Serialize for MemberAction {
10823    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10824        // union serializer
10825        use serde::ser::SerializeStruct;
10826        match self {
10827            MemberAction::LeaveACopy => {
10828                // unit
10829                let mut s = serializer.serialize_struct("MemberAction", 1)?;
10830                s.serialize_field(".tag", "leave_a_copy")?;
10831                s.end()
10832            }
10833            MemberAction::MakeEditor => {
10834                // unit
10835                let mut s = serializer.serialize_struct("MemberAction", 1)?;
10836                s.serialize_field(".tag", "make_editor")?;
10837                s.end()
10838            }
10839            MemberAction::MakeOwner => {
10840                // unit
10841                let mut s = serializer.serialize_struct("MemberAction", 1)?;
10842                s.serialize_field(".tag", "make_owner")?;
10843                s.end()
10844            }
10845            MemberAction::MakeViewer => {
10846                // unit
10847                let mut s = serializer.serialize_struct("MemberAction", 1)?;
10848                s.serialize_field(".tag", "make_viewer")?;
10849                s.end()
10850            }
10851            MemberAction::MakeViewerNoComment => {
10852                // unit
10853                let mut s = serializer.serialize_struct("MemberAction", 1)?;
10854                s.serialize_field(".tag", "make_viewer_no_comment")?;
10855                s.end()
10856            }
10857            MemberAction::Remove => {
10858                // unit
10859                let mut s = serializer.serialize_struct("MemberAction", 1)?;
10860                s.serialize_field(".tag", "remove")?;
10861                s.end()
10862            }
10863            MemberAction::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
10864        }
10865    }
10866}
10867
10868/// Whether the user is allowed to take the action on the associated member.
10869#[derive(Debug, Clone, PartialEq, Eq)]
10870#[non_exhaustive] // structs may have more fields added in the future.
10871pub struct MemberPermission {
10872    /// The action that the user may wish to take on the member.
10873    pub action: MemberAction,
10874    /// True if the user is allowed to take the action.
10875    pub allow: bool,
10876    /// The reason why the user is denied the permission. Not present if the action is allowed.
10877    pub reason: Option<PermissionDeniedReason>,
10878}
10879
10880impl MemberPermission {
10881    pub fn new(action: MemberAction, allow: bool) -> Self {
10882        MemberPermission {
10883            action,
10884            allow,
10885            reason: None,
10886        }
10887    }
10888
10889    pub fn with_reason(mut self, value: PermissionDeniedReason) -> Self {
10890        self.reason = Some(value);
10891        self
10892    }
10893}
10894
10895const MEMBER_PERMISSION_FIELDS: &[&str] = &["action",
10896                                            "allow",
10897                                            "reason"];
10898impl MemberPermission {
10899    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
10900        map: V,
10901    ) -> Result<MemberPermission, V::Error> {
10902        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
10903    }
10904
10905    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
10906        mut map: V,
10907        optional: bool,
10908    ) -> Result<Option<MemberPermission>, V::Error> {
10909        let mut field_action = None;
10910        let mut field_allow = None;
10911        let mut field_reason = None;
10912        let mut nothing = true;
10913        while let Some(key) = map.next_key::<&str>()? {
10914            nothing = false;
10915            match key {
10916                "action" => {
10917                    if field_action.is_some() {
10918                        return Err(::serde::de::Error::duplicate_field("action"));
10919                    }
10920                    field_action = Some(map.next_value()?);
10921                }
10922                "allow" => {
10923                    if field_allow.is_some() {
10924                        return Err(::serde::de::Error::duplicate_field("allow"));
10925                    }
10926                    field_allow = Some(map.next_value()?);
10927                }
10928                "reason" => {
10929                    if field_reason.is_some() {
10930                        return Err(::serde::de::Error::duplicate_field("reason"));
10931                    }
10932                    field_reason = Some(map.next_value()?);
10933                }
10934                _ => {
10935                    // unknown field allowed and ignored
10936                    map.next_value::<::serde_json::Value>()?;
10937                }
10938            }
10939        }
10940        if optional && nothing {
10941            return Ok(None);
10942        }
10943        let result = MemberPermission {
10944            action: field_action.ok_or_else(|| ::serde::de::Error::missing_field("action"))?,
10945            allow: field_allow.ok_or_else(|| ::serde::de::Error::missing_field("allow"))?,
10946            reason: field_reason.and_then(Option::flatten),
10947        };
10948        Ok(Some(result))
10949    }
10950
10951    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
10952        &self,
10953        s: &mut S::SerializeStruct,
10954    ) -> Result<(), S::Error> {
10955        use serde::ser::SerializeStruct;
10956        s.serialize_field("action", &self.action)?;
10957        s.serialize_field("allow", &self.allow)?;
10958        if let Some(val) = &self.reason {
10959            s.serialize_field("reason", val)?;
10960        }
10961        Ok(())
10962    }
10963}
10964
10965impl<'de> ::serde::de::Deserialize<'de> for MemberPermission {
10966    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10967        // struct deserializer
10968        use serde::de::{MapAccess, Visitor};
10969        struct StructVisitor;
10970        impl<'de> Visitor<'de> for StructVisitor {
10971            type Value = MemberPermission;
10972            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10973                f.write_str("a MemberPermission struct")
10974            }
10975            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
10976                MemberPermission::internal_deserialize(map)
10977            }
10978        }
10979        deserializer.deserialize_struct("MemberPermission", MEMBER_PERMISSION_FIELDS, StructVisitor)
10980    }
10981}
10982
10983impl ::serde::ser::Serialize for MemberPermission {
10984    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10985        // struct serializer
10986        use serde::ser::SerializeStruct;
10987        let mut s = serializer.serialize_struct("MemberPermission", 3)?;
10988        self.internal_serialize::<S>(&mut s)?;
10989        s.end()
10990    }
10991}
10992
10993/// Policy governing who can be a member of a shared folder. Only applicable to folders owned by a
10994/// user on a team.
10995#[derive(Debug, Clone, PartialEq, Eq)]
10996#[non_exhaustive] // variants may be added in the future
10997pub enum MemberPolicy {
10998    /// Only a teammate can become a member.
10999    Team,
11000    /// Anyone can become a member.
11001    Anyone,
11002    /// Only a teammate and approved people can become a member.
11003    TeamAndApproved,
11004    /// Catch-all used for unrecognized values returned from the server. Encountering this value
11005    /// typically indicates that this SDK version is out of date.
11006    Other,
11007}
11008
11009impl<'de> ::serde::de::Deserialize<'de> for MemberPolicy {
11010    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
11011        // union deserializer
11012        use serde::de::{self, MapAccess, Visitor};
11013        struct EnumVisitor;
11014        impl<'de> Visitor<'de> for EnumVisitor {
11015            type Value = MemberPolicy;
11016            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11017                f.write_str("a MemberPolicy structure")
11018            }
11019            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
11020                let tag: &str = match map.next_key()? {
11021                    Some(".tag") => map.next_value()?,
11022                    _ => return Err(de::Error::missing_field(".tag"))
11023                };
11024                let value = match tag {
11025                    "team" => MemberPolicy::Team,
11026                    "anyone" => MemberPolicy::Anyone,
11027                    "team_and_approved" => MemberPolicy::TeamAndApproved,
11028                    _ => MemberPolicy::Other,
11029                };
11030                crate::eat_json_fields(&mut map)?;
11031                Ok(value)
11032            }
11033        }
11034        const VARIANTS: &[&str] = &["team",
11035                                    "anyone",
11036                                    "team_and_approved",
11037                                    "other"];
11038        deserializer.deserialize_struct("MemberPolicy", VARIANTS, EnumVisitor)
11039    }
11040}
11041
11042impl ::serde::ser::Serialize for MemberPolicy {
11043    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
11044        // union serializer
11045        use serde::ser::SerializeStruct;
11046        match self {
11047            MemberPolicy::Team => {
11048                // unit
11049                let mut s = serializer.serialize_struct("MemberPolicy", 1)?;
11050                s.serialize_field(".tag", "team")?;
11051                s.end()
11052            }
11053            MemberPolicy::Anyone => {
11054                // unit
11055                let mut s = serializer.serialize_struct("MemberPolicy", 1)?;
11056                s.serialize_field(".tag", "anyone")?;
11057                s.end()
11058            }
11059            MemberPolicy::TeamAndApproved => {
11060                // unit
11061                let mut s = serializer.serialize_struct("MemberPolicy", 1)?;
11062                s.serialize_field(".tag", "team_and_approved")?;
11063                s.end()
11064            }
11065            MemberPolicy::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
11066        }
11067    }
11068}
11069
11070/// Includes different ways to identify a member of a shared folder.
11071#[derive(Debug, Clone, PartialEq, Eq)]
11072#[non_exhaustive] // variants may be added in the future
11073pub enum MemberSelector {
11074    /// Dropbox account, team member, or group ID of member.
11075    DropboxId(DropboxId),
11076    /// Email address of member.
11077    Email(crate::types::common::EmailAddress),
11078    /// Catch-all used for unrecognized values returned from the server. Encountering this value
11079    /// typically indicates that this SDK version is out of date.
11080    Other,
11081}
11082
11083impl<'de> ::serde::de::Deserialize<'de> for MemberSelector {
11084    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
11085        // union deserializer
11086        use serde::de::{self, MapAccess, Visitor};
11087        struct EnumVisitor;
11088        impl<'de> Visitor<'de> for EnumVisitor {
11089            type Value = MemberSelector;
11090            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11091                f.write_str("a MemberSelector structure")
11092            }
11093            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
11094                let tag: &str = match map.next_key()? {
11095                    Some(".tag") => map.next_value()?,
11096                    _ => return Err(de::Error::missing_field(".tag"))
11097                };
11098                let value = match tag {
11099                    "dropbox_id" => {
11100                        match map.next_key()? {
11101                            Some("dropbox_id") => MemberSelector::DropboxId(map.next_value()?),
11102                            None => return Err(de::Error::missing_field("dropbox_id")),
11103                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
11104                        }
11105                    }
11106                    "email" => {
11107                        match map.next_key()? {
11108                            Some("email") => MemberSelector::Email(map.next_value()?),
11109                            None => return Err(de::Error::missing_field("email")),
11110                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
11111                        }
11112                    }
11113                    _ => MemberSelector::Other,
11114                };
11115                crate::eat_json_fields(&mut map)?;
11116                Ok(value)
11117            }
11118        }
11119        const VARIANTS: &[&str] = &["dropbox_id",
11120                                    "email",
11121                                    "other"];
11122        deserializer.deserialize_struct("MemberSelector", VARIANTS, EnumVisitor)
11123    }
11124}
11125
11126impl ::serde::ser::Serialize for MemberSelector {
11127    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
11128        // union serializer
11129        use serde::ser::SerializeStruct;
11130        match self {
11131            MemberSelector::DropboxId(x) => {
11132                // primitive
11133                let mut s = serializer.serialize_struct("MemberSelector", 2)?;
11134                s.serialize_field(".tag", "dropbox_id")?;
11135                s.serialize_field("dropbox_id", x)?;
11136                s.end()
11137            }
11138            MemberSelector::Email(x) => {
11139                // primitive
11140                let mut s = serializer.serialize_struct("MemberSelector", 2)?;
11141                s.serialize_field(".tag", "email")?;
11142                s.serialize_field("email", x)?;
11143                s.end()
11144            }
11145            MemberSelector::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
11146        }
11147    }
11148}
11149
11150/// The information about a member of the shared content.
11151#[derive(Debug, Clone, PartialEq, Eq)]
11152#[non_exhaustive] // structs may have more fields added in the future.
11153pub struct MembershipInfo {
11154    /// The access type for this member. It contains inherited access type from parent folder, and
11155    /// acquired access type from this folder.
11156    pub access_type: AccessLevel,
11157    /// The permissions that requesting user has on this member. The set of permissions corresponds
11158    /// to the MemberActions in the request.
11159    pub permissions: Option<Vec<MemberPermission>>,
11160    /// Never set.
11161    pub initials: Option<String>,
11162    /// True if the member has access on a parent folder.
11163    pub is_inherited: bool,
11164}
11165
11166impl MembershipInfo {
11167    pub fn new(access_type: AccessLevel) -> Self {
11168        MembershipInfo {
11169            access_type,
11170            permissions: None,
11171            initials: None,
11172            is_inherited: false,
11173        }
11174    }
11175
11176    pub fn with_permissions(mut self, value: Vec<MemberPermission>) -> Self {
11177        self.permissions = Some(value);
11178        self
11179    }
11180
11181    pub fn with_initials(mut self, value: String) -> Self {
11182        self.initials = Some(value);
11183        self
11184    }
11185
11186    pub fn with_is_inherited(mut self, value: bool) -> Self {
11187        self.is_inherited = value;
11188        self
11189    }
11190}
11191
11192const MEMBERSHIP_INFO_FIELDS: &[&str] = &["access_type",
11193                                          "permissions",
11194                                          "initials",
11195                                          "is_inherited"];
11196impl MembershipInfo {
11197    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
11198        map: V,
11199    ) -> Result<MembershipInfo, V::Error> {
11200        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
11201    }
11202
11203    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
11204        mut map: V,
11205        optional: bool,
11206    ) -> Result<Option<MembershipInfo>, V::Error> {
11207        let mut field_access_type = None;
11208        let mut field_permissions = None;
11209        let mut field_initials = None;
11210        let mut field_is_inherited = None;
11211        let mut nothing = true;
11212        while let Some(key) = map.next_key::<&str>()? {
11213            nothing = false;
11214            match key {
11215                "access_type" => {
11216                    if field_access_type.is_some() {
11217                        return Err(::serde::de::Error::duplicate_field("access_type"));
11218                    }
11219                    field_access_type = Some(map.next_value()?);
11220                }
11221                "permissions" => {
11222                    if field_permissions.is_some() {
11223                        return Err(::serde::de::Error::duplicate_field("permissions"));
11224                    }
11225                    field_permissions = Some(map.next_value()?);
11226                }
11227                "initials" => {
11228                    if field_initials.is_some() {
11229                        return Err(::serde::de::Error::duplicate_field("initials"));
11230                    }
11231                    field_initials = Some(map.next_value()?);
11232                }
11233                "is_inherited" => {
11234                    if field_is_inherited.is_some() {
11235                        return Err(::serde::de::Error::duplicate_field("is_inherited"));
11236                    }
11237                    field_is_inherited = Some(map.next_value()?);
11238                }
11239                _ => {
11240                    // unknown field allowed and ignored
11241                    map.next_value::<::serde_json::Value>()?;
11242                }
11243            }
11244        }
11245        if optional && nothing {
11246            return Ok(None);
11247        }
11248        let result = MembershipInfo {
11249            access_type: field_access_type.ok_or_else(|| ::serde::de::Error::missing_field("access_type"))?,
11250            permissions: field_permissions.and_then(Option::flatten),
11251            initials: field_initials.and_then(Option::flatten),
11252            is_inherited: field_is_inherited.unwrap_or(false),
11253        };
11254        Ok(Some(result))
11255    }
11256
11257    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
11258        &self,
11259        s: &mut S::SerializeStruct,
11260    ) -> Result<(), S::Error> {
11261        use serde::ser::SerializeStruct;
11262        s.serialize_field("access_type", &self.access_type)?;
11263        if let Some(val) = &self.permissions {
11264            s.serialize_field("permissions", val)?;
11265        }
11266        if let Some(val) = &self.initials {
11267            s.serialize_field("initials", val)?;
11268        }
11269        if self.is_inherited {
11270            s.serialize_field("is_inherited", &self.is_inherited)?;
11271        }
11272        Ok(())
11273    }
11274}
11275
11276impl<'de> ::serde::de::Deserialize<'de> for MembershipInfo {
11277    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
11278        // struct deserializer
11279        use serde::de::{MapAccess, Visitor};
11280        struct StructVisitor;
11281        impl<'de> Visitor<'de> for StructVisitor {
11282            type Value = MembershipInfo;
11283            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11284                f.write_str("a MembershipInfo struct")
11285            }
11286            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
11287                MembershipInfo::internal_deserialize(map)
11288            }
11289        }
11290        deserializer.deserialize_struct("MembershipInfo", MEMBERSHIP_INFO_FIELDS, StructVisitor)
11291    }
11292}
11293
11294impl ::serde::ser::Serialize for MembershipInfo {
11295    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
11296        // struct serializer
11297        use serde::ser::SerializeStruct;
11298        let mut s = serializer.serialize_struct("MembershipInfo", 4)?;
11299        self.internal_serialize::<S>(&mut s)?;
11300        s.end()
11301    }
11302}
11303
11304#[derive(Debug, Clone, PartialEq, Eq)]
11305#[non_exhaustive] // structs may have more fields added in the future.
11306pub struct ModifySharedLinkSettingsArgs {
11307    /// URL of the shared link to change its settings.
11308    pub url: String,
11309    /// Set of settings for the shared link.
11310    pub settings: SharedLinkSettings,
11311    /// If set to true, removes the expiration of the shared link.
11312    pub remove_expiration: bool,
11313}
11314
11315impl ModifySharedLinkSettingsArgs {
11316    pub fn new(url: String, settings: SharedLinkSettings) -> Self {
11317        ModifySharedLinkSettingsArgs {
11318            url,
11319            settings,
11320            remove_expiration: false,
11321        }
11322    }
11323
11324    pub fn with_remove_expiration(mut self, value: bool) -> Self {
11325        self.remove_expiration = value;
11326        self
11327    }
11328}
11329
11330const MODIFY_SHARED_LINK_SETTINGS_ARGS_FIELDS: &[&str] = &["url",
11331                                                           "settings",
11332                                                           "remove_expiration"];
11333impl ModifySharedLinkSettingsArgs {
11334    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
11335        map: V,
11336    ) -> Result<ModifySharedLinkSettingsArgs, V::Error> {
11337        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
11338    }
11339
11340    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
11341        mut map: V,
11342        optional: bool,
11343    ) -> Result<Option<ModifySharedLinkSettingsArgs>, V::Error> {
11344        let mut field_url = None;
11345        let mut field_settings = None;
11346        let mut field_remove_expiration = None;
11347        let mut nothing = true;
11348        while let Some(key) = map.next_key::<&str>()? {
11349            nothing = false;
11350            match key {
11351                "url" => {
11352                    if field_url.is_some() {
11353                        return Err(::serde::de::Error::duplicate_field("url"));
11354                    }
11355                    field_url = Some(map.next_value()?);
11356                }
11357                "settings" => {
11358                    if field_settings.is_some() {
11359                        return Err(::serde::de::Error::duplicate_field("settings"));
11360                    }
11361                    field_settings = Some(map.next_value()?);
11362                }
11363                "remove_expiration" => {
11364                    if field_remove_expiration.is_some() {
11365                        return Err(::serde::de::Error::duplicate_field("remove_expiration"));
11366                    }
11367                    field_remove_expiration = Some(map.next_value()?);
11368                }
11369                _ => {
11370                    // unknown field allowed and ignored
11371                    map.next_value::<::serde_json::Value>()?;
11372                }
11373            }
11374        }
11375        if optional && nothing {
11376            return Ok(None);
11377        }
11378        let result = ModifySharedLinkSettingsArgs {
11379            url: field_url.ok_or_else(|| ::serde::de::Error::missing_field("url"))?,
11380            settings: field_settings.ok_or_else(|| ::serde::de::Error::missing_field("settings"))?,
11381            remove_expiration: field_remove_expiration.unwrap_or(false),
11382        };
11383        Ok(Some(result))
11384    }
11385
11386    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
11387        &self,
11388        s: &mut S::SerializeStruct,
11389    ) -> Result<(), S::Error> {
11390        use serde::ser::SerializeStruct;
11391        s.serialize_field("url", &self.url)?;
11392        s.serialize_field("settings", &self.settings)?;
11393        if self.remove_expiration {
11394            s.serialize_field("remove_expiration", &self.remove_expiration)?;
11395        }
11396        Ok(())
11397    }
11398}
11399
11400impl<'de> ::serde::de::Deserialize<'de> for ModifySharedLinkSettingsArgs {
11401    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
11402        // struct deserializer
11403        use serde::de::{MapAccess, Visitor};
11404        struct StructVisitor;
11405        impl<'de> Visitor<'de> for StructVisitor {
11406            type Value = ModifySharedLinkSettingsArgs;
11407            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11408                f.write_str("a ModifySharedLinkSettingsArgs struct")
11409            }
11410            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
11411                ModifySharedLinkSettingsArgs::internal_deserialize(map)
11412            }
11413        }
11414        deserializer.deserialize_struct("ModifySharedLinkSettingsArgs", MODIFY_SHARED_LINK_SETTINGS_ARGS_FIELDS, StructVisitor)
11415    }
11416}
11417
11418impl ::serde::ser::Serialize for ModifySharedLinkSettingsArgs {
11419    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
11420        // struct serializer
11421        use serde::ser::SerializeStruct;
11422        let mut s = serializer.serialize_struct("ModifySharedLinkSettingsArgs", 3)?;
11423        self.internal_serialize::<S>(&mut s)?;
11424        s.end()
11425    }
11426}
11427
11428#[derive(Debug, Clone, PartialEq, Eq)]
11429#[non_exhaustive] // variants may be added in the future
11430pub enum ModifySharedLinkSettingsError {
11431    /// The shared link wasn't found.
11432    SharedLinkNotFound,
11433    /// The caller is not allowed to access this shared link.
11434    SharedLinkAccessDenied,
11435    /// This type of link is not supported; use [`files::export()`](crate::files::export) instead.
11436    UnsupportedLinkType,
11437    /// Private shared links do not support `path` or `link_password` parameter fields.
11438    UnsupportedParameterField,
11439    /// There is an error with the given settings.
11440    SettingsError(SharedLinkSettingsError),
11441    /// This user's email address is not verified. This functionality is only available on accounts
11442    /// with a verified email address. Users can verify their email address
11443    /// [here](https://www.dropbox.com/help/317).
11444    EmailNotVerified,
11445    /// Catch-all used for unrecognized values returned from the server. Encountering this value
11446    /// typically indicates that this SDK version is out of date.
11447    Other,
11448}
11449
11450impl<'de> ::serde::de::Deserialize<'de> for ModifySharedLinkSettingsError {
11451    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
11452        // union deserializer
11453        use serde::de::{self, MapAccess, Visitor};
11454        struct EnumVisitor;
11455        impl<'de> Visitor<'de> for EnumVisitor {
11456            type Value = ModifySharedLinkSettingsError;
11457            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11458                f.write_str("a ModifySharedLinkSettingsError structure")
11459            }
11460            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
11461                let tag: &str = match map.next_key()? {
11462                    Some(".tag") => map.next_value()?,
11463                    _ => return Err(de::Error::missing_field(".tag"))
11464                };
11465                let value = match tag {
11466                    "shared_link_not_found" => ModifySharedLinkSettingsError::SharedLinkNotFound,
11467                    "shared_link_access_denied" => ModifySharedLinkSettingsError::SharedLinkAccessDenied,
11468                    "unsupported_link_type" => ModifySharedLinkSettingsError::UnsupportedLinkType,
11469                    "unsupported_parameter_field" => ModifySharedLinkSettingsError::UnsupportedParameterField,
11470                    "settings_error" => {
11471                        match map.next_key()? {
11472                            Some("settings_error") => ModifySharedLinkSettingsError::SettingsError(map.next_value()?),
11473                            None => return Err(de::Error::missing_field("settings_error")),
11474                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
11475                        }
11476                    }
11477                    "email_not_verified" => ModifySharedLinkSettingsError::EmailNotVerified,
11478                    _ => ModifySharedLinkSettingsError::Other,
11479                };
11480                crate::eat_json_fields(&mut map)?;
11481                Ok(value)
11482            }
11483        }
11484        const VARIANTS: &[&str] = &["shared_link_not_found",
11485                                    "shared_link_access_denied",
11486                                    "unsupported_link_type",
11487                                    "unsupported_parameter_field",
11488                                    "other",
11489                                    "settings_error",
11490                                    "email_not_verified"];
11491        deserializer.deserialize_struct("ModifySharedLinkSettingsError", VARIANTS, EnumVisitor)
11492    }
11493}
11494
11495impl ::serde::ser::Serialize for ModifySharedLinkSettingsError {
11496    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
11497        // union serializer
11498        use serde::ser::SerializeStruct;
11499        match self {
11500            ModifySharedLinkSettingsError::SharedLinkNotFound => {
11501                // unit
11502                let mut s = serializer.serialize_struct("ModifySharedLinkSettingsError", 1)?;
11503                s.serialize_field(".tag", "shared_link_not_found")?;
11504                s.end()
11505            }
11506            ModifySharedLinkSettingsError::SharedLinkAccessDenied => {
11507                // unit
11508                let mut s = serializer.serialize_struct("ModifySharedLinkSettingsError", 1)?;
11509                s.serialize_field(".tag", "shared_link_access_denied")?;
11510                s.end()
11511            }
11512            ModifySharedLinkSettingsError::UnsupportedLinkType => {
11513                // unit
11514                let mut s = serializer.serialize_struct("ModifySharedLinkSettingsError", 1)?;
11515                s.serialize_field(".tag", "unsupported_link_type")?;
11516                s.end()
11517            }
11518            ModifySharedLinkSettingsError::UnsupportedParameterField => {
11519                // unit
11520                let mut s = serializer.serialize_struct("ModifySharedLinkSettingsError", 1)?;
11521                s.serialize_field(".tag", "unsupported_parameter_field")?;
11522                s.end()
11523            }
11524            ModifySharedLinkSettingsError::SettingsError(x) => {
11525                // union or polymporphic struct
11526                let mut s = serializer.serialize_struct("ModifySharedLinkSettingsError", 2)?;
11527                s.serialize_field(".tag", "settings_error")?;
11528                s.serialize_field("settings_error", x)?;
11529                s.end()
11530            }
11531            ModifySharedLinkSettingsError::EmailNotVerified => {
11532                // unit
11533                let mut s = serializer.serialize_struct("ModifySharedLinkSettingsError", 1)?;
11534                s.serialize_field(".tag", "email_not_verified")?;
11535                s.end()
11536            }
11537            ModifySharedLinkSettingsError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
11538        }
11539    }
11540}
11541
11542impl ::std::error::Error for ModifySharedLinkSettingsError {
11543    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
11544        match self {
11545            ModifySharedLinkSettingsError::SettingsError(inner) => Some(inner),
11546            _ => None,
11547        }
11548    }
11549}
11550
11551impl ::std::fmt::Display for ModifySharedLinkSettingsError {
11552    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11553        match self {
11554            ModifySharedLinkSettingsError::SharedLinkNotFound => f.write_str("The shared link wasn't found."),
11555            ModifySharedLinkSettingsError::SharedLinkAccessDenied => f.write_str("The caller is not allowed to access this shared link."),
11556            ModifySharedLinkSettingsError::UnsupportedParameterField => f.write_str("Private shared links do not support `path` or `link_password` parameter fields."),
11557            ModifySharedLinkSettingsError::SettingsError(inner) => write!(f, "There is an error with the given settings: {}", inner),
11558            _ => write!(f, "{:?}", *self),
11559        }
11560    }
11561}
11562
11563// union extends SharedLinkError
11564impl From<SharedLinkError> for ModifySharedLinkSettingsError {
11565    fn from(parent: SharedLinkError) -> Self {
11566        match parent {
11567            SharedLinkError::SharedLinkNotFound => ModifySharedLinkSettingsError::SharedLinkNotFound,
11568            SharedLinkError::SharedLinkAccessDenied => ModifySharedLinkSettingsError::SharedLinkAccessDenied,
11569            SharedLinkError::UnsupportedLinkType => ModifySharedLinkSettingsError::UnsupportedLinkType,
11570            SharedLinkError::UnsupportedParameterField => ModifySharedLinkSettingsError::UnsupportedParameterField,
11571            SharedLinkError::Other => ModifySharedLinkSettingsError::Other,
11572        }
11573    }
11574}
11575#[derive(Debug, Clone, PartialEq, Eq)]
11576#[non_exhaustive] // structs may have more fields added in the future.
11577pub struct MountFolderArg {
11578    /// The ID of the shared folder to mount.
11579    pub shared_folder_id: crate::types::common::SharedFolderId,
11580}
11581
11582impl MountFolderArg {
11583    pub fn new(shared_folder_id: crate::types::common::SharedFolderId) -> Self {
11584        MountFolderArg {
11585            shared_folder_id,
11586        }
11587    }
11588}
11589
11590const MOUNT_FOLDER_ARG_FIELDS: &[&str] = &["shared_folder_id"];
11591impl MountFolderArg {
11592    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
11593        map: V,
11594    ) -> Result<MountFolderArg, V::Error> {
11595        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
11596    }
11597
11598    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
11599        mut map: V,
11600        optional: bool,
11601    ) -> Result<Option<MountFolderArg>, V::Error> {
11602        let mut field_shared_folder_id = None;
11603        let mut nothing = true;
11604        while let Some(key) = map.next_key::<&str>()? {
11605            nothing = false;
11606            match key {
11607                "shared_folder_id" => {
11608                    if field_shared_folder_id.is_some() {
11609                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
11610                    }
11611                    field_shared_folder_id = Some(map.next_value()?);
11612                }
11613                _ => {
11614                    // unknown field allowed and ignored
11615                    map.next_value::<::serde_json::Value>()?;
11616                }
11617            }
11618        }
11619        if optional && nothing {
11620            return Ok(None);
11621        }
11622        let result = MountFolderArg {
11623            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
11624        };
11625        Ok(Some(result))
11626    }
11627
11628    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
11629        &self,
11630        s: &mut S::SerializeStruct,
11631    ) -> Result<(), S::Error> {
11632        use serde::ser::SerializeStruct;
11633        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
11634        Ok(())
11635    }
11636}
11637
11638impl<'de> ::serde::de::Deserialize<'de> for MountFolderArg {
11639    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
11640        // struct deserializer
11641        use serde::de::{MapAccess, Visitor};
11642        struct StructVisitor;
11643        impl<'de> Visitor<'de> for StructVisitor {
11644            type Value = MountFolderArg;
11645            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11646                f.write_str("a MountFolderArg struct")
11647            }
11648            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
11649                MountFolderArg::internal_deserialize(map)
11650            }
11651        }
11652        deserializer.deserialize_struct("MountFolderArg", MOUNT_FOLDER_ARG_FIELDS, StructVisitor)
11653    }
11654}
11655
11656impl ::serde::ser::Serialize for MountFolderArg {
11657    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
11658        // struct serializer
11659        use serde::ser::SerializeStruct;
11660        let mut s = serializer.serialize_struct("MountFolderArg", 1)?;
11661        self.internal_serialize::<S>(&mut s)?;
11662        s.end()
11663    }
11664}
11665
11666#[derive(Debug, Clone, PartialEq, Eq)]
11667#[non_exhaustive] // variants may be added in the future
11668pub enum MountFolderError {
11669    AccessError(SharedFolderAccessError),
11670    /// Mounting would cause a shared folder to be inside another, which is disallowed.
11671    InsideSharedFolder,
11672    /// The current user does not have enough space to mount the shared folder.
11673    InsufficientQuota(InsufficientQuotaAmounts),
11674    /// The shared folder is already mounted.
11675    AlreadyMounted,
11676    /// The current user does not have permission to perform this action.
11677    NoPermission,
11678    /// The shared folder is not mountable. One example where this can occur is when the shared
11679    /// folder belongs within a team folder in the user's Dropbox.
11680    NotMountable,
11681    /// The shared folder is not mountable by directly call APIs, instead the automounter is
11682    /// responsible for mounting it.
11683    MustAutomount,
11684    /// Catch-all used for unrecognized values returned from the server. Encountering this value
11685    /// typically indicates that this SDK version is out of date.
11686    Other,
11687}
11688
11689impl<'de> ::serde::de::Deserialize<'de> for MountFolderError {
11690    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
11691        // union deserializer
11692        use serde::de::{self, MapAccess, Visitor};
11693        struct EnumVisitor;
11694        impl<'de> Visitor<'de> for EnumVisitor {
11695            type Value = MountFolderError;
11696            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11697                f.write_str("a MountFolderError structure")
11698            }
11699            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
11700                let tag: &str = match map.next_key()? {
11701                    Some(".tag") => map.next_value()?,
11702                    _ => return Err(de::Error::missing_field(".tag"))
11703                };
11704                let value = match tag {
11705                    "access_error" => {
11706                        match map.next_key()? {
11707                            Some("access_error") => MountFolderError::AccessError(map.next_value()?),
11708                            None => return Err(de::Error::missing_field("access_error")),
11709                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
11710                        }
11711                    }
11712                    "inside_shared_folder" => MountFolderError::InsideSharedFolder,
11713                    "insufficient_quota" => MountFolderError::InsufficientQuota(InsufficientQuotaAmounts::internal_deserialize(&mut map)?),
11714                    "already_mounted" => MountFolderError::AlreadyMounted,
11715                    "no_permission" => MountFolderError::NoPermission,
11716                    "not_mountable" => MountFolderError::NotMountable,
11717                    "must_automount" => MountFolderError::MustAutomount,
11718                    _ => MountFolderError::Other,
11719                };
11720                crate::eat_json_fields(&mut map)?;
11721                Ok(value)
11722            }
11723        }
11724        const VARIANTS: &[&str] = &["access_error",
11725                                    "inside_shared_folder",
11726                                    "insufficient_quota",
11727                                    "already_mounted",
11728                                    "no_permission",
11729                                    "not_mountable",
11730                                    "must_automount",
11731                                    "other"];
11732        deserializer.deserialize_struct("MountFolderError", VARIANTS, EnumVisitor)
11733    }
11734}
11735
11736impl ::serde::ser::Serialize for MountFolderError {
11737    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
11738        // union serializer
11739        use serde::ser::SerializeStruct;
11740        match self {
11741            MountFolderError::AccessError(x) => {
11742                // union or polymporphic struct
11743                let mut s = serializer.serialize_struct("MountFolderError", 2)?;
11744                s.serialize_field(".tag", "access_error")?;
11745                s.serialize_field("access_error", x)?;
11746                s.end()
11747            }
11748            MountFolderError::InsideSharedFolder => {
11749                // unit
11750                let mut s = serializer.serialize_struct("MountFolderError", 1)?;
11751                s.serialize_field(".tag", "inside_shared_folder")?;
11752                s.end()
11753            }
11754            MountFolderError::InsufficientQuota(x) => {
11755                // struct
11756                let mut s = serializer.serialize_struct("MountFolderError", 4)?;
11757                s.serialize_field(".tag", "insufficient_quota")?;
11758                x.internal_serialize::<S>(&mut s)?;
11759                s.end()
11760            }
11761            MountFolderError::AlreadyMounted => {
11762                // unit
11763                let mut s = serializer.serialize_struct("MountFolderError", 1)?;
11764                s.serialize_field(".tag", "already_mounted")?;
11765                s.end()
11766            }
11767            MountFolderError::NoPermission => {
11768                // unit
11769                let mut s = serializer.serialize_struct("MountFolderError", 1)?;
11770                s.serialize_field(".tag", "no_permission")?;
11771                s.end()
11772            }
11773            MountFolderError::NotMountable => {
11774                // unit
11775                let mut s = serializer.serialize_struct("MountFolderError", 1)?;
11776                s.serialize_field(".tag", "not_mountable")?;
11777                s.end()
11778            }
11779            MountFolderError::MustAutomount => {
11780                // unit
11781                let mut s = serializer.serialize_struct("MountFolderError", 1)?;
11782                s.serialize_field(".tag", "must_automount")?;
11783                s.end()
11784            }
11785            MountFolderError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
11786        }
11787    }
11788}
11789
11790impl ::std::error::Error for MountFolderError {
11791    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
11792        match self {
11793            MountFolderError::AccessError(inner) => Some(inner),
11794            _ => None,
11795        }
11796    }
11797}
11798
11799impl ::std::fmt::Display for MountFolderError {
11800    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11801        match self {
11802            MountFolderError::AccessError(inner) => write!(f, "MountFolderError: {}", inner),
11803            MountFolderError::InsideSharedFolder => f.write_str("Mounting would cause a shared folder to be inside another, which is disallowed."),
11804            MountFolderError::InsufficientQuota(inner) => write!(f, "The current user does not have enough space to mount the shared folder: {:?}", inner),
11805            MountFolderError::AlreadyMounted => f.write_str("The shared folder is already mounted."),
11806            MountFolderError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
11807            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."),
11808            MountFolderError::MustAutomount => f.write_str("The shared folder is not mountable by directly call APIs, instead the automounter is responsible for mounting it."),
11809            _ => write!(f, "{:?}", *self),
11810        }
11811    }
11812}
11813
11814/// Contains information about a parent folder that a member has access to.
11815#[derive(Debug, Clone, PartialEq, Eq)]
11816#[non_exhaustive] // structs may have more fields added in the future.
11817pub struct ParentFolderAccessInfo {
11818    /// Display name for the folder.
11819    pub folder_name: String,
11820    /// The identifier of the parent shared folder.
11821    pub shared_folder_id: crate::types::common::SharedFolderId,
11822    /// The user's permissions for the parent shared folder.
11823    pub permissions: Vec<MemberPermission>,
11824    /// The full path to the parent shared folder relative to the acting user's root.
11825    pub path: String,
11826}
11827
11828impl ParentFolderAccessInfo {
11829    pub fn new(
11830        folder_name: String,
11831        shared_folder_id: crate::types::common::SharedFolderId,
11832        permissions: Vec<MemberPermission>,
11833        path: String,
11834    ) -> Self {
11835        ParentFolderAccessInfo {
11836            folder_name,
11837            shared_folder_id,
11838            permissions,
11839            path,
11840        }
11841    }
11842}
11843
11844const PARENT_FOLDER_ACCESS_INFO_FIELDS: &[&str] = &["folder_name",
11845                                                    "shared_folder_id",
11846                                                    "permissions",
11847                                                    "path"];
11848impl ParentFolderAccessInfo {
11849    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
11850        map: V,
11851    ) -> Result<ParentFolderAccessInfo, V::Error> {
11852        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
11853    }
11854
11855    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
11856        mut map: V,
11857        optional: bool,
11858    ) -> Result<Option<ParentFolderAccessInfo>, V::Error> {
11859        let mut field_folder_name = None;
11860        let mut field_shared_folder_id = None;
11861        let mut field_permissions = None;
11862        let mut field_path = None;
11863        let mut nothing = true;
11864        while let Some(key) = map.next_key::<&str>()? {
11865            nothing = false;
11866            match key {
11867                "folder_name" => {
11868                    if field_folder_name.is_some() {
11869                        return Err(::serde::de::Error::duplicate_field("folder_name"));
11870                    }
11871                    field_folder_name = Some(map.next_value()?);
11872                }
11873                "shared_folder_id" => {
11874                    if field_shared_folder_id.is_some() {
11875                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
11876                    }
11877                    field_shared_folder_id = Some(map.next_value()?);
11878                }
11879                "permissions" => {
11880                    if field_permissions.is_some() {
11881                        return Err(::serde::de::Error::duplicate_field("permissions"));
11882                    }
11883                    field_permissions = Some(map.next_value()?);
11884                }
11885                "path" => {
11886                    if field_path.is_some() {
11887                        return Err(::serde::de::Error::duplicate_field("path"));
11888                    }
11889                    field_path = Some(map.next_value()?);
11890                }
11891                _ => {
11892                    // unknown field allowed and ignored
11893                    map.next_value::<::serde_json::Value>()?;
11894                }
11895            }
11896        }
11897        if optional && nothing {
11898            return Ok(None);
11899        }
11900        let result = ParentFolderAccessInfo {
11901            folder_name: field_folder_name.ok_or_else(|| ::serde::de::Error::missing_field("folder_name"))?,
11902            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
11903            permissions: field_permissions.ok_or_else(|| ::serde::de::Error::missing_field("permissions"))?,
11904            path: field_path.ok_or_else(|| ::serde::de::Error::missing_field("path"))?,
11905        };
11906        Ok(Some(result))
11907    }
11908
11909    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
11910        &self,
11911        s: &mut S::SerializeStruct,
11912    ) -> Result<(), S::Error> {
11913        use serde::ser::SerializeStruct;
11914        s.serialize_field("folder_name", &self.folder_name)?;
11915        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
11916        s.serialize_field("permissions", &self.permissions)?;
11917        s.serialize_field("path", &self.path)?;
11918        Ok(())
11919    }
11920}
11921
11922impl<'de> ::serde::de::Deserialize<'de> for ParentFolderAccessInfo {
11923    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
11924        // struct deserializer
11925        use serde::de::{MapAccess, Visitor};
11926        struct StructVisitor;
11927        impl<'de> Visitor<'de> for StructVisitor {
11928            type Value = ParentFolderAccessInfo;
11929            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11930                f.write_str("a ParentFolderAccessInfo struct")
11931            }
11932            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
11933                ParentFolderAccessInfo::internal_deserialize(map)
11934            }
11935        }
11936        deserializer.deserialize_struct("ParentFolderAccessInfo", PARENT_FOLDER_ACCESS_INFO_FIELDS, StructVisitor)
11937    }
11938}
11939
11940impl ::serde::ser::Serialize for ParentFolderAccessInfo {
11941    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
11942        // struct serializer
11943        use serde::ser::SerializeStruct;
11944        let mut s = serializer.serialize_struct("ParentFolderAccessInfo", 4)?;
11945        self.internal_serialize::<S>(&mut s)?;
11946        s.end()
11947    }
11948}
11949
11950/// Metadata for a path-based shared link.
11951#[derive(Debug, Clone, PartialEq, Eq)]
11952#[non_exhaustive] // structs may have more fields added in the future.
11953pub struct PathLinkMetadata {
11954    /// URL of the shared link.
11955    pub url: String,
11956    /// Who can access the link.
11957    pub visibility: Visibility,
11958    /// Path in user's Dropbox.
11959    pub path: String,
11960    /// Expiration time, if set. By default the link won't expire.
11961    pub expires: Option<crate::types::common::DropboxTimestamp>,
11962}
11963
11964impl PathLinkMetadata {
11965    pub fn new(url: String, visibility: Visibility, path: String) -> Self {
11966        PathLinkMetadata {
11967            url,
11968            visibility,
11969            path,
11970            expires: None,
11971        }
11972    }
11973
11974    pub fn with_expires(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
11975        self.expires = Some(value);
11976        self
11977    }
11978}
11979
11980const PATH_LINK_METADATA_FIELDS: &[&str] = &["url",
11981                                             "visibility",
11982                                             "path",
11983                                             "expires"];
11984impl PathLinkMetadata {
11985    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
11986        map: V,
11987    ) -> Result<PathLinkMetadata, V::Error> {
11988        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
11989    }
11990
11991    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
11992        mut map: V,
11993        optional: bool,
11994    ) -> Result<Option<PathLinkMetadata>, V::Error> {
11995        let mut field_url = None;
11996        let mut field_visibility = None;
11997        let mut field_path = None;
11998        let mut field_expires = None;
11999        let mut nothing = true;
12000        while let Some(key) = map.next_key::<&str>()? {
12001            nothing = false;
12002            match key {
12003                "url" => {
12004                    if field_url.is_some() {
12005                        return Err(::serde::de::Error::duplicate_field("url"));
12006                    }
12007                    field_url = Some(map.next_value()?);
12008                }
12009                "visibility" => {
12010                    if field_visibility.is_some() {
12011                        return Err(::serde::de::Error::duplicate_field("visibility"));
12012                    }
12013                    field_visibility = Some(map.next_value()?);
12014                }
12015                "path" => {
12016                    if field_path.is_some() {
12017                        return Err(::serde::de::Error::duplicate_field("path"));
12018                    }
12019                    field_path = Some(map.next_value()?);
12020                }
12021                "expires" => {
12022                    if field_expires.is_some() {
12023                        return Err(::serde::de::Error::duplicate_field("expires"));
12024                    }
12025                    field_expires = Some(map.next_value()?);
12026                }
12027                _ => {
12028                    // unknown field allowed and ignored
12029                    map.next_value::<::serde_json::Value>()?;
12030                }
12031            }
12032        }
12033        if optional && nothing {
12034            return Ok(None);
12035        }
12036        let result = PathLinkMetadata {
12037            url: field_url.ok_or_else(|| ::serde::de::Error::missing_field("url"))?,
12038            visibility: field_visibility.ok_or_else(|| ::serde::de::Error::missing_field("visibility"))?,
12039            path: field_path.ok_or_else(|| ::serde::de::Error::missing_field("path"))?,
12040            expires: field_expires.and_then(Option::flatten),
12041        };
12042        Ok(Some(result))
12043    }
12044
12045    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
12046        &self,
12047        s: &mut S::SerializeStruct,
12048    ) -> Result<(), S::Error> {
12049        use serde::ser::SerializeStruct;
12050        s.serialize_field("url", &self.url)?;
12051        s.serialize_field("visibility", &self.visibility)?;
12052        s.serialize_field("path", &self.path)?;
12053        if let Some(val) = &self.expires {
12054            s.serialize_field("expires", val)?;
12055        }
12056        Ok(())
12057    }
12058}
12059
12060impl<'de> ::serde::de::Deserialize<'de> for PathLinkMetadata {
12061    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12062        // struct deserializer
12063        use serde::de::{MapAccess, Visitor};
12064        struct StructVisitor;
12065        impl<'de> Visitor<'de> for StructVisitor {
12066            type Value = PathLinkMetadata;
12067            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12068                f.write_str("a PathLinkMetadata struct")
12069            }
12070            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
12071                PathLinkMetadata::internal_deserialize(map)
12072            }
12073        }
12074        deserializer.deserialize_struct("PathLinkMetadata", PATH_LINK_METADATA_FIELDS, StructVisitor)
12075    }
12076}
12077
12078impl ::serde::ser::Serialize for PathLinkMetadata {
12079    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12080        // struct serializer
12081        use serde::ser::SerializeStruct;
12082        let mut s = serializer.serialize_struct("PathLinkMetadata", 4)?;
12083        self.internal_serialize::<S>(&mut s)?;
12084        s.end()
12085    }
12086}
12087
12088// struct extends polymorphic struct LinkMetadata
12089impl From<PathLinkMetadata> for LinkMetadata {
12090    fn from(subtype: PathLinkMetadata) -> Self {
12091        LinkMetadata::Path(subtype)
12092    }
12093}
12094/// Flag to indicate pending upload default (for linking to not-yet-existing paths).
12095#[derive(Debug, Clone, PartialEq, Eq)]
12096pub enum PendingUploadMode {
12097    /// Assume pending uploads are files.
12098    File,
12099    /// Assume pending uploads are folders.
12100    Folder,
12101}
12102
12103impl<'de> ::serde::de::Deserialize<'de> for PendingUploadMode {
12104    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12105        // union deserializer
12106        use serde::de::{self, MapAccess, Visitor};
12107        struct EnumVisitor;
12108        impl<'de> Visitor<'de> for EnumVisitor {
12109            type Value = PendingUploadMode;
12110            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12111                f.write_str("a PendingUploadMode structure")
12112            }
12113            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
12114                let tag: &str = match map.next_key()? {
12115                    Some(".tag") => map.next_value()?,
12116                    _ => return Err(de::Error::missing_field(".tag"))
12117                };
12118                let value = match tag {
12119                    "file" => PendingUploadMode::File,
12120                    "folder" => PendingUploadMode::Folder,
12121                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
12122                };
12123                crate::eat_json_fields(&mut map)?;
12124                Ok(value)
12125            }
12126        }
12127        const VARIANTS: &[&str] = &["file",
12128                                    "folder"];
12129        deserializer.deserialize_struct("PendingUploadMode", VARIANTS, EnumVisitor)
12130    }
12131}
12132
12133impl ::serde::ser::Serialize for PendingUploadMode {
12134    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12135        // union serializer
12136        use serde::ser::SerializeStruct;
12137        match self {
12138            PendingUploadMode::File => {
12139                // unit
12140                let mut s = serializer.serialize_struct("PendingUploadMode", 1)?;
12141                s.serialize_field(".tag", "file")?;
12142                s.end()
12143            }
12144            PendingUploadMode::Folder => {
12145                // unit
12146                let mut s = serializer.serialize_struct("PendingUploadMode", 1)?;
12147                s.serialize_field(".tag", "folder")?;
12148                s.end()
12149            }
12150        }
12151    }
12152}
12153
12154/// Possible reasons the user is denied a permission.
12155#[derive(Debug, Clone, PartialEq, Eq)]
12156#[non_exhaustive] // variants may be added in the future
12157pub enum PermissionDeniedReason {
12158    /// User is not on the same team as the folder owner.
12159    UserNotSameTeamAsOwner,
12160    /// User is prohibited by the owner from taking the action.
12161    UserNotAllowedByOwner,
12162    /// Target is indirectly a member of the folder, for example by being part of a group.
12163    TargetIsIndirectMember,
12164    /// Target is the owner of the folder.
12165    TargetIsOwner,
12166    /// Target is the user itself.
12167    TargetIsSelf,
12168    /// Target is not an active member of the team.
12169    TargetNotActive,
12170    /// Folder is team folder for a limited team.
12171    FolderIsLimitedTeamFolder,
12172    /// The content owner needs to be on a Dropbox team to perform this action.
12173    OwnerNotOnTeam,
12174    /// The user does not have permission to perform this action on the link.
12175    PermissionDenied,
12176    /// The user's team policy prevents performing this action on the link.
12177    RestrictedByTeam,
12178    /// The user's account type does not support this action.
12179    UserAccountType,
12180    /// The user needs to be on a Dropbox team to perform this action.
12181    UserNotOnTeam,
12182    /// Folder is inside of another shared folder.
12183    FolderIsInsideSharedFolder,
12184    /// Policy cannot be changed due to restrictions from parent folder.
12185    RestrictedByParentFolder,
12186    InsufficientPlan(InsufficientPlan),
12187    /// Catch-all used for unrecognized values returned from the server. Encountering this value
12188    /// typically indicates that this SDK version is out of date.
12189    Other,
12190}
12191
12192impl<'de> ::serde::de::Deserialize<'de> for PermissionDeniedReason {
12193    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12194        // union deserializer
12195        use serde::de::{self, MapAccess, Visitor};
12196        struct EnumVisitor;
12197        impl<'de> Visitor<'de> for EnumVisitor {
12198            type Value = PermissionDeniedReason;
12199            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12200                f.write_str("a PermissionDeniedReason structure")
12201            }
12202            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
12203                let tag: &str = match map.next_key()? {
12204                    Some(".tag") => map.next_value()?,
12205                    _ => return Err(de::Error::missing_field(".tag"))
12206                };
12207                let value = match tag {
12208                    "user_not_same_team_as_owner" => PermissionDeniedReason::UserNotSameTeamAsOwner,
12209                    "user_not_allowed_by_owner" => PermissionDeniedReason::UserNotAllowedByOwner,
12210                    "target_is_indirect_member" => PermissionDeniedReason::TargetIsIndirectMember,
12211                    "target_is_owner" => PermissionDeniedReason::TargetIsOwner,
12212                    "target_is_self" => PermissionDeniedReason::TargetIsSelf,
12213                    "target_not_active" => PermissionDeniedReason::TargetNotActive,
12214                    "folder_is_limited_team_folder" => PermissionDeniedReason::FolderIsLimitedTeamFolder,
12215                    "owner_not_on_team" => PermissionDeniedReason::OwnerNotOnTeam,
12216                    "permission_denied" => PermissionDeniedReason::PermissionDenied,
12217                    "restricted_by_team" => PermissionDeniedReason::RestrictedByTeam,
12218                    "user_account_type" => PermissionDeniedReason::UserAccountType,
12219                    "user_not_on_team" => PermissionDeniedReason::UserNotOnTeam,
12220                    "folder_is_inside_shared_folder" => PermissionDeniedReason::FolderIsInsideSharedFolder,
12221                    "restricted_by_parent_folder" => PermissionDeniedReason::RestrictedByParentFolder,
12222                    "insufficient_plan" => PermissionDeniedReason::InsufficientPlan(InsufficientPlan::internal_deserialize(&mut map)?),
12223                    _ => PermissionDeniedReason::Other,
12224                };
12225                crate::eat_json_fields(&mut map)?;
12226                Ok(value)
12227            }
12228        }
12229        const VARIANTS: &[&str] = &["user_not_same_team_as_owner",
12230                                    "user_not_allowed_by_owner",
12231                                    "target_is_indirect_member",
12232                                    "target_is_owner",
12233                                    "target_is_self",
12234                                    "target_not_active",
12235                                    "folder_is_limited_team_folder",
12236                                    "owner_not_on_team",
12237                                    "permission_denied",
12238                                    "restricted_by_team",
12239                                    "user_account_type",
12240                                    "user_not_on_team",
12241                                    "folder_is_inside_shared_folder",
12242                                    "restricted_by_parent_folder",
12243                                    "insufficient_plan",
12244                                    "other"];
12245        deserializer.deserialize_struct("PermissionDeniedReason", VARIANTS, EnumVisitor)
12246    }
12247}
12248
12249impl ::serde::ser::Serialize for PermissionDeniedReason {
12250    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12251        // union serializer
12252        use serde::ser::SerializeStruct;
12253        match self {
12254            PermissionDeniedReason::UserNotSameTeamAsOwner => {
12255                // unit
12256                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12257                s.serialize_field(".tag", "user_not_same_team_as_owner")?;
12258                s.end()
12259            }
12260            PermissionDeniedReason::UserNotAllowedByOwner => {
12261                // unit
12262                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12263                s.serialize_field(".tag", "user_not_allowed_by_owner")?;
12264                s.end()
12265            }
12266            PermissionDeniedReason::TargetIsIndirectMember => {
12267                // unit
12268                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12269                s.serialize_field(".tag", "target_is_indirect_member")?;
12270                s.end()
12271            }
12272            PermissionDeniedReason::TargetIsOwner => {
12273                // unit
12274                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12275                s.serialize_field(".tag", "target_is_owner")?;
12276                s.end()
12277            }
12278            PermissionDeniedReason::TargetIsSelf => {
12279                // unit
12280                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12281                s.serialize_field(".tag", "target_is_self")?;
12282                s.end()
12283            }
12284            PermissionDeniedReason::TargetNotActive => {
12285                // unit
12286                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12287                s.serialize_field(".tag", "target_not_active")?;
12288                s.end()
12289            }
12290            PermissionDeniedReason::FolderIsLimitedTeamFolder => {
12291                // unit
12292                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12293                s.serialize_field(".tag", "folder_is_limited_team_folder")?;
12294                s.end()
12295            }
12296            PermissionDeniedReason::OwnerNotOnTeam => {
12297                // unit
12298                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12299                s.serialize_field(".tag", "owner_not_on_team")?;
12300                s.end()
12301            }
12302            PermissionDeniedReason::PermissionDenied => {
12303                // unit
12304                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12305                s.serialize_field(".tag", "permission_denied")?;
12306                s.end()
12307            }
12308            PermissionDeniedReason::RestrictedByTeam => {
12309                // unit
12310                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12311                s.serialize_field(".tag", "restricted_by_team")?;
12312                s.end()
12313            }
12314            PermissionDeniedReason::UserAccountType => {
12315                // unit
12316                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12317                s.serialize_field(".tag", "user_account_type")?;
12318                s.end()
12319            }
12320            PermissionDeniedReason::UserNotOnTeam => {
12321                // unit
12322                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12323                s.serialize_field(".tag", "user_not_on_team")?;
12324                s.end()
12325            }
12326            PermissionDeniedReason::FolderIsInsideSharedFolder => {
12327                // unit
12328                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12329                s.serialize_field(".tag", "folder_is_inside_shared_folder")?;
12330                s.end()
12331            }
12332            PermissionDeniedReason::RestrictedByParentFolder => {
12333                // unit
12334                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
12335                s.serialize_field(".tag", "restricted_by_parent_folder")?;
12336                s.end()
12337            }
12338            PermissionDeniedReason::InsufficientPlan(x) => {
12339                // struct
12340                let mut s = serializer.serialize_struct("PermissionDeniedReason", 3)?;
12341                s.serialize_field(".tag", "insufficient_plan")?;
12342                x.internal_serialize::<S>(&mut s)?;
12343                s.end()
12344            }
12345            PermissionDeniedReason::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
12346        }
12347    }
12348}
12349
12350/// Removes all self-removable access from a file or folder. For folders: always relinquishes
12351/// without keeping a local copy (leave_a_copy=false behavior). If you need control over keeping
12352/// folder contents, use the relinquish_folder_membership endpoint instead.
12353#[derive(Debug, Clone, PartialEq, Eq)]
12354#[non_exhaustive] // structs may have more fields added in the future.
12355pub struct RelinquishAccessArg {
12356    /// The id for the file or folder.
12357    pub file_id: String,
12358}
12359
12360impl RelinquishAccessArg {
12361    pub fn new(file_id: String) -> Self {
12362        RelinquishAccessArg {
12363            file_id,
12364        }
12365    }
12366}
12367
12368const RELINQUISH_ACCESS_ARG_FIELDS: &[&str] = &["file_id"];
12369impl RelinquishAccessArg {
12370    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
12371        map: V,
12372    ) -> Result<RelinquishAccessArg, V::Error> {
12373        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
12374    }
12375
12376    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
12377        mut map: V,
12378        optional: bool,
12379    ) -> Result<Option<RelinquishAccessArg>, V::Error> {
12380        let mut field_file_id = None;
12381        let mut nothing = true;
12382        while let Some(key) = map.next_key::<&str>()? {
12383            nothing = false;
12384            match key {
12385                "file_id" => {
12386                    if field_file_id.is_some() {
12387                        return Err(::serde::de::Error::duplicate_field("file_id"));
12388                    }
12389                    field_file_id = Some(map.next_value()?);
12390                }
12391                _ => {
12392                    // unknown field allowed and ignored
12393                    map.next_value::<::serde_json::Value>()?;
12394                }
12395            }
12396        }
12397        if optional && nothing {
12398            return Ok(None);
12399        }
12400        let result = RelinquishAccessArg {
12401            file_id: field_file_id.ok_or_else(|| ::serde::de::Error::missing_field("file_id"))?,
12402        };
12403        Ok(Some(result))
12404    }
12405
12406    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
12407        &self,
12408        s: &mut S::SerializeStruct,
12409    ) -> Result<(), S::Error> {
12410        use serde::ser::SerializeStruct;
12411        s.serialize_field("file_id", &self.file_id)?;
12412        Ok(())
12413    }
12414}
12415
12416impl<'de> ::serde::de::Deserialize<'de> for RelinquishAccessArg {
12417    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12418        // struct deserializer
12419        use serde::de::{MapAccess, Visitor};
12420        struct StructVisitor;
12421        impl<'de> Visitor<'de> for StructVisitor {
12422            type Value = RelinquishAccessArg;
12423            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12424                f.write_str("a RelinquishAccessArg struct")
12425            }
12426            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
12427                RelinquishAccessArg::internal_deserialize(map)
12428            }
12429        }
12430        deserializer.deserialize_struct("RelinquishAccessArg", RELINQUISH_ACCESS_ARG_FIELDS, StructVisitor)
12431    }
12432}
12433
12434impl ::serde::ser::Serialize for RelinquishAccessArg {
12435    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12436        // struct serializer
12437        use serde::ser::SerializeStruct;
12438        let mut s = serializer.serialize_struct("RelinquishAccessArg", 1)?;
12439        self.internal_serialize::<S>(&mut s)?;
12440        s.end()
12441    }
12442}
12443
12444/// Error result for the relinquish_access endpoint.
12445#[derive(Debug, Clone, PartialEq, Eq)]
12446#[non_exhaustive] // variants may be added in the future
12447pub enum RelinquishAccessError {
12448    /// File or folder not found or has been deleted.
12449    InvalidFileId,
12450    /// Caller's email address is not verified.
12451    EmailUnverified,
12452    /// User is the owner of the file/folder.
12453    Owner,
12454    /// User only has inherited access from a parent folder.
12455    NoExplicitAccess,
12456    /// User has access only via group membership.
12457    GroupAccess,
12458    /// Team folder restrictions apply.
12459    TeamFolder,
12460    /// Caller does not have permission to perform this action. Generic fallback.
12461    NoPermission,
12462    /// Catch-all used for unrecognized values returned from the server. Encountering this value
12463    /// typically indicates that this SDK version is out of date.
12464    Other,
12465}
12466
12467impl<'de> ::serde::de::Deserialize<'de> for RelinquishAccessError {
12468    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12469        // union deserializer
12470        use serde::de::{self, MapAccess, Visitor};
12471        struct EnumVisitor;
12472        impl<'de> Visitor<'de> for EnumVisitor {
12473            type Value = RelinquishAccessError;
12474            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12475                f.write_str("a RelinquishAccessError structure")
12476            }
12477            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
12478                let tag: &str = match map.next_key()? {
12479                    Some(".tag") => map.next_value()?,
12480                    _ => return Err(de::Error::missing_field(".tag"))
12481                };
12482                let value = match tag {
12483                    "invalid_file_id" => RelinquishAccessError::InvalidFileId,
12484                    "email_unverified" => RelinquishAccessError::EmailUnverified,
12485                    "owner" => RelinquishAccessError::Owner,
12486                    "no_explicit_access" => RelinquishAccessError::NoExplicitAccess,
12487                    "group_access" => RelinquishAccessError::GroupAccess,
12488                    "team_folder" => RelinquishAccessError::TeamFolder,
12489                    "no_permission" => RelinquishAccessError::NoPermission,
12490                    _ => RelinquishAccessError::Other,
12491                };
12492                crate::eat_json_fields(&mut map)?;
12493                Ok(value)
12494            }
12495        }
12496        const VARIANTS: &[&str] = &["invalid_file_id",
12497                                    "email_unverified",
12498                                    "owner",
12499                                    "no_explicit_access",
12500                                    "group_access",
12501                                    "team_folder",
12502                                    "no_permission",
12503                                    "other"];
12504        deserializer.deserialize_struct("RelinquishAccessError", VARIANTS, EnumVisitor)
12505    }
12506}
12507
12508impl ::serde::ser::Serialize for RelinquishAccessError {
12509    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12510        // union serializer
12511        use serde::ser::SerializeStruct;
12512        match self {
12513            RelinquishAccessError::InvalidFileId => {
12514                // unit
12515                let mut s = serializer.serialize_struct("RelinquishAccessError", 1)?;
12516                s.serialize_field(".tag", "invalid_file_id")?;
12517                s.end()
12518            }
12519            RelinquishAccessError::EmailUnverified => {
12520                // unit
12521                let mut s = serializer.serialize_struct("RelinquishAccessError", 1)?;
12522                s.serialize_field(".tag", "email_unverified")?;
12523                s.end()
12524            }
12525            RelinquishAccessError::Owner => {
12526                // unit
12527                let mut s = serializer.serialize_struct("RelinquishAccessError", 1)?;
12528                s.serialize_field(".tag", "owner")?;
12529                s.end()
12530            }
12531            RelinquishAccessError::NoExplicitAccess => {
12532                // unit
12533                let mut s = serializer.serialize_struct("RelinquishAccessError", 1)?;
12534                s.serialize_field(".tag", "no_explicit_access")?;
12535                s.end()
12536            }
12537            RelinquishAccessError::GroupAccess => {
12538                // unit
12539                let mut s = serializer.serialize_struct("RelinquishAccessError", 1)?;
12540                s.serialize_field(".tag", "group_access")?;
12541                s.end()
12542            }
12543            RelinquishAccessError::TeamFolder => {
12544                // unit
12545                let mut s = serializer.serialize_struct("RelinquishAccessError", 1)?;
12546                s.serialize_field(".tag", "team_folder")?;
12547                s.end()
12548            }
12549            RelinquishAccessError::NoPermission => {
12550                // unit
12551                let mut s = serializer.serialize_struct("RelinquishAccessError", 1)?;
12552                s.serialize_field(".tag", "no_permission")?;
12553                s.end()
12554            }
12555            RelinquishAccessError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
12556        }
12557    }
12558}
12559
12560impl ::std::error::Error for RelinquishAccessError {
12561}
12562
12563impl ::std::fmt::Display for RelinquishAccessError {
12564    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12565        match self {
12566            RelinquishAccessError::InvalidFileId => f.write_str("File or folder not found or has been deleted."),
12567            RelinquishAccessError::EmailUnverified => f.write_str("Caller's email address is not verified."),
12568            RelinquishAccessError::Owner => f.write_str("User is the owner of the file/folder."),
12569            RelinquishAccessError::NoExplicitAccess => f.write_str("User only has inherited access from a parent folder."),
12570            RelinquishAccessError::GroupAccess => f.write_str("User has access only via group membership."),
12571            RelinquishAccessError::TeamFolder => f.write_str("Team folder restrictions apply."),
12572            RelinquishAccessError::NoPermission => f.write_str("Caller does not have permission to perform this action. Generic fallback."),
12573            _ => write!(f, "{:?}", *self),
12574        }
12575    }
12576}
12577
12578/// Returns an empty response for the relinquish_access endpoint.
12579#[derive(Debug, Clone, PartialEq, Eq, Default)]
12580#[non_exhaustive] // structs may have more fields added in the future.
12581pub struct RelinquishAccessResult {
12582}
12583
12584const RELINQUISH_ACCESS_RESULT_FIELDS: &[&str] = &[];
12585impl RelinquishAccessResult {
12586    // no _opt deserializer
12587    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
12588        mut map: V,
12589    ) -> Result<RelinquishAccessResult, V::Error> {
12590        // ignore any fields found; none are presently recognized
12591        crate::eat_json_fields(&mut map)?;
12592        Ok(RelinquishAccessResult {})
12593    }
12594}
12595
12596impl<'de> ::serde::de::Deserialize<'de> for RelinquishAccessResult {
12597    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12598        // struct deserializer
12599        use serde::de::{MapAccess, Visitor};
12600        struct StructVisitor;
12601        impl<'de> Visitor<'de> for StructVisitor {
12602            type Value = RelinquishAccessResult;
12603            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12604                f.write_str("a RelinquishAccessResult struct")
12605            }
12606            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
12607                RelinquishAccessResult::internal_deserialize(map)
12608            }
12609        }
12610        deserializer.deserialize_struct("RelinquishAccessResult", RELINQUISH_ACCESS_RESULT_FIELDS, StructVisitor)
12611    }
12612}
12613
12614impl ::serde::ser::Serialize for RelinquishAccessResult {
12615    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12616        // struct serializer
12617        use serde::ser::SerializeStruct;
12618        serializer.serialize_struct("RelinquishAccessResult", 0)?.end()
12619    }
12620}
12621
12622#[derive(Debug, Clone, PartialEq, Eq)]
12623#[non_exhaustive] // structs may have more fields added in the future.
12624pub struct RelinquishFileMembershipArg {
12625    /// The path or id for the file.
12626    pub file: PathOrId,
12627}
12628
12629impl RelinquishFileMembershipArg {
12630    pub fn new(file: PathOrId) -> Self {
12631        RelinquishFileMembershipArg {
12632            file,
12633        }
12634    }
12635}
12636
12637const RELINQUISH_FILE_MEMBERSHIP_ARG_FIELDS: &[&str] = &["file"];
12638impl RelinquishFileMembershipArg {
12639    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
12640        map: V,
12641    ) -> Result<RelinquishFileMembershipArg, V::Error> {
12642        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
12643    }
12644
12645    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
12646        mut map: V,
12647        optional: bool,
12648    ) -> Result<Option<RelinquishFileMembershipArg>, V::Error> {
12649        let mut field_file = None;
12650        let mut nothing = true;
12651        while let Some(key) = map.next_key::<&str>()? {
12652            nothing = false;
12653            match key {
12654                "file" => {
12655                    if field_file.is_some() {
12656                        return Err(::serde::de::Error::duplicate_field("file"));
12657                    }
12658                    field_file = Some(map.next_value()?);
12659                }
12660                _ => {
12661                    // unknown field allowed and ignored
12662                    map.next_value::<::serde_json::Value>()?;
12663                }
12664            }
12665        }
12666        if optional && nothing {
12667            return Ok(None);
12668        }
12669        let result = RelinquishFileMembershipArg {
12670            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
12671        };
12672        Ok(Some(result))
12673    }
12674
12675    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
12676        &self,
12677        s: &mut S::SerializeStruct,
12678    ) -> Result<(), S::Error> {
12679        use serde::ser::SerializeStruct;
12680        s.serialize_field("file", &self.file)?;
12681        Ok(())
12682    }
12683}
12684
12685impl<'de> ::serde::de::Deserialize<'de> for RelinquishFileMembershipArg {
12686    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12687        // struct deserializer
12688        use serde::de::{MapAccess, Visitor};
12689        struct StructVisitor;
12690        impl<'de> Visitor<'de> for StructVisitor {
12691            type Value = RelinquishFileMembershipArg;
12692            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12693                f.write_str("a RelinquishFileMembershipArg struct")
12694            }
12695            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
12696                RelinquishFileMembershipArg::internal_deserialize(map)
12697            }
12698        }
12699        deserializer.deserialize_struct("RelinquishFileMembershipArg", RELINQUISH_FILE_MEMBERSHIP_ARG_FIELDS, StructVisitor)
12700    }
12701}
12702
12703impl ::serde::ser::Serialize for RelinquishFileMembershipArg {
12704    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12705        // struct serializer
12706        use serde::ser::SerializeStruct;
12707        let mut s = serializer.serialize_struct("RelinquishFileMembershipArg", 1)?;
12708        self.internal_serialize::<S>(&mut s)?;
12709        s.end()
12710    }
12711}
12712
12713#[derive(Debug, Clone, PartialEq, Eq)]
12714#[non_exhaustive] // variants may be added in the future
12715pub enum RelinquishFileMembershipError {
12716    AccessError(SharingFileAccessError),
12717    /// The current user has access to the shared file via a group.  You can't relinquish membership
12718    /// to a file shared via groups.
12719    GroupAccess,
12720    /// The current user does not have permission to perform this action.
12721    NoPermission,
12722    /// Catch-all used for unrecognized values returned from the server. Encountering this value
12723    /// typically indicates that this SDK version is out of date.
12724    Other,
12725}
12726
12727impl<'de> ::serde::de::Deserialize<'de> for RelinquishFileMembershipError {
12728    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12729        // union deserializer
12730        use serde::de::{self, MapAccess, Visitor};
12731        struct EnumVisitor;
12732        impl<'de> Visitor<'de> for EnumVisitor {
12733            type Value = RelinquishFileMembershipError;
12734            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12735                f.write_str("a RelinquishFileMembershipError structure")
12736            }
12737            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
12738                let tag: &str = match map.next_key()? {
12739                    Some(".tag") => map.next_value()?,
12740                    _ => return Err(de::Error::missing_field(".tag"))
12741                };
12742                let value = match tag {
12743                    "access_error" => {
12744                        match map.next_key()? {
12745                            Some("access_error") => RelinquishFileMembershipError::AccessError(map.next_value()?),
12746                            None => return Err(de::Error::missing_field("access_error")),
12747                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
12748                        }
12749                    }
12750                    "group_access" => RelinquishFileMembershipError::GroupAccess,
12751                    "no_permission" => RelinquishFileMembershipError::NoPermission,
12752                    _ => RelinquishFileMembershipError::Other,
12753                };
12754                crate::eat_json_fields(&mut map)?;
12755                Ok(value)
12756            }
12757        }
12758        const VARIANTS: &[&str] = &["access_error",
12759                                    "group_access",
12760                                    "no_permission",
12761                                    "other"];
12762        deserializer.deserialize_struct("RelinquishFileMembershipError", VARIANTS, EnumVisitor)
12763    }
12764}
12765
12766impl ::serde::ser::Serialize for RelinquishFileMembershipError {
12767    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12768        // union serializer
12769        use serde::ser::SerializeStruct;
12770        match self {
12771            RelinquishFileMembershipError::AccessError(x) => {
12772                // union or polymporphic struct
12773                let mut s = serializer.serialize_struct("RelinquishFileMembershipError", 2)?;
12774                s.serialize_field(".tag", "access_error")?;
12775                s.serialize_field("access_error", x)?;
12776                s.end()
12777            }
12778            RelinquishFileMembershipError::GroupAccess => {
12779                // unit
12780                let mut s = serializer.serialize_struct("RelinquishFileMembershipError", 1)?;
12781                s.serialize_field(".tag", "group_access")?;
12782                s.end()
12783            }
12784            RelinquishFileMembershipError::NoPermission => {
12785                // unit
12786                let mut s = serializer.serialize_struct("RelinquishFileMembershipError", 1)?;
12787                s.serialize_field(".tag", "no_permission")?;
12788                s.end()
12789            }
12790            RelinquishFileMembershipError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
12791        }
12792    }
12793}
12794
12795impl ::std::error::Error for RelinquishFileMembershipError {
12796    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
12797        match self {
12798            RelinquishFileMembershipError::AccessError(inner) => Some(inner),
12799            _ => None,
12800        }
12801    }
12802}
12803
12804impl ::std::fmt::Display for RelinquishFileMembershipError {
12805    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12806        match self {
12807            RelinquishFileMembershipError::AccessError(inner) => write!(f, "RelinquishFileMembershipError: {}", inner),
12808            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."),
12809            RelinquishFileMembershipError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
12810            _ => write!(f, "{:?}", *self),
12811        }
12812    }
12813}
12814
12815#[derive(Debug, Clone, PartialEq, Eq)]
12816#[non_exhaustive] // structs may have more fields added in the future.
12817pub struct RelinquishFolderMembershipArg {
12818    /// The ID for the shared folder.
12819    pub shared_folder_id: crate::types::common::SharedFolderId,
12820    /// Keep a copy of the folder's contents upon relinquishing membership. This must be set to
12821    /// false when the folder is within a team folder or another shared folder.
12822    pub leave_a_copy: bool,
12823}
12824
12825impl RelinquishFolderMembershipArg {
12826    pub fn new(shared_folder_id: crate::types::common::SharedFolderId) -> Self {
12827        RelinquishFolderMembershipArg {
12828            shared_folder_id,
12829            leave_a_copy: false,
12830        }
12831    }
12832
12833    pub fn with_leave_a_copy(mut self, value: bool) -> Self {
12834        self.leave_a_copy = value;
12835        self
12836    }
12837}
12838
12839const RELINQUISH_FOLDER_MEMBERSHIP_ARG_FIELDS: &[&str] = &["shared_folder_id",
12840                                                           "leave_a_copy"];
12841impl RelinquishFolderMembershipArg {
12842    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
12843        map: V,
12844    ) -> Result<RelinquishFolderMembershipArg, V::Error> {
12845        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
12846    }
12847
12848    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
12849        mut map: V,
12850        optional: bool,
12851    ) -> Result<Option<RelinquishFolderMembershipArg>, V::Error> {
12852        let mut field_shared_folder_id = None;
12853        let mut field_leave_a_copy = None;
12854        let mut nothing = true;
12855        while let Some(key) = map.next_key::<&str>()? {
12856            nothing = false;
12857            match key {
12858                "shared_folder_id" => {
12859                    if field_shared_folder_id.is_some() {
12860                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
12861                    }
12862                    field_shared_folder_id = Some(map.next_value()?);
12863                }
12864                "leave_a_copy" => {
12865                    if field_leave_a_copy.is_some() {
12866                        return Err(::serde::de::Error::duplicate_field("leave_a_copy"));
12867                    }
12868                    field_leave_a_copy = Some(map.next_value()?);
12869                }
12870                _ => {
12871                    // unknown field allowed and ignored
12872                    map.next_value::<::serde_json::Value>()?;
12873                }
12874            }
12875        }
12876        if optional && nothing {
12877            return Ok(None);
12878        }
12879        let result = RelinquishFolderMembershipArg {
12880            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
12881            leave_a_copy: field_leave_a_copy.unwrap_or(false),
12882        };
12883        Ok(Some(result))
12884    }
12885
12886    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
12887        &self,
12888        s: &mut S::SerializeStruct,
12889    ) -> Result<(), S::Error> {
12890        use serde::ser::SerializeStruct;
12891        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
12892        if self.leave_a_copy {
12893            s.serialize_field("leave_a_copy", &self.leave_a_copy)?;
12894        }
12895        Ok(())
12896    }
12897}
12898
12899impl<'de> ::serde::de::Deserialize<'de> for RelinquishFolderMembershipArg {
12900    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12901        // struct deserializer
12902        use serde::de::{MapAccess, Visitor};
12903        struct StructVisitor;
12904        impl<'de> Visitor<'de> for StructVisitor {
12905            type Value = RelinquishFolderMembershipArg;
12906            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12907                f.write_str("a RelinquishFolderMembershipArg struct")
12908            }
12909            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
12910                RelinquishFolderMembershipArg::internal_deserialize(map)
12911            }
12912        }
12913        deserializer.deserialize_struct("RelinquishFolderMembershipArg", RELINQUISH_FOLDER_MEMBERSHIP_ARG_FIELDS, StructVisitor)
12914    }
12915}
12916
12917impl ::serde::ser::Serialize for RelinquishFolderMembershipArg {
12918    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12919        // struct serializer
12920        use serde::ser::SerializeStruct;
12921        let mut s = serializer.serialize_struct("RelinquishFolderMembershipArg", 2)?;
12922        self.internal_serialize::<S>(&mut s)?;
12923        s.end()
12924    }
12925}
12926
12927#[derive(Debug, Clone, PartialEq, Eq)]
12928#[non_exhaustive] // variants may be added in the future
12929pub enum RelinquishFolderMembershipError {
12930    AccessError(SharedFolderAccessError),
12931    /// The current user is the owner of the shared folder. Owners cannot relinquish membership to
12932    /// their own folders. Try unsharing or transferring ownership first.
12933    FolderOwner,
12934    /// The shared folder is currently mounted.  Unmount the shared folder before relinquishing
12935    /// membership.
12936    Mounted,
12937    /// The current user has access to the shared folder via a group.  You can't relinquish
12938    /// membership to folders shared via groups.
12939    GroupAccess,
12940    /// This action cannot be performed on a team shared folder.
12941    TeamFolder,
12942    /// The current user does not have permission to perform this action.
12943    NoPermission,
12944    /// The current user only has inherited access to the shared folder.  You can't relinquish
12945    /// inherited membership to folders.
12946    NoExplicitAccess,
12947    /// Catch-all used for unrecognized values returned from the server. Encountering this value
12948    /// typically indicates that this SDK version is out of date.
12949    Other,
12950}
12951
12952impl<'de> ::serde::de::Deserialize<'de> for RelinquishFolderMembershipError {
12953    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12954        // union deserializer
12955        use serde::de::{self, MapAccess, Visitor};
12956        struct EnumVisitor;
12957        impl<'de> Visitor<'de> for EnumVisitor {
12958            type Value = RelinquishFolderMembershipError;
12959            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12960                f.write_str("a RelinquishFolderMembershipError structure")
12961            }
12962            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
12963                let tag: &str = match map.next_key()? {
12964                    Some(".tag") => map.next_value()?,
12965                    _ => return Err(de::Error::missing_field(".tag"))
12966                };
12967                let value = match tag {
12968                    "access_error" => {
12969                        match map.next_key()? {
12970                            Some("access_error") => RelinquishFolderMembershipError::AccessError(map.next_value()?),
12971                            None => return Err(de::Error::missing_field("access_error")),
12972                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
12973                        }
12974                    }
12975                    "folder_owner" => RelinquishFolderMembershipError::FolderOwner,
12976                    "mounted" => RelinquishFolderMembershipError::Mounted,
12977                    "group_access" => RelinquishFolderMembershipError::GroupAccess,
12978                    "team_folder" => RelinquishFolderMembershipError::TeamFolder,
12979                    "no_permission" => RelinquishFolderMembershipError::NoPermission,
12980                    "no_explicit_access" => RelinquishFolderMembershipError::NoExplicitAccess,
12981                    _ => RelinquishFolderMembershipError::Other,
12982                };
12983                crate::eat_json_fields(&mut map)?;
12984                Ok(value)
12985            }
12986        }
12987        const VARIANTS: &[&str] = &["access_error",
12988                                    "folder_owner",
12989                                    "mounted",
12990                                    "group_access",
12991                                    "team_folder",
12992                                    "no_permission",
12993                                    "no_explicit_access",
12994                                    "other"];
12995        deserializer.deserialize_struct("RelinquishFolderMembershipError", VARIANTS, EnumVisitor)
12996    }
12997}
12998
12999impl ::serde::ser::Serialize for RelinquishFolderMembershipError {
13000    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13001        // union serializer
13002        use serde::ser::SerializeStruct;
13003        match self {
13004            RelinquishFolderMembershipError::AccessError(x) => {
13005                // union or polymporphic struct
13006                let mut s = serializer.serialize_struct("RelinquishFolderMembershipError", 2)?;
13007                s.serialize_field(".tag", "access_error")?;
13008                s.serialize_field("access_error", x)?;
13009                s.end()
13010            }
13011            RelinquishFolderMembershipError::FolderOwner => {
13012                // unit
13013                let mut s = serializer.serialize_struct("RelinquishFolderMembershipError", 1)?;
13014                s.serialize_field(".tag", "folder_owner")?;
13015                s.end()
13016            }
13017            RelinquishFolderMembershipError::Mounted => {
13018                // unit
13019                let mut s = serializer.serialize_struct("RelinquishFolderMembershipError", 1)?;
13020                s.serialize_field(".tag", "mounted")?;
13021                s.end()
13022            }
13023            RelinquishFolderMembershipError::GroupAccess => {
13024                // unit
13025                let mut s = serializer.serialize_struct("RelinquishFolderMembershipError", 1)?;
13026                s.serialize_field(".tag", "group_access")?;
13027                s.end()
13028            }
13029            RelinquishFolderMembershipError::TeamFolder => {
13030                // unit
13031                let mut s = serializer.serialize_struct("RelinquishFolderMembershipError", 1)?;
13032                s.serialize_field(".tag", "team_folder")?;
13033                s.end()
13034            }
13035            RelinquishFolderMembershipError::NoPermission => {
13036                // unit
13037                let mut s = serializer.serialize_struct("RelinquishFolderMembershipError", 1)?;
13038                s.serialize_field(".tag", "no_permission")?;
13039                s.end()
13040            }
13041            RelinquishFolderMembershipError::NoExplicitAccess => {
13042                // unit
13043                let mut s = serializer.serialize_struct("RelinquishFolderMembershipError", 1)?;
13044                s.serialize_field(".tag", "no_explicit_access")?;
13045                s.end()
13046            }
13047            RelinquishFolderMembershipError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
13048        }
13049    }
13050}
13051
13052impl ::std::error::Error for RelinquishFolderMembershipError {
13053    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
13054        match self {
13055            RelinquishFolderMembershipError::AccessError(inner) => Some(inner),
13056            _ => None,
13057        }
13058    }
13059}
13060
13061impl ::std::fmt::Display for RelinquishFolderMembershipError {
13062    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13063        match self {
13064            RelinquishFolderMembershipError::AccessError(inner) => write!(f, "RelinquishFolderMembershipError: {}", inner),
13065            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."),
13066            RelinquishFolderMembershipError::Mounted => f.write_str("The shared folder is currently mounted.  Unmount the shared folder before relinquishing membership."),
13067            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."),
13068            RelinquishFolderMembershipError::TeamFolder => f.write_str("This action cannot be performed on a team shared folder."),
13069            RelinquishFolderMembershipError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
13070            RelinquishFolderMembershipError::NoExplicitAccess => f.write_str("The current user only has inherited access to the shared folder.  You can't relinquish inherited membership to folders."),
13071            _ => write!(f, "{:?}", *self),
13072        }
13073    }
13074}
13075
13076/// Arguments for [`remove_file_member_2()`](crate::sharing::remove_file_member_2).
13077#[derive(Debug, Clone, PartialEq, Eq)]
13078#[non_exhaustive] // structs may have more fields added in the future.
13079pub struct RemoveFileMemberArg {
13080    /// File from which to remove members.
13081    pub file: PathOrId,
13082    /// Member to remove from this file. Note that even if an email is specified, it may result in
13083    /// the removal of a user (not an invitee) if the user's main account corresponds to that email
13084    /// address.
13085    pub member: MemberSelector,
13086}
13087
13088impl RemoveFileMemberArg {
13089    pub fn new(file: PathOrId, member: MemberSelector) -> Self {
13090        RemoveFileMemberArg {
13091            file,
13092            member,
13093        }
13094    }
13095}
13096
13097const REMOVE_FILE_MEMBER_ARG_FIELDS: &[&str] = &["file",
13098                                                 "member"];
13099impl RemoveFileMemberArg {
13100    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
13101        map: V,
13102    ) -> Result<RemoveFileMemberArg, V::Error> {
13103        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
13104    }
13105
13106    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
13107        mut map: V,
13108        optional: bool,
13109    ) -> Result<Option<RemoveFileMemberArg>, V::Error> {
13110        let mut field_file = None;
13111        let mut field_member = None;
13112        let mut nothing = true;
13113        while let Some(key) = map.next_key::<&str>()? {
13114            nothing = false;
13115            match key {
13116                "file" => {
13117                    if field_file.is_some() {
13118                        return Err(::serde::de::Error::duplicate_field("file"));
13119                    }
13120                    field_file = Some(map.next_value()?);
13121                }
13122                "member" => {
13123                    if field_member.is_some() {
13124                        return Err(::serde::de::Error::duplicate_field("member"));
13125                    }
13126                    field_member = Some(map.next_value()?);
13127                }
13128                _ => {
13129                    // unknown field allowed and ignored
13130                    map.next_value::<::serde_json::Value>()?;
13131                }
13132            }
13133        }
13134        if optional && nothing {
13135            return Ok(None);
13136        }
13137        let result = RemoveFileMemberArg {
13138            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
13139            member: field_member.ok_or_else(|| ::serde::de::Error::missing_field("member"))?,
13140        };
13141        Ok(Some(result))
13142    }
13143
13144    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
13145        &self,
13146        s: &mut S::SerializeStruct,
13147    ) -> Result<(), S::Error> {
13148        use serde::ser::SerializeStruct;
13149        s.serialize_field("file", &self.file)?;
13150        s.serialize_field("member", &self.member)?;
13151        Ok(())
13152    }
13153}
13154
13155impl<'de> ::serde::de::Deserialize<'de> for RemoveFileMemberArg {
13156    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
13157        // struct deserializer
13158        use serde::de::{MapAccess, Visitor};
13159        struct StructVisitor;
13160        impl<'de> Visitor<'de> for StructVisitor {
13161            type Value = RemoveFileMemberArg;
13162            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13163                f.write_str("a RemoveFileMemberArg struct")
13164            }
13165            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
13166                RemoveFileMemberArg::internal_deserialize(map)
13167            }
13168        }
13169        deserializer.deserialize_struct("RemoveFileMemberArg", REMOVE_FILE_MEMBER_ARG_FIELDS, StructVisitor)
13170    }
13171}
13172
13173impl ::serde::ser::Serialize for RemoveFileMemberArg {
13174    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13175        // struct serializer
13176        use serde::ser::SerializeStruct;
13177        let mut s = serializer.serialize_struct("RemoveFileMemberArg", 2)?;
13178        self.internal_serialize::<S>(&mut s)?;
13179        s.end()
13180    }
13181}
13182
13183/// Errors for [`remove_file_member_2()`](crate::sharing::remove_file_member_2).
13184#[derive(Debug, Clone, PartialEq, Eq)]
13185#[non_exhaustive] // variants may be added in the future
13186pub enum RemoveFileMemberError {
13187    UserError(SharingUserError),
13188    AccessError(SharingFileAccessError),
13189    /// This member does not have explicit access to the file and therefore cannot be removed. The
13190    /// return value is the access that a user might have to the file from a parent folder.
13191    NoExplicitAccess(MemberAccessLevelResult),
13192    /// Catch-all used for unrecognized values returned from the server. Encountering this value
13193    /// typically indicates that this SDK version is out of date.
13194    Other,
13195}
13196
13197impl<'de> ::serde::de::Deserialize<'de> for RemoveFileMemberError {
13198    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
13199        // union deserializer
13200        use serde::de::{self, MapAccess, Visitor};
13201        struct EnumVisitor;
13202        impl<'de> Visitor<'de> for EnumVisitor {
13203            type Value = RemoveFileMemberError;
13204            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13205                f.write_str("a RemoveFileMemberError structure")
13206            }
13207            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
13208                let tag: &str = match map.next_key()? {
13209                    Some(".tag") => map.next_value()?,
13210                    _ => return Err(de::Error::missing_field(".tag"))
13211                };
13212                let value = match tag {
13213                    "user_error" => {
13214                        match map.next_key()? {
13215                            Some("user_error") => RemoveFileMemberError::UserError(map.next_value()?),
13216                            None => return Err(de::Error::missing_field("user_error")),
13217                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
13218                        }
13219                    }
13220                    "access_error" => {
13221                        match map.next_key()? {
13222                            Some("access_error") => RemoveFileMemberError::AccessError(map.next_value()?),
13223                            None => return Err(de::Error::missing_field("access_error")),
13224                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
13225                        }
13226                    }
13227                    "no_explicit_access" => RemoveFileMemberError::NoExplicitAccess(MemberAccessLevelResult::internal_deserialize(&mut map)?),
13228                    _ => RemoveFileMemberError::Other,
13229                };
13230                crate::eat_json_fields(&mut map)?;
13231                Ok(value)
13232            }
13233        }
13234        const VARIANTS: &[&str] = &["user_error",
13235                                    "access_error",
13236                                    "no_explicit_access",
13237                                    "other"];
13238        deserializer.deserialize_struct("RemoveFileMemberError", VARIANTS, EnumVisitor)
13239    }
13240}
13241
13242impl ::serde::ser::Serialize for RemoveFileMemberError {
13243    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13244        // union serializer
13245        use serde::ser::SerializeStruct;
13246        match self {
13247            RemoveFileMemberError::UserError(x) => {
13248                // union or polymporphic struct
13249                let mut s = serializer.serialize_struct("RemoveFileMemberError", 2)?;
13250                s.serialize_field(".tag", "user_error")?;
13251                s.serialize_field("user_error", x)?;
13252                s.end()
13253            }
13254            RemoveFileMemberError::AccessError(x) => {
13255                // union or polymporphic struct
13256                let mut s = serializer.serialize_struct("RemoveFileMemberError", 2)?;
13257                s.serialize_field(".tag", "access_error")?;
13258                s.serialize_field("access_error", x)?;
13259                s.end()
13260            }
13261            RemoveFileMemberError::NoExplicitAccess(x) => {
13262                // struct
13263                let mut s = serializer.serialize_struct("RemoveFileMemberError", 4)?;
13264                s.serialize_field(".tag", "no_explicit_access")?;
13265                x.internal_serialize::<S>(&mut s)?;
13266                s.end()
13267            }
13268            RemoveFileMemberError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
13269        }
13270    }
13271}
13272
13273impl ::std::error::Error for RemoveFileMemberError {
13274    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
13275        match self {
13276            RemoveFileMemberError::UserError(inner) => Some(inner),
13277            RemoveFileMemberError::AccessError(inner) => Some(inner),
13278            _ => None,
13279        }
13280    }
13281}
13282
13283impl ::std::fmt::Display for RemoveFileMemberError {
13284    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13285        match self {
13286            RemoveFileMemberError::UserError(inner) => write!(f, "RemoveFileMemberError: {}", inner),
13287            RemoveFileMemberError::AccessError(inner) => write!(f, "RemoveFileMemberError: {}", inner),
13288            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),
13289            _ => write!(f, "{:?}", *self),
13290        }
13291    }
13292}
13293
13294#[derive(Debug, Clone, PartialEq, Eq)]
13295#[non_exhaustive] // structs may have more fields added in the future.
13296pub struct RemoveFolderMemberArg {
13297    /// The ID for the shared folder.
13298    pub shared_folder_id: crate::types::common::SharedFolderId,
13299    /// The member to remove from the folder.
13300    pub member: MemberSelector,
13301    /// If true, the removed user will keep their copy of the folder after it's unshared, assuming
13302    /// it was mounted. Otherwise, it will be removed from their Dropbox. This must be set to false
13303    /// when removing a group, or when the folder is within a team folder or another shared folder.
13304    pub leave_a_copy: bool,
13305}
13306
13307impl RemoveFolderMemberArg {
13308    pub fn new(
13309        shared_folder_id: crate::types::common::SharedFolderId,
13310        member: MemberSelector,
13311        leave_a_copy: bool,
13312    ) -> Self {
13313        RemoveFolderMemberArg {
13314            shared_folder_id,
13315            member,
13316            leave_a_copy,
13317        }
13318    }
13319}
13320
13321const REMOVE_FOLDER_MEMBER_ARG_FIELDS: &[&str] = &["shared_folder_id",
13322                                                   "member",
13323                                                   "leave_a_copy"];
13324impl RemoveFolderMemberArg {
13325    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
13326        map: V,
13327    ) -> Result<RemoveFolderMemberArg, V::Error> {
13328        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
13329    }
13330
13331    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
13332        mut map: V,
13333        optional: bool,
13334    ) -> Result<Option<RemoveFolderMemberArg>, V::Error> {
13335        let mut field_shared_folder_id = None;
13336        let mut field_member = None;
13337        let mut field_leave_a_copy = None;
13338        let mut nothing = true;
13339        while let Some(key) = map.next_key::<&str>()? {
13340            nothing = false;
13341            match key {
13342                "shared_folder_id" => {
13343                    if field_shared_folder_id.is_some() {
13344                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
13345                    }
13346                    field_shared_folder_id = Some(map.next_value()?);
13347                }
13348                "member" => {
13349                    if field_member.is_some() {
13350                        return Err(::serde::de::Error::duplicate_field("member"));
13351                    }
13352                    field_member = Some(map.next_value()?);
13353                }
13354                "leave_a_copy" => {
13355                    if field_leave_a_copy.is_some() {
13356                        return Err(::serde::de::Error::duplicate_field("leave_a_copy"));
13357                    }
13358                    field_leave_a_copy = Some(map.next_value()?);
13359                }
13360                _ => {
13361                    // unknown field allowed and ignored
13362                    map.next_value::<::serde_json::Value>()?;
13363                }
13364            }
13365        }
13366        if optional && nothing {
13367            return Ok(None);
13368        }
13369        let result = RemoveFolderMemberArg {
13370            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
13371            member: field_member.ok_or_else(|| ::serde::de::Error::missing_field("member"))?,
13372            leave_a_copy: field_leave_a_copy.ok_or_else(|| ::serde::de::Error::missing_field("leave_a_copy"))?,
13373        };
13374        Ok(Some(result))
13375    }
13376
13377    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
13378        &self,
13379        s: &mut S::SerializeStruct,
13380    ) -> Result<(), S::Error> {
13381        use serde::ser::SerializeStruct;
13382        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
13383        s.serialize_field("member", &self.member)?;
13384        s.serialize_field("leave_a_copy", &self.leave_a_copy)?;
13385        Ok(())
13386    }
13387}
13388
13389impl<'de> ::serde::de::Deserialize<'de> for RemoveFolderMemberArg {
13390    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
13391        // struct deserializer
13392        use serde::de::{MapAccess, Visitor};
13393        struct StructVisitor;
13394        impl<'de> Visitor<'de> for StructVisitor {
13395            type Value = RemoveFolderMemberArg;
13396            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13397                f.write_str("a RemoveFolderMemberArg struct")
13398            }
13399            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
13400                RemoveFolderMemberArg::internal_deserialize(map)
13401            }
13402        }
13403        deserializer.deserialize_struct("RemoveFolderMemberArg", REMOVE_FOLDER_MEMBER_ARG_FIELDS, StructVisitor)
13404    }
13405}
13406
13407impl ::serde::ser::Serialize for RemoveFolderMemberArg {
13408    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13409        // struct serializer
13410        use serde::ser::SerializeStruct;
13411        let mut s = serializer.serialize_struct("RemoveFolderMemberArg", 3)?;
13412        self.internal_serialize::<S>(&mut s)?;
13413        s.end()
13414    }
13415}
13416
13417#[derive(Debug, Clone, PartialEq, Eq)]
13418#[non_exhaustive] // variants may be added in the future
13419pub enum RemoveFolderMemberError {
13420    AccessError(SharedFolderAccessError),
13421    MemberError(SharedFolderMemberError),
13422    /// The target user is the owner of the shared folder. You can't remove this user until
13423    /// ownership has been transferred to another member.
13424    FolderOwner,
13425    /// The target user has access to the shared folder via a group.
13426    GroupAccess,
13427    /// This action cannot be performed on a team shared folder.
13428    TeamFolder,
13429    /// The current user does not have permission to perform this action.
13430    NoPermission,
13431    /// This shared folder has too many files for leaving a copy. You can still remove this user
13432    /// without leaving a copy.
13433    TooManyFiles,
13434    /// Catch-all used for unrecognized values returned from the server. Encountering this value
13435    /// typically indicates that this SDK version is out of date.
13436    Other,
13437}
13438
13439impl<'de> ::serde::de::Deserialize<'de> for RemoveFolderMemberError {
13440    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
13441        // union deserializer
13442        use serde::de::{self, MapAccess, Visitor};
13443        struct EnumVisitor;
13444        impl<'de> Visitor<'de> for EnumVisitor {
13445            type Value = RemoveFolderMemberError;
13446            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13447                f.write_str("a RemoveFolderMemberError structure")
13448            }
13449            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
13450                let tag: &str = match map.next_key()? {
13451                    Some(".tag") => map.next_value()?,
13452                    _ => return Err(de::Error::missing_field(".tag"))
13453                };
13454                let value = match tag {
13455                    "access_error" => {
13456                        match map.next_key()? {
13457                            Some("access_error") => RemoveFolderMemberError::AccessError(map.next_value()?),
13458                            None => return Err(de::Error::missing_field("access_error")),
13459                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
13460                        }
13461                    }
13462                    "member_error" => {
13463                        match map.next_key()? {
13464                            Some("member_error") => RemoveFolderMemberError::MemberError(map.next_value()?),
13465                            None => return Err(de::Error::missing_field("member_error")),
13466                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
13467                        }
13468                    }
13469                    "folder_owner" => RemoveFolderMemberError::FolderOwner,
13470                    "group_access" => RemoveFolderMemberError::GroupAccess,
13471                    "team_folder" => RemoveFolderMemberError::TeamFolder,
13472                    "no_permission" => RemoveFolderMemberError::NoPermission,
13473                    "too_many_files" => RemoveFolderMemberError::TooManyFiles,
13474                    _ => RemoveFolderMemberError::Other,
13475                };
13476                crate::eat_json_fields(&mut map)?;
13477                Ok(value)
13478            }
13479        }
13480        const VARIANTS: &[&str] = &["access_error",
13481                                    "member_error",
13482                                    "folder_owner",
13483                                    "group_access",
13484                                    "team_folder",
13485                                    "no_permission",
13486                                    "too_many_files",
13487                                    "other"];
13488        deserializer.deserialize_struct("RemoveFolderMemberError", VARIANTS, EnumVisitor)
13489    }
13490}
13491
13492impl ::serde::ser::Serialize for RemoveFolderMemberError {
13493    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13494        // union serializer
13495        use serde::ser::SerializeStruct;
13496        match self {
13497            RemoveFolderMemberError::AccessError(x) => {
13498                // union or polymporphic struct
13499                let mut s = serializer.serialize_struct("RemoveFolderMemberError", 2)?;
13500                s.serialize_field(".tag", "access_error")?;
13501                s.serialize_field("access_error", x)?;
13502                s.end()
13503            }
13504            RemoveFolderMemberError::MemberError(x) => {
13505                // union or polymporphic struct
13506                let mut s = serializer.serialize_struct("RemoveFolderMemberError", 2)?;
13507                s.serialize_field(".tag", "member_error")?;
13508                s.serialize_field("member_error", x)?;
13509                s.end()
13510            }
13511            RemoveFolderMemberError::FolderOwner => {
13512                // unit
13513                let mut s = serializer.serialize_struct("RemoveFolderMemberError", 1)?;
13514                s.serialize_field(".tag", "folder_owner")?;
13515                s.end()
13516            }
13517            RemoveFolderMemberError::GroupAccess => {
13518                // unit
13519                let mut s = serializer.serialize_struct("RemoveFolderMemberError", 1)?;
13520                s.serialize_field(".tag", "group_access")?;
13521                s.end()
13522            }
13523            RemoveFolderMemberError::TeamFolder => {
13524                // unit
13525                let mut s = serializer.serialize_struct("RemoveFolderMemberError", 1)?;
13526                s.serialize_field(".tag", "team_folder")?;
13527                s.end()
13528            }
13529            RemoveFolderMemberError::NoPermission => {
13530                // unit
13531                let mut s = serializer.serialize_struct("RemoveFolderMemberError", 1)?;
13532                s.serialize_field(".tag", "no_permission")?;
13533                s.end()
13534            }
13535            RemoveFolderMemberError::TooManyFiles => {
13536                // unit
13537                let mut s = serializer.serialize_struct("RemoveFolderMemberError", 1)?;
13538                s.serialize_field(".tag", "too_many_files")?;
13539                s.end()
13540            }
13541            RemoveFolderMemberError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
13542        }
13543    }
13544}
13545
13546impl ::std::error::Error for RemoveFolderMemberError {
13547    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
13548        match self {
13549            RemoveFolderMemberError::AccessError(inner) => Some(inner),
13550            RemoveFolderMemberError::MemberError(inner) => Some(inner),
13551            _ => None,
13552        }
13553    }
13554}
13555
13556impl ::std::fmt::Display for RemoveFolderMemberError {
13557    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13558        match self {
13559            RemoveFolderMemberError::AccessError(inner) => write!(f, "RemoveFolderMemberError: {}", inner),
13560            RemoveFolderMemberError::MemberError(inner) => write!(f, "RemoveFolderMemberError: {}", inner),
13561            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."),
13562            RemoveFolderMemberError::GroupAccess => f.write_str("The target user has access to the shared folder via a group."),
13563            RemoveFolderMemberError::TeamFolder => f.write_str("This action cannot be performed on a team shared folder."),
13564            RemoveFolderMemberError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
13565            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."),
13566            _ => write!(f, "{:?}", *self),
13567        }
13568    }
13569}
13570
13571#[derive(Debug, Clone, PartialEq, Eq)]
13572pub enum RemoveMemberJobStatus {
13573    /// The asynchronous job is still in progress.
13574    InProgress,
13575    /// Removing the folder member has finished. The value is information about whether the member
13576    /// has another form of access.
13577    Complete(MemberAccessLevelResult),
13578    Failed(RemoveFolderMemberError),
13579}
13580
13581impl<'de> ::serde::de::Deserialize<'de> for RemoveMemberJobStatus {
13582    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
13583        // union deserializer
13584        use serde::de::{self, MapAccess, Visitor};
13585        struct EnumVisitor;
13586        impl<'de> Visitor<'de> for EnumVisitor {
13587            type Value = RemoveMemberJobStatus;
13588            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13589                f.write_str("a RemoveMemberJobStatus structure")
13590            }
13591            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
13592                let tag: &str = match map.next_key()? {
13593                    Some(".tag") => map.next_value()?,
13594                    _ => return Err(de::Error::missing_field(".tag"))
13595                };
13596                let value = match tag {
13597                    "in_progress" => RemoveMemberJobStatus::InProgress,
13598                    "complete" => RemoveMemberJobStatus::Complete(MemberAccessLevelResult::internal_deserialize(&mut map)?),
13599                    "failed" => {
13600                        match map.next_key()? {
13601                            Some("failed") => RemoveMemberJobStatus::Failed(map.next_value()?),
13602                            None => return Err(de::Error::missing_field("failed")),
13603                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
13604                        }
13605                    }
13606                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
13607                };
13608                crate::eat_json_fields(&mut map)?;
13609                Ok(value)
13610            }
13611        }
13612        const VARIANTS: &[&str] = &["in_progress",
13613                                    "complete",
13614                                    "failed"];
13615        deserializer.deserialize_struct("RemoveMemberJobStatus", VARIANTS, EnumVisitor)
13616    }
13617}
13618
13619impl ::serde::ser::Serialize for RemoveMemberJobStatus {
13620    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13621        // union serializer
13622        use serde::ser::SerializeStruct;
13623        match self {
13624            RemoveMemberJobStatus::InProgress => {
13625                // unit
13626                let mut s = serializer.serialize_struct("RemoveMemberJobStatus", 1)?;
13627                s.serialize_field(".tag", "in_progress")?;
13628                s.end()
13629            }
13630            RemoveMemberJobStatus::Complete(x) => {
13631                // struct
13632                let mut s = serializer.serialize_struct("RemoveMemberJobStatus", 4)?;
13633                s.serialize_field(".tag", "complete")?;
13634                x.internal_serialize::<S>(&mut s)?;
13635                s.end()
13636            }
13637            RemoveMemberJobStatus::Failed(x) => {
13638                // union or polymporphic struct
13639                let mut s = serializer.serialize_struct("RemoveMemberJobStatus", 2)?;
13640                s.serialize_field(".tag", "failed")?;
13641                s.serialize_field("failed", x)?;
13642                s.end()
13643            }
13644        }
13645    }
13646}
13647
13648// union extends crate::types::dbx_async::PollResultBase
13649impl From<crate::types::dbx_async::PollResultBase> for RemoveMemberJobStatus {
13650    fn from(parent: crate::types::dbx_async::PollResultBase) -> Self {
13651        match parent {
13652            crate::types::dbx_async::PollResultBase::InProgress => RemoveMemberJobStatus::InProgress,
13653        }
13654    }
13655}
13656#[derive(Debug, Clone, PartialEq, Eq)]
13657#[non_exhaustive] // variants may be added in the future
13658pub enum RequestedLinkAccessLevel {
13659    /// Users who use the link can view and comment on the content.
13660    Viewer,
13661    /// Users who use the link can edit, view and comment on the content. Note not all file types
13662    /// support edit links yet.
13663    Editor,
13664    /// Request for the maximum access level you can set the link to.
13665    Max,
13666    /// Request for the default access level the user has set.
13667    Default,
13668    /// Catch-all used for unrecognized values returned from the server. Encountering this value
13669    /// typically indicates that this SDK version is out of date.
13670    Other,
13671}
13672
13673impl<'de> ::serde::de::Deserialize<'de> for RequestedLinkAccessLevel {
13674    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
13675        // union deserializer
13676        use serde::de::{self, MapAccess, Visitor};
13677        struct EnumVisitor;
13678        impl<'de> Visitor<'de> for EnumVisitor {
13679            type Value = RequestedLinkAccessLevel;
13680            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13681                f.write_str("a RequestedLinkAccessLevel structure")
13682            }
13683            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
13684                let tag: &str = match map.next_key()? {
13685                    Some(".tag") => map.next_value()?,
13686                    _ => return Err(de::Error::missing_field(".tag"))
13687                };
13688                let value = match tag {
13689                    "viewer" => RequestedLinkAccessLevel::Viewer,
13690                    "editor" => RequestedLinkAccessLevel::Editor,
13691                    "max" => RequestedLinkAccessLevel::Max,
13692                    "default" => RequestedLinkAccessLevel::Default,
13693                    _ => RequestedLinkAccessLevel::Other,
13694                };
13695                crate::eat_json_fields(&mut map)?;
13696                Ok(value)
13697            }
13698        }
13699        const VARIANTS: &[&str] = &["viewer",
13700                                    "editor",
13701                                    "max",
13702                                    "default",
13703                                    "other"];
13704        deserializer.deserialize_struct("RequestedLinkAccessLevel", VARIANTS, EnumVisitor)
13705    }
13706}
13707
13708impl ::serde::ser::Serialize for RequestedLinkAccessLevel {
13709    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13710        // union serializer
13711        use serde::ser::SerializeStruct;
13712        match self {
13713            RequestedLinkAccessLevel::Viewer => {
13714                // unit
13715                let mut s = serializer.serialize_struct("RequestedLinkAccessLevel", 1)?;
13716                s.serialize_field(".tag", "viewer")?;
13717                s.end()
13718            }
13719            RequestedLinkAccessLevel::Editor => {
13720                // unit
13721                let mut s = serializer.serialize_struct("RequestedLinkAccessLevel", 1)?;
13722                s.serialize_field(".tag", "editor")?;
13723                s.end()
13724            }
13725            RequestedLinkAccessLevel::Max => {
13726                // unit
13727                let mut s = serializer.serialize_struct("RequestedLinkAccessLevel", 1)?;
13728                s.serialize_field(".tag", "max")?;
13729                s.end()
13730            }
13731            RequestedLinkAccessLevel::Default => {
13732                // unit
13733                let mut s = serializer.serialize_struct("RequestedLinkAccessLevel", 1)?;
13734                s.serialize_field(".tag", "default")?;
13735                s.end()
13736            }
13737            RequestedLinkAccessLevel::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
13738        }
13739    }
13740}
13741
13742/// The access permission that can be requested by the caller for the shared link. Note that the
13743/// final resolved visibility of the shared link takes into account other aspects, such as team and
13744/// shared folder settings. Check the [`ResolvedVisibility`] for more info on the possible resolved
13745/// visibility values of shared links.
13746#[derive(Debug, Clone, PartialEq, Eq)]
13747pub enum RequestedVisibility {
13748    /// Anyone who has received the link can access it. No login required.
13749    Public,
13750    /// Only members of the same team can access the link. Login is required.
13751    TeamOnly,
13752    /// A link-specific password is required to access the link. Login is not required.
13753    Password,
13754}
13755
13756impl<'de> ::serde::de::Deserialize<'de> for RequestedVisibility {
13757    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
13758        // union deserializer
13759        use serde::de::{self, MapAccess, Visitor};
13760        struct EnumVisitor;
13761        impl<'de> Visitor<'de> for EnumVisitor {
13762            type Value = RequestedVisibility;
13763            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13764                f.write_str("a RequestedVisibility structure")
13765            }
13766            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
13767                let tag: &str = match map.next_key()? {
13768                    Some(".tag") => map.next_value()?,
13769                    _ => return Err(de::Error::missing_field(".tag"))
13770                };
13771                let value = match tag {
13772                    "public" => RequestedVisibility::Public,
13773                    "team_only" => RequestedVisibility::TeamOnly,
13774                    "password" => RequestedVisibility::Password,
13775                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
13776                };
13777                crate::eat_json_fields(&mut map)?;
13778                Ok(value)
13779            }
13780        }
13781        const VARIANTS: &[&str] = &["public",
13782                                    "team_only",
13783                                    "password"];
13784        deserializer.deserialize_struct("RequestedVisibility", VARIANTS, EnumVisitor)
13785    }
13786}
13787
13788impl ::serde::ser::Serialize for RequestedVisibility {
13789    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13790        // union serializer
13791        use serde::ser::SerializeStruct;
13792        match self {
13793            RequestedVisibility::Public => {
13794                // unit
13795                let mut s = serializer.serialize_struct("RequestedVisibility", 1)?;
13796                s.serialize_field(".tag", "public")?;
13797                s.end()
13798            }
13799            RequestedVisibility::TeamOnly => {
13800                // unit
13801                let mut s = serializer.serialize_struct("RequestedVisibility", 1)?;
13802                s.serialize_field(".tag", "team_only")?;
13803                s.end()
13804            }
13805            RequestedVisibility::Password => {
13806                // unit
13807                let mut s = serializer.serialize_struct("RequestedVisibility", 1)?;
13808                s.serialize_field(".tag", "password")?;
13809                s.end()
13810            }
13811        }
13812    }
13813}
13814
13815/// The actual access permissions values of shared links after taking into account user preferences
13816/// and the team and shared folder settings. Check the [`RequestedVisibility`] for more info on the
13817/// possible visibility values that can be set by the shared link's owner.
13818#[derive(Debug, Clone, PartialEq, Eq)]
13819#[non_exhaustive] // variants may be added in the future
13820pub enum ResolvedVisibility {
13821    /// Anyone who has received the link can access it. No login required.
13822    Public,
13823    /// Only members of the same team can access the link. Login is required.
13824    TeamOnly,
13825    /// A link-specific password is required to access the link. Login is not required.
13826    Password,
13827    /// Only members of the same team who have the link-specific password can access the link. Login
13828    /// is required.
13829    TeamAndPassword,
13830    /// Only members of the shared folder containing the linked file can access the link. Login is
13831    /// required.
13832    SharedFolderOnly,
13833    /// The link merely points the user to the content, and does not grant any additional rights.
13834    /// Existing members of the content who use this link can only access the content with their
13835    /// pre-existing access rights. Either on the file directly, or inherited from a parent folder.
13836    NoOne,
13837    /// Only the current user can view this link.
13838    OnlyYou,
13839    /// Catch-all used for unrecognized values returned from the server. Encountering this value
13840    /// typically indicates that this SDK version is out of date.
13841    Other,
13842}
13843
13844impl<'de> ::serde::de::Deserialize<'de> for ResolvedVisibility {
13845    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
13846        // union deserializer
13847        use serde::de::{self, MapAccess, Visitor};
13848        struct EnumVisitor;
13849        impl<'de> Visitor<'de> for EnumVisitor {
13850            type Value = ResolvedVisibility;
13851            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13852                f.write_str("a ResolvedVisibility structure")
13853            }
13854            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
13855                let tag: &str = match map.next_key()? {
13856                    Some(".tag") => map.next_value()?,
13857                    _ => return Err(de::Error::missing_field(".tag"))
13858                };
13859                let value = match tag {
13860                    "public" => ResolvedVisibility::Public,
13861                    "team_only" => ResolvedVisibility::TeamOnly,
13862                    "password" => ResolvedVisibility::Password,
13863                    "team_and_password" => ResolvedVisibility::TeamAndPassword,
13864                    "shared_folder_only" => ResolvedVisibility::SharedFolderOnly,
13865                    "no_one" => ResolvedVisibility::NoOne,
13866                    "only_you" => ResolvedVisibility::OnlyYou,
13867                    _ => ResolvedVisibility::Other,
13868                };
13869                crate::eat_json_fields(&mut map)?;
13870                Ok(value)
13871            }
13872        }
13873        const VARIANTS: &[&str] = &["public",
13874                                    "team_only",
13875                                    "password",
13876                                    "team_and_password",
13877                                    "shared_folder_only",
13878                                    "no_one",
13879                                    "only_you",
13880                                    "other"];
13881        deserializer.deserialize_struct("ResolvedVisibility", VARIANTS, EnumVisitor)
13882    }
13883}
13884
13885impl ::serde::ser::Serialize for ResolvedVisibility {
13886    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13887        // union serializer
13888        use serde::ser::SerializeStruct;
13889        match self {
13890            ResolvedVisibility::Public => {
13891                // unit
13892                let mut s = serializer.serialize_struct("ResolvedVisibility", 1)?;
13893                s.serialize_field(".tag", "public")?;
13894                s.end()
13895            }
13896            ResolvedVisibility::TeamOnly => {
13897                // unit
13898                let mut s = serializer.serialize_struct("ResolvedVisibility", 1)?;
13899                s.serialize_field(".tag", "team_only")?;
13900                s.end()
13901            }
13902            ResolvedVisibility::Password => {
13903                // unit
13904                let mut s = serializer.serialize_struct("ResolvedVisibility", 1)?;
13905                s.serialize_field(".tag", "password")?;
13906                s.end()
13907            }
13908            ResolvedVisibility::TeamAndPassword => {
13909                // unit
13910                let mut s = serializer.serialize_struct("ResolvedVisibility", 1)?;
13911                s.serialize_field(".tag", "team_and_password")?;
13912                s.end()
13913            }
13914            ResolvedVisibility::SharedFolderOnly => {
13915                // unit
13916                let mut s = serializer.serialize_struct("ResolvedVisibility", 1)?;
13917                s.serialize_field(".tag", "shared_folder_only")?;
13918                s.end()
13919            }
13920            ResolvedVisibility::NoOne => {
13921                // unit
13922                let mut s = serializer.serialize_struct("ResolvedVisibility", 1)?;
13923                s.serialize_field(".tag", "no_one")?;
13924                s.end()
13925            }
13926            ResolvedVisibility::OnlyYou => {
13927                // unit
13928                let mut s = serializer.serialize_struct("ResolvedVisibility", 1)?;
13929                s.serialize_field(".tag", "only_you")?;
13930                s.end()
13931            }
13932            ResolvedVisibility::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
13933        }
13934    }
13935}
13936
13937// union extends RequestedVisibility
13938impl From<RequestedVisibility> for ResolvedVisibility {
13939    fn from(parent: RequestedVisibility) -> Self {
13940        match parent {
13941            RequestedVisibility::Public => ResolvedVisibility::Public,
13942            RequestedVisibility::TeamOnly => ResolvedVisibility::TeamOnly,
13943            RequestedVisibility::Password => ResolvedVisibility::Password,
13944        }
13945    }
13946}
13947#[derive(Debug, Clone, PartialEq, Eq)]
13948#[non_exhaustive] // structs may have more fields added in the future.
13949pub struct RevokeSharedLinkArg {
13950    /// URL of the shared link.
13951    pub url: String,
13952}
13953
13954impl RevokeSharedLinkArg {
13955    pub fn new(url: String) -> Self {
13956        RevokeSharedLinkArg {
13957            url,
13958        }
13959    }
13960}
13961
13962const REVOKE_SHARED_LINK_ARG_FIELDS: &[&str] = &["url"];
13963impl RevokeSharedLinkArg {
13964    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
13965        map: V,
13966    ) -> Result<RevokeSharedLinkArg, V::Error> {
13967        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
13968    }
13969
13970    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
13971        mut map: V,
13972        optional: bool,
13973    ) -> Result<Option<RevokeSharedLinkArg>, V::Error> {
13974        let mut field_url = None;
13975        let mut nothing = true;
13976        while let Some(key) = map.next_key::<&str>()? {
13977            nothing = false;
13978            match key {
13979                "url" => {
13980                    if field_url.is_some() {
13981                        return Err(::serde::de::Error::duplicate_field("url"));
13982                    }
13983                    field_url = Some(map.next_value()?);
13984                }
13985                _ => {
13986                    // unknown field allowed and ignored
13987                    map.next_value::<::serde_json::Value>()?;
13988                }
13989            }
13990        }
13991        if optional && nothing {
13992            return Ok(None);
13993        }
13994        let result = RevokeSharedLinkArg {
13995            url: field_url.ok_or_else(|| ::serde::de::Error::missing_field("url"))?,
13996        };
13997        Ok(Some(result))
13998    }
13999
14000    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
14001        &self,
14002        s: &mut S::SerializeStruct,
14003    ) -> Result<(), S::Error> {
14004        use serde::ser::SerializeStruct;
14005        s.serialize_field("url", &self.url)?;
14006        Ok(())
14007    }
14008}
14009
14010impl<'de> ::serde::de::Deserialize<'de> for RevokeSharedLinkArg {
14011    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
14012        // struct deserializer
14013        use serde::de::{MapAccess, Visitor};
14014        struct StructVisitor;
14015        impl<'de> Visitor<'de> for StructVisitor {
14016            type Value = RevokeSharedLinkArg;
14017            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14018                f.write_str("a RevokeSharedLinkArg struct")
14019            }
14020            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
14021                RevokeSharedLinkArg::internal_deserialize(map)
14022            }
14023        }
14024        deserializer.deserialize_struct("RevokeSharedLinkArg", REVOKE_SHARED_LINK_ARG_FIELDS, StructVisitor)
14025    }
14026}
14027
14028impl ::serde::ser::Serialize for RevokeSharedLinkArg {
14029    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
14030        // struct serializer
14031        use serde::ser::SerializeStruct;
14032        let mut s = serializer.serialize_struct("RevokeSharedLinkArg", 1)?;
14033        self.internal_serialize::<S>(&mut s)?;
14034        s.end()
14035    }
14036}
14037
14038#[derive(Debug, Clone, PartialEq, Eq)]
14039#[non_exhaustive] // variants may be added in the future
14040pub enum RevokeSharedLinkError {
14041    /// The shared link wasn't found.
14042    SharedLinkNotFound,
14043    /// The caller is not allowed to access this shared link.
14044    SharedLinkAccessDenied,
14045    /// This type of link is not supported; use [`files::export()`](crate::files::export) instead.
14046    UnsupportedLinkType,
14047    /// Private shared links do not support `path` or `link_password` parameter fields.
14048    UnsupportedParameterField,
14049    /// Shared link is malformed.
14050    SharedLinkMalformed,
14051    /// Catch-all used for unrecognized values returned from the server. Encountering this value
14052    /// typically indicates that this SDK version is out of date.
14053    Other,
14054}
14055
14056impl<'de> ::serde::de::Deserialize<'de> for RevokeSharedLinkError {
14057    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
14058        // union deserializer
14059        use serde::de::{self, MapAccess, Visitor};
14060        struct EnumVisitor;
14061        impl<'de> Visitor<'de> for EnumVisitor {
14062            type Value = RevokeSharedLinkError;
14063            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14064                f.write_str("a RevokeSharedLinkError structure")
14065            }
14066            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
14067                let tag: &str = match map.next_key()? {
14068                    Some(".tag") => map.next_value()?,
14069                    _ => return Err(de::Error::missing_field(".tag"))
14070                };
14071                let value = match tag {
14072                    "shared_link_not_found" => RevokeSharedLinkError::SharedLinkNotFound,
14073                    "shared_link_access_denied" => RevokeSharedLinkError::SharedLinkAccessDenied,
14074                    "unsupported_link_type" => RevokeSharedLinkError::UnsupportedLinkType,
14075                    "unsupported_parameter_field" => RevokeSharedLinkError::UnsupportedParameterField,
14076                    "shared_link_malformed" => RevokeSharedLinkError::SharedLinkMalformed,
14077                    _ => RevokeSharedLinkError::Other,
14078                };
14079                crate::eat_json_fields(&mut map)?;
14080                Ok(value)
14081            }
14082        }
14083        const VARIANTS: &[&str] = &["shared_link_not_found",
14084                                    "shared_link_access_denied",
14085                                    "unsupported_link_type",
14086                                    "unsupported_parameter_field",
14087                                    "other",
14088                                    "shared_link_malformed"];
14089        deserializer.deserialize_struct("RevokeSharedLinkError", VARIANTS, EnumVisitor)
14090    }
14091}
14092
14093impl ::serde::ser::Serialize for RevokeSharedLinkError {
14094    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
14095        // union serializer
14096        use serde::ser::SerializeStruct;
14097        match self {
14098            RevokeSharedLinkError::SharedLinkNotFound => {
14099                // unit
14100                let mut s = serializer.serialize_struct("RevokeSharedLinkError", 1)?;
14101                s.serialize_field(".tag", "shared_link_not_found")?;
14102                s.end()
14103            }
14104            RevokeSharedLinkError::SharedLinkAccessDenied => {
14105                // unit
14106                let mut s = serializer.serialize_struct("RevokeSharedLinkError", 1)?;
14107                s.serialize_field(".tag", "shared_link_access_denied")?;
14108                s.end()
14109            }
14110            RevokeSharedLinkError::UnsupportedLinkType => {
14111                // unit
14112                let mut s = serializer.serialize_struct("RevokeSharedLinkError", 1)?;
14113                s.serialize_field(".tag", "unsupported_link_type")?;
14114                s.end()
14115            }
14116            RevokeSharedLinkError::UnsupportedParameterField => {
14117                // unit
14118                let mut s = serializer.serialize_struct("RevokeSharedLinkError", 1)?;
14119                s.serialize_field(".tag", "unsupported_parameter_field")?;
14120                s.end()
14121            }
14122            RevokeSharedLinkError::SharedLinkMalformed => {
14123                // unit
14124                let mut s = serializer.serialize_struct("RevokeSharedLinkError", 1)?;
14125                s.serialize_field(".tag", "shared_link_malformed")?;
14126                s.end()
14127            }
14128            RevokeSharedLinkError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
14129        }
14130    }
14131}
14132
14133impl ::std::error::Error for RevokeSharedLinkError {
14134}
14135
14136impl ::std::fmt::Display for RevokeSharedLinkError {
14137    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14138        match self {
14139            RevokeSharedLinkError::SharedLinkNotFound => f.write_str("The shared link wasn't found."),
14140            RevokeSharedLinkError::SharedLinkAccessDenied => f.write_str("The caller is not allowed to access this shared link."),
14141            RevokeSharedLinkError::UnsupportedParameterField => f.write_str("Private shared links do not support `path` or `link_password` parameter fields."),
14142            RevokeSharedLinkError::SharedLinkMalformed => f.write_str("Shared link is malformed."),
14143            _ => write!(f, "{:?}", *self),
14144        }
14145    }
14146}
14147
14148// union extends SharedLinkError
14149impl From<SharedLinkError> for RevokeSharedLinkError {
14150    fn from(parent: SharedLinkError) -> Self {
14151        match parent {
14152            SharedLinkError::SharedLinkNotFound => RevokeSharedLinkError::SharedLinkNotFound,
14153            SharedLinkError::SharedLinkAccessDenied => RevokeSharedLinkError::SharedLinkAccessDenied,
14154            SharedLinkError::UnsupportedLinkType => RevokeSharedLinkError::UnsupportedLinkType,
14155            SharedLinkError::UnsupportedParameterField => RevokeSharedLinkError::UnsupportedParameterField,
14156            SharedLinkError::Other => RevokeSharedLinkError::Other,
14157        }
14158    }
14159}
14160#[derive(Debug, Clone, PartialEq, Eq)]
14161#[non_exhaustive] // structs may have more fields added in the future.
14162pub struct SetAccessInheritanceArg {
14163    /// The ID for the shared folder.
14164    pub shared_folder_id: crate::types::common::SharedFolderId,
14165    /// The access inheritance settings for the folder.
14166    pub access_inheritance: AccessInheritance,
14167}
14168
14169impl SetAccessInheritanceArg {
14170    pub fn new(shared_folder_id: crate::types::common::SharedFolderId) -> Self {
14171        SetAccessInheritanceArg {
14172            shared_folder_id,
14173            access_inheritance: AccessInheritance::Inherit,
14174        }
14175    }
14176
14177    pub fn with_access_inheritance(mut self, value: AccessInheritance) -> Self {
14178        self.access_inheritance = value;
14179        self
14180    }
14181}
14182
14183const SET_ACCESS_INHERITANCE_ARG_FIELDS: &[&str] = &["shared_folder_id",
14184                                                     "access_inheritance"];
14185impl SetAccessInheritanceArg {
14186    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
14187        map: V,
14188    ) -> Result<SetAccessInheritanceArg, V::Error> {
14189        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
14190    }
14191
14192    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
14193        mut map: V,
14194        optional: bool,
14195    ) -> Result<Option<SetAccessInheritanceArg>, V::Error> {
14196        let mut field_shared_folder_id = None;
14197        let mut field_access_inheritance = None;
14198        let mut nothing = true;
14199        while let Some(key) = map.next_key::<&str>()? {
14200            nothing = false;
14201            match key {
14202                "shared_folder_id" => {
14203                    if field_shared_folder_id.is_some() {
14204                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
14205                    }
14206                    field_shared_folder_id = Some(map.next_value()?);
14207                }
14208                "access_inheritance" => {
14209                    if field_access_inheritance.is_some() {
14210                        return Err(::serde::de::Error::duplicate_field("access_inheritance"));
14211                    }
14212                    field_access_inheritance = Some(map.next_value()?);
14213                }
14214                _ => {
14215                    // unknown field allowed and ignored
14216                    map.next_value::<::serde_json::Value>()?;
14217                }
14218            }
14219        }
14220        if optional && nothing {
14221            return Ok(None);
14222        }
14223        let result = SetAccessInheritanceArg {
14224            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
14225            access_inheritance: field_access_inheritance.unwrap_or(AccessInheritance::Inherit),
14226        };
14227        Ok(Some(result))
14228    }
14229
14230    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
14231        &self,
14232        s: &mut S::SerializeStruct,
14233    ) -> Result<(), S::Error> {
14234        use serde::ser::SerializeStruct;
14235        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
14236        if self.access_inheritance != AccessInheritance::Inherit {
14237            s.serialize_field("access_inheritance", &self.access_inheritance)?;
14238        }
14239        Ok(())
14240    }
14241}
14242
14243impl<'de> ::serde::de::Deserialize<'de> for SetAccessInheritanceArg {
14244    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
14245        // struct deserializer
14246        use serde::de::{MapAccess, Visitor};
14247        struct StructVisitor;
14248        impl<'de> Visitor<'de> for StructVisitor {
14249            type Value = SetAccessInheritanceArg;
14250            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14251                f.write_str("a SetAccessInheritanceArg struct")
14252            }
14253            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
14254                SetAccessInheritanceArg::internal_deserialize(map)
14255            }
14256        }
14257        deserializer.deserialize_struct("SetAccessInheritanceArg", SET_ACCESS_INHERITANCE_ARG_FIELDS, StructVisitor)
14258    }
14259}
14260
14261impl ::serde::ser::Serialize for SetAccessInheritanceArg {
14262    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
14263        // struct serializer
14264        use serde::ser::SerializeStruct;
14265        let mut s = serializer.serialize_struct("SetAccessInheritanceArg", 2)?;
14266        self.internal_serialize::<S>(&mut s)?;
14267        s.end()
14268    }
14269}
14270
14271#[derive(Debug, Clone, PartialEq, Eq)]
14272#[non_exhaustive] // variants may be added in the future
14273pub enum SetAccessInheritanceError {
14274    /// Unable to access shared folder.
14275    AccessError(SharedFolderAccessError),
14276    /// The current user does not have permission to perform this action.
14277    NoPermission,
14278    /// Catch-all used for unrecognized values returned from the server. Encountering this value
14279    /// typically indicates that this SDK version is out of date.
14280    Other,
14281}
14282
14283impl<'de> ::serde::de::Deserialize<'de> for SetAccessInheritanceError {
14284    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
14285        // union deserializer
14286        use serde::de::{self, MapAccess, Visitor};
14287        struct EnumVisitor;
14288        impl<'de> Visitor<'de> for EnumVisitor {
14289            type Value = SetAccessInheritanceError;
14290            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14291                f.write_str("a SetAccessInheritanceError structure")
14292            }
14293            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
14294                let tag: &str = match map.next_key()? {
14295                    Some(".tag") => map.next_value()?,
14296                    _ => return Err(de::Error::missing_field(".tag"))
14297                };
14298                let value = match tag {
14299                    "access_error" => {
14300                        match map.next_key()? {
14301                            Some("access_error") => SetAccessInheritanceError::AccessError(map.next_value()?),
14302                            None => return Err(de::Error::missing_field("access_error")),
14303                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
14304                        }
14305                    }
14306                    "no_permission" => SetAccessInheritanceError::NoPermission,
14307                    _ => SetAccessInheritanceError::Other,
14308                };
14309                crate::eat_json_fields(&mut map)?;
14310                Ok(value)
14311            }
14312        }
14313        const VARIANTS: &[&str] = &["access_error",
14314                                    "no_permission",
14315                                    "other"];
14316        deserializer.deserialize_struct("SetAccessInheritanceError", VARIANTS, EnumVisitor)
14317    }
14318}
14319
14320impl ::serde::ser::Serialize for SetAccessInheritanceError {
14321    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
14322        // union serializer
14323        use serde::ser::SerializeStruct;
14324        match self {
14325            SetAccessInheritanceError::AccessError(x) => {
14326                // union or polymporphic struct
14327                let mut s = serializer.serialize_struct("SetAccessInheritanceError", 2)?;
14328                s.serialize_field(".tag", "access_error")?;
14329                s.serialize_field("access_error", x)?;
14330                s.end()
14331            }
14332            SetAccessInheritanceError::NoPermission => {
14333                // unit
14334                let mut s = serializer.serialize_struct("SetAccessInheritanceError", 1)?;
14335                s.serialize_field(".tag", "no_permission")?;
14336                s.end()
14337            }
14338            SetAccessInheritanceError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
14339        }
14340    }
14341}
14342
14343impl ::std::error::Error for SetAccessInheritanceError {
14344    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
14345        match self {
14346            SetAccessInheritanceError::AccessError(inner) => Some(inner),
14347            _ => None,
14348        }
14349    }
14350}
14351
14352impl ::std::fmt::Display for SetAccessInheritanceError {
14353    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14354        match self {
14355            SetAccessInheritanceError::AccessError(inner) => write!(f, "Unable to access shared folder: {}", inner),
14356            SetAccessInheritanceError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
14357            _ => write!(f, "{:?}", *self),
14358        }
14359    }
14360}
14361
14362#[derive(Debug, Clone, PartialEq, Eq)]
14363#[non_exhaustive] // structs may have more fields added in the future.
14364pub struct ShareFolderArg {
14365    /// The path or the file id to the folder to share. If it does not exist, then a new one is
14366    /// created.
14367    pub path: crate::types::files::WritePathOrId,
14368    /// Who can add and remove members of this shared folder.
14369    pub acl_update_policy: Option<AclUpdatePolicy>,
14370    /// Whether to force the share to happen asynchronously.
14371    pub force_async: bool,
14372    /// Who can be a member of this shared folder. Only applicable if the current user is on a team.
14373    pub member_policy: Option<MemberPolicy>,
14374    /// The policy to apply to shared links created for content inside this shared folder.  The
14375    /// current user must be on a team to set this policy to [`SharedLinkPolicy::Members`].
14376    pub shared_link_policy: Option<SharedLinkPolicy>,
14377    /// Who can enable/disable viewer info for this shared folder.
14378    pub viewer_info_policy: Option<ViewerInfoPolicy>,
14379    /// The access inheritance settings for the folder.
14380    pub access_inheritance: AccessInheritance,
14381    /// A list of `FolderAction`s corresponding to `FolderPermission`s that should appear in the
14382    /// response's [`SharedFolderMetadata::permissions`](SharedFolderMetadata) field describing the
14383    /// actions the authenticated user can perform on the folder.
14384    pub actions: Option<Vec<FolderAction>>,
14385    /// Settings on the link for this folder.
14386    pub link_settings: Option<LinkSettings>,
14387}
14388
14389impl ShareFolderArg {
14390    pub fn new(path: crate::types::files::WritePathOrId) -> Self {
14391        ShareFolderArg {
14392            path,
14393            acl_update_policy: None,
14394            force_async: false,
14395            member_policy: None,
14396            shared_link_policy: None,
14397            viewer_info_policy: None,
14398            access_inheritance: AccessInheritance::Inherit,
14399            actions: None,
14400            link_settings: None,
14401        }
14402    }
14403
14404    pub fn with_acl_update_policy(mut self, value: AclUpdatePolicy) -> Self {
14405        self.acl_update_policy = Some(value);
14406        self
14407    }
14408
14409    pub fn with_force_async(mut self, value: bool) -> Self {
14410        self.force_async = value;
14411        self
14412    }
14413
14414    pub fn with_member_policy(mut self, value: MemberPolicy) -> Self {
14415        self.member_policy = Some(value);
14416        self
14417    }
14418
14419    pub fn with_shared_link_policy(mut self, value: SharedLinkPolicy) -> Self {
14420        self.shared_link_policy = Some(value);
14421        self
14422    }
14423
14424    pub fn with_viewer_info_policy(mut self, value: ViewerInfoPolicy) -> Self {
14425        self.viewer_info_policy = Some(value);
14426        self
14427    }
14428
14429    pub fn with_access_inheritance(mut self, value: AccessInheritance) -> Self {
14430        self.access_inheritance = value;
14431        self
14432    }
14433
14434    pub fn with_actions(mut self, value: Vec<FolderAction>) -> Self {
14435        self.actions = Some(value);
14436        self
14437    }
14438
14439    pub fn with_link_settings(mut self, value: LinkSettings) -> Self {
14440        self.link_settings = Some(value);
14441        self
14442    }
14443}
14444
14445const SHARE_FOLDER_ARG_FIELDS: &[&str] = &["path",
14446                                           "acl_update_policy",
14447                                           "force_async",
14448                                           "member_policy",
14449                                           "shared_link_policy",
14450                                           "viewer_info_policy",
14451                                           "access_inheritance",
14452                                           "actions",
14453                                           "link_settings"];
14454impl ShareFolderArg {
14455    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
14456        map: V,
14457    ) -> Result<ShareFolderArg, V::Error> {
14458        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
14459    }
14460
14461    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
14462        mut map: V,
14463        optional: bool,
14464    ) -> Result<Option<ShareFolderArg>, V::Error> {
14465        let mut field_path = None;
14466        let mut field_acl_update_policy = None;
14467        let mut field_force_async = None;
14468        let mut field_member_policy = None;
14469        let mut field_shared_link_policy = None;
14470        let mut field_viewer_info_policy = None;
14471        let mut field_access_inheritance = None;
14472        let mut field_actions = None;
14473        let mut field_link_settings = None;
14474        let mut nothing = true;
14475        while let Some(key) = map.next_key::<&str>()? {
14476            nothing = false;
14477            match key {
14478                "path" => {
14479                    if field_path.is_some() {
14480                        return Err(::serde::de::Error::duplicate_field("path"));
14481                    }
14482                    field_path = Some(map.next_value()?);
14483                }
14484                "acl_update_policy" => {
14485                    if field_acl_update_policy.is_some() {
14486                        return Err(::serde::de::Error::duplicate_field("acl_update_policy"));
14487                    }
14488                    field_acl_update_policy = Some(map.next_value()?);
14489                }
14490                "force_async" => {
14491                    if field_force_async.is_some() {
14492                        return Err(::serde::de::Error::duplicate_field("force_async"));
14493                    }
14494                    field_force_async = Some(map.next_value()?);
14495                }
14496                "member_policy" => {
14497                    if field_member_policy.is_some() {
14498                        return Err(::serde::de::Error::duplicate_field("member_policy"));
14499                    }
14500                    field_member_policy = Some(map.next_value()?);
14501                }
14502                "shared_link_policy" => {
14503                    if field_shared_link_policy.is_some() {
14504                        return Err(::serde::de::Error::duplicate_field("shared_link_policy"));
14505                    }
14506                    field_shared_link_policy = Some(map.next_value()?);
14507                }
14508                "viewer_info_policy" => {
14509                    if field_viewer_info_policy.is_some() {
14510                        return Err(::serde::de::Error::duplicate_field("viewer_info_policy"));
14511                    }
14512                    field_viewer_info_policy = Some(map.next_value()?);
14513                }
14514                "access_inheritance" => {
14515                    if field_access_inheritance.is_some() {
14516                        return Err(::serde::de::Error::duplicate_field("access_inheritance"));
14517                    }
14518                    field_access_inheritance = Some(map.next_value()?);
14519                }
14520                "actions" => {
14521                    if field_actions.is_some() {
14522                        return Err(::serde::de::Error::duplicate_field("actions"));
14523                    }
14524                    field_actions = Some(map.next_value()?);
14525                }
14526                "link_settings" => {
14527                    if field_link_settings.is_some() {
14528                        return Err(::serde::de::Error::duplicate_field("link_settings"));
14529                    }
14530                    field_link_settings = Some(map.next_value()?);
14531                }
14532                _ => {
14533                    // unknown field allowed and ignored
14534                    map.next_value::<::serde_json::Value>()?;
14535                }
14536            }
14537        }
14538        if optional && nothing {
14539            return Ok(None);
14540        }
14541        let result = ShareFolderArg {
14542            path: field_path.ok_or_else(|| ::serde::de::Error::missing_field("path"))?,
14543            acl_update_policy: field_acl_update_policy.and_then(Option::flatten),
14544            force_async: field_force_async.unwrap_or(false),
14545            member_policy: field_member_policy.and_then(Option::flatten),
14546            shared_link_policy: field_shared_link_policy.and_then(Option::flatten),
14547            viewer_info_policy: field_viewer_info_policy.and_then(Option::flatten),
14548            access_inheritance: field_access_inheritance.unwrap_or(AccessInheritance::Inherit),
14549            actions: field_actions.and_then(Option::flatten),
14550            link_settings: field_link_settings.and_then(Option::flatten),
14551        };
14552        Ok(Some(result))
14553    }
14554
14555    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
14556        &self,
14557        s: &mut S::SerializeStruct,
14558    ) -> Result<(), S::Error> {
14559        use serde::ser::SerializeStruct;
14560        s.serialize_field("path", &self.path)?;
14561        if let Some(val) = &self.acl_update_policy {
14562            s.serialize_field("acl_update_policy", val)?;
14563        }
14564        if self.force_async {
14565            s.serialize_field("force_async", &self.force_async)?;
14566        }
14567        if let Some(val) = &self.member_policy {
14568            s.serialize_field("member_policy", val)?;
14569        }
14570        if let Some(val) = &self.shared_link_policy {
14571            s.serialize_field("shared_link_policy", val)?;
14572        }
14573        if let Some(val) = &self.viewer_info_policy {
14574            s.serialize_field("viewer_info_policy", val)?;
14575        }
14576        if self.access_inheritance != AccessInheritance::Inherit {
14577            s.serialize_field("access_inheritance", &self.access_inheritance)?;
14578        }
14579        if let Some(val) = &self.actions {
14580            s.serialize_field("actions", val)?;
14581        }
14582        if let Some(val) = &self.link_settings {
14583            s.serialize_field("link_settings", val)?;
14584        }
14585        Ok(())
14586    }
14587}
14588
14589impl<'de> ::serde::de::Deserialize<'de> for ShareFolderArg {
14590    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
14591        // struct deserializer
14592        use serde::de::{MapAccess, Visitor};
14593        struct StructVisitor;
14594        impl<'de> Visitor<'de> for StructVisitor {
14595            type Value = ShareFolderArg;
14596            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14597                f.write_str("a ShareFolderArg struct")
14598            }
14599            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
14600                ShareFolderArg::internal_deserialize(map)
14601            }
14602        }
14603        deserializer.deserialize_struct("ShareFolderArg", SHARE_FOLDER_ARG_FIELDS, StructVisitor)
14604    }
14605}
14606
14607impl ::serde::ser::Serialize for ShareFolderArg {
14608    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
14609        // struct serializer
14610        use serde::ser::SerializeStruct;
14611        let mut s = serializer.serialize_struct("ShareFolderArg", 9)?;
14612        self.internal_serialize::<S>(&mut s)?;
14613        s.end()
14614    }
14615}
14616
14617// struct extends ShareFolderArgBase
14618impl From<ShareFolderArg> for ShareFolderArgBase {
14619    fn from(subtype: ShareFolderArg) -> Self {
14620        Self {
14621            path: subtype.path,
14622            acl_update_policy: subtype.acl_update_policy,
14623            force_async: subtype.force_async,
14624            member_policy: subtype.member_policy,
14625            shared_link_policy: subtype.shared_link_policy,
14626            viewer_info_policy: subtype.viewer_info_policy,
14627            access_inheritance: subtype.access_inheritance,
14628        }
14629    }
14630}
14631#[derive(Debug, Clone, PartialEq, Eq)]
14632#[non_exhaustive] // structs may have more fields added in the future.
14633pub struct ShareFolderArgBase {
14634    /// The path or the file id to the folder to share. If it does not exist, then a new one is
14635    /// created.
14636    pub path: crate::types::files::WritePathOrId,
14637    /// Who can add and remove members of this shared folder.
14638    pub acl_update_policy: Option<AclUpdatePolicy>,
14639    /// Whether to force the share to happen asynchronously.
14640    pub force_async: bool,
14641    /// Who can be a member of this shared folder. Only applicable if the current user is on a team.
14642    pub member_policy: Option<MemberPolicy>,
14643    /// The policy to apply to shared links created for content inside this shared folder.  The
14644    /// current user must be on a team to set this policy to [`SharedLinkPolicy::Members`].
14645    pub shared_link_policy: Option<SharedLinkPolicy>,
14646    /// Who can enable/disable viewer info for this shared folder.
14647    pub viewer_info_policy: Option<ViewerInfoPolicy>,
14648    /// The access inheritance settings for the folder.
14649    pub access_inheritance: AccessInheritance,
14650}
14651
14652impl ShareFolderArgBase {
14653    pub fn new(path: crate::types::files::WritePathOrId) -> Self {
14654        ShareFolderArgBase {
14655            path,
14656            acl_update_policy: None,
14657            force_async: false,
14658            member_policy: None,
14659            shared_link_policy: None,
14660            viewer_info_policy: None,
14661            access_inheritance: AccessInheritance::Inherit,
14662        }
14663    }
14664
14665    pub fn with_acl_update_policy(mut self, value: AclUpdatePolicy) -> Self {
14666        self.acl_update_policy = Some(value);
14667        self
14668    }
14669
14670    pub fn with_force_async(mut self, value: bool) -> Self {
14671        self.force_async = value;
14672        self
14673    }
14674
14675    pub fn with_member_policy(mut self, value: MemberPolicy) -> Self {
14676        self.member_policy = Some(value);
14677        self
14678    }
14679
14680    pub fn with_shared_link_policy(mut self, value: SharedLinkPolicy) -> Self {
14681        self.shared_link_policy = Some(value);
14682        self
14683    }
14684
14685    pub fn with_viewer_info_policy(mut self, value: ViewerInfoPolicy) -> Self {
14686        self.viewer_info_policy = Some(value);
14687        self
14688    }
14689
14690    pub fn with_access_inheritance(mut self, value: AccessInheritance) -> Self {
14691        self.access_inheritance = value;
14692        self
14693    }
14694}
14695
14696const SHARE_FOLDER_ARG_BASE_FIELDS: &[&str] = &["path",
14697                                                "acl_update_policy",
14698                                                "force_async",
14699                                                "member_policy",
14700                                                "shared_link_policy",
14701                                                "viewer_info_policy",
14702                                                "access_inheritance"];
14703impl ShareFolderArgBase {
14704    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
14705        map: V,
14706    ) -> Result<ShareFolderArgBase, V::Error> {
14707        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
14708    }
14709
14710    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
14711        mut map: V,
14712        optional: bool,
14713    ) -> Result<Option<ShareFolderArgBase>, V::Error> {
14714        let mut field_path = None;
14715        let mut field_acl_update_policy = None;
14716        let mut field_force_async = None;
14717        let mut field_member_policy = None;
14718        let mut field_shared_link_policy = None;
14719        let mut field_viewer_info_policy = None;
14720        let mut field_access_inheritance = None;
14721        let mut nothing = true;
14722        while let Some(key) = map.next_key::<&str>()? {
14723            nothing = false;
14724            match key {
14725                "path" => {
14726                    if field_path.is_some() {
14727                        return Err(::serde::de::Error::duplicate_field("path"));
14728                    }
14729                    field_path = Some(map.next_value()?);
14730                }
14731                "acl_update_policy" => {
14732                    if field_acl_update_policy.is_some() {
14733                        return Err(::serde::de::Error::duplicate_field("acl_update_policy"));
14734                    }
14735                    field_acl_update_policy = Some(map.next_value()?);
14736                }
14737                "force_async" => {
14738                    if field_force_async.is_some() {
14739                        return Err(::serde::de::Error::duplicate_field("force_async"));
14740                    }
14741                    field_force_async = Some(map.next_value()?);
14742                }
14743                "member_policy" => {
14744                    if field_member_policy.is_some() {
14745                        return Err(::serde::de::Error::duplicate_field("member_policy"));
14746                    }
14747                    field_member_policy = Some(map.next_value()?);
14748                }
14749                "shared_link_policy" => {
14750                    if field_shared_link_policy.is_some() {
14751                        return Err(::serde::de::Error::duplicate_field("shared_link_policy"));
14752                    }
14753                    field_shared_link_policy = Some(map.next_value()?);
14754                }
14755                "viewer_info_policy" => {
14756                    if field_viewer_info_policy.is_some() {
14757                        return Err(::serde::de::Error::duplicate_field("viewer_info_policy"));
14758                    }
14759                    field_viewer_info_policy = Some(map.next_value()?);
14760                }
14761                "access_inheritance" => {
14762                    if field_access_inheritance.is_some() {
14763                        return Err(::serde::de::Error::duplicate_field("access_inheritance"));
14764                    }
14765                    field_access_inheritance = Some(map.next_value()?);
14766                }
14767                _ => {
14768                    // unknown field allowed and ignored
14769                    map.next_value::<::serde_json::Value>()?;
14770                }
14771            }
14772        }
14773        if optional && nothing {
14774            return Ok(None);
14775        }
14776        let result = ShareFolderArgBase {
14777            path: field_path.ok_or_else(|| ::serde::de::Error::missing_field("path"))?,
14778            acl_update_policy: field_acl_update_policy.and_then(Option::flatten),
14779            force_async: field_force_async.unwrap_or(false),
14780            member_policy: field_member_policy.and_then(Option::flatten),
14781            shared_link_policy: field_shared_link_policy.and_then(Option::flatten),
14782            viewer_info_policy: field_viewer_info_policy.and_then(Option::flatten),
14783            access_inheritance: field_access_inheritance.unwrap_or(AccessInheritance::Inherit),
14784        };
14785        Ok(Some(result))
14786    }
14787
14788    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
14789        &self,
14790        s: &mut S::SerializeStruct,
14791    ) -> Result<(), S::Error> {
14792        use serde::ser::SerializeStruct;
14793        s.serialize_field("path", &self.path)?;
14794        if let Some(val) = &self.acl_update_policy {
14795            s.serialize_field("acl_update_policy", val)?;
14796        }
14797        if self.force_async {
14798            s.serialize_field("force_async", &self.force_async)?;
14799        }
14800        if let Some(val) = &self.member_policy {
14801            s.serialize_field("member_policy", val)?;
14802        }
14803        if let Some(val) = &self.shared_link_policy {
14804            s.serialize_field("shared_link_policy", val)?;
14805        }
14806        if let Some(val) = &self.viewer_info_policy {
14807            s.serialize_field("viewer_info_policy", val)?;
14808        }
14809        if self.access_inheritance != AccessInheritance::Inherit {
14810            s.serialize_field("access_inheritance", &self.access_inheritance)?;
14811        }
14812        Ok(())
14813    }
14814}
14815
14816impl<'de> ::serde::de::Deserialize<'de> for ShareFolderArgBase {
14817    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
14818        // struct deserializer
14819        use serde::de::{MapAccess, Visitor};
14820        struct StructVisitor;
14821        impl<'de> Visitor<'de> for StructVisitor {
14822            type Value = ShareFolderArgBase;
14823            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14824                f.write_str("a ShareFolderArgBase struct")
14825            }
14826            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
14827                ShareFolderArgBase::internal_deserialize(map)
14828            }
14829        }
14830        deserializer.deserialize_struct("ShareFolderArgBase", SHARE_FOLDER_ARG_BASE_FIELDS, StructVisitor)
14831    }
14832}
14833
14834impl ::serde::ser::Serialize for ShareFolderArgBase {
14835    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
14836        // struct serializer
14837        use serde::ser::SerializeStruct;
14838        let mut s = serializer.serialize_struct("ShareFolderArgBase", 7)?;
14839        self.internal_serialize::<S>(&mut s)?;
14840        s.end()
14841    }
14842}
14843
14844#[derive(Debug, Clone, PartialEq, Eq)]
14845#[non_exhaustive] // variants may be added in the future
14846pub enum ShareFolderError {
14847    /// This user's email address is not verified. This functionality is only available on accounts
14848    /// with a verified email address. Users can verify their email address
14849    /// [here](https://www.dropbox.com/help/317).
14850    EmailUnverified,
14851    /// [`ShareFolderArg::path`](ShareFolderArg) is invalid.
14852    BadPath(SharePathError),
14853    /// Team policy or group sharing settings are more restrictive than
14854    /// [`ShareFolderArg::member_policy`](ShareFolderArg).
14855    TeamPolicyDisallowsMemberPolicy,
14856    /// The current user's account is not allowed to select the specified
14857    /// [`ShareFolderArg::shared_link_policy`](ShareFolderArg).
14858    DisallowedSharedLinkPolicy,
14859    /// The current user does not have permission to perform this action.
14860    NoPermission,
14861    /// Catch-all used for unrecognized values returned from the server. Encountering this value
14862    /// typically indicates that this SDK version is out of date.
14863    Other,
14864}
14865
14866impl<'de> ::serde::de::Deserialize<'de> for ShareFolderError {
14867    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
14868        // union deserializer
14869        use serde::de::{self, MapAccess, Visitor};
14870        struct EnumVisitor;
14871        impl<'de> Visitor<'de> for EnumVisitor {
14872            type Value = ShareFolderError;
14873            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14874                f.write_str("a ShareFolderError structure")
14875            }
14876            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
14877                let tag: &str = match map.next_key()? {
14878                    Some(".tag") => map.next_value()?,
14879                    _ => return Err(de::Error::missing_field(".tag"))
14880                };
14881                let value = match tag {
14882                    "email_unverified" => ShareFolderError::EmailUnverified,
14883                    "bad_path" => {
14884                        match map.next_key()? {
14885                            Some("bad_path") => ShareFolderError::BadPath(map.next_value()?),
14886                            None => return Err(de::Error::missing_field("bad_path")),
14887                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
14888                        }
14889                    }
14890                    "team_policy_disallows_member_policy" => ShareFolderError::TeamPolicyDisallowsMemberPolicy,
14891                    "disallowed_shared_link_policy" => ShareFolderError::DisallowedSharedLinkPolicy,
14892                    "no_permission" => ShareFolderError::NoPermission,
14893                    _ => ShareFolderError::Other,
14894                };
14895                crate::eat_json_fields(&mut map)?;
14896                Ok(value)
14897            }
14898        }
14899        const VARIANTS: &[&str] = &["email_unverified",
14900                                    "bad_path",
14901                                    "team_policy_disallows_member_policy",
14902                                    "disallowed_shared_link_policy",
14903                                    "other",
14904                                    "no_permission"];
14905        deserializer.deserialize_struct("ShareFolderError", VARIANTS, EnumVisitor)
14906    }
14907}
14908
14909impl ::serde::ser::Serialize for ShareFolderError {
14910    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
14911        // union serializer
14912        use serde::ser::SerializeStruct;
14913        match self {
14914            ShareFolderError::EmailUnverified => {
14915                // unit
14916                let mut s = serializer.serialize_struct("ShareFolderError", 1)?;
14917                s.serialize_field(".tag", "email_unverified")?;
14918                s.end()
14919            }
14920            ShareFolderError::BadPath(x) => {
14921                // union or polymporphic struct
14922                let mut s = serializer.serialize_struct("ShareFolderError", 2)?;
14923                s.serialize_field(".tag", "bad_path")?;
14924                s.serialize_field("bad_path", x)?;
14925                s.end()
14926            }
14927            ShareFolderError::TeamPolicyDisallowsMemberPolicy => {
14928                // unit
14929                let mut s = serializer.serialize_struct("ShareFolderError", 1)?;
14930                s.serialize_field(".tag", "team_policy_disallows_member_policy")?;
14931                s.end()
14932            }
14933            ShareFolderError::DisallowedSharedLinkPolicy => {
14934                // unit
14935                let mut s = serializer.serialize_struct("ShareFolderError", 1)?;
14936                s.serialize_field(".tag", "disallowed_shared_link_policy")?;
14937                s.end()
14938            }
14939            ShareFolderError::NoPermission => {
14940                // unit
14941                let mut s = serializer.serialize_struct("ShareFolderError", 1)?;
14942                s.serialize_field(".tag", "no_permission")?;
14943                s.end()
14944            }
14945            ShareFolderError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
14946        }
14947    }
14948}
14949
14950impl ::std::error::Error for ShareFolderError {
14951    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
14952        match self {
14953            ShareFolderError::BadPath(inner) => Some(inner),
14954            _ => None,
14955        }
14956    }
14957}
14958
14959impl ::std::fmt::Display for ShareFolderError {
14960    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14961        match self {
14962            ShareFolderError::BadPath(inner) => write!(f, "ShareFolderError: {}", inner),
14963            ShareFolderError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
14964            _ => write!(f, "{:?}", *self),
14965        }
14966    }
14967}
14968
14969// union extends ShareFolderErrorBase
14970impl From<ShareFolderErrorBase> for ShareFolderError {
14971    fn from(parent: ShareFolderErrorBase) -> Self {
14972        match parent {
14973            ShareFolderErrorBase::EmailUnverified => ShareFolderError::EmailUnverified,
14974            ShareFolderErrorBase::BadPath(x) => ShareFolderError::BadPath(x),
14975            ShareFolderErrorBase::TeamPolicyDisallowsMemberPolicy => ShareFolderError::TeamPolicyDisallowsMemberPolicy,
14976            ShareFolderErrorBase::DisallowedSharedLinkPolicy => ShareFolderError::DisallowedSharedLinkPolicy,
14977            ShareFolderErrorBase::Other => ShareFolderError::Other,
14978        }
14979    }
14980}
14981#[derive(Debug, Clone, PartialEq, Eq)]
14982#[non_exhaustive] // variants may be added in the future
14983pub enum ShareFolderErrorBase {
14984    /// This user's email address is not verified. This functionality is only available on accounts
14985    /// with a verified email address. Users can verify their email address
14986    /// [here](https://www.dropbox.com/help/317).
14987    EmailUnverified,
14988    /// [`ShareFolderArg::path`](ShareFolderArg) is invalid.
14989    BadPath(SharePathError),
14990    /// Team policy or group sharing settings are more restrictive than
14991    /// [`ShareFolderArg::member_policy`](ShareFolderArg).
14992    TeamPolicyDisallowsMemberPolicy,
14993    /// The current user's account is not allowed to select the specified
14994    /// [`ShareFolderArg::shared_link_policy`](ShareFolderArg).
14995    DisallowedSharedLinkPolicy,
14996    /// Catch-all used for unrecognized values returned from the server. Encountering this value
14997    /// typically indicates that this SDK version is out of date.
14998    Other,
14999}
15000
15001impl<'de> ::serde::de::Deserialize<'de> for ShareFolderErrorBase {
15002    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
15003        // union deserializer
15004        use serde::de::{self, MapAccess, Visitor};
15005        struct EnumVisitor;
15006        impl<'de> Visitor<'de> for EnumVisitor {
15007            type Value = ShareFolderErrorBase;
15008            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
15009                f.write_str("a ShareFolderErrorBase structure")
15010            }
15011            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
15012                let tag: &str = match map.next_key()? {
15013                    Some(".tag") => map.next_value()?,
15014                    _ => return Err(de::Error::missing_field(".tag"))
15015                };
15016                let value = match tag {
15017                    "email_unverified" => ShareFolderErrorBase::EmailUnverified,
15018                    "bad_path" => {
15019                        match map.next_key()? {
15020                            Some("bad_path") => ShareFolderErrorBase::BadPath(map.next_value()?),
15021                            None => return Err(de::Error::missing_field("bad_path")),
15022                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
15023                        }
15024                    }
15025                    "team_policy_disallows_member_policy" => ShareFolderErrorBase::TeamPolicyDisallowsMemberPolicy,
15026                    "disallowed_shared_link_policy" => ShareFolderErrorBase::DisallowedSharedLinkPolicy,
15027                    _ => ShareFolderErrorBase::Other,
15028                };
15029                crate::eat_json_fields(&mut map)?;
15030                Ok(value)
15031            }
15032        }
15033        const VARIANTS: &[&str] = &["email_unverified",
15034                                    "bad_path",
15035                                    "team_policy_disallows_member_policy",
15036                                    "disallowed_shared_link_policy",
15037                                    "other"];
15038        deserializer.deserialize_struct("ShareFolderErrorBase", VARIANTS, EnumVisitor)
15039    }
15040}
15041
15042impl ::serde::ser::Serialize for ShareFolderErrorBase {
15043    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
15044        // union serializer
15045        use serde::ser::SerializeStruct;
15046        match self {
15047            ShareFolderErrorBase::EmailUnverified => {
15048                // unit
15049                let mut s = serializer.serialize_struct("ShareFolderErrorBase", 1)?;
15050                s.serialize_field(".tag", "email_unverified")?;
15051                s.end()
15052            }
15053            ShareFolderErrorBase::BadPath(x) => {
15054                // union or polymporphic struct
15055                let mut s = serializer.serialize_struct("ShareFolderErrorBase", 2)?;
15056                s.serialize_field(".tag", "bad_path")?;
15057                s.serialize_field("bad_path", x)?;
15058                s.end()
15059            }
15060            ShareFolderErrorBase::TeamPolicyDisallowsMemberPolicy => {
15061                // unit
15062                let mut s = serializer.serialize_struct("ShareFolderErrorBase", 1)?;
15063                s.serialize_field(".tag", "team_policy_disallows_member_policy")?;
15064                s.end()
15065            }
15066            ShareFolderErrorBase::DisallowedSharedLinkPolicy => {
15067                // unit
15068                let mut s = serializer.serialize_struct("ShareFolderErrorBase", 1)?;
15069                s.serialize_field(".tag", "disallowed_shared_link_policy")?;
15070                s.end()
15071            }
15072            ShareFolderErrorBase::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
15073        }
15074    }
15075}
15076
15077#[derive(Debug, Clone, PartialEq, Eq)]
15078#[non_exhaustive] // variants may be added in the future
15079pub enum ShareFolderErrorBaseV2 {
15080    /// This user's email address is not verified. This functionality is only available on accounts
15081    /// with a verified email address. Users can verify their email address
15082    /// [here](https://www.dropbox.com/help/317).
15083    EmailUnverified,
15084    /// Team policy or group sharing settings are more restrictive than
15085    /// [`ShareFolderArg::member_policy`](ShareFolderArg).
15086    TeamPolicyDisallowsMemberPolicy,
15087    /// The current user's account is not allowed to select the specified
15088    /// [`ShareFolderArg::shared_link_policy`](ShareFolderArg).
15089    DisallowedSharedLinkPolicy,
15090    /// Catch-all used for unrecognized values returned from the server. Encountering this value
15091    /// typically indicates that this SDK version is out of date.
15092    Other,
15093}
15094
15095impl<'de> ::serde::de::Deserialize<'de> for ShareFolderErrorBaseV2 {
15096    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
15097        // union deserializer
15098        use serde::de::{self, MapAccess, Visitor};
15099        struct EnumVisitor;
15100        impl<'de> Visitor<'de> for EnumVisitor {
15101            type Value = ShareFolderErrorBaseV2;
15102            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
15103                f.write_str("a ShareFolderErrorBaseV2 structure")
15104            }
15105            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
15106                let tag: &str = match map.next_key()? {
15107                    Some(".tag") => map.next_value()?,
15108                    _ => return Err(de::Error::missing_field(".tag"))
15109                };
15110                let value = match tag {
15111                    "email_unverified" => ShareFolderErrorBaseV2::EmailUnverified,
15112                    "team_policy_disallows_member_policy" => ShareFolderErrorBaseV2::TeamPolicyDisallowsMemberPolicy,
15113                    "disallowed_shared_link_policy" => ShareFolderErrorBaseV2::DisallowedSharedLinkPolicy,
15114                    _ => ShareFolderErrorBaseV2::Other,
15115                };
15116                crate::eat_json_fields(&mut map)?;
15117                Ok(value)
15118            }
15119        }
15120        const VARIANTS: &[&str] = &["email_unverified",
15121                                    "team_policy_disallows_member_policy",
15122                                    "disallowed_shared_link_policy",
15123                                    "other"];
15124        deserializer.deserialize_struct("ShareFolderErrorBaseV2", VARIANTS, EnumVisitor)
15125    }
15126}
15127
15128impl ::serde::ser::Serialize for ShareFolderErrorBaseV2 {
15129    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
15130        // union serializer
15131        use serde::ser::SerializeStruct;
15132        match self {
15133            ShareFolderErrorBaseV2::EmailUnverified => {
15134                // unit
15135                let mut s = serializer.serialize_struct("ShareFolderErrorBaseV2", 1)?;
15136                s.serialize_field(".tag", "email_unverified")?;
15137                s.end()
15138            }
15139            ShareFolderErrorBaseV2::TeamPolicyDisallowsMemberPolicy => {
15140                // unit
15141                let mut s = serializer.serialize_struct("ShareFolderErrorBaseV2", 1)?;
15142                s.serialize_field(".tag", "team_policy_disallows_member_policy")?;
15143                s.end()
15144            }
15145            ShareFolderErrorBaseV2::DisallowedSharedLinkPolicy => {
15146                // unit
15147                let mut s = serializer.serialize_struct("ShareFolderErrorBaseV2", 1)?;
15148                s.serialize_field(".tag", "disallowed_shared_link_policy")?;
15149                s.end()
15150            }
15151            ShareFolderErrorBaseV2::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
15152        }
15153    }
15154}
15155
15156#[derive(Debug, Clone, PartialEq, Eq)]
15157#[non_exhaustive] // variants may be added in the future
15158pub enum ShareFolderErrorV2 {
15159    /// This user's email address is not verified. This functionality is only available on accounts
15160    /// with a verified email address. Users can verify their email address
15161    /// [here](https://www.dropbox.com/help/317).
15162    EmailUnverified,
15163    /// Team policy or group sharing settings are more restrictive than
15164    /// [`ShareFolderArg::member_policy`](ShareFolderArg).
15165    TeamPolicyDisallowsMemberPolicy,
15166    /// The current user's account is not allowed to select the specified
15167    /// [`ShareFolderArg::shared_link_policy`](ShareFolderArg).
15168    DisallowedSharedLinkPolicy,
15169    /// The current user does not have permission to perform this action.
15170    NoPermission,
15171    /// Catch-all used for unrecognized values returned from the server. Encountering this value
15172    /// typically indicates that this SDK version is out of date.
15173    Other,
15174}
15175
15176impl<'de> ::serde::de::Deserialize<'de> for ShareFolderErrorV2 {
15177    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
15178        // union deserializer
15179        use serde::de::{self, MapAccess, Visitor};
15180        struct EnumVisitor;
15181        impl<'de> Visitor<'de> for EnumVisitor {
15182            type Value = ShareFolderErrorV2;
15183            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
15184                f.write_str("a ShareFolderErrorV2 structure")
15185            }
15186            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
15187                let tag: &str = match map.next_key()? {
15188                    Some(".tag") => map.next_value()?,
15189                    _ => return Err(de::Error::missing_field(".tag"))
15190                };
15191                let value = match tag {
15192                    "email_unverified" => ShareFolderErrorV2::EmailUnverified,
15193                    "team_policy_disallows_member_policy" => ShareFolderErrorV2::TeamPolicyDisallowsMemberPolicy,
15194                    "disallowed_shared_link_policy" => ShareFolderErrorV2::DisallowedSharedLinkPolicy,
15195                    "no_permission" => ShareFolderErrorV2::NoPermission,
15196                    _ => ShareFolderErrorV2::Other,
15197                };
15198                crate::eat_json_fields(&mut map)?;
15199                Ok(value)
15200            }
15201        }
15202        const VARIANTS: &[&str] = &["email_unverified",
15203                                    "team_policy_disallows_member_policy",
15204                                    "disallowed_shared_link_policy",
15205                                    "other",
15206                                    "no_permission"];
15207        deserializer.deserialize_struct("ShareFolderErrorV2", VARIANTS, EnumVisitor)
15208    }
15209}
15210
15211impl ::serde::ser::Serialize for ShareFolderErrorV2 {
15212    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
15213        // union serializer
15214        use serde::ser::SerializeStruct;
15215        match self {
15216            ShareFolderErrorV2::EmailUnverified => {
15217                // unit
15218                let mut s = serializer.serialize_struct("ShareFolderErrorV2", 1)?;
15219                s.serialize_field(".tag", "email_unverified")?;
15220                s.end()
15221            }
15222            ShareFolderErrorV2::TeamPolicyDisallowsMemberPolicy => {
15223                // unit
15224                let mut s = serializer.serialize_struct("ShareFolderErrorV2", 1)?;
15225                s.serialize_field(".tag", "team_policy_disallows_member_policy")?;
15226                s.end()
15227            }
15228            ShareFolderErrorV2::DisallowedSharedLinkPolicy => {
15229                // unit
15230                let mut s = serializer.serialize_struct("ShareFolderErrorV2", 1)?;
15231                s.serialize_field(".tag", "disallowed_shared_link_policy")?;
15232                s.end()
15233            }
15234            ShareFolderErrorV2::NoPermission => {
15235                // unit
15236                let mut s = serializer.serialize_struct("ShareFolderErrorV2", 1)?;
15237                s.serialize_field(".tag", "no_permission")?;
15238                s.end()
15239            }
15240            ShareFolderErrorV2::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
15241        }
15242    }
15243}
15244
15245// union extends ShareFolderErrorBaseV2
15246impl From<ShareFolderErrorBaseV2> for ShareFolderErrorV2 {
15247    fn from(parent: ShareFolderErrorBaseV2) -> Self {
15248        match parent {
15249            ShareFolderErrorBaseV2::EmailUnverified => ShareFolderErrorV2::EmailUnverified,
15250            ShareFolderErrorBaseV2::TeamPolicyDisallowsMemberPolicy => ShareFolderErrorV2::TeamPolicyDisallowsMemberPolicy,
15251            ShareFolderErrorBaseV2::DisallowedSharedLinkPolicy => ShareFolderErrorV2::DisallowedSharedLinkPolicy,
15252            ShareFolderErrorBaseV2::Other => ShareFolderErrorV2::Other,
15253        }
15254    }
15255}
15256#[derive(Debug, Clone, PartialEq, Eq)]
15257pub enum ShareFolderJobStatus {
15258    /// The asynchronous job is still in progress.
15259    InProgress,
15260    /// The share job has finished. The value is the metadata for the folder.
15261    Complete(SharedFolderMetadata),
15262    Failed(ShareFolderError),
15263}
15264
15265impl<'de> ::serde::de::Deserialize<'de> for ShareFolderJobStatus {
15266    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
15267        // union deserializer
15268        use serde::de::{self, MapAccess, Visitor};
15269        struct EnumVisitor;
15270        impl<'de> Visitor<'de> for EnumVisitor {
15271            type Value = ShareFolderJobStatus;
15272            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
15273                f.write_str("a ShareFolderJobStatus structure")
15274            }
15275            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
15276                let tag: &str = match map.next_key()? {
15277                    Some(".tag") => map.next_value()?,
15278                    _ => return Err(de::Error::missing_field(".tag"))
15279                };
15280                let value = match tag {
15281                    "in_progress" => ShareFolderJobStatus::InProgress,
15282                    "complete" => ShareFolderJobStatus::Complete(SharedFolderMetadata::internal_deserialize(&mut map)?),
15283                    "failed" => {
15284                        match map.next_key()? {
15285                            Some("failed") => ShareFolderJobStatus::Failed(map.next_value()?),
15286                            None => return Err(de::Error::missing_field("failed")),
15287                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
15288                        }
15289                    }
15290                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
15291                };
15292                crate::eat_json_fields(&mut map)?;
15293                Ok(value)
15294            }
15295        }
15296        const VARIANTS: &[&str] = &["in_progress",
15297                                    "complete",
15298                                    "failed"];
15299        deserializer.deserialize_struct("ShareFolderJobStatus", VARIANTS, EnumVisitor)
15300    }
15301}
15302
15303impl ::serde::ser::Serialize for ShareFolderJobStatus {
15304    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
15305        // union serializer
15306        use serde::ser::SerializeStruct;
15307        match self {
15308            ShareFolderJobStatus::InProgress => {
15309                // unit
15310                let mut s = serializer.serialize_struct("ShareFolderJobStatus", 1)?;
15311                s.serialize_field(".tag", "in_progress")?;
15312                s.end()
15313            }
15314            ShareFolderJobStatus::Complete(x) => {
15315                // struct
15316                let mut s = serializer.serialize_struct("ShareFolderJobStatus", 19)?;
15317                s.serialize_field(".tag", "complete")?;
15318                x.internal_serialize::<S>(&mut s)?;
15319                s.end()
15320            }
15321            ShareFolderJobStatus::Failed(x) => {
15322                // union or polymporphic struct
15323                let mut s = serializer.serialize_struct("ShareFolderJobStatus", 2)?;
15324                s.serialize_field(".tag", "failed")?;
15325                s.serialize_field("failed", x)?;
15326                s.end()
15327            }
15328        }
15329    }
15330}
15331
15332// union extends crate::types::dbx_async::PollResultBase
15333impl From<crate::types::dbx_async::PollResultBase> for ShareFolderJobStatus {
15334    fn from(parent: crate::types::dbx_async::PollResultBase) -> Self {
15335        match parent {
15336            crate::types::dbx_async::PollResultBase::InProgress => ShareFolderJobStatus::InProgress,
15337        }
15338    }
15339}
15340#[derive(Debug, Clone, PartialEq, Eq)]
15341pub enum ShareFolderLaunch {
15342    /// This response indicates that the processing is asynchronous. The string is an id that can be
15343    /// used to obtain the status of the asynchronous job.
15344    AsyncJobId(crate::types::dbx_async::AsyncJobId),
15345    Complete(SharedFolderMetadata),
15346}
15347
15348impl<'de> ::serde::de::Deserialize<'de> for ShareFolderLaunch {
15349    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
15350        // union deserializer
15351        use serde::de::{self, MapAccess, Visitor};
15352        struct EnumVisitor;
15353        impl<'de> Visitor<'de> for EnumVisitor {
15354            type Value = ShareFolderLaunch;
15355            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
15356                f.write_str("a ShareFolderLaunch structure")
15357            }
15358            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
15359                let tag: &str = match map.next_key()? {
15360                    Some(".tag") => map.next_value()?,
15361                    _ => return Err(de::Error::missing_field(".tag"))
15362                };
15363                let value = match tag {
15364                    "async_job_id" => {
15365                        match map.next_key()? {
15366                            Some("async_job_id") => ShareFolderLaunch::AsyncJobId(map.next_value()?),
15367                            None => return Err(de::Error::missing_field("async_job_id")),
15368                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
15369                        }
15370                    }
15371                    "complete" => ShareFolderLaunch::Complete(SharedFolderMetadata::internal_deserialize(&mut map)?),
15372                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
15373                };
15374                crate::eat_json_fields(&mut map)?;
15375                Ok(value)
15376            }
15377        }
15378        const VARIANTS: &[&str] = &["async_job_id",
15379                                    "complete"];
15380        deserializer.deserialize_struct("ShareFolderLaunch", VARIANTS, EnumVisitor)
15381    }
15382}
15383
15384impl ::serde::ser::Serialize for ShareFolderLaunch {
15385    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
15386        // union serializer
15387        use serde::ser::SerializeStruct;
15388        match self {
15389            ShareFolderLaunch::AsyncJobId(x) => {
15390                // primitive
15391                let mut s = serializer.serialize_struct("ShareFolderLaunch", 2)?;
15392                s.serialize_field(".tag", "async_job_id")?;
15393                s.serialize_field("async_job_id", x)?;
15394                s.end()
15395            }
15396            ShareFolderLaunch::Complete(x) => {
15397                // struct
15398                let mut s = serializer.serialize_struct("ShareFolderLaunch", 19)?;
15399                s.serialize_field(".tag", "complete")?;
15400                x.internal_serialize::<S>(&mut s)?;
15401                s.end()
15402            }
15403        }
15404    }
15405}
15406
15407// union extends crate::types::dbx_async::LaunchResultBase
15408impl From<crate::types::dbx_async::LaunchResultBase> for ShareFolderLaunch {
15409    fn from(parent: crate::types::dbx_async::LaunchResultBase) -> Self {
15410        match parent {
15411            crate::types::dbx_async::LaunchResultBase::AsyncJobId(x) => ShareFolderLaunch::AsyncJobId(x),
15412        }
15413    }
15414}
15415#[derive(Debug, Clone, PartialEq, Eq)]
15416#[non_exhaustive] // variants may be added in the future
15417pub enum SharePathError {
15418    /// A file is at the specified path.
15419    IsFile,
15420    /// We do not support sharing a folder inside a shared folder.
15421    InsideSharedFolder,
15422    /// We do not support shared folders that contain shared folders.
15423    ContainsSharedFolder,
15424    /// We do not support shared folders that contain app folders.
15425    ContainsAppFolder,
15426    /// We do not support shared folders that contain team folders.
15427    ContainsTeamFolder,
15428    /// We do not support sharing an app folder.
15429    IsAppFolder,
15430    /// We do not support sharing a folder inside an app folder.
15431    InsideAppFolder,
15432    /// A public folder can't be shared this way. Use a public link instead.
15433    IsPublicFolder,
15434    /// A folder inside a public folder can't be shared this way. Use a public link instead.
15435    InsidePublicFolder,
15436    /// Folder is already shared. Contains metadata about the existing shared folder.
15437    AlreadyShared(SharedFolderMetadata),
15438    /// Path is not valid.
15439    InvalidPath,
15440    /// We do not support sharing a Mac OS X package.
15441    IsOsxPackage,
15442    /// We do not support sharing a folder inside a Mac OS X package.
15443    InsideOsxPackage,
15444    /// We do not support sharing the Vault folder.
15445    IsVault,
15446    /// We do not support sharing a folder inside a locked Vault.
15447    IsVaultLocked,
15448    /// We do not support sharing the Family folder.
15449    IsFamily,
15450    /// Catch-all used for unrecognized values returned from the server. Encountering this value
15451    /// typically indicates that this SDK version is out of date.
15452    Other,
15453}
15454
15455impl<'de> ::serde::de::Deserialize<'de> for SharePathError {
15456    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
15457        // union deserializer
15458        use serde::de::{self, MapAccess, Visitor};
15459        struct EnumVisitor;
15460        impl<'de> Visitor<'de> for EnumVisitor {
15461            type Value = SharePathError;
15462            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
15463                f.write_str("a SharePathError structure")
15464            }
15465            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
15466                let tag: &str = match map.next_key()? {
15467                    Some(".tag") => map.next_value()?,
15468                    _ => return Err(de::Error::missing_field(".tag"))
15469                };
15470                let value = match tag {
15471                    "is_file" => SharePathError::IsFile,
15472                    "inside_shared_folder" => SharePathError::InsideSharedFolder,
15473                    "contains_shared_folder" => SharePathError::ContainsSharedFolder,
15474                    "contains_app_folder" => SharePathError::ContainsAppFolder,
15475                    "contains_team_folder" => SharePathError::ContainsTeamFolder,
15476                    "is_app_folder" => SharePathError::IsAppFolder,
15477                    "inside_app_folder" => SharePathError::InsideAppFolder,
15478                    "is_public_folder" => SharePathError::IsPublicFolder,
15479                    "inside_public_folder" => SharePathError::InsidePublicFolder,
15480                    "already_shared" => SharePathError::AlreadyShared(SharedFolderMetadata::internal_deserialize(&mut map)?),
15481                    "invalid_path" => SharePathError::InvalidPath,
15482                    "is_osx_package" => SharePathError::IsOsxPackage,
15483                    "inside_osx_package" => SharePathError::InsideOsxPackage,
15484                    "is_vault" => SharePathError::IsVault,
15485                    "is_vault_locked" => SharePathError::IsVaultLocked,
15486                    "is_family" => SharePathError::IsFamily,
15487                    _ => SharePathError::Other,
15488                };
15489                crate::eat_json_fields(&mut map)?;
15490                Ok(value)
15491            }
15492        }
15493        const VARIANTS: &[&str] = &["is_file",
15494                                    "inside_shared_folder",
15495                                    "contains_shared_folder",
15496                                    "contains_app_folder",
15497                                    "contains_team_folder",
15498                                    "is_app_folder",
15499                                    "inside_app_folder",
15500                                    "is_public_folder",
15501                                    "inside_public_folder",
15502                                    "already_shared",
15503                                    "invalid_path",
15504                                    "is_osx_package",
15505                                    "inside_osx_package",
15506                                    "is_vault",
15507                                    "is_vault_locked",
15508                                    "is_family",
15509                                    "other"];
15510        deserializer.deserialize_struct("SharePathError", VARIANTS, EnumVisitor)
15511    }
15512}
15513
15514impl ::serde::ser::Serialize for SharePathError {
15515    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
15516        // union serializer
15517        use serde::ser::SerializeStruct;
15518        match self {
15519            SharePathError::IsFile => {
15520                // unit
15521                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15522                s.serialize_field(".tag", "is_file")?;
15523                s.end()
15524            }
15525            SharePathError::InsideSharedFolder => {
15526                // unit
15527                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15528                s.serialize_field(".tag", "inside_shared_folder")?;
15529                s.end()
15530            }
15531            SharePathError::ContainsSharedFolder => {
15532                // unit
15533                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15534                s.serialize_field(".tag", "contains_shared_folder")?;
15535                s.end()
15536            }
15537            SharePathError::ContainsAppFolder => {
15538                // unit
15539                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15540                s.serialize_field(".tag", "contains_app_folder")?;
15541                s.end()
15542            }
15543            SharePathError::ContainsTeamFolder => {
15544                // unit
15545                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15546                s.serialize_field(".tag", "contains_team_folder")?;
15547                s.end()
15548            }
15549            SharePathError::IsAppFolder => {
15550                // unit
15551                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15552                s.serialize_field(".tag", "is_app_folder")?;
15553                s.end()
15554            }
15555            SharePathError::InsideAppFolder => {
15556                // unit
15557                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15558                s.serialize_field(".tag", "inside_app_folder")?;
15559                s.end()
15560            }
15561            SharePathError::IsPublicFolder => {
15562                // unit
15563                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15564                s.serialize_field(".tag", "is_public_folder")?;
15565                s.end()
15566            }
15567            SharePathError::InsidePublicFolder => {
15568                // unit
15569                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15570                s.serialize_field(".tag", "inside_public_folder")?;
15571                s.end()
15572            }
15573            SharePathError::AlreadyShared(x) => {
15574                // struct
15575                let mut s = serializer.serialize_struct("SharePathError", 19)?;
15576                s.serialize_field(".tag", "already_shared")?;
15577                x.internal_serialize::<S>(&mut s)?;
15578                s.end()
15579            }
15580            SharePathError::InvalidPath => {
15581                // unit
15582                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15583                s.serialize_field(".tag", "invalid_path")?;
15584                s.end()
15585            }
15586            SharePathError::IsOsxPackage => {
15587                // unit
15588                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15589                s.serialize_field(".tag", "is_osx_package")?;
15590                s.end()
15591            }
15592            SharePathError::InsideOsxPackage => {
15593                // unit
15594                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15595                s.serialize_field(".tag", "inside_osx_package")?;
15596                s.end()
15597            }
15598            SharePathError::IsVault => {
15599                // unit
15600                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15601                s.serialize_field(".tag", "is_vault")?;
15602                s.end()
15603            }
15604            SharePathError::IsVaultLocked => {
15605                // unit
15606                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15607                s.serialize_field(".tag", "is_vault_locked")?;
15608                s.end()
15609            }
15610            SharePathError::IsFamily => {
15611                // unit
15612                let mut s = serializer.serialize_struct("SharePathError", 1)?;
15613                s.serialize_field(".tag", "is_family")?;
15614                s.end()
15615            }
15616            SharePathError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
15617        }
15618    }
15619}
15620
15621impl ::std::error::Error for SharePathError {
15622}
15623
15624impl ::std::fmt::Display for SharePathError {
15625    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
15626        match self {
15627            SharePathError::IsFile => f.write_str("A file is at the specified path."),
15628            SharePathError::InsideSharedFolder => f.write_str("We do not support sharing a folder inside a shared folder."),
15629            SharePathError::ContainsSharedFolder => f.write_str("We do not support shared folders that contain shared folders."),
15630            SharePathError::ContainsAppFolder => f.write_str("We do not support shared folders that contain app folders."),
15631            SharePathError::ContainsTeamFolder => f.write_str("We do not support shared folders that contain team folders."),
15632            SharePathError::IsAppFolder => f.write_str("We do not support sharing an app folder."),
15633            SharePathError::InsideAppFolder => f.write_str("We do not support sharing a folder inside an app folder."),
15634            SharePathError::IsPublicFolder => f.write_str("A public folder can't be shared this way. Use a public link instead."),
15635            SharePathError::InsidePublicFolder => f.write_str("A folder inside a public folder can't be shared this way. Use a public link instead."),
15636            SharePathError::AlreadyShared(inner) => write!(f, "Folder is already shared. Contains metadata about the existing shared folder: {:?}", inner),
15637            SharePathError::InvalidPath => f.write_str("Path is not valid."),
15638            SharePathError::IsOsxPackage => f.write_str("We do not support sharing a Mac OS X package."),
15639            SharePathError::InsideOsxPackage => f.write_str("We do not support sharing a folder inside a Mac OS X package."),
15640            SharePathError::IsVault => f.write_str("We do not support sharing the Vault folder."),
15641            SharePathError::IsVaultLocked => f.write_str("We do not support sharing a folder inside a locked Vault."),
15642            SharePathError::IsFamily => f.write_str("We do not support sharing the Family folder."),
15643            _ => write!(f, "{:?}", *self),
15644        }
15645    }
15646}
15647
15648#[derive(Debug, Clone, PartialEq, Eq)]
15649#[non_exhaustive] // variants may be added in the future
15650pub enum SharePathErrorBaseV2 {
15651    /// A file is at the specified path.
15652    IsFile,
15653    /// We do not support sharing a folder inside a shared folder.
15654    InsideSharedFolder,
15655    /// We do not support shared folders that contain shared folders.
15656    ContainsSharedFolder,
15657    /// We do not support shared folders that contain team folders.
15658    ContainsTeamFolder,
15659    /// We do not support sharing an app folder.
15660    IsAppFolder,
15661    /// We do not support sharing a folder inside an app folder.
15662    InsideAppFolder,
15663    /// A public folder can't be shared this way. Use a public link instead.
15664    IsPublicFolder,
15665    /// A folder inside a public folder can't be shared this way. Use a public link instead.
15666    InsidePublicFolder,
15667    /// Folder is already shared. Contains metadata about the existing shared folder.
15668    AlreadyShared(SharedFolderMetadata),
15669    /// Path is not valid.
15670    InvalidPath,
15671    /// We do not support sharing a Mac OS X package.
15672    IsOsxPackage,
15673    /// We do not support sharing a folder inside a Mac OS X package.
15674    InsideOsxPackage,
15675    /// We do not support sharing the Vault folder.
15676    IsVault,
15677    /// We do not support sharing a folder inside a locked Vault.
15678    IsVaultLocked,
15679    /// Catch-all used for unrecognized values returned from the server. Encountering this value
15680    /// typically indicates that this SDK version is out of date.
15681    Other,
15682}
15683
15684impl<'de> ::serde::de::Deserialize<'de> for SharePathErrorBaseV2 {
15685    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
15686        // union deserializer
15687        use serde::de::{self, MapAccess, Visitor};
15688        struct EnumVisitor;
15689        impl<'de> Visitor<'de> for EnumVisitor {
15690            type Value = SharePathErrorBaseV2;
15691            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
15692                f.write_str("a SharePathErrorBaseV2 structure")
15693            }
15694            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
15695                let tag: &str = match map.next_key()? {
15696                    Some(".tag") => map.next_value()?,
15697                    _ => return Err(de::Error::missing_field(".tag"))
15698                };
15699                let value = match tag {
15700                    "is_file" => SharePathErrorBaseV2::IsFile,
15701                    "inside_shared_folder" => SharePathErrorBaseV2::InsideSharedFolder,
15702                    "contains_shared_folder" => SharePathErrorBaseV2::ContainsSharedFolder,
15703                    "contains_team_folder" => SharePathErrorBaseV2::ContainsTeamFolder,
15704                    "is_app_folder" => SharePathErrorBaseV2::IsAppFolder,
15705                    "inside_app_folder" => SharePathErrorBaseV2::InsideAppFolder,
15706                    "is_public_folder" => SharePathErrorBaseV2::IsPublicFolder,
15707                    "inside_public_folder" => SharePathErrorBaseV2::InsidePublicFolder,
15708                    "already_shared" => SharePathErrorBaseV2::AlreadyShared(SharedFolderMetadata::internal_deserialize(&mut map)?),
15709                    "invalid_path" => SharePathErrorBaseV2::InvalidPath,
15710                    "is_osx_package" => SharePathErrorBaseV2::IsOsxPackage,
15711                    "inside_osx_package" => SharePathErrorBaseV2::InsideOsxPackage,
15712                    "is_vault" => SharePathErrorBaseV2::IsVault,
15713                    "is_vault_locked" => SharePathErrorBaseV2::IsVaultLocked,
15714                    _ => SharePathErrorBaseV2::Other,
15715                };
15716                crate::eat_json_fields(&mut map)?;
15717                Ok(value)
15718            }
15719        }
15720        const VARIANTS: &[&str] = &["is_file",
15721                                    "inside_shared_folder",
15722                                    "contains_shared_folder",
15723                                    "contains_team_folder",
15724                                    "is_app_folder",
15725                                    "inside_app_folder",
15726                                    "is_public_folder",
15727                                    "inside_public_folder",
15728                                    "already_shared",
15729                                    "invalid_path",
15730                                    "is_osx_package",
15731                                    "inside_osx_package",
15732                                    "is_vault",
15733                                    "is_vault_locked",
15734                                    "other"];
15735        deserializer.deserialize_struct("SharePathErrorBaseV2", VARIANTS, EnumVisitor)
15736    }
15737}
15738
15739impl ::serde::ser::Serialize for SharePathErrorBaseV2 {
15740    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
15741        // union serializer
15742        use serde::ser::SerializeStruct;
15743        match self {
15744            SharePathErrorBaseV2::IsFile => {
15745                // unit
15746                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 1)?;
15747                s.serialize_field(".tag", "is_file")?;
15748                s.end()
15749            }
15750            SharePathErrorBaseV2::InsideSharedFolder => {
15751                // unit
15752                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 1)?;
15753                s.serialize_field(".tag", "inside_shared_folder")?;
15754                s.end()
15755            }
15756            SharePathErrorBaseV2::ContainsSharedFolder => {
15757                // unit
15758                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 1)?;
15759                s.serialize_field(".tag", "contains_shared_folder")?;
15760                s.end()
15761            }
15762            SharePathErrorBaseV2::ContainsTeamFolder => {
15763                // unit
15764                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 1)?;
15765                s.serialize_field(".tag", "contains_team_folder")?;
15766                s.end()
15767            }
15768            SharePathErrorBaseV2::IsAppFolder => {
15769                // unit
15770                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 1)?;
15771                s.serialize_field(".tag", "is_app_folder")?;
15772                s.end()
15773            }
15774            SharePathErrorBaseV2::InsideAppFolder => {
15775                // unit
15776                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 1)?;
15777                s.serialize_field(".tag", "inside_app_folder")?;
15778                s.end()
15779            }
15780            SharePathErrorBaseV2::IsPublicFolder => {
15781                // unit
15782                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 1)?;
15783                s.serialize_field(".tag", "is_public_folder")?;
15784                s.end()
15785            }
15786            SharePathErrorBaseV2::InsidePublicFolder => {
15787                // unit
15788                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 1)?;
15789                s.serialize_field(".tag", "inside_public_folder")?;
15790                s.end()
15791            }
15792            SharePathErrorBaseV2::AlreadyShared(x) => {
15793                // struct
15794                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 19)?;
15795                s.serialize_field(".tag", "already_shared")?;
15796                x.internal_serialize::<S>(&mut s)?;
15797                s.end()
15798            }
15799            SharePathErrorBaseV2::InvalidPath => {
15800                // unit
15801                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 1)?;
15802                s.serialize_field(".tag", "invalid_path")?;
15803                s.end()
15804            }
15805            SharePathErrorBaseV2::IsOsxPackage => {
15806                // unit
15807                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 1)?;
15808                s.serialize_field(".tag", "is_osx_package")?;
15809                s.end()
15810            }
15811            SharePathErrorBaseV2::InsideOsxPackage => {
15812                // unit
15813                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 1)?;
15814                s.serialize_field(".tag", "inside_osx_package")?;
15815                s.end()
15816            }
15817            SharePathErrorBaseV2::IsVault => {
15818                // unit
15819                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 1)?;
15820                s.serialize_field(".tag", "is_vault")?;
15821                s.end()
15822            }
15823            SharePathErrorBaseV2::IsVaultLocked => {
15824                // unit
15825                let mut s = serializer.serialize_struct("SharePathErrorBaseV2", 1)?;
15826                s.serialize_field(".tag", "is_vault_locked")?;
15827                s.end()
15828            }
15829            SharePathErrorBaseV2::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
15830        }
15831    }
15832}
15833
15834#[derive(Debug, Clone, PartialEq, Eq)]
15835#[non_exhaustive] // variants may be added in the future
15836pub enum SharePathErrorV2 {
15837    /// A file is at the specified path.
15838    IsFile,
15839    /// We do not support sharing a folder inside a shared folder.
15840    InsideSharedFolder,
15841    /// We do not support shared folders that contain shared folders.
15842    ContainsSharedFolder,
15843    /// We do not support shared folders that contain team folders.
15844    ContainsTeamFolder,
15845    /// We do not support sharing an app folder.
15846    IsAppFolder,
15847    /// We do not support sharing a folder inside an app folder.
15848    InsideAppFolder,
15849    /// A public folder can't be shared this way. Use a public link instead.
15850    IsPublicFolder,
15851    /// A folder inside a public folder can't be shared this way. Use a public link instead.
15852    InsidePublicFolder,
15853    /// Folder is already shared. Contains metadata about the existing shared folder.
15854    AlreadyShared(SharedFolderMetadata),
15855    /// Path is not valid.
15856    InvalidPath,
15857    /// We do not support sharing a Mac OS X package.
15858    IsOsxPackage,
15859    /// We do not support sharing a folder inside a Mac OS X package.
15860    InsideOsxPackage,
15861    /// We do not support sharing the Vault folder.
15862    IsVault,
15863    /// We do not support sharing a folder inside a locked Vault.
15864    IsVaultLocked,
15865    /// We do not support sharing the Family folder.
15866    IsFamily,
15867    /// We do not support shared folders that contain app folders.
15868    ContainsAppFolder,
15869    /// Catch-all used for unrecognized values returned from the server. Encountering this value
15870    /// typically indicates that this SDK version is out of date.
15871    Other,
15872}
15873
15874impl<'de> ::serde::de::Deserialize<'de> for SharePathErrorV2 {
15875    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
15876        // union deserializer
15877        use serde::de::{self, MapAccess, Visitor};
15878        struct EnumVisitor;
15879        impl<'de> Visitor<'de> for EnumVisitor {
15880            type Value = SharePathErrorV2;
15881            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
15882                f.write_str("a SharePathErrorV2 structure")
15883            }
15884            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
15885                let tag: &str = match map.next_key()? {
15886                    Some(".tag") => map.next_value()?,
15887                    _ => return Err(de::Error::missing_field(".tag"))
15888                };
15889                let value = match tag {
15890                    "is_file" => SharePathErrorV2::IsFile,
15891                    "inside_shared_folder" => SharePathErrorV2::InsideSharedFolder,
15892                    "contains_shared_folder" => SharePathErrorV2::ContainsSharedFolder,
15893                    "contains_team_folder" => SharePathErrorV2::ContainsTeamFolder,
15894                    "is_app_folder" => SharePathErrorV2::IsAppFolder,
15895                    "inside_app_folder" => SharePathErrorV2::InsideAppFolder,
15896                    "is_public_folder" => SharePathErrorV2::IsPublicFolder,
15897                    "inside_public_folder" => SharePathErrorV2::InsidePublicFolder,
15898                    "already_shared" => SharePathErrorV2::AlreadyShared(SharedFolderMetadata::internal_deserialize(&mut map)?),
15899                    "invalid_path" => SharePathErrorV2::InvalidPath,
15900                    "is_osx_package" => SharePathErrorV2::IsOsxPackage,
15901                    "inside_osx_package" => SharePathErrorV2::InsideOsxPackage,
15902                    "is_vault" => SharePathErrorV2::IsVault,
15903                    "is_vault_locked" => SharePathErrorV2::IsVaultLocked,
15904                    "is_family" => SharePathErrorV2::IsFamily,
15905                    "contains_app_folder" => SharePathErrorV2::ContainsAppFolder,
15906                    _ => SharePathErrorV2::Other,
15907                };
15908                crate::eat_json_fields(&mut map)?;
15909                Ok(value)
15910            }
15911        }
15912        const VARIANTS: &[&str] = &["is_file",
15913                                    "inside_shared_folder",
15914                                    "contains_shared_folder",
15915                                    "contains_team_folder",
15916                                    "is_app_folder",
15917                                    "inside_app_folder",
15918                                    "is_public_folder",
15919                                    "inside_public_folder",
15920                                    "already_shared",
15921                                    "invalid_path",
15922                                    "is_osx_package",
15923                                    "inside_osx_package",
15924                                    "is_vault",
15925                                    "is_vault_locked",
15926                                    "other",
15927                                    "is_family",
15928                                    "contains_app_folder"];
15929        deserializer.deserialize_struct("SharePathErrorV2", VARIANTS, EnumVisitor)
15930    }
15931}
15932
15933impl ::serde::ser::Serialize for SharePathErrorV2 {
15934    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
15935        // union serializer
15936        use serde::ser::SerializeStruct;
15937        match self {
15938            SharePathErrorV2::IsFile => {
15939                // unit
15940                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
15941                s.serialize_field(".tag", "is_file")?;
15942                s.end()
15943            }
15944            SharePathErrorV2::InsideSharedFolder => {
15945                // unit
15946                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
15947                s.serialize_field(".tag", "inside_shared_folder")?;
15948                s.end()
15949            }
15950            SharePathErrorV2::ContainsSharedFolder => {
15951                // unit
15952                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
15953                s.serialize_field(".tag", "contains_shared_folder")?;
15954                s.end()
15955            }
15956            SharePathErrorV2::ContainsTeamFolder => {
15957                // unit
15958                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
15959                s.serialize_field(".tag", "contains_team_folder")?;
15960                s.end()
15961            }
15962            SharePathErrorV2::IsAppFolder => {
15963                // unit
15964                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
15965                s.serialize_field(".tag", "is_app_folder")?;
15966                s.end()
15967            }
15968            SharePathErrorV2::InsideAppFolder => {
15969                // unit
15970                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
15971                s.serialize_field(".tag", "inside_app_folder")?;
15972                s.end()
15973            }
15974            SharePathErrorV2::IsPublicFolder => {
15975                // unit
15976                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
15977                s.serialize_field(".tag", "is_public_folder")?;
15978                s.end()
15979            }
15980            SharePathErrorV2::InsidePublicFolder => {
15981                // unit
15982                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
15983                s.serialize_field(".tag", "inside_public_folder")?;
15984                s.end()
15985            }
15986            SharePathErrorV2::AlreadyShared(x) => {
15987                // struct
15988                let mut s = serializer.serialize_struct("SharePathErrorV2", 19)?;
15989                s.serialize_field(".tag", "already_shared")?;
15990                x.internal_serialize::<S>(&mut s)?;
15991                s.end()
15992            }
15993            SharePathErrorV2::InvalidPath => {
15994                // unit
15995                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
15996                s.serialize_field(".tag", "invalid_path")?;
15997                s.end()
15998            }
15999            SharePathErrorV2::IsOsxPackage => {
16000                // unit
16001                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
16002                s.serialize_field(".tag", "is_osx_package")?;
16003                s.end()
16004            }
16005            SharePathErrorV2::InsideOsxPackage => {
16006                // unit
16007                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
16008                s.serialize_field(".tag", "inside_osx_package")?;
16009                s.end()
16010            }
16011            SharePathErrorV2::IsVault => {
16012                // unit
16013                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
16014                s.serialize_field(".tag", "is_vault")?;
16015                s.end()
16016            }
16017            SharePathErrorV2::IsVaultLocked => {
16018                // unit
16019                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
16020                s.serialize_field(".tag", "is_vault_locked")?;
16021                s.end()
16022            }
16023            SharePathErrorV2::IsFamily => {
16024                // unit
16025                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
16026                s.serialize_field(".tag", "is_family")?;
16027                s.end()
16028            }
16029            SharePathErrorV2::ContainsAppFolder => {
16030                // unit
16031                let mut s = serializer.serialize_struct("SharePathErrorV2", 1)?;
16032                s.serialize_field(".tag", "contains_app_folder")?;
16033                s.end()
16034            }
16035            SharePathErrorV2::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
16036        }
16037    }
16038}
16039
16040// union extends SharePathErrorBaseV2
16041impl From<SharePathErrorBaseV2> for SharePathErrorV2 {
16042    fn from(parent: SharePathErrorBaseV2) -> Self {
16043        match parent {
16044            SharePathErrorBaseV2::IsFile => SharePathErrorV2::IsFile,
16045            SharePathErrorBaseV2::InsideSharedFolder => SharePathErrorV2::InsideSharedFolder,
16046            SharePathErrorBaseV2::ContainsSharedFolder => SharePathErrorV2::ContainsSharedFolder,
16047            SharePathErrorBaseV2::ContainsTeamFolder => SharePathErrorV2::ContainsTeamFolder,
16048            SharePathErrorBaseV2::IsAppFolder => SharePathErrorV2::IsAppFolder,
16049            SharePathErrorBaseV2::InsideAppFolder => SharePathErrorV2::InsideAppFolder,
16050            SharePathErrorBaseV2::IsPublicFolder => SharePathErrorV2::IsPublicFolder,
16051            SharePathErrorBaseV2::InsidePublicFolder => SharePathErrorV2::InsidePublicFolder,
16052            SharePathErrorBaseV2::AlreadyShared(x) => SharePathErrorV2::AlreadyShared(x),
16053            SharePathErrorBaseV2::InvalidPath => SharePathErrorV2::InvalidPath,
16054            SharePathErrorBaseV2::IsOsxPackage => SharePathErrorV2::IsOsxPackage,
16055            SharePathErrorBaseV2::InsideOsxPackage => SharePathErrorV2::InsideOsxPackage,
16056            SharePathErrorBaseV2::IsVault => SharePathErrorV2::IsVault,
16057            SharePathErrorBaseV2::IsVaultLocked => SharePathErrorV2::IsVaultLocked,
16058            SharePathErrorBaseV2::Other => SharePathErrorV2::Other,
16059        }
16060    }
16061}
16062/// Metadata of a shared link for a file or folder.
16063#[derive(Debug, Clone, PartialEq, Eq)]
16064#[non_exhaustive] // structs may have more fields added in the future.
16065pub struct SharedContentLinkMetadata {
16066    /// The audience options that are available for the content. Some audience options may be
16067    /// unavailable. For example, team_only may be unavailable if the content is not owned by a user
16068    /// on a team. The 'default' audience option is always available if the user can modify link
16069    /// settings.
16070    pub audience_options: Vec<LinkAudience>,
16071    /// The current audience of the link.
16072    pub current_audience: LinkAudience,
16073    /// A list of permissions for actions you can perform on the link.
16074    pub link_permissions: Vec<LinkPermission>,
16075    /// Whether the link is protected by a password.
16076    pub password_protected: bool,
16077    /// The URL of the link.
16078    pub url: String,
16079    /// The access level on the link for this file.
16080    pub access_level: Option<AccessLevel>,
16081    /// The shared folder that prevents the link audience for this link from being more restrictive.
16082    pub audience_restricting_shared_folder: Option<AudienceRestrictingSharedFolder>,
16083    /// Whether the link has an expiry set on it. A link with an expiry will have its audience
16084    /// changed to members when the expiry is reached.
16085    pub expiry: Option<crate::types::common::DropboxTimestamp>,
16086    /// The content inside this folder with link audience different than this folder's. This is only
16087    /// returned when an endpoint that returns metadata for a single shared folder is called, e.g.
16088    /// /get_folder_metadata.
16089    pub audience_exceptions: Option<AudienceExceptions>,
16090}
16091
16092impl SharedContentLinkMetadata {
16093    pub fn new(
16094        audience_options: Vec<LinkAudience>,
16095        current_audience: LinkAudience,
16096        link_permissions: Vec<LinkPermission>,
16097        password_protected: bool,
16098        url: String,
16099    ) -> Self {
16100        SharedContentLinkMetadata {
16101            audience_options,
16102            current_audience,
16103            link_permissions,
16104            password_protected,
16105            url,
16106            access_level: None,
16107            audience_restricting_shared_folder: None,
16108            expiry: None,
16109            audience_exceptions: None,
16110        }
16111    }
16112
16113    pub fn with_access_level(mut self, value: AccessLevel) -> Self {
16114        self.access_level = Some(value);
16115        self
16116    }
16117
16118    pub fn with_audience_restricting_shared_folder(
16119        mut self,
16120        value: AudienceRestrictingSharedFolder,
16121    ) -> Self {
16122        self.audience_restricting_shared_folder = Some(value);
16123        self
16124    }
16125
16126    pub fn with_expiry(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
16127        self.expiry = Some(value);
16128        self
16129    }
16130
16131    pub fn with_audience_exceptions(mut self, value: AudienceExceptions) -> Self {
16132        self.audience_exceptions = Some(value);
16133        self
16134    }
16135}
16136
16137const SHARED_CONTENT_LINK_METADATA_FIELDS: &[&str] = &["audience_options",
16138                                                       "current_audience",
16139                                                       "link_permissions",
16140                                                       "password_protected",
16141                                                       "url",
16142                                                       "access_level",
16143                                                       "audience_restricting_shared_folder",
16144                                                       "expiry",
16145                                                       "audience_exceptions"];
16146impl SharedContentLinkMetadata {
16147    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
16148        map: V,
16149    ) -> Result<SharedContentLinkMetadata, V::Error> {
16150        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
16151    }
16152
16153    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
16154        mut map: V,
16155        optional: bool,
16156    ) -> Result<Option<SharedContentLinkMetadata>, V::Error> {
16157        let mut field_audience_options = None;
16158        let mut field_current_audience = None;
16159        let mut field_link_permissions = None;
16160        let mut field_password_protected = None;
16161        let mut field_url = None;
16162        let mut field_access_level = None;
16163        let mut field_audience_restricting_shared_folder = None;
16164        let mut field_expiry = None;
16165        let mut field_audience_exceptions = None;
16166        let mut nothing = true;
16167        while let Some(key) = map.next_key::<&str>()? {
16168            nothing = false;
16169            match key {
16170                "audience_options" => {
16171                    if field_audience_options.is_some() {
16172                        return Err(::serde::de::Error::duplicate_field("audience_options"));
16173                    }
16174                    field_audience_options = Some(map.next_value()?);
16175                }
16176                "current_audience" => {
16177                    if field_current_audience.is_some() {
16178                        return Err(::serde::de::Error::duplicate_field("current_audience"));
16179                    }
16180                    field_current_audience = Some(map.next_value()?);
16181                }
16182                "link_permissions" => {
16183                    if field_link_permissions.is_some() {
16184                        return Err(::serde::de::Error::duplicate_field("link_permissions"));
16185                    }
16186                    field_link_permissions = Some(map.next_value()?);
16187                }
16188                "password_protected" => {
16189                    if field_password_protected.is_some() {
16190                        return Err(::serde::de::Error::duplicate_field("password_protected"));
16191                    }
16192                    field_password_protected = Some(map.next_value()?);
16193                }
16194                "url" => {
16195                    if field_url.is_some() {
16196                        return Err(::serde::de::Error::duplicate_field("url"));
16197                    }
16198                    field_url = Some(map.next_value()?);
16199                }
16200                "access_level" => {
16201                    if field_access_level.is_some() {
16202                        return Err(::serde::de::Error::duplicate_field("access_level"));
16203                    }
16204                    field_access_level = Some(map.next_value()?);
16205                }
16206                "audience_restricting_shared_folder" => {
16207                    if field_audience_restricting_shared_folder.is_some() {
16208                        return Err(::serde::de::Error::duplicate_field("audience_restricting_shared_folder"));
16209                    }
16210                    field_audience_restricting_shared_folder = Some(map.next_value()?);
16211                }
16212                "expiry" => {
16213                    if field_expiry.is_some() {
16214                        return Err(::serde::de::Error::duplicate_field("expiry"));
16215                    }
16216                    field_expiry = Some(map.next_value()?);
16217                }
16218                "audience_exceptions" => {
16219                    if field_audience_exceptions.is_some() {
16220                        return Err(::serde::de::Error::duplicate_field("audience_exceptions"));
16221                    }
16222                    field_audience_exceptions = Some(map.next_value()?);
16223                }
16224                _ => {
16225                    // unknown field allowed and ignored
16226                    map.next_value::<::serde_json::Value>()?;
16227                }
16228            }
16229        }
16230        if optional && nothing {
16231            return Ok(None);
16232        }
16233        let result = SharedContentLinkMetadata {
16234            audience_options: field_audience_options.ok_or_else(|| ::serde::de::Error::missing_field("audience_options"))?,
16235            current_audience: field_current_audience.ok_or_else(|| ::serde::de::Error::missing_field("current_audience"))?,
16236            link_permissions: field_link_permissions.ok_or_else(|| ::serde::de::Error::missing_field("link_permissions"))?,
16237            password_protected: field_password_protected.ok_or_else(|| ::serde::de::Error::missing_field("password_protected"))?,
16238            url: field_url.ok_or_else(|| ::serde::de::Error::missing_field("url"))?,
16239            access_level: field_access_level.and_then(Option::flatten),
16240            audience_restricting_shared_folder: field_audience_restricting_shared_folder.and_then(Option::flatten),
16241            expiry: field_expiry.and_then(Option::flatten),
16242            audience_exceptions: field_audience_exceptions.and_then(Option::flatten),
16243        };
16244        Ok(Some(result))
16245    }
16246
16247    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
16248        &self,
16249        s: &mut S::SerializeStruct,
16250    ) -> Result<(), S::Error> {
16251        use serde::ser::SerializeStruct;
16252        s.serialize_field("audience_options", &self.audience_options)?;
16253        s.serialize_field("current_audience", &self.current_audience)?;
16254        s.serialize_field("link_permissions", &self.link_permissions)?;
16255        s.serialize_field("password_protected", &self.password_protected)?;
16256        s.serialize_field("url", &self.url)?;
16257        if let Some(val) = &self.access_level {
16258            s.serialize_field("access_level", val)?;
16259        }
16260        if let Some(val) = &self.audience_restricting_shared_folder {
16261            s.serialize_field("audience_restricting_shared_folder", val)?;
16262        }
16263        if let Some(val) = &self.expiry {
16264            s.serialize_field("expiry", val)?;
16265        }
16266        if let Some(val) = &self.audience_exceptions {
16267            s.serialize_field("audience_exceptions", val)?;
16268        }
16269        Ok(())
16270    }
16271}
16272
16273impl<'de> ::serde::de::Deserialize<'de> for SharedContentLinkMetadata {
16274    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
16275        // struct deserializer
16276        use serde::de::{MapAccess, Visitor};
16277        struct StructVisitor;
16278        impl<'de> Visitor<'de> for StructVisitor {
16279            type Value = SharedContentLinkMetadata;
16280            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
16281                f.write_str("a SharedContentLinkMetadata struct")
16282            }
16283            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
16284                SharedContentLinkMetadata::internal_deserialize(map)
16285            }
16286        }
16287        deserializer.deserialize_struct("SharedContentLinkMetadata", SHARED_CONTENT_LINK_METADATA_FIELDS, StructVisitor)
16288    }
16289}
16290
16291impl ::serde::ser::Serialize for SharedContentLinkMetadata {
16292    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
16293        // struct serializer
16294        use serde::ser::SerializeStruct;
16295        let mut s = serializer.serialize_struct("SharedContentLinkMetadata", 9)?;
16296        self.internal_serialize::<S>(&mut s)?;
16297        s.end()
16298    }
16299}
16300
16301// struct extends SharedContentLinkMetadataBase
16302impl From<SharedContentLinkMetadata> for SharedContentLinkMetadataBase {
16303    fn from(subtype: SharedContentLinkMetadata) -> Self {
16304        Self {
16305            audience_options: subtype.audience_options,
16306            current_audience: subtype.current_audience,
16307            link_permissions: subtype.link_permissions,
16308            password_protected: subtype.password_protected,
16309            access_level: subtype.access_level,
16310            audience_restricting_shared_folder: subtype.audience_restricting_shared_folder,
16311            expiry: subtype.expiry,
16312        }
16313    }
16314}
16315#[derive(Debug, Clone, PartialEq, Eq)]
16316#[non_exhaustive] // structs may have more fields added in the future.
16317pub struct SharedContentLinkMetadataBase {
16318    /// The audience options that are available for the content. Some audience options may be
16319    /// unavailable. For example, team_only may be unavailable if the content is not owned by a user
16320    /// on a team. The 'default' audience option is always available if the user can modify link
16321    /// settings.
16322    pub audience_options: Vec<LinkAudience>,
16323    /// The current audience of the link.
16324    pub current_audience: LinkAudience,
16325    /// A list of permissions for actions you can perform on the link.
16326    pub link_permissions: Vec<LinkPermission>,
16327    /// Whether the link is protected by a password.
16328    pub password_protected: bool,
16329    /// The access level on the link for this file.
16330    pub access_level: Option<AccessLevel>,
16331    /// The shared folder that prevents the link audience for this link from being more restrictive.
16332    pub audience_restricting_shared_folder: Option<AudienceRestrictingSharedFolder>,
16333    /// Whether the link has an expiry set on it. A link with an expiry will have its audience
16334    /// changed to members when the expiry is reached.
16335    pub expiry: Option<crate::types::common::DropboxTimestamp>,
16336}
16337
16338impl SharedContentLinkMetadataBase {
16339    pub fn new(
16340        audience_options: Vec<LinkAudience>,
16341        current_audience: LinkAudience,
16342        link_permissions: Vec<LinkPermission>,
16343        password_protected: bool,
16344    ) -> Self {
16345        SharedContentLinkMetadataBase {
16346            audience_options,
16347            current_audience,
16348            link_permissions,
16349            password_protected,
16350            access_level: None,
16351            audience_restricting_shared_folder: None,
16352            expiry: None,
16353        }
16354    }
16355
16356    pub fn with_access_level(mut self, value: AccessLevel) -> Self {
16357        self.access_level = Some(value);
16358        self
16359    }
16360
16361    pub fn with_audience_restricting_shared_folder(
16362        mut self,
16363        value: AudienceRestrictingSharedFolder,
16364    ) -> Self {
16365        self.audience_restricting_shared_folder = Some(value);
16366        self
16367    }
16368
16369    pub fn with_expiry(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
16370        self.expiry = Some(value);
16371        self
16372    }
16373}
16374
16375const SHARED_CONTENT_LINK_METADATA_BASE_FIELDS: &[&str] = &["audience_options",
16376                                                            "current_audience",
16377                                                            "link_permissions",
16378                                                            "password_protected",
16379                                                            "access_level",
16380                                                            "audience_restricting_shared_folder",
16381                                                            "expiry"];
16382impl SharedContentLinkMetadataBase {
16383    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
16384        map: V,
16385    ) -> Result<SharedContentLinkMetadataBase, V::Error> {
16386        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
16387    }
16388
16389    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
16390        mut map: V,
16391        optional: bool,
16392    ) -> Result<Option<SharedContentLinkMetadataBase>, V::Error> {
16393        let mut field_audience_options = None;
16394        let mut field_current_audience = None;
16395        let mut field_link_permissions = None;
16396        let mut field_password_protected = None;
16397        let mut field_access_level = None;
16398        let mut field_audience_restricting_shared_folder = None;
16399        let mut field_expiry = None;
16400        let mut nothing = true;
16401        while let Some(key) = map.next_key::<&str>()? {
16402            nothing = false;
16403            match key {
16404                "audience_options" => {
16405                    if field_audience_options.is_some() {
16406                        return Err(::serde::de::Error::duplicate_field("audience_options"));
16407                    }
16408                    field_audience_options = Some(map.next_value()?);
16409                }
16410                "current_audience" => {
16411                    if field_current_audience.is_some() {
16412                        return Err(::serde::de::Error::duplicate_field("current_audience"));
16413                    }
16414                    field_current_audience = Some(map.next_value()?);
16415                }
16416                "link_permissions" => {
16417                    if field_link_permissions.is_some() {
16418                        return Err(::serde::de::Error::duplicate_field("link_permissions"));
16419                    }
16420                    field_link_permissions = Some(map.next_value()?);
16421                }
16422                "password_protected" => {
16423                    if field_password_protected.is_some() {
16424                        return Err(::serde::de::Error::duplicate_field("password_protected"));
16425                    }
16426                    field_password_protected = Some(map.next_value()?);
16427                }
16428                "access_level" => {
16429                    if field_access_level.is_some() {
16430                        return Err(::serde::de::Error::duplicate_field("access_level"));
16431                    }
16432                    field_access_level = Some(map.next_value()?);
16433                }
16434                "audience_restricting_shared_folder" => {
16435                    if field_audience_restricting_shared_folder.is_some() {
16436                        return Err(::serde::de::Error::duplicate_field("audience_restricting_shared_folder"));
16437                    }
16438                    field_audience_restricting_shared_folder = Some(map.next_value()?);
16439                }
16440                "expiry" => {
16441                    if field_expiry.is_some() {
16442                        return Err(::serde::de::Error::duplicate_field("expiry"));
16443                    }
16444                    field_expiry = Some(map.next_value()?);
16445                }
16446                _ => {
16447                    // unknown field allowed and ignored
16448                    map.next_value::<::serde_json::Value>()?;
16449                }
16450            }
16451        }
16452        if optional && nothing {
16453            return Ok(None);
16454        }
16455        let result = SharedContentLinkMetadataBase {
16456            audience_options: field_audience_options.ok_or_else(|| ::serde::de::Error::missing_field("audience_options"))?,
16457            current_audience: field_current_audience.ok_or_else(|| ::serde::de::Error::missing_field("current_audience"))?,
16458            link_permissions: field_link_permissions.ok_or_else(|| ::serde::de::Error::missing_field("link_permissions"))?,
16459            password_protected: field_password_protected.ok_or_else(|| ::serde::de::Error::missing_field("password_protected"))?,
16460            access_level: field_access_level.and_then(Option::flatten),
16461            audience_restricting_shared_folder: field_audience_restricting_shared_folder.and_then(Option::flatten),
16462            expiry: field_expiry.and_then(Option::flatten),
16463        };
16464        Ok(Some(result))
16465    }
16466
16467    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
16468        &self,
16469        s: &mut S::SerializeStruct,
16470    ) -> Result<(), S::Error> {
16471        use serde::ser::SerializeStruct;
16472        s.serialize_field("audience_options", &self.audience_options)?;
16473        s.serialize_field("current_audience", &self.current_audience)?;
16474        s.serialize_field("link_permissions", &self.link_permissions)?;
16475        s.serialize_field("password_protected", &self.password_protected)?;
16476        if let Some(val) = &self.access_level {
16477            s.serialize_field("access_level", val)?;
16478        }
16479        if let Some(val) = &self.audience_restricting_shared_folder {
16480            s.serialize_field("audience_restricting_shared_folder", val)?;
16481        }
16482        if let Some(val) = &self.expiry {
16483            s.serialize_field("expiry", val)?;
16484        }
16485        Ok(())
16486    }
16487}
16488
16489impl<'de> ::serde::de::Deserialize<'de> for SharedContentLinkMetadataBase {
16490    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
16491        // struct deserializer
16492        use serde::de::{MapAccess, Visitor};
16493        struct StructVisitor;
16494        impl<'de> Visitor<'de> for StructVisitor {
16495            type Value = SharedContentLinkMetadataBase;
16496            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
16497                f.write_str("a SharedContentLinkMetadataBase struct")
16498            }
16499            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
16500                SharedContentLinkMetadataBase::internal_deserialize(map)
16501            }
16502        }
16503        deserializer.deserialize_struct("SharedContentLinkMetadataBase", SHARED_CONTENT_LINK_METADATA_BASE_FIELDS, StructVisitor)
16504    }
16505}
16506
16507impl ::serde::ser::Serialize for SharedContentLinkMetadataBase {
16508    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
16509        // struct serializer
16510        use serde::ser::SerializeStruct;
16511        let mut s = serializer.serialize_struct("SharedContentLinkMetadataBase", 7)?;
16512        self.internal_serialize::<S>(&mut s)?;
16513        s.end()
16514    }
16515}
16516
16517/// Shared file user, group, and invitee membership. Used for the results of
16518/// [`list_file_members()`](crate::sharing::list_file_members) and
16519/// [`list_file_members_continue()`](crate::sharing::list_file_members_continue), and used as part
16520/// of the results for [`list_file_members_batch()`](crate::sharing::list_file_members_batch).
16521#[derive(Debug, Clone, PartialEq, Eq)]
16522#[non_exhaustive] // structs may have more fields added in the future.
16523pub struct SharedFileMembers {
16524    /// The list of user members of the shared file.
16525    pub users: Vec<UserFileMembershipInfo>,
16526    /// The list of group members of the shared file.
16527    pub groups: Vec<GroupMembershipInfo>,
16528    /// The list of invited members of a file, but have not logged in and claimed this.
16529    pub invitees: Vec<InviteeMembershipInfo>,
16530    /// Present if there are additional shared file members that have not been returned yet. Pass
16531    /// the cursor into [`list_file_members_continue()`](crate::sharing::list_file_members_continue)
16532    /// to list additional members.
16533    pub cursor: Option<String>,
16534}
16535
16536impl SharedFileMembers {
16537    pub fn new(
16538        users: Vec<UserFileMembershipInfo>,
16539        groups: Vec<GroupMembershipInfo>,
16540        invitees: Vec<InviteeMembershipInfo>,
16541    ) -> Self {
16542        SharedFileMembers {
16543            users,
16544            groups,
16545            invitees,
16546            cursor: None,
16547        }
16548    }
16549
16550    pub fn with_cursor(mut self, value: String) -> Self {
16551        self.cursor = Some(value);
16552        self
16553    }
16554}
16555
16556const SHARED_FILE_MEMBERS_FIELDS: &[&str] = &["users",
16557                                              "groups",
16558                                              "invitees",
16559                                              "cursor"];
16560impl SharedFileMembers {
16561    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
16562        map: V,
16563    ) -> Result<SharedFileMembers, V::Error> {
16564        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
16565    }
16566
16567    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
16568        mut map: V,
16569        optional: bool,
16570    ) -> Result<Option<SharedFileMembers>, V::Error> {
16571        let mut field_users = None;
16572        let mut field_groups = None;
16573        let mut field_invitees = None;
16574        let mut field_cursor = None;
16575        let mut nothing = true;
16576        while let Some(key) = map.next_key::<&str>()? {
16577            nothing = false;
16578            match key {
16579                "users" => {
16580                    if field_users.is_some() {
16581                        return Err(::serde::de::Error::duplicate_field("users"));
16582                    }
16583                    field_users = Some(map.next_value()?);
16584                }
16585                "groups" => {
16586                    if field_groups.is_some() {
16587                        return Err(::serde::de::Error::duplicate_field("groups"));
16588                    }
16589                    field_groups = Some(map.next_value()?);
16590                }
16591                "invitees" => {
16592                    if field_invitees.is_some() {
16593                        return Err(::serde::de::Error::duplicate_field("invitees"));
16594                    }
16595                    field_invitees = Some(map.next_value()?);
16596                }
16597                "cursor" => {
16598                    if field_cursor.is_some() {
16599                        return Err(::serde::de::Error::duplicate_field("cursor"));
16600                    }
16601                    field_cursor = Some(map.next_value()?);
16602                }
16603                _ => {
16604                    // unknown field allowed and ignored
16605                    map.next_value::<::serde_json::Value>()?;
16606                }
16607            }
16608        }
16609        if optional && nothing {
16610            return Ok(None);
16611        }
16612        let result = SharedFileMembers {
16613            users: field_users.ok_or_else(|| ::serde::de::Error::missing_field("users"))?,
16614            groups: field_groups.ok_or_else(|| ::serde::de::Error::missing_field("groups"))?,
16615            invitees: field_invitees.ok_or_else(|| ::serde::de::Error::missing_field("invitees"))?,
16616            cursor: field_cursor.and_then(Option::flatten),
16617        };
16618        Ok(Some(result))
16619    }
16620
16621    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
16622        &self,
16623        s: &mut S::SerializeStruct,
16624    ) -> Result<(), S::Error> {
16625        use serde::ser::SerializeStruct;
16626        s.serialize_field("users", &self.users)?;
16627        s.serialize_field("groups", &self.groups)?;
16628        s.serialize_field("invitees", &self.invitees)?;
16629        if let Some(val) = &self.cursor {
16630            s.serialize_field("cursor", val)?;
16631        }
16632        Ok(())
16633    }
16634}
16635
16636impl<'de> ::serde::de::Deserialize<'de> for SharedFileMembers {
16637    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
16638        // struct deserializer
16639        use serde::de::{MapAccess, Visitor};
16640        struct StructVisitor;
16641        impl<'de> Visitor<'de> for StructVisitor {
16642            type Value = SharedFileMembers;
16643            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
16644                f.write_str("a SharedFileMembers struct")
16645            }
16646            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
16647                SharedFileMembers::internal_deserialize(map)
16648            }
16649        }
16650        deserializer.deserialize_struct("SharedFileMembers", SHARED_FILE_MEMBERS_FIELDS, StructVisitor)
16651    }
16652}
16653
16654impl ::serde::ser::Serialize for SharedFileMembers {
16655    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
16656        // struct serializer
16657        use serde::ser::SerializeStruct;
16658        let mut s = serializer.serialize_struct("SharedFileMembers", 4)?;
16659        self.internal_serialize::<S>(&mut s)?;
16660        s.end()
16661    }
16662}
16663
16664/// Properties of the shared file.
16665#[derive(Debug, Clone, PartialEq, Eq)]
16666#[non_exhaustive] // structs may have more fields added in the future.
16667pub struct SharedFileMetadata {
16668    /// The ID of the file.
16669    pub id: crate::types::files::FileId,
16670    /// The name of this file.
16671    pub name: String,
16672    /// Policies governing this shared file.
16673    pub policy: FolderPolicy,
16674    /// URL for displaying a web preview of the shared file.
16675    pub preview_url: String,
16676    /// The current user's access level for this shared file.
16677    pub access_type: Option<AccessLevel>,
16678    /// The expected metadata of the link associated for the file when it is first shared. Absent if
16679    /// the link already exists. This is for an unreleased feature so it may not be returned yet.
16680    pub expected_link_metadata: Option<ExpectedSharedContentLinkMetadata>,
16681    /// The metadata of the link associated for the file. This is for an unreleased feature so it
16682    /// may not be returned yet.
16683    pub link_metadata: Option<SharedContentLinkMetadata>,
16684    /// The display names of the users that own the file. If the file is part of a team folder, the
16685    /// display names of the team admins are also included. Absent if the owner display names cannot
16686    /// be fetched.
16687    pub owner_display_names: Option<Vec<String>>,
16688    /// The team that owns the file. This field is not present if the file is not owned by a team.
16689    pub owner_team: Option<crate::types::users::Team>,
16690    /// The ID of the parent shared folder. This field is present only if the file is contained
16691    /// within a shared folder.
16692    pub parent_shared_folder_id: Option<crate::types::common::SharedFolderId>,
16693    /// The cased path to be used for display purposes only. In rare instances the casing will not
16694    /// correctly match the user's filesystem, but this behavior will match the path provided in the
16695    /// Core API v1. Absent for unmounted files.
16696    pub path_display: Option<String>,
16697    /// The lower-case full path of this file. Absent for unmounted files.
16698    pub path_lower: Option<String>,
16699    /// The sharing permissions that requesting user has on this file. This corresponds to the
16700    /// entries given in [`GetFileMetadataBatchArg::actions`](GetFileMetadataBatchArg) or
16701    /// [`GetFileMetadataArg::actions`](GetFileMetadataArg).
16702    pub permissions: Option<Vec<FilePermission>>,
16703    /// Timestamp indicating when the current user was invited to this shared file. If the user was
16704    /// not invited to the shared file, the timestamp will indicate when the user was invited to the
16705    /// parent shared folder. This value may be absent.
16706    pub time_invited: Option<crate::types::common::DropboxTimestamp>,
16707}
16708
16709impl SharedFileMetadata {
16710    pub fn new(
16711        id: crate::types::files::FileId,
16712        name: String,
16713        policy: FolderPolicy,
16714        preview_url: String,
16715    ) -> Self {
16716        SharedFileMetadata {
16717            id,
16718            name,
16719            policy,
16720            preview_url,
16721            access_type: None,
16722            expected_link_metadata: None,
16723            link_metadata: None,
16724            owner_display_names: None,
16725            owner_team: None,
16726            parent_shared_folder_id: None,
16727            path_display: None,
16728            path_lower: None,
16729            permissions: None,
16730            time_invited: None,
16731        }
16732    }
16733
16734    pub fn with_access_type(mut self, value: AccessLevel) -> Self {
16735        self.access_type = Some(value);
16736        self
16737    }
16738
16739    pub fn with_expected_link_metadata(
16740        mut self,
16741        value: ExpectedSharedContentLinkMetadata,
16742    ) -> Self {
16743        self.expected_link_metadata = Some(value);
16744        self
16745    }
16746
16747    pub fn with_link_metadata(mut self, value: SharedContentLinkMetadata) -> Self {
16748        self.link_metadata = Some(value);
16749        self
16750    }
16751
16752    pub fn with_owner_display_names(mut self, value: Vec<String>) -> Self {
16753        self.owner_display_names = Some(value);
16754        self
16755    }
16756
16757    pub fn with_owner_team(mut self, value: crate::types::users::Team) -> Self {
16758        self.owner_team = Some(value);
16759        self
16760    }
16761
16762    pub fn with_parent_shared_folder_id(
16763        mut self,
16764        value: crate::types::common::SharedFolderId,
16765    ) -> Self {
16766        self.parent_shared_folder_id = Some(value);
16767        self
16768    }
16769
16770    pub fn with_path_display(mut self, value: String) -> Self {
16771        self.path_display = Some(value);
16772        self
16773    }
16774
16775    pub fn with_path_lower(mut self, value: String) -> Self {
16776        self.path_lower = Some(value);
16777        self
16778    }
16779
16780    pub fn with_permissions(mut self, value: Vec<FilePermission>) -> Self {
16781        self.permissions = Some(value);
16782        self
16783    }
16784
16785    pub fn with_time_invited(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
16786        self.time_invited = Some(value);
16787        self
16788    }
16789}
16790
16791const SHARED_FILE_METADATA_FIELDS: &[&str] = &["id",
16792                                               "name",
16793                                               "policy",
16794                                               "preview_url",
16795                                               "access_type",
16796                                               "expected_link_metadata",
16797                                               "link_metadata",
16798                                               "owner_display_names",
16799                                               "owner_team",
16800                                               "parent_shared_folder_id",
16801                                               "path_display",
16802                                               "path_lower",
16803                                               "permissions",
16804                                               "time_invited"];
16805impl SharedFileMetadata {
16806    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
16807        map: V,
16808    ) -> Result<SharedFileMetadata, V::Error> {
16809        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
16810    }
16811
16812    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
16813        mut map: V,
16814        optional: bool,
16815    ) -> Result<Option<SharedFileMetadata>, V::Error> {
16816        let mut field_id = None;
16817        let mut field_name = None;
16818        let mut field_policy = None;
16819        let mut field_preview_url = None;
16820        let mut field_access_type = None;
16821        let mut field_expected_link_metadata = None;
16822        let mut field_link_metadata = None;
16823        let mut field_owner_display_names = None;
16824        let mut field_owner_team = None;
16825        let mut field_parent_shared_folder_id = None;
16826        let mut field_path_display = None;
16827        let mut field_path_lower = None;
16828        let mut field_permissions = None;
16829        let mut field_time_invited = None;
16830        let mut nothing = true;
16831        while let Some(key) = map.next_key::<&str>()? {
16832            nothing = false;
16833            match key {
16834                "id" => {
16835                    if field_id.is_some() {
16836                        return Err(::serde::de::Error::duplicate_field("id"));
16837                    }
16838                    field_id = Some(map.next_value()?);
16839                }
16840                "name" => {
16841                    if field_name.is_some() {
16842                        return Err(::serde::de::Error::duplicate_field("name"));
16843                    }
16844                    field_name = Some(map.next_value()?);
16845                }
16846                "policy" => {
16847                    if field_policy.is_some() {
16848                        return Err(::serde::de::Error::duplicate_field("policy"));
16849                    }
16850                    field_policy = Some(map.next_value()?);
16851                }
16852                "preview_url" => {
16853                    if field_preview_url.is_some() {
16854                        return Err(::serde::de::Error::duplicate_field("preview_url"));
16855                    }
16856                    field_preview_url = Some(map.next_value()?);
16857                }
16858                "access_type" => {
16859                    if field_access_type.is_some() {
16860                        return Err(::serde::de::Error::duplicate_field("access_type"));
16861                    }
16862                    field_access_type = Some(map.next_value()?);
16863                }
16864                "expected_link_metadata" => {
16865                    if field_expected_link_metadata.is_some() {
16866                        return Err(::serde::de::Error::duplicate_field("expected_link_metadata"));
16867                    }
16868                    field_expected_link_metadata = Some(map.next_value()?);
16869                }
16870                "link_metadata" => {
16871                    if field_link_metadata.is_some() {
16872                        return Err(::serde::de::Error::duplicate_field("link_metadata"));
16873                    }
16874                    field_link_metadata = Some(map.next_value()?);
16875                }
16876                "owner_display_names" => {
16877                    if field_owner_display_names.is_some() {
16878                        return Err(::serde::de::Error::duplicate_field("owner_display_names"));
16879                    }
16880                    field_owner_display_names = Some(map.next_value()?);
16881                }
16882                "owner_team" => {
16883                    if field_owner_team.is_some() {
16884                        return Err(::serde::de::Error::duplicate_field("owner_team"));
16885                    }
16886                    field_owner_team = Some(map.next_value()?);
16887                }
16888                "parent_shared_folder_id" => {
16889                    if field_parent_shared_folder_id.is_some() {
16890                        return Err(::serde::de::Error::duplicate_field("parent_shared_folder_id"));
16891                    }
16892                    field_parent_shared_folder_id = Some(map.next_value()?);
16893                }
16894                "path_display" => {
16895                    if field_path_display.is_some() {
16896                        return Err(::serde::de::Error::duplicate_field("path_display"));
16897                    }
16898                    field_path_display = Some(map.next_value()?);
16899                }
16900                "path_lower" => {
16901                    if field_path_lower.is_some() {
16902                        return Err(::serde::de::Error::duplicate_field("path_lower"));
16903                    }
16904                    field_path_lower = Some(map.next_value()?);
16905                }
16906                "permissions" => {
16907                    if field_permissions.is_some() {
16908                        return Err(::serde::de::Error::duplicate_field("permissions"));
16909                    }
16910                    field_permissions = Some(map.next_value()?);
16911                }
16912                "time_invited" => {
16913                    if field_time_invited.is_some() {
16914                        return Err(::serde::de::Error::duplicate_field("time_invited"));
16915                    }
16916                    field_time_invited = Some(map.next_value()?);
16917                }
16918                _ => {
16919                    // unknown field allowed and ignored
16920                    map.next_value::<::serde_json::Value>()?;
16921                }
16922            }
16923        }
16924        if optional && nothing {
16925            return Ok(None);
16926        }
16927        let result = SharedFileMetadata {
16928            id: field_id.ok_or_else(|| ::serde::de::Error::missing_field("id"))?,
16929            name: field_name.ok_or_else(|| ::serde::de::Error::missing_field("name"))?,
16930            policy: field_policy.ok_or_else(|| ::serde::de::Error::missing_field("policy"))?,
16931            preview_url: field_preview_url.ok_or_else(|| ::serde::de::Error::missing_field("preview_url"))?,
16932            access_type: field_access_type.and_then(Option::flatten),
16933            expected_link_metadata: field_expected_link_metadata.and_then(Option::flatten),
16934            link_metadata: field_link_metadata.and_then(Option::flatten),
16935            owner_display_names: field_owner_display_names.and_then(Option::flatten),
16936            owner_team: field_owner_team.and_then(Option::flatten),
16937            parent_shared_folder_id: field_parent_shared_folder_id.and_then(Option::flatten),
16938            path_display: field_path_display.and_then(Option::flatten),
16939            path_lower: field_path_lower.and_then(Option::flatten),
16940            permissions: field_permissions.and_then(Option::flatten),
16941            time_invited: field_time_invited.and_then(Option::flatten),
16942        };
16943        Ok(Some(result))
16944    }
16945
16946    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
16947        &self,
16948        s: &mut S::SerializeStruct,
16949    ) -> Result<(), S::Error> {
16950        use serde::ser::SerializeStruct;
16951        s.serialize_field("id", &self.id)?;
16952        s.serialize_field("name", &self.name)?;
16953        s.serialize_field("policy", &self.policy)?;
16954        s.serialize_field("preview_url", &self.preview_url)?;
16955        if let Some(val) = &self.access_type {
16956            s.serialize_field("access_type", val)?;
16957        }
16958        if let Some(val) = &self.expected_link_metadata {
16959            s.serialize_field("expected_link_metadata", val)?;
16960        }
16961        if let Some(val) = &self.link_metadata {
16962            s.serialize_field("link_metadata", val)?;
16963        }
16964        if let Some(val) = &self.owner_display_names {
16965            s.serialize_field("owner_display_names", val)?;
16966        }
16967        if let Some(val) = &self.owner_team {
16968            s.serialize_field("owner_team", val)?;
16969        }
16970        if let Some(val) = &self.parent_shared_folder_id {
16971            s.serialize_field("parent_shared_folder_id", val)?;
16972        }
16973        if let Some(val) = &self.path_display {
16974            s.serialize_field("path_display", val)?;
16975        }
16976        if let Some(val) = &self.path_lower {
16977            s.serialize_field("path_lower", val)?;
16978        }
16979        if let Some(val) = &self.permissions {
16980            s.serialize_field("permissions", val)?;
16981        }
16982        if let Some(val) = &self.time_invited {
16983            s.serialize_field("time_invited", val)?;
16984        }
16985        Ok(())
16986    }
16987}
16988
16989impl<'de> ::serde::de::Deserialize<'de> for SharedFileMetadata {
16990    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
16991        // struct deserializer
16992        use serde::de::{MapAccess, Visitor};
16993        struct StructVisitor;
16994        impl<'de> Visitor<'de> for StructVisitor {
16995            type Value = SharedFileMetadata;
16996            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
16997                f.write_str("a SharedFileMetadata struct")
16998            }
16999            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
17000                SharedFileMetadata::internal_deserialize(map)
17001            }
17002        }
17003        deserializer.deserialize_struct("SharedFileMetadata", SHARED_FILE_METADATA_FIELDS, StructVisitor)
17004    }
17005}
17006
17007impl ::serde::ser::Serialize for SharedFileMetadata {
17008    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
17009        // struct serializer
17010        use serde::ser::SerializeStruct;
17011        let mut s = serializer.serialize_struct("SharedFileMetadata", 14)?;
17012        self.internal_serialize::<S>(&mut s)?;
17013        s.end()
17014    }
17015}
17016
17017/// There is an error accessing the shared folder.
17018#[derive(Debug, Clone, PartialEq, Eq)]
17019#[non_exhaustive] // variants may be added in the future
17020pub enum SharedFolderAccessError {
17021    /// This shared folder ID is invalid.
17022    InvalidId,
17023    /// The user is not a member of the shared folder thus cannot access it.
17024    NotAMember,
17025    /// The user does not exist or their account is disabled.
17026    InvalidMember,
17027    /// Never set.
17028    EmailUnverified,
17029    /// The shared folder is unmounted.
17030    Unmounted,
17031    /// Catch-all used for unrecognized values returned from the server. Encountering this value
17032    /// typically indicates that this SDK version is out of date.
17033    Other,
17034}
17035
17036impl<'de> ::serde::de::Deserialize<'de> for SharedFolderAccessError {
17037    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
17038        // union deserializer
17039        use serde::de::{self, MapAccess, Visitor};
17040        struct EnumVisitor;
17041        impl<'de> Visitor<'de> for EnumVisitor {
17042            type Value = SharedFolderAccessError;
17043            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17044                f.write_str("a SharedFolderAccessError structure")
17045            }
17046            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
17047                let tag: &str = match map.next_key()? {
17048                    Some(".tag") => map.next_value()?,
17049                    _ => return Err(de::Error::missing_field(".tag"))
17050                };
17051                let value = match tag {
17052                    "invalid_id" => SharedFolderAccessError::InvalidId,
17053                    "not_a_member" => SharedFolderAccessError::NotAMember,
17054                    "invalid_member" => SharedFolderAccessError::InvalidMember,
17055                    "email_unverified" => SharedFolderAccessError::EmailUnverified,
17056                    "unmounted" => SharedFolderAccessError::Unmounted,
17057                    _ => SharedFolderAccessError::Other,
17058                };
17059                crate::eat_json_fields(&mut map)?;
17060                Ok(value)
17061            }
17062        }
17063        const VARIANTS: &[&str] = &["invalid_id",
17064                                    "not_a_member",
17065                                    "invalid_member",
17066                                    "email_unverified",
17067                                    "unmounted",
17068                                    "other"];
17069        deserializer.deserialize_struct("SharedFolderAccessError", VARIANTS, EnumVisitor)
17070    }
17071}
17072
17073impl ::serde::ser::Serialize for SharedFolderAccessError {
17074    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
17075        // union serializer
17076        use serde::ser::SerializeStruct;
17077        match self {
17078            SharedFolderAccessError::InvalidId => {
17079                // unit
17080                let mut s = serializer.serialize_struct("SharedFolderAccessError", 1)?;
17081                s.serialize_field(".tag", "invalid_id")?;
17082                s.end()
17083            }
17084            SharedFolderAccessError::NotAMember => {
17085                // unit
17086                let mut s = serializer.serialize_struct("SharedFolderAccessError", 1)?;
17087                s.serialize_field(".tag", "not_a_member")?;
17088                s.end()
17089            }
17090            SharedFolderAccessError::InvalidMember => {
17091                // unit
17092                let mut s = serializer.serialize_struct("SharedFolderAccessError", 1)?;
17093                s.serialize_field(".tag", "invalid_member")?;
17094                s.end()
17095            }
17096            SharedFolderAccessError::EmailUnverified => {
17097                // unit
17098                let mut s = serializer.serialize_struct("SharedFolderAccessError", 1)?;
17099                s.serialize_field(".tag", "email_unverified")?;
17100                s.end()
17101            }
17102            SharedFolderAccessError::Unmounted => {
17103                // unit
17104                let mut s = serializer.serialize_struct("SharedFolderAccessError", 1)?;
17105                s.serialize_field(".tag", "unmounted")?;
17106                s.end()
17107            }
17108            SharedFolderAccessError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
17109        }
17110    }
17111}
17112
17113impl ::std::error::Error for SharedFolderAccessError {
17114}
17115
17116impl ::std::fmt::Display for SharedFolderAccessError {
17117    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17118        match self {
17119            SharedFolderAccessError::InvalidId => f.write_str("This shared folder ID is invalid."),
17120            SharedFolderAccessError::NotAMember => f.write_str("The user is not a member of the shared folder thus cannot access it."),
17121            SharedFolderAccessError::InvalidMember => f.write_str("The user does not exist or their account is disabled."),
17122            SharedFolderAccessError::EmailUnverified => f.write_str("Never set."),
17123            SharedFolderAccessError::Unmounted => f.write_str("The shared folder is unmounted."),
17124            _ => write!(f, "{:?}", *self),
17125        }
17126    }
17127}
17128
17129#[derive(Debug, Clone, PartialEq, Eq)]
17130#[non_exhaustive] // variants may be added in the future
17131pub enum SharedFolderMemberError {
17132    /// The target dropbox_id is invalid.
17133    InvalidDropboxId,
17134    /// The target dropbox_id is not a member of the shared folder.
17135    NotAMember,
17136    /// The target member only has inherited access to the shared folder.
17137    NoExplicitAccess(MemberAccessLevelResult),
17138    /// Catch-all used for unrecognized values returned from the server. Encountering this value
17139    /// typically indicates that this SDK version is out of date.
17140    Other,
17141}
17142
17143impl<'de> ::serde::de::Deserialize<'de> for SharedFolderMemberError {
17144    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
17145        // union deserializer
17146        use serde::de::{self, MapAccess, Visitor};
17147        struct EnumVisitor;
17148        impl<'de> Visitor<'de> for EnumVisitor {
17149            type Value = SharedFolderMemberError;
17150            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17151                f.write_str("a SharedFolderMemberError structure")
17152            }
17153            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
17154                let tag: &str = match map.next_key()? {
17155                    Some(".tag") => map.next_value()?,
17156                    _ => return Err(de::Error::missing_field(".tag"))
17157                };
17158                let value = match tag {
17159                    "invalid_dropbox_id" => SharedFolderMemberError::InvalidDropboxId,
17160                    "not_a_member" => SharedFolderMemberError::NotAMember,
17161                    "no_explicit_access" => SharedFolderMemberError::NoExplicitAccess(MemberAccessLevelResult::internal_deserialize(&mut map)?),
17162                    _ => SharedFolderMemberError::Other,
17163                };
17164                crate::eat_json_fields(&mut map)?;
17165                Ok(value)
17166            }
17167        }
17168        const VARIANTS: &[&str] = &["invalid_dropbox_id",
17169                                    "not_a_member",
17170                                    "no_explicit_access",
17171                                    "other"];
17172        deserializer.deserialize_struct("SharedFolderMemberError", VARIANTS, EnumVisitor)
17173    }
17174}
17175
17176impl ::serde::ser::Serialize for SharedFolderMemberError {
17177    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
17178        // union serializer
17179        use serde::ser::SerializeStruct;
17180        match self {
17181            SharedFolderMemberError::InvalidDropboxId => {
17182                // unit
17183                let mut s = serializer.serialize_struct("SharedFolderMemberError", 1)?;
17184                s.serialize_field(".tag", "invalid_dropbox_id")?;
17185                s.end()
17186            }
17187            SharedFolderMemberError::NotAMember => {
17188                // unit
17189                let mut s = serializer.serialize_struct("SharedFolderMemberError", 1)?;
17190                s.serialize_field(".tag", "not_a_member")?;
17191                s.end()
17192            }
17193            SharedFolderMemberError::NoExplicitAccess(x) => {
17194                // struct
17195                let mut s = serializer.serialize_struct("SharedFolderMemberError", 4)?;
17196                s.serialize_field(".tag", "no_explicit_access")?;
17197                x.internal_serialize::<S>(&mut s)?;
17198                s.end()
17199            }
17200            SharedFolderMemberError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
17201        }
17202    }
17203}
17204
17205impl ::std::error::Error for SharedFolderMemberError {
17206}
17207
17208impl ::std::fmt::Display for SharedFolderMemberError {
17209    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17210        match self {
17211            SharedFolderMemberError::InvalidDropboxId => f.write_str("The target dropbox_id is invalid."),
17212            SharedFolderMemberError::NotAMember => f.write_str("The target dropbox_id is not a member of the shared folder."),
17213            SharedFolderMemberError::NoExplicitAccess(inner) => write!(f, "The target member only has inherited access to the shared folder: {:?}", inner),
17214            _ => write!(f, "{:?}", *self),
17215        }
17216    }
17217}
17218
17219/// Shared folder user and group membership.
17220#[derive(Debug, Clone, PartialEq, Eq)]
17221#[non_exhaustive] // structs may have more fields added in the future.
17222pub struct SharedFolderMembers {
17223    /// The list of user members of the shared folder.
17224    pub users: Vec<UserMembershipInfo>,
17225    /// The list of group members of the shared folder.
17226    pub groups: Vec<GroupMembershipInfo>,
17227    /// The list of invitees to the shared folder.
17228    pub invitees: Vec<InviteeMembershipInfo>,
17229    /// Present if there are additional shared folder members that have not been returned yet. Pass
17230    /// the cursor into
17231    /// [`list_folder_members_continue()`](crate::sharing::list_folder_members_continue) to list
17232    /// additional members.
17233    pub cursor: Option<String>,
17234}
17235
17236impl SharedFolderMembers {
17237    pub fn new(
17238        users: Vec<UserMembershipInfo>,
17239        groups: Vec<GroupMembershipInfo>,
17240        invitees: Vec<InviteeMembershipInfo>,
17241    ) -> Self {
17242        SharedFolderMembers {
17243            users,
17244            groups,
17245            invitees,
17246            cursor: None,
17247        }
17248    }
17249
17250    pub fn with_cursor(mut self, value: String) -> Self {
17251        self.cursor = Some(value);
17252        self
17253    }
17254}
17255
17256const SHARED_FOLDER_MEMBERS_FIELDS: &[&str] = &["users",
17257                                                "groups",
17258                                                "invitees",
17259                                                "cursor"];
17260impl SharedFolderMembers {
17261    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
17262        map: V,
17263    ) -> Result<SharedFolderMembers, V::Error> {
17264        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
17265    }
17266
17267    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
17268        mut map: V,
17269        optional: bool,
17270    ) -> Result<Option<SharedFolderMembers>, V::Error> {
17271        let mut field_users = None;
17272        let mut field_groups = None;
17273        let mut field_invitees = None;
17274        let mut field_cursor = None;
17275        let mut nothing = true;
17276        while let Some(key) = map.next_key::<&str>()? {
17277            nothing = false;
17278            match key {
17279                "users" => {
17280                    if field_users.is_some() {
17281                        return Err(::serde::de::Error::duplicate_field("users"));
17282                    }
17283                    field_users = Some(map.next_value()?);
17284                }
17285                "groups" => {
17286                    if field_groups.is_some() {
17287                        return Err(::serde::de::Error::duplicate_field("groups"));
17288                    }
17289                    field_groups = Some(map.next_value()?);
17290                }
17291                "invitees" => {
17292                    if field_invitees.is_some() {
17293                        return Err(::serde::de::Error::duplicate_field("invitees"));
17294                    }
17295                    field_invitees = Some(map.next_value()?);
17296                }
17297                "cursor" => {
17298                    if field_cursor.is_some() {
17299                        return Err(::serde::de::Error::duplicate_field("cursor"));
17300                    }
17301                    field_cursor = Some(map.next_value()?);
17302                }
17303                _ => {
17304                    // unknown field allowed and ignored
17305                    map.next_value::<::serde_json::Value>()?;
17306                }
17307            }
17308        }
17309        if optional && nothing {
17310            return Ok(None);
17311        }
17312        let result = SharedFolderMembers {
17313            users: field_users.ok_or_else(|| ::serde::de::Error::missing_field("users"))?,
17314            groups: field_groups.ok_or_else(|| ::serde::de::Error::missing_field("groups"))?,
17315            invitees: field_invitees.ok_or_else(|| ::serde::de::Error::missing_field("invitees"))?,
17316            cursor: field_cursor.and_then(Option::flatten),
17317        };
17318        Ok(Some(result))
17319    }
17320
17321    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
17322        &self,
17323        s: &mut S::SerializeStruct,
17324    ) -> Result<(), S::Error> {
17325        use serde::ser::SerializeStruct;
17326        s.serialize_field("users", &self.users)?;
17327        s.serialize_field("groups", &self.groups)?;
17328        s.serialize_field("invitees", &self.invitees)?;
17329        if let Some(val) = &self.cursor {
17330            s.serialize_field("cursor", val)?;
17331        }
17332        Ok(())
17333    }
17334}
17335
17336impl<'de> ::serde::de::Deserialize<'de> for SharedFolderMembers {
17337    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
17338        // struct deserializer
17339        use serde::de::{MapAccess, Visitor};
17340        struct StructVisitor;
17341        impl<'de> Visitor<'de> for StructVisitor {
17342            type Value = SharedFolderMembers;
17343            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17344                f.write_str("a SharedFolderMembers struct")
17345            }
17346            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
17347                SharedFolderMembers::internal_deserialize(map)
17348            }
17349        }
17350        deserializer.deserialize_struct("SharedFolderMembers", SHARED_FOLDER_MEMBERS_FIELDS, StructVisitor)
17351    }
17352}
17353
17354impl ::serde::ser::Serialize for SharedFolderMembers {
17355    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
17356        // struct serializer
17357        use serde::ser::SerializeStruct;
17358        let mut s = serializer.serialize_struct("SharedFolderMembers", 4)?;
17359        self.internal_serialize::<S>(&mut s)?;
17360        s.end()
17361    }
17362}
17363
17364/// The metadata which includes basic information about the shared folder.
17365#[derive(Debug, Clone, PartialEq, Eq)]
17366#[non_exhaustive] // structs may have more fields added in the future.
17367pub struct SharedFolderMetadata {
17368    /// The current user's access level for this shared folder.
17369    pub access_type: AccessLevel,
17370    /// Whether this folder is inside of a team folder.
17371    pub is_inside_team_folder: bool,
17372    /// Whether this folder is a [team folder](https://www.dropbox.com/en/help/986).
17373    pub is_team_folder: bool,
17374    /// The name of the this shared folder.
17375    pub name: String,
17376    /// Policies governing this shared folder.
17377    pub policy: FolderPolicy,
17378    /// URL for displaying a web preview of the shared folder.
17379    pub preview_url: String,
17380    /// The ID of the shared folder.
17381    pub shared_folder_id: crate::types::common::SharedFolderId,
17382    /// Timestamp indicating when the current user was invited to this shared folder.
17383    pub time_invited: crate::types::common::DropboxTimestamp,
17384    /// The display names of the users that own the folder. If the folder is part of a team folder,
17385    /// the display names of the team admins are also included. Absent if the owner display names
17386    /// cannot be fetched.
17387    pub owner_display_names: Option<Vec<String>>,
17388    /// The team that owns the folder. This field is not present if the folder is not owned by a
17389    /// team.
17390    pub owner_team: Option<crate::types::users::Team>,
17391    /// The ID of the parent shared folder. This field is present only if the folder is contained
17392    /// within another shared folder.
17393    pub parent_shared_folder_id: Option<crate::types::common::SharedFolderId>,
17394    /// The full path of this shared folder. Absent for unmounted folders.
17395    pub path_display: Option<String>,
17396    /// The lower-cased full path of this shared folder. Absent for unmounted folders.
17397    pub path_lower: Option<String>,
17398    /// Display name for the parent folder.
17399    pub parent_folder_name: Option<String>,
17400    /// The metadata of the shared content link to this shared folder. Absent if there is no link on
17401    /// the folder. This is for an unreleased feature so it may not be returned yet.
17402    pub link_metadata: Option<SharedContentLinkMetadata>,
17403    /// Actions the current user may perform on the folder and its contents. The set of permissions
17404    /// corresponds to the FolderActions in the request.
17405    pub permissions: Option<Vec<FolderPermission>>,
17406    /// Whether the folder inherits its members from its parent.
17407    pub access_inheritance: AccessInheritance,
17408    /// The ID of the content.
17409    pub folder_id: Option<crate::types::files::FileId>,
17410}
17411
17412impl SharedFolderMetadata {
17413    pub fn new(
17414        access_type: AccessLevel,
17415        is_inside_team_folder: bool,
17416        is_team_folder: bool,
17417        name: String,
17418        policy: FolderPolicy,
17419        preview_url: String,
17420        shared_folder_id: crate::types::common::SharedFolderId,
17421        time_invited: crate::types::common::DropboxTimestamp,
17422    ) -> Self {
17423        SharedFolderMetadata {
17424            access_type,
17425            is_inside_team_folder,
17426            is_team_folder,
17427            name,
17428            policy,
17429            preview_url,
17430            shared_folder_id,
17431            time_invited,
17432            owner_display_names: None,
17433            owner_team: None,
17434            parent_shared_folder_id: None,
17435            path_display: None,
17436            path_lower: None,
17437            parent_folder_name: None,
17438            link_metadata: None,
17439            permissions: None,
17440            access_inheritance: AccessInheritance::Inherit,
17441            folder_id: None,
17442        }
17443    }
17444
17445    pub fn with_owner_display_names(mut self, value: Vec<String>) -> Self {
17446        self.owner_display_names = Some(value);
17447        self
17448    }
17449
17450    pub fn with_owner_team(mut self, value: crate::types::users::Team) -> Self {
17451        self.owner_team = Some(value);
17452        self
17453    }
17454
17455    pub fn with_parent_shared_folder_id(
17456        mut self,
17457        value: crate::types::common::SharedFolderId,
17458    ) -> Self {
17459        self.parent_shared_folder_id = Some(value);
17460        self
17461    }
17462
17463    pub fn with_path_display(mut self, value: String) -> Self {
17464        self.path_display = Some(value);
17465        self
17466    }
17467
17468    pub fn with_path_lower(mut self, value: String) -> Self {
17469        self.path_lower = Some(value);
17470        self
17471    }
17472
17473    pub fn with_parent_folder_name(mut self, value: String) -> Self {
17474        self.parent_folder_name = Some(value);
17475        self
17476    }
17477
17478    pub fn with_link_metadata(mut self, value: SharedContentLinkMetadata) -> Self {
17479        self.link_metadata = Some(value);
17480        self
17481    }
17482
17483    pub fn with_permissions(mut self, value: Vec<FolderPermission>) -> Self {
17484        self.permissions = Some(value);
17485        self
17486    }
17487
17488    pub fn with_access_inheritance(mut self, value: AccessInheritance) -> Self {
17489        self.access_inheritance = value;
17490        self
17491    }
17492
17493    pub fn with_folder_id(mut self, value: crate::types::files::FileId) -> Self {
17494        self.folder_id = Some(value);
17495        self
17496    }
17497}
17498
17499const SHARED_FOLDER_METADATA_FIELDS: &[&str] = &["access_type",
17500                                                 "is_inside_team_folder",
17501                                                 "is_team_folder",
17502                                                 "name",
17503                                                 "policy",
17504                                                 "preview_url",
17505                                                 "shared_folder_id",
17506                                                 "time_invited",
17507                                                 "owner_display_names",
17508                                                 "owner_team",
17509                                                 "parent_shared_folder_id",
17510                                                 "path_display",
17511                                                 "path_lower",
17512                                                 "parent_folder_name",
17513                                                 "link_metadata",
17514                                                 "permissions",
17515                                                 "access_inheritance",
17516                                                 "folder_id"];
17517impl SharedFolderMetadata {
17518    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
17519        map: V,
17520    ) -> Result<SharedFolderMetadata, V::Error> {
17521        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
17522    }
17523
17524    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
17525        mut map: V,
17526        optional: bool,
17527    ) -> Result<Option<SharedFolderMetadata>, V::Error> {
17528        let mut field_access_type = None;
17529        let mut field_is_inside_team_folder = None;
17530        let mut field_is_team_folder = None;
17531        let mut field_name = None;
17532        let mut field_policy = None;
17533        let mut field_preview_url = None;
17534        let mut field_shared_folder_id = None;
17535        let mut field_time_invited = None;
17536        let mut field_owner_display_names = None;
17537        let mut field_owner_team = None;
17538        let mut field_parent_shared_folder_id = None;
17539        let mut field_path_display = None;
17540        let mut field_path_lower = None;
17541        let mut field_parent_folder_name = None;
17542        let mut field_link_metadata = None;
17543        let mut field_permissions = None;
17544        let mut field_access_inheritance = None;
17545        let mut field_folder_id = None;
17546        let mut nothing = true;
17547        while let Some(key) = map.next_key::<&str>()? {
17548            nothing = false;
17549            match key {
17550                "access_type" => {
17551                    if field_access_type.is_some() {
17552                        return Err(::serde::de::Error::duplicate_field("access_type"));
17553                    }
17554                    field_access_type = Some(map.next_value()?);
17555                }
17556                "is_inside_team_folder" => {
17557                    if field_is_inside_team_folder.is_some() {
17558                        return Err(::serde::de::Error::duplicate_field("is_inside_team_folder"));
17559                    }
17560                    field_is_inside_team_folder = Some(map.next_value()?);
17561                }
17562                "is_team_folder" => {
17563                    if field_is_team_folder.is_some() {
17564                        return Err(::serde::de::Error::duplicate_field("is_team_folder"));
17565                    }
17566                    field_is_team_folder = Some(map.next_value()?);
17567                }
17568                "name" => {
17569                    if field_name.is_some() {
17570                        return Err(::serde::de::Error::duplicate_field("name"));
17571                    }
17572                    field_name = Some(map.next_value()?);
17573                }
17574                "policy" => {
17575                    if field_policy.is_some() {
17576                        return Err(::serde::de::Error::duplicate_field("policy"));
17577                    }
17578                    field_policy = Some(map.next_value()?);
17579                }
17580                "preview_url" => {
17581                    if field_preview_url.is_some() {
17582                        return Err(::serde::de::Error::duplicate_field("preview_url"));
17583                    }
17584                    field_preview_url = Some(map.next_value()?);
17585                }
17586                "shared_folder_id" => {
17587                    if field_shared_folder_id.is_some() {
17588                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
17589                    }
17590                    field_shared_folder_id = Some(map.next_value()?);
17591                }
17592                "time_invited" => {
17593                    if field_time_invited.is_some() {
17594                        return Err(::serde::de::Error::duplicate_field("time_invited"));
17595                    }
17596                    field_time_invited = Some(map.next_value()?);
17597                }
17598                "owner_display_names" => {
17599                    if field_owner_display_names.is_some() {
17600                        return Err(::serde::de::Error::duplicate_field("owner_display_names"));
17601                    }
17602                    field_owner_display_names = Some(map.next_value()?);
17603                }
17604                "owner_team" => {
17605                    if field_owner_team.is_some() {
17606                        return Err(::serde::de::Error::duplicate_field("owner_team"));
17607                    }
17608                    field_owner_team = Some(map.next_value()?);
17609                }
17610                "parent_shared_folder_id" => {
17611                    if field_parent_shared_folder_id.is_some() {
17612                        return Err(::serde::de::Error::duplicate_field("parent_shared_folder_id"));
17613                    }
17614                    field_parent_shared_folder_id = Some(map.next_value()?);
17615                }
17616                "path_display" => {
17617                    if field_path_display.is_some() {
17618                        return Err(::serde::de::Error::duplicate_field("path_display"));
17619                    }
17620                    field_path_display = Some(map.next_value()?);
17621                }
17622                "path_lower" => {
17623                    if field_path_lower.is_some() {
17624                        return Err(::serde::de::Error::duplicate_field("path_lower"));
17625                    }
17626                    field_path_lower = Some(map.next_value()?);
17627                }
17628                "parent_folder_name" => {
17629                    if field_parent_folder_name.is_some() {
17630                        return Err(::serde::de::Error::duplicate_field("parent_folder_name"));
17631                    }
17632                    field_parent_folder_name = Some(map.next_value()?);
17633                }
17634                "link_metadata" => {
17635                    if field_link_metadata.is_some() {
17636                        return Err(::serde::de::Error::duplicate_field("link_metadata"));
17637                    }
17638                    field_link_metadata = Some(map.next_value()?);
17639                }
17640                "permissions" => {
17641                    if field_permissions.is_some() {
17642                        return Err(::serde::de::Error::duplicate_field("permissions"));
17643                    }
17644                    field_permissions = Some(map.next_value()?);
17645                }
17646                "access_inheritance" => {
17647                    if field_access_inheritance.is_some() {
17648                        return Err(::serde::de::Error::duplicate_field("access_inheritance"));
17649                    }
17650                    field_access_inheritance = Some(map.next_value()?);
17651                }
17652                "folder_id" => {
17653                    if field_folder_id.is_some() {
17654                        return Err(::serde::de::Error::duplicate_field("folder_id"));
17655                    }
17656                    field_folder_id = Some(map.next_value()?);
17657                }
17658                _ => {
17659                    // unknown field allowed and ignored
17660                    map.next_value::<::serde_json::Value>()?;
17661                }
17662            }
17663        }
17664        if optional && nothing {
17665            return Ok(None);
17666        }
17667        let result = SharedFolderMetadata {
17668            access_type: field_access_type.ok_or_else(|| ::serde::de::Error::missing_field("access_type"))?,
17669            is_inside_team_folder: field_is_inside_team_folder.ok_or_else(|| ::serde::de::Error::missing_field("is_inside_team_folder"))?,
17670            is_team_folder: field_is_team_folder.ok_or_else(|| ::serde::de::Error::missing_field("is_team_folder"))?,
17671            name: field_name.ok_or_else(|| ::serde::de::Error::missing_field("name"))?,
17672            policy: field_policy.ok_or_else(|| ::serde::de::Error::missing_field("policy"))?,
17673            preview_url: field_preview_url.ok_or_else(|| ::serde::de::Error::missing_field("preview_url"))?,
17674            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
17675            time_invited: field_time_invited.ok_or_else(|| ::serde::de::Error::missing_field("time_invited"))?,
17676            owner_display_names: field_owner_display_names.and_then(Option::flatten),
17677            owner_team: field_owner_team.and_then(Option::flatten),
17678            parent_shared_folder_id: field_parent_shared_folder_id.and_then(Option::flatten),
17679            path_display: field_path_display.and_then(Option::flatten),
17680            path_lower: field_path_lower.and_then(Option::flatten),
17681            parent_folder_name: field_parent_folder_name.and_then(Option::flatten),
17682            link_metadata: field_link_metadata.and_then(Option::flatten),
17683            permissions: field_permissions.and_then(Option::flatten),
17684            access_inheritance: field_access_inheritance.unwrap_or(AccessInheritance::Inherit),
17685            folder_id: field_folder_id.and_then(Option::flatten),
17686        };
17687        Ok(Some(result))
17688    }
17689
17690    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
17691        &self,
17692        s: &mut S::SerializeStruct,
17693    ) -> Result<(), S::Error> {
17694        use serde::ser::SerializeStruct;
17695        s.serialize_field("access_type", &self.access_type)?;
17696        s.serialize_field("is_inside_team_folder", &self.is_inside_team_folder)?;
17697        s.serialize_field("is_team_folder", &self.is_team_folder)?;
17698        s.serialize_field("name", &self.name)?;
17699        s.serialize_field("policy", &self.policy)?;
17700        s.serialize_field("preview_url", &self.preview_url)?;
17701        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
17702        s.serialize_field("time_invited", &self.time_invited)?;
17703        if let Some(val) = &self.owner_display_names {
17704            s.serialize_field("owner_display_names", val)?;
17705        }
17706        if let Some(val) = &self.owner_team {
17707            s.serialize_field("owner_team", val)?;
17708        }
17709        if let Some(val) = &self.parent_shared_folder_id {
17710            s.serialize_field("parent_shared_folder_id", val)?;
17711        }
17712        if let Some(val) = &self.path_display {
17713            s.serialize_field("path_display", val)?;
17714        }
17715        if let Some(val) = &self.path_lower {
17716            s.serialize_field("path_lower", val)?;
17717        }
17718        if let Some(val) = &self.parent_folder_name {
17719            s.serialize_field("parent_folder_name", val)?;
17720        }
17721        if let Some(val) = &self.link_metadata {
17722            s.serialize_field("link_metadata", val)?;
17723        }
17724        if let Some(val) = &self.permissions {
17725            s.serialize_field("permissions", val)?;
17726        }
17727        if self.access_inheritance != AccessInheritance::Inherit {
17728            s.serialize_field("access_inheritance", &self.access_inheritance)?;
17729        }
17730        if let Some(val) = &self.folder_id {
17731            s.serialize_field("folder_id", val)?;
17732        }
17733        Ok(())
17734    }
17735}
17736
17737impl<'de> ::serde::de::Deserialize<'de> for SharedFolderMetadata {
17738    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
17739        // struct deserializer
17740        use serde::de::{MapAccess, Visitor};
17741        struct StructVisitor;
17742        impl<'de> Visitor<'de> for StructVisitor {
17743            type Value = SharedFolderMetadata;
17744            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17745                f.write_str("a SharedFolderMetadata struct")
17746            }
17747            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
17748                SharedFolderMetadata::internal_deserialize(map)
17749            }
17750        }
17751        deserializer.deserialize_struct("SharedFolderMetadata", SHARED_FOLDER_METADATA_FIELDS, StructVisitor)
17752    }
17753}
17754
17755impl ::serde::ser::Serialize for SharedFolderMetadata {
17756    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
17757        // struct serializer
17758        use serde::ser::SerializeStruct;
17759        let mut s = serializer.serialize_struct("SharedFolderMetadata", 18)?;
17760        self.internal_serialize::<S>(&mut s)?;
17761        s.end()
17762    }
17763}
17764
17765// struct extends SharedFolderMetadataBase
17766impl From<SharedFolderMetadata> for SharedFolderMetadataBase {
17767    fn from(subtype: SharedFolderMetadata) -> Self {
17768        Self {
17769            access_type: subtype.access_type,
17770            is_inside_team_folder: subtype.is_inside_team_folder,
17771            is_team_folder: subtype.is_team_folder,
17772            owner_display_names: subtype.owner_display_names,
17773            owner_team: subtype.owner_team,
17774            parent_shared_folder_id: subtype.parent_shared_folder_id,
17775            path_display: subtype.path_display,
17776            path_lower: subtype.path_lower,
17777            parent_folder_name: subtype.parent_folder_name,
17778        }
17779    }
17780}
17781/// Properties of the shared folder.
17782#[derive(Debug, Clone, PartialEq, Eq)]
17783#[non_exhaustive] // structs may have more fields added in the future.
17784pub struct SharedFolderMetadataBase {
17785    /// The current user's access level for this shared folder.
17786    pub access_type: AccessLevel,
17787    /// Whether this folder is inside of a team folder.
17788    pub is_inside_team_folder: bool,
17789    /// Whether this folder is a [team folder](https://www.dropbox.com/en/help/986).
17790    pub is_team_folder: bool,
17791    /// The display names of the users that own the folder. If the folder is part of a team folder,
17792    /// the display names of the team admins are also included. Absent if the owner display names
17793    /// cannot be fetched.
17794    pub owner_display_names: Option<Vec<String>>,
17795    /// The team that owns the folder. This field is not present if the folder is not owned by a
17796    /// team.
17797    pub owner_team: Option<crate::types::users::Team>,
17798    /// The ID of the parent shared folder. This field is present only if the folder is contained
17799    /// within another shared folder.
17800    pub parent_shared_folder_id: Option<crate::types::common::SharedFolderId>,
17801    /// The full path of this shared folder. Absent for unmounted folders.
17802    pub path_display: Option<String>,
17803    /// The lower-cased full path of this shared folder. Absent for unmounted folders.
17804    pub path_lower: Option<String>,
17805    /// Display name for the parent folder.
17806    pub parent_folder_name: Option<String>,
17807}
17808
17809impl SharedFolderMetadataBase {
17810    pub fn new(
17811        access_type: AccessLevel,
17812        is_inside_team_folder: bool,
17813        is_team_folder: bool,
17814    ) -> Self {
17815        SharedFolderMetadataBase {
17816            access_type,
17817            is_inside_team_folder,
17818            is_team_folder,
17819            owner_display_names: None,
17820            owner_team: None,
17821            parent_shared_folder_id: None,
17822            path_display: None,
17823            path_lower: None,
17824            parent_folder_name: None,
17825        }
17826    }
17827
17828    pub fn with_owner_display_names(mut self, value: Vec<String>) -> Self {
17829        self.owner_display_names = Some(value);
17830        self
17831    }
17832
17833    pub fn with_owner_team(mut self, value: crate::types::users::Team) -> Self {
17834        self.owner_team = Some(value);
17835        self
17836    }
17837
17838    pub fn with_parent_shared_folder_id(
17839        mut self,
17840        value: crate::types::common::SharedFolderId,
17841    ) -> Self {
17842        self.parent_shared_folder_id = Some(value);
17843        self
17844    }
17845
17846    pub fn with_path_display(mut self, value: String) -> Self {
17847        self.path_display = Some(value);
17848        self
17849    }
17850
17851    pub fn with_path_lower(mut self, value: String) -> Self {
17852        self.path_lower = Some(value);
17853        self
17854    }
17855
17856    pub fn with_parent_folder_name(mut self, value: String) -> Self {
17857        self.parent_folder_name = Some(value);
17858        self
17859    }
17860}
17861
17862const SHARED_FOLDER_METADATA_BASE_FIELDS: &[&str] = &["access_type",
17863                                                      "is_inside_team_folder",
17864                                                      "is_team_folder",
17865                                                      "owner_display_names",
17866                                                      "owner_team",
17867                                                      "parent_shared_folder_id",
17868                                                      "path_display",
17869                                                      "path_lower",
17870                                                      "parent_folder_name"];
17871impl SharedFolderMetadataBase {
17872    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
17873        map: V,
17874    ) -> Result<SharedFolderMetadataBase, V::Error> {
17875        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
17876    }
17877
17878    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
17879        mut map: V,
17880        optional: bool,
17881    ) -> Result<Option<SharedFolderMetadataBase>, V::Error> {
17882        let mut field_access_type = None;
17883        let mut field_is_inside_team_folder = None;
17884        let mut field_is_team_folder = None;
17885        let mut field_owner_display_names = None;
17886        let mut field_owner_team = None;
17887        let mut field_parent_shared_folder_id = None;
17888        let mut field_path_display = None;
17889        let mut field_path_lower = None;
17890        let mut field_parent_folder_name = None;
17891        let mut nothing = true;
17892        while let Some(key) = map.next_key::<&str>()? {
17893            nothing = false;
17894            match key {
17895                "access_type" => {
17896                    if field_access_type.is_some() {
17897                        return Err(::serde::de::Error::duplicate_field("access_type"));
17898                    }
17899                    field_access_type = Some(map.next_value()?);
17900                }
17901                "is_inside_team_folder" => {
17902                    if field_is_inside_team_folder.is_some() {
17903                        return Err(::serde::de::Error::duplicate_field("is_inside_team_folder"));
17904                    }
17905                    field_is_inside_team_folder = Some(map.next_value()?);
17906                }
17907                "is_team_folder" => {
17908                    if field_is_team_folder.is_some() {
17909                        return Err(::serde::de::Error::duplicate_field("is_team_folder"));
17910                    }
17911                    field_is_team_folder = Some(map.next_value()?);
17912                }
17913                "owner_display_names" => {
17914                    if field_owner_display_names.is_some() {
17915                        return Err(::serde::de::Error::duplicate_field("owner_display_names"));
17916                    }
17917                    field_owner_display_names = Some(map.next_value()?);
17918                }
17919                "owner_team" => {
17920                    if field_owner_team.is_some() {
17921                        return Err(::serde::de::Error::duplicate_field("owner_team"));
17922                    }
17923                    field_owner_team = Some(map.next_value()?);
17924                }
17925                "parent_shared_folder_id" => {
17926                    if field_parent_shared_folder_id.is_some() {
17927                        return Err(::serde::de::Error::duplicate_field("parent_shared_folder_id"));
17928                    }
17929                    field_parent_shared_folder_id = Some(map.next_value()?);
17930                }
17931                "path_display" => {
17932                    if field_path_display.is_some() {
17933                        return Err(::serde::de::Error::duplicate_field("path_display"));
17934                    }
17935                    field_path_display = Some(map.next_value()?);
17936                }
17937                "path_lower" => {
17938                    if field_path_lower.is_some() {
17939                        return Err(::serde::de::Error::duplicate_field("path_lower"));
17940                    }
17941                    field_path_lower = Some(map.next_value()?);
17942                }
17943                "parent_folder_name" => {
17944                    if field_parent_folder_name.is_some() {
17945                        return Err(::serde::de::Error::duplicate_field("parent_folder_name"));
17946                    }
17947                    field_parent_folder_name = Some(map.next_value()?);
17948                }
17949                _ => {
17950                    // unknown field allowed and ignored
17951                    map.next_value::<::serde_json::Value>()?;
17952                }
17953            }
17954        }
17955        if optional && nothing {
17956            return Ok(None);
17957        }
17958        let result = SharedFolderMetadataBase {
17959            access_type: field_access_type.ok_or_else(|| ::serde::de::Error::missing_field("access_type"))?,
17960            is_inside_team_folder: field_is_inside_team_folder.ok_or_else(|| ::serde::de::Error::missing_field("is_inside_team_folder"))?,
17961            is_team_folder: field_is_team_folder.ok_or_else(|| ::serde::de::Error::missing_field("is_team_folder"))?,
17962            owner_display_names: field_owner_display_names.and_then(Option::flatten),
17963            owner_team: field_owner_team.and_then(Option::flatten),
17964            parent_shared_folder_id: field_parent_shared_folder_id.and_then(Option::flatten),
17965            path_display: field_path_display.and_then(Option::flatten),
17966            path_lower: field_path_lower.and_then(Option::flatten),
17967            parent_folder_name: field_parent_folder_name.and_then(Option::flatten),
17968        };
17969        Ok(Some(result))
17970    }
17971
17972    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
17973        &self,
17974        s: &mut S::SerializeStruct,
17975    ) -> Result<(), S::Error> {
17976        use serde::ser::SerializeStruct;
17977        s.serialize_field("access_type", &self.access_type)?;
17978        s.serialize_field("is_inside_team_folder", &self.is_inside_team_folder)?;
17979        s.serialize_field("is_team_folder", &self.is_team_folder)?;
17980        if let Some(val) = &self.owner_display_names {
17981            s.serialize_field("owner_display_names", val)?;
17982        }
17983        if let Some(val) = &self.owner_team {
17984            s.serialize_field("owner_team", val)?;
17985        }
17986        if let Some(val) = &self.parent_shared_folder_id {
17987            s.serialize_field("parent_shared_folder_id", val)?;
17988        }
17989        if let Some(val) = &self.path_display {
17990            s.serialize_field("path_display", val)?;
17991        }
17992        if let Some(val) = &self.path_lower {
17993            s.serialize_field("path_lower", val)?;
17994        }
17995        if let Some(val) = &self.parent_folder_name {
17996            s.serialize_field("parent_folder_name", val)?;
17997        }
17998        Ok(())
17999    }
18000}
18001
18002impl<'de> ::serde::de::Deserialize<'de> for SharedFolderMetadataBase {
18003    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18004        // struct deserializer
18005        use serde::de::{MapAccess, Visitor};
18006        struct StructVisitor;
18007        impl<'de> Visitor<'de> for StructVisitor {
18008            type Value = SharedFolderMetadataBase;
18009            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18010                f.write_str("a SharedFolderMetadataBase struct")
18011            }
18012            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
18013                SharedFolderMetadataBase::internal_deserialize(map)
18014            }
18015        }
18016        deserializer.deserialize_struct("SharedFolderMetadataBase", SHARED_FOLDER_METADATA_BASE_FIELDS, StructVisitor)
18017    }
18018}
18019
18020impl ::serde::ser::Serialize for SharedFolderMetadataBase {
18021    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18022        // struct serializer
18023        use serde::ser::SerializeStruct;
18024        let mut s = serializer.serialize_struct("SharedFolderMetadataBase", 9)?;
18025        self.internal_serialize::<S>(&mut s)?;
18026        s.end()
18027    }
18028}
18029
18030#[derive(Debug, Clone, PartialEq, Eq)]
18031#[non_exhaustive] // variants may be added in the future
18032pub enum SharedLinkAccessFailureReason {
18033    /// User is not logged in.
18034    LoginRequired,
18035    /// This user's email address is not verified. This functionality is only available on accounts
18036    /// with a verified email address. Users can verify their email address
18037    /// [here](https://www.dropbox.com/help/317).
18038    EmailVerifyRequired,
18039    /// The link is password protected.
18040    PasswordRequired,
18041    /// Access is allowed for team members only.
18042    TeamOnly,
18043    /// Access is allowed for the shared link's owner only.
18044    OwnerOnly,
18045    /// Catch-all used for unrecognized values returned from the server. Encountering this value
18046    /// typically indicates that this SDK version is out of date.
18047    Other,
18048}
18049
18050impl<'de> ::serde::de::Deserialize<'de> for SharedLinkAccessFailureReason {
18051    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18052        // union deserializer
18053        use serde::de::{self, MapAccess, Visitor};
18054        struct EnumVisitor;
18055        impl<'de> Visitor<'de> for EnumVisitor {
18056            type Value = SharedLinkAccessFailureReason;
18057            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18058                f.write_str("a SharedLinkAccessFailureReason structure")
18059            }
18060            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
18061                let tag: &str = match map.next_key()? {
18062                    Some(".tag") => map.next_value()?,
18063                    _ => return Err(de::Error::missing_field(".tag"))
18064                };
18065                let value = match tag {
18066                    "login_required" => SharedLinkAccessFailureReason::LoginRequired,
18067                    "email_verify_required" => SharedLinkAccessFailureReason::EmailVerifyRequired,
18068                    "password_required" => SharedLinkAccessFailureReason::PasswordRequired,
18069                    "team_only" => SharedLinkAccessFailureReason::TeamOnly,
18070                    "owner_only" => SharedLinkAccessFailureReason::OwnerOnly,
18071                    _ => SharedLinkAccessFailureReason::Other,
18072                };
18073                crate::eat_json_fields(&mut map)?;
18074                Ok(value)
18075            }
18076        }
18077        const VARIANTS: &[&str] = &["login_required",
18078                                    "email_verify_required",
18079                                    "password_required",
18080                                    "team_only",
18081                                    "owner_only",
18082                                    "other"];
18083        deserializer.deserialize_struct("SharedLinkAccessFailureReason", VARIANTS, EnumVisitor)
18084    }
18085}
18086
18087impl ::serde::ser::Serialize for SharedLinkAccessFailureReason {
18088    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18089        // union serializer
18090        use serde::ser::SerializeStruct;
18091        match self {
18092            SharedLinkAccessFailureReason::LoginRequired => {
18093                // unit
18094                let mut s = serializer.serialize_struct("SharedLinkAccessFailureReason", 1)?;
18095                s.serialize_field(".tag", "login_required")?;
18096                s.end()
18097            }
18098            SharedLinkAccessFailureReason::EmailVerifyRequired => {
18099                // unit
18100                let mut s = serializer.serialize_struct("SharedLinkAccessFailureReason", 1)?;
18101                s.serialize_field(".tag", "email_verify_required")?;
18102                s.end()
18103            }
18104            SharedLinkAccessFailureReason::PasswordRequired => {
18105                // unit
18106                let mut s = serializer.serialize_struct("SharedLinkAccessFailureReason", 1)?;
18107                s.serialize_field(".tag", "password_required")?;
18108                s.end()
18109            }
18110            SharedLinkAccessFailureReason::TeamOnly => {
18111                // unit
18112                let mut s = serializer.serialize_struct("SharedLinkAccessFailureReason", 1)?;
18113                s.serialize_field(".tag", "team_only")?;
18114                s.end()
18115            }
18116            SharedLinkAccessFailureReason::OwnerOnly => {
18117                // unit
18118                let mut s = serializer.serialize_struct("SharedLinkAccessFailureReason", 1)?;
18119                s.serialize_field(".tag", "owner_only")?;
18120                s.end()
18121            }
18122            SharedLinkAccessFailureReason::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
18123        }
18124    }
18125}
18126
18127#[derive(Debug, Clone, PartialEq, Eq)]
18128#[non_exhaustive] // variants may be added in the future
18129pub enum SharedLinkAlreadyExistsMetadata {
18130    /// Metadata of the shared link that already exists.
18131    Metadata(SharedLinkMetadata),
18132    /// Catch-all used for unrecognized values returned from the server. Encountering this value
18133    /// typically indicates that this SDK version is out of date.
18134    Other,
18135}
18136
18137impl<'de> ::serde::de::Deserialize<'de> for SharedLinkAlreadyExistsMetadata {
18138    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18139        // union deserializer
18140        use serde::de::{self, MapAccess, Visitor};
18141        struct EnumVisitor;
18142        impl<'de> Visitor<'de> for EnumVisitor {
18143            type Value = SharedLinkAlreadyExistsMetadata;
18144            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18145                f.write_str("a SharedLinkAlreadyExistsMetadata structure")
18146            }
18147            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
18148                let tag: &str = match map.next_key()? {
18149                    Some(".tag") => map.next_value()?,
18150                    _ => return Err(de::Error::missing_field(".tag"))
18151                };
18152                let value = match tag {
18153                    "metadata" => {
18154                        match map.next_key()? {
18155                            Some("metadata") => SharedLinkAlreadyExistsMetadata::Metadata(map.next_value()?),
18156                            None => return Err(de::Error::missing_field("metadata")),
18157                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
18158                        }
18159                    }
18160                    _ => SharedLinkAlreadyExistsMetadata::Other,
18161                };
18162                crate::eat_json_fields(&mut map)?;
18163                Ok(value)
18164            }
18165        }
18166        const VARIANTS: &[&str] = &["metadata",
18167                                    "other"];
18168        deserializer.deserialize_struct("SharedLinkAlreadyExistsMetadata", VARIANTS, EnumVisitor)
18169    }
18170}
18171
18172impl ::serde::ser::Serialize for SharedLinkAlreadyExistsMetadata {
18173    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18174        // union serializer
18175        use serde::ser::SerializeStruct;
18176        match self {
18177            SharedLinkAlreadyExistsMetadata::Metadata(x) => {
18178                // union or polymporphic struct
18179                let mut s = serializer.serialize_struct("SharedLinkAlreadyExistsMetadata", 2)?;
18180                s.serialize_field(".tag", "metadata")?;
18181                s.serialize_field("metadata", x)?;
18182                s.end()
18183            }
18184            SharedLinkAlreadyExistsMetadata::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
18185        }
18186    }
18187}
18188
18189#[derive(Debug, Clone, PartialEq, Eq)]
18190#[non_exhaustive] // variants may be added in the future
18191pub enum SharedLinkError {
18192    /// The shared link wasn't found.
18193    SharedLinkNotFound,
18194    /// The caller is not allowed to access this shared link.
18195    SharedLinkAccessDenied,
18196    /// This type of link is not supported; use [`files::export()`](crate::files::export) instead.
18197    UnsupportedLinkType,
18198    /// Private shared links do not support `path` or `link_password` parameter fields.
18199    UnsupportedParameterField,
18200    /// Catch-all used for unrecognized values returned from the server. Encountering this value
18201    /// typically indicates that this SDK version is out of date.
18202    Other,
18203}
18204
18205impl<'de> ::serde::de::Deserialize<'de> for SharedLinkError {
18206    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18207        // union deserializer
18208        use serde::de::{self, MapAccess, Visitor};
18209        struct EnumVisitor;
18210        impl<'de> Visitor<'de> for EnumVisitor {
18211            type Value = SharedLinkError;
18212            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18213                f.write_str("a SharedLinkError structure")
18214            }
18215            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
18216                let tag: &str = match map.next_key()? {
18217                    Some(".tag") => map.next_value()?,
18218                    _ => return Err(de::Error::missing_field(".tag"))
18219                };
18220                let value = match tag {
18221                    "shared_link_not_found" => SharedLinkError::SharedLinkNotFound,
18222                    "shared_link_access_denied" => SharedLinkError::SharedLinkAccessDenied,
18223                    "unsupported_link_type" => SharedLinkError::UnsupportedLinkType,
18224                    "unsupported_parameter_field" => SharedLinkError::UnsupportedParameterField,
18225                    _ => SharedLinkError::Other,
18226                };
18227                crate::eat_json_fields(&mut map)?;
18228                Ok(value)
18229            }
18230        }
18231        const VARIANTS: &[&str] = &["shared_link_not_found",
18232                                    "shared_link_access_denied",
18233                                    "unsupported_link_type",
18234                                    "unsupported_parameter_field",
18235                                    "other"];
18236        deserializer.deserialize_struct("SharedLinkError", VARIANTS, EnumVisitor)
18237    }
18238}
18239
18240impl ::serde::ser::Serialize for SharedLinkError {
18241    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18242        // union serializer
18243        use serde::ser::SerializeStruct;
18244        match self {
18245            SharedLinkError::SharedLinkNotFound => {
18246                // unit
18247                let mut s = serializer.serialize_struct("SharedLinkError", 1)?;
18248                s.serialize_field(".tag", "shared_link_not_found")?;
18249                s.end()
18250            }
18251            SharedLinkError::SharedLinkAccessDenied => {
18252                // unit
18253                let mut s = serializer.serialize_struct("SharedLinkError", 1)?;
18254                s.serialize_field(".tag", "shared_link_access_denied")?;
18255                s.end()
18256            }
18257            SharedLinkError::UnsupportedLinkType => {
18258                // unit
18259                let mut s = serializer.serialize_struct("SharedLinkError", 1)?;
18260                s.serialize_field(".tag", "unsupported_link_type")?;
18261                s.end()
18262            }
18263            SharedLinkError::UnsupportedParameterField => {
18264                // unit
18265                let mut s = serializer.serialize_struct("SharedLinkError", 1)?;
18266                s.serialize_field(".tag", "unsupported_parameter_field")?;
18267                s.end()
18268            }
18269            SharedLinkError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
18270        }
18271    }
18272}
18273
18274impl ::std::error::Error for SharedLinkError {
18275}
18276
18277impl ::std::fmt::Display for SharedLinkError {
18278    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18279        match self {
18280            SharedLinkError::SharedLinkNotFound => f.write_str("The shared link wasn't found."),
18281            SharedLinkError::SharedLinkAccessDenied => f.write_str("The caller is not allowed to access this shared link."),
18282            SharedLinkError::UnsupportedParameterField => f.write_str("Private shared links do not support `path` or `link_password` parameter fields."),
18283            _ => write!(f, "{:?}", *self),
18284        }
18285    }
18286}
18287
18288/// The metadata of a shared link.
18289#[derive(Debug, Clone, PartialEq, Eq)]
18290#[non_exhaustive] // variants may be added in the future
18291pub enum SharedLinkMetadata {
18292    File(FileLinkMetadata),
18293    Folder(FolderLinkMetadata),
18294    /// Catch-all used for unrecognized values returned from the server. Encountering this value
18295    /// typically indicates that this SDK version is out of date.
18296    Other,
18297}
18298
18299impl<'de> ::serde::de::Deserialize<'de> for SharedLinkMetadata {
18300    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18301        // polymorphic struct deserializer
18302        use serde::de::{self, MapAccess, Visitor};
18303        struct EnumVisitor;
18304        impl<'de> Visitor<'de> for EnumVisitor {
18305            type Value = SharedLinkMetadata;
18306            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18307                f.write_str("a SharedLinkMetadata structure")
18308            }
18309            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
18310                let tag = match map.next_key()? {
18311                    Some(".tag") => map.next_value()?,
18312                    _ => return Err(de::Error::missing_field(".tag"))
18313                };
18314                match tag {
18315                    "file" => Ok(SharedLinkMetadata::File(FileLinkMetadata::internal_deserialize(map)?)),
18316                    "folder" => Ok(SharedLinkMetadata::Folder(FolderLinkMetadata::internal_deserialize(map)?)),
18317                    _ => {
18318                        crate::eat_json_fields(&mut map)?;
18319                        Ok(SharedLinkMetadata::Other)
18320                    }
18321                }
18322            }
18323        }
18324        const VARIANTS: &[&str] = &["file",
18325                                    "folder"];
18326        deserializer.deserialize_struct("SharedLinkMetadata", VARIANTS, EnumVisitor)
18327    }
18328}
18329
18330impl ::serde::ser::Serialize for SharedLinkMetadata {
18331    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18332        // polymorphic struct serializer
18333        use serde::ser::SerializeStruct;
18334        match self {
18335            SharedLinkMetadata::File(x) => {
18336                let mut s = serializer.serialize_struct("SharedLinkMetadata", 13)?;
18337                s.serialize_field(".tag", "file")?;
18338                x.internal_serialize::<S>(&mut s)?;
18339                s.end()
18340            }
18341            SharedLinkMetadata::Folder(x) => {
18342                let mut s = serializer.serialize_struct("SharedLinkMetadata", 9)?;
18343                s.serialize_field(".tag", "folder")?;
18344                x.internal_serialize::<S>(&mut s)?;
18345                s.end()
18346            }
18347            SharedLinkMetadata::Other => Err(::serde::ser::Error::custom("cannot serialize unknown variant"))
18348        }
18349    }
18350}
18351
18352/// The potential errors for a call to get_shared_link_metadata.
18353#[derive(Debug, Clone, PartialEq, Eq)]
18354#[non_exhaustive] // variants may be added in the future
18355pub enum SharedLinkMetadataError {
18356    /// The shared link wasn't found.
18357    SharedLinkNotFound,
18358    /// The caller is not allowed to access this shared link.
18359    SharedLinkAccessDenied,
18360    /// This type of link is not supported; use [`files::export()`](crate::files::export) instead.
18361    UnsupportedLinkType,
18362    /// Private shared links do not support `path` or `link_password` parameter fields.
18363    UnsupportedParameterField,
18364    /// Catch-all used for unrecognized values returned from the server. Encountering this value
18365    /// typically indicates that this SDK version is out of date.
18366    Other,
18367}
18368
18369impl<'de> ::serde::de::Deserialize<'de> for SharedLinkMetadataError {
18370    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18371        // union deserializer
18372        use serde::de::{self, MapAccess, Visitor};
18373        struct EnumVisitor;
18374        impl<'de> Visitor<'de> for EnumVisitor {
18375            type Value = SharedLinkMetadataError;
18376            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18377                f.write_str("a SharedLinkMetadataError structure")
18378            }
18379            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
18380                let tag: &str = match map.next_key()? {
18381                    Some(".tag") => map.next_value()?,
18382                    _ => return Err(de::Error::missing_field(".tag"))
18383                };
18384                let value = match tag {
18385                    "shared_link_not_found" => SharedLinkMetadataError::SharedLinkNotFound,
18386                    "shared_link_access_denied" => SharedLinkMetadataError::SharedLinkAccessDenied,
18387                    "unsupported_link_type" => SharedLinkMetadataError::UnsupportedLinkType,
18388                    "unsupported_parameter_field" => SharedLinkMetadataError::UnsupportedParameterField,
18389                    _ => SharedLinkMetadataError::Other,
18390                };
18391                crate::eat_json_fields(&mut map)?;
18392                Ok(value)
18393            }
18394        }
18395        const VARIANTS: &[&str] = &["shared_link_not_found",
18396                                    "shared_link_access_denied",
18397                                    "unsupported_link_type",
18398                                    "unsupported_parameter_field",
18399                                    "other"];
18400        deserializer.deserialize_struct("SharedLinkMetadataError", VARIANTS, EnumVisitor)
18401    }
18402}
18403
18404impl ::serde::ser::Serialize for SharedLinkMetadataError {
18405    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18406        // union serializer
18407        use serde::ser::SerializeStruct;
18408        match self {
18409            SharedLinkMetadataError::SharedLinkNotFound => {
18410                // unit
18411                let mut s = serializer.serialize_struct("SharedLinkMetadataError", 1)?;
18412                s.serialize_field(".tag", "shared_link_not_found")?;
18413                s.end()
18414            }
18415            SharedLinkMetadataError::SharedLinkAccessDenied => {
18416                // unit
18417                let mut s = serializer.serialize_struct("SharedLinkMetadataError", 1)?;
18418                s.serialize_field(".tag", "shared_link_access_denied")?;
18419                s.end()
18420            }
18421            SharedLinkMetadataError::UnsupportedLinkType => {
18422                // unit
18423                let mut s = serializer.serialize_struct("SharedLinkMetadataError", 1)?;
18424                s.serialize_field(".tag", "unsupported_link_type")?;
18425                s.end()
18426            }
18427            SharedLinkMetadataError::UnsupportedParameterField => {
18428                // unit
18429                let mut s = serializer.serialize_struct("SharedLinkMetadataError", 1)?;
18430                s.serialize_field(".tag", "unsupported_parameter_field")?;
18431                s.end()
18432            }
18433            SharedLinkMetadataError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
18434        }
18435    }
18436}
18437
18438impl ::std::error::Error for SharedLinkMetadataError {
18439}
18440
18441impl ::std::fmt::Display for SharedLinkMetadataError {
18442    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18443        match self {
18444            SharedLinkMetadataError::SharedLinkNotFound => f.write_str("The shared link wasn't found."),
18445            SharedLinkMetadataError::SharedLinkAccessDenied => f.write_str("The caller is not allowed to access this shared link."),
18446            SharedLinkMetadataError::UnsupportedParameterField => f.write_str("Private shared links do not support `path` or `link_password` parameter fields."),
18447            _ => write!(f, "{:?}", *self),
18448        }
18449    }
18450}
18451
18452// union extends SharedLinkError
18453impl From<SharedLinkError> for SharedLinkMetadataError {
18454    fn from(parent: SharedLinkError) -> Self {
18455        match parent {
18456            SharedLinkError::SharedLinkNotFound => SharedLinkMetadataError::SharedLinkNotFound,
18457            SharedLinkError::SharedLinkAccessDenied => SharedLinkMetadataError::SharedLinkAccessDenied,
18458            SharedLinkError::UnsupportedLinkType => SharedLinkMetadataError::UnsupportedLinkType,
18459            SharedLinkError::UnsupportedParameterField => SharedLinkMetadataError::UnsupportedParameterField,
18460            SharedLinkError::Other => SharedLinkMetadataError::Other,
18461        }
18462    }
18463}
18464/// Who can view shared links in this folder.
18465#[derive(Debug, Clone, PartialEq, Eq)]
18466#[non_exhaustive] // variants may be added in the future
18467pub enum SharedLinkPolicy {
18468    /// Links can be shared with anyone.
18469    Anyone,
18470    /// Links can be shared with anyone on the same team as the owner.
18471    Team,
18472    /// Links can only be shared among members of the shared folder.
18473    Members,
18474    /// Catch-all used for unrecognized values returned from the server. Encountering this value
18475    /// typically indicates that this SDK version is out of date.
18476    Other,
18477}
18478
18479impl<'de> ::serde::de::Deserialize<'de> for SharedLinkPolicy {
18480    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18481        // union deserializer
18482        use serde::de::{self, MapAccess, Visitor};
18483        struct EnumVisitor;
18484        impl<'de> Visitor<'de> for EnumVisitor {
18485            type Value = SharedLinkPolicy;
18486            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18487                f.write_str("a SharedLinkPolicy structure")
18488            }
18489            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
18490                let tag: &str = match map.next_key()? {
18491                    Some(".tag") => map.next_value()?,
18492                    _ => return Err(de::Error::missing_field(".tag"))
18493                };
18494                let value = match tag {
18495                    "anyone" => SharedLinkPolicy::Anyone,
18496                    "team" => SharedLinkPolicy::Team,
18497                    "members" => SharedLinkPolicy::Members,
18498                    _ => SharedLinkPolicy::Other,
18499                };
18500                crate::eat_json_fields(&mut map)?;
18501                Ok(value)
18502            }
18503        }
18504        const VARIANTS: &[&str] = &["anyone",
18505                                    "team",
18506                                    "members",
18507                                    "other"];
18508        deserializer.deserialize_struct("SharedLinkPolicy", VARIANTS, EnumVisitor)
18509    }
18510}
18511
18512impl ::serde::ser::Serialize for SharedLinkPolicy {
18513    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18514        // union serializer
18515        use serde::ser::SerializeStruct;
18516        match self {
18517            SharedLinkPolicy::Anyone => {
18518                // unit
18519                let mut s = serializer.serialize_struct("SharedLinkPolicy", 1)?;
18520                s.serialize_field(".tag", "anyone")?;
18521                s.end()
18522            }
18523            SharedLinkPolicy::Team => {
18524                // unit
18525                let mut s = serializer.serialize_struct("SharedLinkPolicy", 1)?;
18526                s.serialize_field(".tag", "team")?;
18527                s.end()
18528            }
18529            SharedLinkPolicy::Members => {
18530                // unit
18531                let mut s = serializer.serialize_struct("SharedLinkPolicy", 1)?;
18532                s.serialize_field(".tag", "members")?;
18533                s.end()
18534            }
18535            SharedLinkPolicy::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
18536        }
18537    }
18538}
18539
18540#[derive(Debug, Clone, PartialEq, Eq, Default)]
18541#[non_exhaustive] // structs may have more fields added in the future.
18542pub struct SharedLinkSettings {
18543    /// Boolean flag to enable or disable password protection.
18544    pub require_password: Option<bool>,
18545    /// If `require_password` is true, this is needed to specify the password to access the link.
18546    pub link_password: Option<String>,
18547    /// Expiration time of the shared link. By default the link won't expire.
18548    pub expires: Option<crate::types::common::DropboxTimestamp>,
18549    /// The new audience who can benefit from the access level specified by the link's access level
18550    /// specified in the `link_access_level` field of `LinkPermissions`. This is used in conjunction
18551    /// with team policies and shared folder policies to determine the final effective audience type
18552    /// in the `effective_audience` field of `LinkPermissions.
18553    pub audience: Option<LinkAudience>,
18554    /// Requested access level you want the audience to gain from this link. Note, modifying access
18555    /// level for an existing link is not supported.
18556    pub access: Option<RequestedLinkAccessLevel>,
18557    /// Use `audience` instead.  The requested access for this shared link.
18558    pub requested_visibility: Option<RequestedVisibility>,
18559    /// Boolean flag to allow or not download capabilities for shared links.
18560    pub allow_download: Option<bool>,
18561}
18562
18563impl SharedLinkSettings {
18564    pub fn with_require_password(mut self, value: bool) -> Self {
18565        self.require_password = Some(value);
18566        self
18567    }
18568
18569    pub fn with_link_password(mut self, value: String) -> Self {
18570        self.link_password = Some(value);
18571        self
18572    }
18573
18574    pub fn with_expires(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
18575        self.expires = Some(value);
18576        self
18577    }
18578
18579    pub fn with_audience(mut self, value: LinkAudience) -> Self {
18580        self.audience = Some(value);
18581        self
18582    }
18583
18584    pub fn with_access(mut self, value: RequestedLinkAccessLevel) -> Self {
18585        self.access = Some(value);
18586        self
18587    }
18588
18589    pub fn with_requested_visibility(mut self, value: RequestedVisibility) -> Self {
18590        self.requested_visibility = Some(value);
18591        self
18592    }
18593
18594    pub fn with_allow_download(mut self, value: bool) -> Self {
18595        self.allow_download = Some(value);
18596        self
18597    }
18598}
18599
18600const SHARED_LINK_SETTINGS_FIELDS: &[&str] = &["require_password",
18601                                               "link_password",
18602                                               "expires",
18603                                               "audience",
18604                                               "access",
18605                                               "requested_visibility",
18606                                               "allow_download"];
18607impl SharedLinkSettings {
18608    // no _opt deserializer
18609    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
18610        mut map: V,
18611    ) -> Result<SharedLinkSettings, V::Error> {
18612        let mut field_require_password = None;
18613        let mut field_link_password = None;
18614        let mut field_expires = None;
18615        let mut field_audience = None;
18616        let mut field_access = None;
18617        let mut field_requested_visibility = None;
18618        let mut field_allow_download = None;
18619        while let Some(key) = map.next_key::<&str>()? {
18620            match key {
18621                "require_password" => {
18622                    if field_require_password.is_some() {
18623                        return Err(::serde::de::Error::duplicate_field("require_password"));
18624                    }
18625                    field_require_password = Some(map.next_value()?);
18626                }
18627                "link_password" => {
18628                    if field_link_password.is_some() {
18629                        return Err(::serde::de::Error::duplicate_field("link_password"));
18630                    }
18631                    field_link_password = Some(map.next_value()?);
18632                }
18633                "expires" => {
18634                    if field_expires.is_some() {
18635                        return Err(::serde::de::Error::duplicate_field("expires"));
18636                    }
18637                    field_expires = Some(map.next_value()?);
18638                }
18639                "audience" => {
18640                    if field_audience.is_some() {
18641                        return Err(::serde::de::Error::duplicate_field("audience"));
18642                    }
18643                    field_audience = Some(map.next_value()?);
18644                }
18645                "access" => {
18646                    if field_access.is_some() {
18647                        return Err(::serde::de::Error::duplicate_field("access"));
18648                    }
18649                    field_access = Some(map.next_value()?);
18650                }
18651                "requested_visibility" => {
18652                    if field_requested_visibility.is_some() {
18653                        return Err(::serde::de::Error::duplicate_field("requested_visibility"));
18654                    }
18655                    field_requested_visibility = Some(map.next_value()?);
18656                }
18657                "allow_download" => {
18658                    if field_allow_download.is_some() {
18659                        return Err(::serde::de::Error::duplicate_field("allow_download"));
18660                    }
18661                    field_allow_download = Some(map.next_value()?);
18662                }
18663                _ => {
18664                    // unknown field allowed and ignored
18665                    map.next_value::<::serde_json::Value>()?;
18666                }
18667            }
18668        }
18669        let result = SharedLinkSettings {
18670            require_password: field_require_password.and_then(Option::flatten),
18671            link_password: field_link_password.and_then(Option::flatten),
18672            expires: field_expires.and_then(Option::flatten),
18673            audience: field_audience.and_then(Option::flatten),
18674            access: field_access.and_then(Option::flatten),
18675            requested_visibility: field_requested_visibility.and_then(Option::flatten),
18676            allow_download: field_allow_download.and_then(Option::flatten),
18677        };
18678        Ok(result)
18679    }
18680
18681    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
18682        &self,
18683        s: &mut S::SerializeStruct,
18684    ) -> Result<(), S::Error> {
18685        use serde::ser::SerializeStruct;
18686        if let Some(val) = &self.require_password {
18687            s.serialize_field("require_password", val)?;
18688        }
18689        if let Some(val) = &self.link_password {
18690            s.serialize_field("link_password", val)?;
18691        }
18692        if let Some(val) = &self.expires {
18693            s.serialize_field("expires", val)?;
18694        }
18695        if let Some(val) = &self.audience {
18696            s.serialize_field("audience", val)?;
18697        }
18698        if let Some(val) = &self.access {
18699            s.serialize_field("access", val)?;
18700        }
18701        if let Some(val) = &self.requested_visibility {
18702            s.serialize_field("requested_visibility", val)?;
18703        }
18704        if let Some(val) = &self.allow_download {
18705            s.serialize_field("allow_download", val)?;
18706        }
18707        Ok(())
18708    }
18709}
18710
18711impl<'de> ::serde::de::Deserialize<'de> for SharedLinkSettings {
18712    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18713        // struct deserializer
18714        use serde::de::{MapAccess, Visitor};
18715        struct StructVisitor;
18716        impl<'de> Visitor<'de> for StructVisitor {
18717            type Value = SharedLinkSettings;
18718            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18719                f.write_str("a SharedLinkSettings struct")
18720            }
18721            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
18722                SharedLinkSettings::internal_deserialize(map)
18723            }
18724        }
18725        deserializer.deserialize_struct("SharedLinkSettings", SHARED_LINK_SETTINGS_FIELDS, StructVisitor)
18726    }
18727}
18728
18729impl ::serde::ser::Serialize for SharedLinkSettings {
18730    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18731        // struct serializer
18732        use serde::ser::SerializeStruct;
18733        let mut s = serializer.serialize_struct("SharedLinkSettings", 7)?;
18734        self.internal_serialize::<S>(&mut s)?;
18735        s.end()
18736    }
18737}
18738
18739#[derive(Debug, Clone, PartialEq, Eq)]
18740pub enum SharedLinkSettingsError {
18741    /// The given settings are invalid (for example, all attributes of the [`SharedLinkSettings`]
18742    /// are empty, the requested visibility is [`RequestedVisibility::Password`] but the
18743    /// [`SharedLinkSettings::link_password`](SharedLinkSettings) is missing,
18744    /// [`SharedLinkSettings::expires`](SharedLinkSettings) is set to the past, etc.).
18745    InvalidSettings,
18746    /// User is not allowed to modify the settings of this link. Note that basic users can only set
18747    /// [`RequestedVisibility::Public`] as the
18748    /// [`SharedLinkSettings::requested_visibility`](SharedLinkSettings) and cannot set
18749    /// [`SharedLinkSettings::expires`](SharedLinkSettings).
18750    NotAuthorized,
18751}
18752
18753impl<'de> ::serde::de::Deserialize<'de> for SharedLinkSettingsError {
18754    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18755        // union deserializer
18756        use serde::de::{self, MapAccess, Visitor};
18757        struct EnumVisitor;
18758        impl<'de> Visitor<'de> for EnumVisitor {
18759            type Value = SharedLinkSettingsError;
18760            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18761                f.write_str("a SharedLinkSettingsError structure")
18762            }
18763            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
18764                let tag: &str = match map.next_key()? {
18765                    Some(".tag") => map.next_value()?,
18766                    _ => return Err(de::Error::missing_field(".tag"))
18767                };
18768                let value = match tag {
18769                    "invalid_settings" => SharedLinkSettingsError::InvalidSettings,
18770                    "not_authorized" => SharedLinkSettingsError::NotAuthorized,
18771                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
18772                };
18773                crate::eat_json_fields(&mut map)?;
18774                Ok(value)
18775            }
18776        }
18777        const VARIANTS: &[&str] = &["invalid_settings",
18778                                    "not_authorized"];
18779        deserializer.deserialize_struct("SharedLinkSettingsError", VARIANTS, EnumVisitor)
18780    }
18781}
18782
18783impl ::serde::ser::Serialize for SharedLinkSettingsError {
18784    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18785        // union serializer
18786        use serde::ser::SerializeStruct;
18787        match self {
18788            SharedLinkSettingsError::InvalidSettings => {
18789                // unit
18790                let mut s = serializer.serialize_struct("SharedLinkSettingsError", 1)?;
18791                s.serialize_field(".tag", "invalid_settings")?;
18792                s.end()
18793            }
18794            SharedLinkSettingsError::NotAuthorized => {
18795                // unit
18796                let mut s = serializer.serialize_struct("SharedLinkSettingsError", 1)?;
18797                s.serialize_field(".tag", "not_authorized")?;
18798                s.end()
18799            }
18800        }
18801    }
18802}
18803
18804impl ::std::error::Error for SharedLinkSettingsError {
18805}
18806
18807impl ::std::fmt::Display for SharedLinkSettingsError {
18808    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18809        write!(f, "{:?}", *self)
18810    }
18811}
18812
18813/// User could not access this file.
18814#[derive(Debug, Clone, PartialEq, Eq)]
18815#[non_exhaustive] // variants may be added in the future
18816pub enum SharingFileAccessError {
18817    /// Current user does not have sufficient privileges to perform the desired action.
18818    NoPermission,
18819    /// File specified was not found.
18820    InvalidFile,
18821    /// A folder can't be shared this way. Use folder sharing or a shared link instead.
18822    IsFolder,
18823    /// A file inside a public folder can't be shared this way. Use a public link instead.
18824    InsidePublicFolder,
18825    /// A Mac OS X package can't be shared this way. Use a shared link instead.
18826    InsideOsxPackage,
18827    /// Catch-all used for unrecognized values returned from the server. Encountering this value
18828    /// typically indicates that this SDK version is out of date.
18829    Other,
18830}
18831
18832impl<'de> ::serde::de::Deserialize<'de> for SharingFileAccessError {
18833    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18834        // union deserializer
18835        use serde::de::{self, MapAccess, Visitor};
18836        struct EnumVisitor;
18837        impl<'de> Visitor<'de> for EnumVisitor {
18838            type Value = SharingFileAccessError;
18839            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18840                f.write_str("a SharingFileAccessError structure")
18841            }
18842            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
18843                let tag: &str = match map.next_key()? {
18844                    Some(".tag") => map.next_value()?,
18845                    _ => return Err(de::Error::missing_field(".tag"))
18846                };
18847                let value = match tag {
18848                    "no_permission" => SharingFileAccessError::NoPermission,
18849                    "invalid_file" => SharingFileAccessError::InvalidFile,
18850                    "is_folder" => SharingFileAccessError::IsFolder,
18851                    "inside_public_folder" => SharingFileAccessError::InsidePublicFolder,
18852                    "inside_osx_package" => SharingFileAccessError::InsideOsxPackage,
18853                    _ => SharingFileAccessError::Other,
18854                };
18855                crate::eat_json_fields(&mut map)?;
18856                Ok(value)
18857            }
18858        }
18859        const VARIANTS: &[&str] = &["no_permission",
18860                                    "invalid_file",
18861                                    "is_folder",
18862                                    "inside_public_folder",
18863                                    "inside_osx_package",
18864                                    "other"];
18865        deserializer.deserialize_struct("SharingFileAccessError", VARIANTS, EnumVisitor)
18866    }
18867}
18868
18869impl ::serde::ser::Serialize for SharingFileAccessError {
18870    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18871        // union serializer
18872        use serde::ser::SerializeStruct;
18873        match self {
18874            SharingFileAccessError::NoPermission => {
18875                // unit
18876                let mut s = serializer.serialize_struct("SharingFileAccessError", 1)?;
18877                s.serialize_field(".tag", "no_permission")?;
18878                s.end()
18879            }
18880            SharingFileAccessError::InvalidFile => {
18881                // unit
18882                let mut s = serializer.serialize_struct("SharingFileAccessError", 1)?;
18883                s.serialize_field(".tag", "invalid_file")?;
18884                s.end()
18885            }
18886            SharingFileAccessError::IsFolder => {
18887                // unit
18888                let mut s = serializer.serialize_struct("SharingFileAccessError", 1)?;
18889                s.serialize_field(".tag", "is_folder")?;
18890                s.end()
18891            }
18892            SharingFileAccessError::InsidePublicFolder => {
18893                // unit
18894                let mut s = serializer.serialize_struct("SharingFileAccessError", 1)?;
18895                s.serialize_field(".tag", "inside_public_folder")?;
18896                s.end()
18897            }
18898            SharingFileAccessError::InsideOsxPackage => {
18899                // unit
18900                let mut s = serializer.serialize_struct("SharingFileAccessError", 1)?;
18901                s.serialize_field(".tag", "inside_osx_package")?;
18902                s.end()
18903            }
18904            SharingFileAccessError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
18905        }
18906    }
18907}
18908
18909impl ::std::error::Error for SharingFileAccessError {
18910}
18911
18912impl ::std::fmt::Display for SharingFileAccessError {
18913    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18914        match self {
18915            SharingFileAccessError::NoPermission => f.write_str("Current user does not have sufficient privileges to perform the desired action."),
18916            SharingFileAccessError::InvalidFile => f.write_str("File specified was not found."),
18917            SharingFileAccessError::IsFolder => f.write_str("A folder can't be shared this way. Use folder sharing or a shared link instead."),
18918            SharingFileAccessError::InsidePublicFolder => f.write_str("A file inside a public folder can't be shared this way. Use a public link instead."),
18919            SharingFileAccessError::InsideOsxPackage => f.write_str("A Mac OS X package can't be shared this way. Use a shared link instead."),
18920            _ => write!(f, "{:?}", *self),
18921        }
18922    }
18923}
18924
18925/// User account had a problem preventing this action.
18926#[derive(Debug, Clone, PartialEq, Eq)]
18927#[non_exhaustive] // variants may be added in the future
18928pub enum SharingUserError {
18929    /// This user's email address is not verified. This functionality is only available on accounts
18930    /// with a verified email address. Users can verify their email address
18931    /// [here](https://www.dropbox.com/help/317).
18932    EmailUnverified,
18933    /// Catch-all used for unrecognized values returned from the server. Encountering this value
18934    /// typically indicates that this SDK version is out of date.
18935    Other,
18936}
18937
18938impl<'de> ::serde::de::Deserialize<'de> for SharingUserError {
18939    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18940        // union deserializer
18941        use serde::de::{self, MapAccess, Visitor};
18942        struct EnumVisitor;
18943        impl<'de> Visitor<'de> for EnumVisitor {
18944            type Value = SharingUserError;
18945            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18946                f.write_str("a SharingUserError structure")
18947            }
18948            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
18949                let tag: &str = match map.next_key()? {
18950                    Some(".tag") => map.next_value()?,
18951                    _ => return Err(de::Error::missing_field(".tag"))
18952                };
18953                let value = match tag {
18954                    "email_unverified" => SharingUserError::EmailUnverified,
18955                    _ => SharingUserError::Other,
18956                };
18957                crate::eat_json_fields(&mut map)?;
18958                Ok(value)
18959            }
18960        }
18961        const VARIANTS: &[&str] = &["email_unverified",
18962                                    "other"];
18963        deserializer.deserialize_struct("SharingUserError", VARIANTS, EnumVisitor)
18964    }
18965}
18966
18967impl ::serde::ser::Serialize for SharingUserError {
18968    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18969        // union serializer
18970        use serde::ser::SerializeStruct;
18971        match self {
18972            SharingUserError::EmailUnverified => {
18973                // unit
18974                let mut s = serializer.serialize_struct("SharingUserError", 1)?;
18975                s.serialize_field(".tag", "email_unverified")?;
18976                s.end()
18977            }
18978            SharingUserError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
18979        }
18980    }
18981}
18982
18983impl ::std::error::Error for SharingUserError {
18984}
18985
18986impl ::std::fmt::Display for SharingUserError {
18987    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18988        write!(f, "{:?}", *self)
18989    }
18990}
18991
18992/// Information about a team member.
18993#[derive(Debug, Clone, PartialEq, Eq)]
18994#[non_exhaustive] // structs may have more fields added in the future.
18995pub struct TeamMemberInfo {
18996    /// Information about the member's team.
18997    pub team_info: TeamInfo,
18998    /// The display name of the user.
18999    pub display_name: String,
19000    /// ID of user as a member of a team. This field will only be present if the member is in the
19001    /// same team as current user.
19002    pub member_id: Option<String>,
19003}
19004
19005impl TeamMemberInfo {
19006    pub fn new(team_info: TeamInfo, display_name: String) -> Self {
19007        TeamMemberInfo {
19008            team_info,
19009            display_name,
19010            member_id: None,
19011        }
19012    }
19013
19014    pub fn with_member_id(mut self, value: String) -> Self {
19015        self.member_id = Some(value);
19016        self
19017    }
19018}
19019
19020const TEAM_MEMBER_INFO_FIELDS: &[&str] = &["team_info",
19021                                           "display_name",
19022                                           "member_id"];
19023impl TeamMemberInfo {
19024    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
19025        map: V,
19026    ) -> Result<TeamMemberInfo, V::Error> {
19027        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
19028    }
19029
19030    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
19031        mut map: V,
19032        optional: bool,
19033    ) -> Result<Option<TeamMemberInfo>, V::Error> {
19034        let mut field_team_info = None;
19035        let mut field_display_name = None;
19036        let mut field_member_id = None;
19037        let mut nothing = true;
19038        while let Some(key) = map.next_key::<&str>()? {
19039            nothing = false;
19040            match key {
19041                "team_info" => {
19042                    if field_team_info.is_some() {
19043                        return Err(::serde::de::Error::duplicate_field("team_info"));
19044                    }
19045                    field_team_info = Some(map.next_value()?);
19046                }
19047                "display_name" => {
19048                    if field_display_name.is_some() {
19049                        return Err(::serde::de::Error::duplicate_field("display_name"));
19050                    }
19051                    field_display_name = Some(map.next_value()?);
19052                }
19053                "member_id" => {
19054                    if field_member_id.is_some() {
19055                        return Err(::serde::de::Error::duplicate_field("member_id"));
19056                    }
19057                    field_member_id = Some(map.next_value()?);
19058                }
19059                _ => {
19060                    // unknown field allowed and ignored
19061                    map.next_value::<::serde_json::Value>()?;
19062                }
19063            }
19064        }
19065        if optional && nothing {
19066            return Ok(None);
19067        }
19068        let result = TeamMemberInfo {
19069            team_info: field_team_info.ok_or_else(|| ::serde::de::Error::missing_field("team_info"))?,
19070            display_name: field_display_name.ok_or_else(|| ::serde::de::Error::missing_field("display_name"))?,
19071            member_id: field_member_id.and_then(Option::flatten),
19072        };
19073        Ok(Some(result))
19074    }
19075
19076    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
19077        &self,
19078        s: &mut S::SerializeStruct,
19079    ) -> Result<(), S::Error> {
19080        use serde::ser::SerializeStruct;
19081        s.serialize_field("team_info", &self.team_info)?;
19082        s.serialize_field("display_name", &self.display_name)?;
19083        if let Some(val) = &self.member_id {
19084            s.serialize_field("member_id", val)?;
19085        }
19086        Ok(())
19087    }
19088}
19089
19090impl<'de> ::serde::de::Deserialize<'de> for TeamMemberInfo {
19091    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19092        // struct deserializer
19093        use serde::de::{MapAccess, Visitor};
19094        struct StructVisitor;
19095        impl<'de> Visitor<'de> for StructVisitor {
19096            type Value = TeamMemberInfo;
19097            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19098                f.write_str("a TeamMemberInfo struct")
19099            }
19100            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
19101                TeamMemberInfo::internal_deserialize(map)
19102            }
19103        }
19104        deserializer.deserialize_struct("TeamMemberInfo", TEAM_MEMBER_INFO_FIELDS, StructVisitor)
19105    }
19106}
19107
19108impl ::serde::ser::Serialize for TeamMemberInfo {
19109    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19110        // struct serializer
19111        use serde::ser::SerializeStruct;
19112        let mut s = serializer.serialize_struct("TeamMemberInfo", 3)?;
19113        self.internal_serialize::<S>(&mut s)?;
19114        s.end()
19115    }
19116}
19117
19118#[derive(Debug, Clone, PartialEq, Eq)]
19119#[non_exhaustive] // structs may have more fields added in the future.
19120pub struct TransferFolderArg {
19121    /// The ID for the shared folder.
19122    pub shared_folder_id: crate::types::common::SharedFolderId,
19123    /// A account or team member ID to transfer ownership to.
19124    pub to_dropbox_id: DropboxId,
19125}
19126
19127impl TransferFolderArg {
19128    pub fn new(
19129        shared_folder_id: crate::types::common::SharedFolderId,
19130        to_dropbox_id: DropboxId,
19131    ) -> Self {
19132        TransferFolderArg {
19133            shared_folder_id,
19134            to_dropbox_id,
19135        }
19136    }
19137}
19138
19139const TRANSFER_FOLDER_ARG_FIELDS: &[&str] = &["shared_folder_id",
19140                                              "to_dropbox_id"];
19141impl TransferFolderArg {
19142    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
19143        map: V,
19144    ) -> Result<TransferFolderArg, V::Error> {
19145        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
19146    }
19147
19148    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
19149        mut map: V,
19150        optional: bool,
19151    ) -> Result<Option<TransferFolderArg>, V::Error> {
19152        let mut field_shared_folder_id = None;
19153        let mut field_to_dropbox_id = None;
19154        let mut nothing = true;
19155        while let Some(key) = map.next_key::<&str>()? {
19156            nothing = false;
19157            match key {
19158                "shared_folder_id" => {
19159                    if field_shared_folder_id.is_some() {
19160                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
19161                    }
19162                    field_shared_folder_id = Some(map.next_value()?);
19163                }
19164                "to_dropbox_id" => {
19165                    if field_to_dropbox_id.is_some() {
19166                        return Err(::serde::de::Error::duplicate_field("to_dropbox_id"));
19167                    }
19168                    field_to_dropbox_id = Some(map.next_value()?);
19169                }
19170                _ => {
19171                    // unknown field allowed and ignored
19172                    map.next_value::<::serde_json::Value>()?;
19173                }
19174            }
19175        }
19176        if optional && nothing {
19177            return Ok(None);
19178        }
19179        let result = TransferFolderArg {
19180            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
19181            to_dropbox_id: field_to_dropbox_id.ok_or_else(|| ::serde::de::Error::missing_field("to_dropbox_id"))?,
19182        };
19183        Ok(Some(result))
19184    }
19185
19186    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
19187        &self,
19188        s: &mut S::SerializeStruct,
19189    ) -> Result<(), S::Error> {
19190        use serde::ser::SerializeStruct;
19191        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
19192        s.serialize_field("to_dropbox_id", &self.to_dropbox_id)?;
19193        Ok(())
19194    }
19195}
19196
19197impl<'de> ::serde::de::Deserialize<'de> for TransferFolderArg {
19198    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19199        // struct deserializer
19200        use serde::de::{MapAccess, Visitor};
19201        struct StructVisitor;
19202        impl<'de> Visitor<'de> for StructVisitor {
19203            type Value = TransferFolderArg;
19204            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19205                f.write_str("a TransferFolderArg struct")
19206            }
19207            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
19208                TransferFolderArg::internal_deserialize(map)
19209            }
19210        }
19211        deserializer.deserialize_struct("TransferFolderArg", TRANSFER_FOLDER_ARG_FIELDS, StructVisitor)
19212    }
19213}
19214
19215impl ::serde::ser::Serialize for TransferFolderArg {
19216    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19217        // struct serializer
19218        use serde::ser::SerializeStruct;
19219        let mut s = serializer.serialize_struct("TransferFolderArg", 2)?;
19220        self.internal_serialize::<S>(&mut s)?;
19221        s.end()
19222    }
19223}
19224
19225#[derive(Debug, Clone, PartialEq, Eq)]
19226#[non_exhaustive] // variants may be added in the future
19227pub enum TransferFolderError {
19228    AccessError(SharedFolderAccessError),
19229    /// [`TransferFolderArg::to_dropbox_id`](TransferFolderArg) is invalid.
19230    InvalidDropboxId,
19231    /// The new designated owner is not currently a member of the shared folder.
19232    NewOwnerNotAMember,
19233    /// The new designated owner has not added the folder to their Dropbox.
19234    NewOwnerUnmounted,
19235    /// The new designated owner's email address is not verified. This functionality is only
19236    /// available on accounts with a verified email address. Users can verify their email address
19237    /// [here](https://www.dropbox.com/help/317).
19238    NewOwnerEmailUnverified,
19239    /// This action cannot be performed on a team shared folder.
19240    TeamFolder,
19241    /// The current user does not have permission to perform this action.
19242    NoPermission,
19243    /// Catch-all used for unrecognized values returned from the server. Encountering this value
19244    /// typically indicates that this SDK version is out of date.
19245    Other,
19246}
19247
19248impl<'de> ::serde::de::Deserialize<'de> for TransferFolderError {
19249    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19250        // union deserializer
19251        use serde::de::{self, MapAccess, Visitor};
19252        struct EnumVisitor;
19253        impl<'de> Visitor<'de> for EnumVisitor {
19254            type Value = TransferFolderError;
19255            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19256                f.write_str("a TransferFolderError structure")
19257            }
19258            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
19259                let tag: &str = match map.next_key()? {
19260                    Some(".tag") => map.next_value()?,
19261                    _ => return Err(de::Error::missing_field(".tag"))
19262                };
19263                let value = match tag {
19264                    "access_error" => {
19265                        match map.next_key()? {
19266                            Some("access_error") => TransferFolderError::AccessError(map.next_value()?),
19267                            None => return Err(de::Error::missing_field("access_error")),
19268                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
19269                        }
19270                    }
19271                    "invalid_dropbox_id" => TransferFolderError::InvalidDropboxId,
19272                    "new_owner_not_a_member" => TransferFolderError::NewOwnerNotAMember,
19273                    "new_owner_unmounted" => TransferFolderError::NewOwnerUnmounted,
19274                    "new_owner_email_unverified" => TransferFolderError::NewOwnerEmailUnverified,
19275                    "team_folder" => TransferFolderError::TeamFolder,
19276                    "no_permission" => TransferFolderError::NoPermission,
19277                    _ => TransferFolderError::Other,
19278                };
19279                crate::eat_json_fields(&mut map)?;
19280                Ok(value)
19281            }
19282        }
19283        const VARIANTS: &[&str] = &["access_error",
19284                                    "invalid_dropbox_id",
19285                                    "new_owner_not_a_member",
19286                                    "new_owner_unmounted",
19287                                    "new_owner_email_unverified",
19288                                    "team_folder",
19289                                    "no_permission",
19290                                    "other"];
19291        deserializer.deserialize_struct("TransferFolderError", VARIANTS, EnumVisitor)
19292    }
19293}
19294
19295impl ::serde::ser::Serialize for TransferFolderError {
19296    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19297        // union serializer
19298        use serde::ser::SerializeStruct;
19299        match self {
19300            TransferFolderError::AccessError(x) => {
19301                // union or polymporphic struct
19302                let mut s = serializer.serialize_struct("TransferFolderError", 2)?;
19303                s.serialize_field(".tag", "access_error")?;
19304                s.serialize_field("access_error", x)?;
19305                s.end()
19306            }
19307            TransferFolderError::InvalidDropboxId => {
19308                // unit
19309                let mut s = serializer.serialize_struct("TransferFolderError", 1)?;
19310                s.serialize_field(".tag", "invalid_dropbox_id")?;
19311                s.end()
19312            }
19313            TransferFolderError::NewOwnerNotAMember => {
19314                // unit
19315                let mut s = serializer.serialize_struct("TransferFolderError", 1)?;
19316                s.serialize_field(".tag", "new_owner_not_a_member")?;
19317                s.end()
19318            }
19319            TransferFolderError::NewOwnerUnmounted => {
19320                // unit
19321                let mut s = serializer.serialize_struct("TransferFolderError", 1)?;
19322                s.serialize_field(".tag", "new_owner_unmounted")?;
19323                s.end()
19324            }
19325            TransferFolderError::NewOwnerEmailUnverified => {
19326                // unit
19327                let mut s = serializer.serialize_struct("TransferFolderError", 1)?;
19328                s.serialize_field(".tag", "new_owner_email_unverified")?;
19329                s.end()
19330            }
19331            TransferFolderError::TeamFolder => {
19332                // unit
19333                let mut s = serializer.serialize_struct("TransferFolderError", 1)?;
19334                s.serialize_field(".tag", "team_folder")?;
19335                s.end()
19336            }
19337            TransferFolderError::NoPermission => {
19338                // unit
19339                let mut s = serializer.serialize_struct("TransferFolderError", 1)?;
19340                s.serialize_field(".tag", "no_permission")?;
19341                s.end()
19342            }
19343            TransferFolderError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
19344        }
19345    }
19346}
19347
19348impl ::std::error::Error for TransferFolderError {
19349    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
19350        match self {
19351            TransferFolderError::AccessError(inner) => Some(inner),
19352            _ => None,
19353        }
19354    }
19355}
19356
19357impl ::std::fmt::Display for TransferFolderError {
19358    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19359        match self {
19360            TransferFolderError::AccessError(inner) => write!(f, "TransferFolderError: {}", inner),
19361            TransferFolderError::NewOwnerNotAMember => f.write_str("The new designated owner is not currently a member of the shared folder."),
19362            TransferFolderError::NewOwnerUnmounted => f.write_str("The new designated owner has not added the folder to their Dropbox."),
19363            TransferFolderError::TeamFolder => f.write_str("This action cannot be performed on a team shared folder."),
19364            TransferFolderError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
19365            _ => write!(f, "{:?}", *self),
19366        }
19367    }
19368}
19369
19370#[derive(Debug, Clone, PartialEq, Eq)]
19371#[non_exhaustive] // structs may have more fields added in the future.
19372pub struct UnmountFolderArg {
19373    /// The ID for the shared folder.
19374    pub shared_folder_id: crate::types::common::SharedFolderId,
19375}
19376
19377impl UnmountFolderArg {
19378    pub fn new(shared_folder_id: crate::types::common::SharedFolderId) -> Self {
19379        UnmountFolderArg {
19380            shared_folder_id,
19381        }
19382    }
19383}
19384
19385const UNMOUNT_FOLDER_ARG_FIELDS: &[&str] = &["shared_folder_id"];
19386impl UnmountFolderArg {
19387    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
19388        map: V,
19389    ) -> Result<UnmountFolderArg, V::Error> {
19390        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
19391    }
19392
19393    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
19394        mut map: V,
19395        optional: bool,
19396    ) -> Result<Option<UnmountFolderArg>, V::Error> {
19397        let mut field_shared_folder_id = None;
19398        let mut nothing = true;
19399        while let Some(key) = map.next_key::<&str>()? {
19400            nothing = false;
19401            match key {
19402                "shared_folder_id" => {
19403                    if field_shared_folder_id.is_some() {
19404                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
19405                    }
19406                    field_shared_folder_id = Some(map.next_value()?);
19407                }
19408                _ => {
19409                    // unknown field allowed and ignored
19410                    map.next_value::<::serde_json::Value>()?;
19411                }
19412            }
19413        }
19414        if optional && nothing {
19415            return Ok(None);
19416        }
19417        let result = UnmountFolderArg {
19418            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
19419        };
19420        Ok(Some(result))
19421    }
19422
19423    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
19424        &self,
19425        s: &mut S::SerializeStruct,
19426    ) -> Result<(), S::Error> {
19427        use serde::ser::SerializeStruct;
19428        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
19429        Ok(())
19430    }
19431}
19432
19433impl<'de> ::serde::de::Deserialize<'de> for UnmountFolderArg {
19434    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19435        // struct deserializer
19436        use serde::de::{MapAccess, Visitor};
19437        struct StructVisitor;
19438        impl<'de> Visitor<'de> for StructVisitor {
19439            type Value = UnmountFolderArg;
19440            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19441                f.write_str("a UnmountFolderArg struct")
19442            }
19443            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
19444                UnmountFolderArg::internal_deserialize(map)
19445            }
19446        }
19447        deserializer.deserialize_struct("UnmountFolderArg", UNMOUNT_FOLDER_ARG_FIELDS, StructVisitor)
19448    }
19449}
19450
19451impl ::serde::ser::Serialize for UnmountFolderArg {
19452    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19453        // struct serializer
19454        use serde::ser::SerializeStruct;
19455        let mut s = serializer.serialize_struct("UnmountFolderArg", 1)?;
19456        self.internal_serialize::<S>(&mut s)?;
19457        s.end()
19458    }
19459}
19460
19461#[derive(Debug, Clone, PartialEq, Eq)]
19462#[non_exhaustive] // variants may be added in the future
19463pub enum UnmountFolderError {
19464    AccessError(SharedFolderAccessError),
19465    /// The current user does not have permission to perform this action.
19466    NoPermission,
19467    /// The shared folder can't be unmounted. One example where this can occur is when the shared
19468    /// folder's parent folder is also a shared folder that resides in the current user's Dropbox.
19469    NotUnmountable,
19470    /// Catch-all used for unrecognized values returned from the server. Encountering this value
19471    /// typically indicates that this SDK version is out of date.
19472    Other,
19473}
19474
19475impl<'de> ::serde::de::Deserialize<'de> for UnmountFolderError {
19476    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19477        // union deserializer
19478        use serde::de::{self, MapAccess, Visitor};
19479        struct EnumVisitor;
19480        impl<'de> Visitor<'de> for EnumVisitor {
19481            type Value = UnmountFolderError;
19482            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19483                f.write_str("a UnmountFolderError structure")
19484            }
19485            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
19486                let tag: &str = match map.next_key()? {
19487                    Some(".tag") => map.next_value()?,
19488                    _ => return Err(de::Error::missing_field(".tag"))
19489                };
19490                let value = match tag {
19491                    "access_error" => {
19492                        match map.next_key()? {
19493                            Some("access_error") => UnmountFolderError::AccessError(map.next_value()?),
19494                            None => return Err(de::Error::missing_field("access_error")),
19495                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
19496                        }
19497                    }
19498                    "no_permission" => UnmountFolderError::NoPermission,
19499                    "not_unmountable" => UnmountFolderError::NotUnmountable,
19500                    _ => UnmountFolderError::Other,
19501                };
19502                crate::eat_json_fields(&mut map)?;
19503                Ok(value)
19504            }
19505        }
19506        const VARIANTS: &[&str] = &["access_error",
19507                                    "no_permission",
19508                                    "not_unmountable",
19509                                    "other"];
19510        deserializer.deserialize_struct("UnmountFolderError", VARIANTS, EnumVisitor)
19511    }
19512}
19513
19514impl ::serde::ser::Serialize for UnmountFolderError {
19515    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19516        // union serializer
19517        use serde::ser::SerializeStruct;
19518        match self {
19519            UnmountFolderError::AccessError(x) => {
19520                // union or polymporphic struct
19521                let mut s = serializer.serialize_struct("UnmountFolderError", 2)?;
19522                s.serialize_field(".tag", "access_error")?;
19523                s.serialize_field("access_error", x)?;
19524                s.end()
19525            }
19526            UnmountFolderError::NoPermission => {
19527                // unit
19528                let mut s = serializer.serialize_struct("UnmountFolderError", 1)?;
19529                s.serialize_field(".tag", "no_permission")?;
19530                s.end()
19531            }
19532            UnmountFolderError::NotUnmountable => {
19533                // unit
19534                let mut s = serializer.serialize_struct("UnmountFolderError", 1)?;
19535                s.serialize_field(".tag", "not_unmountable")?;
19536                s.end()
19537            }
19538            UnmountFolderError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
19539        }
19540    }
19541}
19542
19543impl ::std::error::Error for UnmountFolderError {
19544    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
19545        match self {
19546            UnmountFolderError::AccessError(inner) => Some(inner),
19547            _ => None,
19548        }
19549    }
19550}
19551
19552impl ::std::fmt::Display for UnmountFolderError {
19553    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19554        match self {
19555            UnmountFolderError::AccessError(inner) => write!(f, "UnmountFolderError: {}", inner),
19556            UnmountFolderError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
19557            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."),
19558            _ => write!(f, "{:?}", *self),
19559        }
19560    }
19561}
19562
19563/// Arguments for [`unshare_file()`](crate::sharing::unshare_file).
19564#[derive(Debug, Clone, PartialEq, Eq)]
19565#[non_exhaustive] // structs may have more fields added in the future.
19566pub struct UnshareFileArg {
19567    /// The file to unshare.
19568    pub file: PathOrId,
19569}
19570
19571impl UnshareFileArg {
19572    pub fn new(file: PathOrId) -> Self {
19573        UnshareFileArg {
19574            file,
19575        }
19576    }
19577}
19578
19579const UNSHARE_FILE_ARG_FIELDS: &[&str] = &["file"];
19580impl UnshareFileArg {
19581    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
19582        map: V,
19583    ) -> Result<UnshareFileArg, V::Error> {
19584        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
19585    }
19586
19587    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
19588        mut map: V,
19589        optional: bool,
19590    ) -> Result<Option<UnshareFileArg>, V::Error> {
19591        let mut field_file = None;
19592        let mut nothing = true;
19593        while let Some(key) = map.next_key::<&str>()? {
19594            nothing = false;
19595            match key {
19596                "file" => {
19597                    if field_file.is_some() {
19598                        return Err(::serde::de::Error::duplicate_field("file"));
19599                    }
19600                    field_file = Some(map.next_value()?);
19601                }
19602                _ => {
19603                    // unknown field allowed and ignored
19604                    map.next_value::<::serde_json::Value>()?;
19605                }
19606            }
19607        }
19608        if optional && nothing {
19609            return Ok(None);
19610        }
19611        let result = UnshareFileArg {
19612            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
19613        };
19614        Ok(Some(result))
19615    }
19616
19617    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
19618        &self,
19619        s: &mut S::SerializeStruct,
19620    ) -> Result<(), S::Error> {
19621        use serde::ser::SerializeStruct;
19622        s.serialize_field("file", &self.file)?;
19623        Ok(())
19624    }
19625}
19626
19627impl<'de> ::serde::de::Deserialize<'de> for UnshareFileArg {
19628    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19629        // struct deserializer
19630        use serde::de::{MapAccess, Visitor};
19631        struct StructVisitor;
19632        impl<'de> Visitor<'de> for StructVisitor {
19633            type Value = UnshareFileArg;
19634            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19635                f.write_str("a UnshareFileArg struct")
19636            }
19637            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
19638                UnshareFileArg::internal_deserialize(map)
19639            }
19640        }
19641        deserializer.deserialize_struct("UnshareFileArg", UNSHARE_FILE_ARG_FIELDS, StructVisitor)
19642    }
19643}
19644
19645impl ::serde::ser::Serialize for UnshareFileArg {
19646    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19647        // struct serializer
19648        use serde::ser::SerializeStruct;
19649        let mut s = serializer.serialize_struct("UnshareFileArg", 1)?;
19650        self.internal_serialize::<S>(&mut s)?;
19651        s.end()
19652    }
19653}
19654
19655/// Error result for [`unshare_file()`](crate::sharing::unshare_file).
19656#[derive(Debug, Clone, PartialEq, Eq)]
19657#[non_exhaustive] // variants may be added in the future
19658pub enum UnshareFileError {
19659    UserError(SharingUserError),
19660    AccessError(SharingFileAccessError),
19661    /// Catch-all used for unrecognized values returned from the server. Encountering this value
19662    /// typically indicates that this SDK version is out of date.
19663    Other,
19664}
19665
19666impl<'de> ::serde::de::Deserialize<'de> for UnshareFileError {
19667    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19668        // union deserializer
19669        use serde::de::{self, MapAccess, Visitor};
19670        struct EnumVisitor;
19671        impl<'de> Visitor<'de> for EnumVisitor {
19672            type Value = UnshareFileError;
19673            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19674                f.write_str("a UnshareFileError structure")
19675            }
19676            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
19677                let tag: &str = match map.next_key()? {
19678                    Some(".tag") => map.next_value()?,
19679                    _ => return Err(de::Error::missing_field(".tag"))
19680                };
19681                let value = match tag {
19682                    "user_error" => {
19683                        match map.next_key()? {
19684                            Some("user_error") => UnshareFileError::UserError(map.next_value()?),
19685                            None => return Err(de::Error::missing_field("user_error")),
19686                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
19687                        }
19688                    }
19689                    "access_error" => {
19690                        match map.next_key()? {
19691                            Some("access_error") => UnshareFileError::AccessError(map.next_value()?),
19692                            None => return Err(de::Error::missing_field("access_error")),
19693                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
19694                        }
19695                    }
19696                    _ => UnshareFileError::Other,
19697                };
19698                crate::eat_json_fields(&mut map)?;
19699                Ok(value)
19700            }
19701        }
19702        const VARIANTS: &[&str] = &["user_error",
19703                                    "access_error",
19704                                    "other"];
19705        deserializer.deserialize_struct("UnshareFileError", VARIANTS, EnumVisitor)
19706    }
19707}
19708
19709impl ::serde::ser::Serialize for UnshareFileError {
19710    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19711        // union serializer
19712        use serde::ser::SerializeStruct;
19713        match self {
19714            UnshareFileError::UserError(x) => {
19715                // union or polymporphic struct
19716                let mut s = serializer.serialize_struct("UnshareFileError", 2)?;
19717                s.serialize_field(".tag", "user_error")?;
19718                s.serialize_field("user_error", x)?;
19719                s.end()
19720            }
19721            UnshareFileError::AccessError(x) => {
19722                // union or polymporphic struct
19723                let mut s = serializer.serialize_struct("UnshareFileError", 2)?;
19724                s.serialize_field(".tag", "access_error")?;
19725                s.serialize_field("access_error", x)?;
19726                s.end()
19727            }
19728            UnshareFileError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
19729        }
19730    }
19731}
19732
19733impl ::std::error::Error for UnshareFileError {
19734    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
19735        match self {
19736            UnshareFileError::UserError(inner) => Some(inner),
19737            UnshareFileError::AccessError(inner) => Some(inner),
19738            _ => None,
19739        }
19740    }
19741}
19742
19743impl ::std::fmt::Display for UnshareFileError {
19744    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19745        match self {
19746            UnshareFileError::UserError(inner) => write!(f, "UnshareFileError: {}", inner),
19747            UnshareFileError::AccessError(inner) => write!(f, "UnshareFileError: {}", inner),
19748            _ => write!(f, "{:?}", *self),
19749        }
19750    }
19751}
19752
19753#[derive(Debug, Clone, PartialEq, Eq)]
19754#[non_exhaustive] // structs may have more fields added in the future.
19755pub struct UnshareFolderArg {
19756    /// The ID for the shared folder.
19757    pub shared_folder_id: crate::types::common::SharedFolderId,
19758    /// If true, members of this shared folder will get a copy of this folder after it's unshared.
19759    /// Otherwise, it will be removed from their Dropbox. The current user, who is an owner, will
19760    /// always retain their copy.
19761    pub leave_a_copy: bool,
19762}
19763
19764impl UnshareFolderArg {
19765    pub fn new(shared_folder_id: crate::types::common::SharedFolderId) -> Self {
19766        UnshareFolderArg {
19767            shared_folder_id,
19768            leave_a_copy: false,
19769        }
19770    }
19771
19772    pub fn with_leave_a_copy(mut self, value: bool) -> Self {
19773        self.leave_a_copy = value;
19774        self
19775    }
19776}
19777
19778const UNSHARE_FOLDER_ARG_FIELDS: &[&str] = &["shared_folder_id",
19779                                             "leave_a_copy"];
19780impl UnshareFolderArg {
19781    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
19782        map: V,
19783    ) -> Result<UnshareFolderArg, V::Error> {
19784        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
19785    }
19786
19787    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
19788        mut map: V,
19789        optional: bool,
19790    ) -> Result<Option<UnshareFolderArg>, V::Error> {
19791        let mut field_shared_folder_id = None;
19792        let mut field_leave_a_copy = None;
19793        let mut nothing = true;
19794        while let Some(key) = map.next_key::<&str>()? {
19795            nothing = false;
19796            match key {
19797                "shared_folder_id" => {
19798                    if field_shared_folder_id.is_some() {
19799                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
19800                    }
19801                    field_shared_folder_id = Some(map.next_value()?);
19802                }
19803                "leave_a_copy" => {
19804                    if field_leave_a_copy.is_some() {
19805                        return Err(::serde::de::Error::duplicate_field("leave_a_copy"));
19806                    }
19807                    field_leave_a_copy = Some(map.next_value()?);
19808                }
19809                _ => {
19810                    // unknown field allowed and ignored
19811                    map.next_value::<::serde_json::Value>()?;
19812                }
19813            }
19814        }
19815        if optional && nothing {
19816            return Ok(None);
19817        }
19818        let result = UnshareFolderArg {
19819            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
19820            leave_a_copy: field_leave_a_copy.unwrap_or(false),
19821        };
19822        Ok(Some(result))
19823    }
19824
19825    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
19826        &self,
19827        s: &mut S::SerializeStruct,
19828    ) -> Result<(), S::Error> {
19829        use serde::ser::SerializeStruct;
19830        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
19831        if self.leave_a_copy {
19832            s.serialize_field("leave_a_copy", &self.leave_a_copy)?;
19833        }
19834        Ok(())
19835    }
19836}
19837
19838impl<'de> ::serde::de::Deserialize<'de> for UnshareFolderArg {
19839    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19840        // struct deserializer
19841        use serde::de::{MapAccess, Visitor};
19842        struct StructVisitor;
19843        impl<'de> Visitor<'de> for StructVisitor {
19844            type Value = UnshareFolderArg;
19845            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19846                f.write_str("a UnshareFolderArg struct")
19847            }
19848            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
19849                UnshareFolderArg::internal_deserialize(map)
19850            }
19851        }
19852        deserializer.deserialize_struct("UnshareFolderArg", UNSHARE_FOLDER_ARG_FIELDS, StructVisitor)
19853    }
19854}
19855
19856impl ::serde::ser::Serialize for UnshareFolderArg {
19857    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19858        // struct serializer
19859        use serde::ser::SerializeStruct;
19860        let mut s = serializer.serialize_struct("UnshareFolderArg", 2)?;
19861        self.internal_serialize::<S>(&mut s)?;
19862        s.end()
19863    }
19864}
19865
19866#[derive(Debug, Clone, PartialEq, Eq)]
19867#[non_exhaustive] // variants may be added in the future
19868pub enum UnshareFolderError {
19869    AccessError(SharedFolderAccessError),
19870    /// This action cannot be performed on a team shared folder.
19871    TeamFolder,
19872    /// The current user does not have permission to perform this action.
19873    NoPermission,
19874    /// This shared folder has too many files to be unshared.
19875    TooManyFiles,
19876    /// Catch-all used for unrecognized values returned from the server. Encountering this value
19877    /// typically indicates that this SDK version is out of date.
19878    Other,
19879}
19880
19881impl<'de> ::serde::de::Deserialize<'de> for UnshareFolderError {
19882    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19883        // union deserializer
19884        use serde::de::{self, MapAccess, Visitor};
19885        struct EnumVisitor;
19886        impl<'de> Visitor<'de> for EnumVisitor {
19887            type Value = UnshareFolderError;
19888            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19889                f.write_str("a UnshareFolderError structure")
19890            }
19891            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
19892                let tag: &str = match map.next_key()? {
19893                    Some(".tag") => map.next_value()?,
19894                    _ => return Err(de::Error::missing_field(".tag"))
19895                };
19896                let value = match tag {
19897                    "access_error" => {
19898                        match map.next_key()? {
19899                            Some("access_error") => UnshareFolderError::AccessError(map.next_value()?),
19900                            None => return Err(de::Error::missing_field("access_error")),
19901                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
19902                        }
19903                    }
19904                    "team_folder" => UnshareFolderError::TeamFolder,
19905                    "no_permission" => UnshareFolderError::NoPermission,
19906                    "too_many_files" => UnshareFolderError::TooManyFiles,
19907                    _ => UnshareFolderError::Other,
19908                };
19909                crate::eat_json_fields(&mut map)?;
19910                Ok(value)
19911            }
19912        }
19913        const VARIANTS: &[&str] = &["access_error",
19914                                    "team_folder",
19915                                    "no_permission",
19916                                    "too_many_files",
19917                                    "other"];
19918        deserializer.deserialize_struct("UnshareFolderError", VARIANTS, EnumVisitor)
19919    }
19920}
19921
19922impl ::serde::ser::Serialize for UnshareFolderError {
19923    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19924        // union serializer
19925        use serde::ser::SerializeStruct;
19926        match self {
19927            UnshareFolderError::AccessError(x) => {
19928                // union or polymporphic struct
19929                let mut s = serializer.serialize_struct("UnshareFolderError", 2)?;
19930                s.serialize_field(".tag", "access_error")?;
19931                s.serialize_field("access_error", x)?;
19932                s.end()
19933            }
19934            UnshareFolderError::TeamFolder => {
19935                // unit
19936                let mut s = serializer.serialize_struct("UnshareFolderError", 1)?;
19937                s.serialize_field(".tag", "team_folder")?;
19938                s.end()
19939            }
19940            UnshareFolderError::NoPermission => {
19941                // unit
19942                let mut s = serializer.serialize_struct("UnshareFolderError", 1)?;
19943                s.serialize_field(".tag", "no_permission")?;
19944                s.end()
19945            }
19946            UnshareFolderError::TooManyFiles => {
19947                // unit
19948                let mut s = serializer.serialize_struct("UnshareFolderError", 1)?;
19949                s.serialize_field(".tag", "too_many_files")?;
19950                s.end()
19951            }
19952            UnshareFolderError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
19953        }
19954    }
19955}
19956
19957impl ::std::error::Error for UnshareFolderError {
19958    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
19959        match self {
19960            UnshareFolderError::AccessError(inner) => Some(inner),
19961            _ => None,
19962        }
19963    }
19964}
19965
19966impl ::std::fmt::Display for UnshareFolderError {
19967    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19968        match self {
19969            UnshareFolderError::AccessError(inner) => write!(f, "UnshareFolderError: {}", inner),
19970            UnshareFolderError::TeamFolder => f.write_str("This action cannot be performed on a team shared folder."),
19971            UnshareFolderError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
19972            UnshareFolderError::TooManyFiles => f.write_str("This shared folder has too many files to be unshared."),
19973            _ => write!(f, "{:?}", *self),
19974        }
19975    }
19976}
19977
19978/// Arguments for [`update_file_member()`](crate::sharing::update_file_member).
19979#[derive(Debug, Clone, PartialEq, Eq)]
19980#[non_exhaustive] // structs may have more fields added in the future.
19981pub struct UpdateFileMemberArgs {
19982    /// File for which we are changing a member's access.
19983    pub file: PathOrId,
19984    /// The member whose access we are changing.
19985    pub member: MemberSelector,
19986    /// The new access level for the member.
19987    pub access_level: AccessLevel,
19988}
19989
19990impl UpdateFileMemberArgs {
19991    pub fn new(file: PathOrId, member: MemberSelector, access_level: AccessLevel) -> Self {
19992        UpdateFileMemberArgs {
19993            file,
19994            member,
19995            access_level,
19996        }
19997    }
19998}
19999
20000const UPDATE_FILE_MEMBER_ARGS_FIELDS: &[&str] = &["file",
20001                                                  "member",
20002                                                  "access_level"];
20003impl UpdateFileMemberArgs {
20004    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
20005        map: V,
20006    ) -> Result<UpdateFileMemberArgs, V::Error> {
20007        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
20008    }
20009
20010    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
20011        mut map: V,
20012        optional: bool,
20013    ) -> Result<Option<UpdateFileMemberArgs>, V::Error> {
20014        let mut field_file = None;
20015        let mut field_member = None;
20016        let mut field_access_level = None;
20017        let mut nothing = true;
20018        while let Some(key) = map.next_key::<&str>()? {
20019            nothing = false;
20020            match key {
20021                "file" => {
20022                    if field_file.is_some() {
20023                        return Err(::serde::de::Error::duplicate_field("file"));
20024                    }
20025                    field_file = Some(map.next_value()?);
20026                }
20027                "member" => {
20028                    if field_member.is_some() {
20029                        return Err(::serde::de::Error::duplicate_field("member"));
20030                    }
20031                    field_member = Some(map.next_value()?);
20032                }
20033                "access_level" => {
20034                    if field_access_level.is_some() {
20035                        return Err(::serde::de::Error::duplicate_field("access_level"));
20036                    }
20037                    field_access_level = Some(map.next_value()?);
20038                }
20039                _ => {
20040                    // unknown field allowed and ignored
20041                    map.next_value::<::serde_json::Value>()?;
20042                }
20043            }
20044        }
20045        if optional && nothing {
20046            return Ok(None);
20047        }
20048        let result = UpdateFileMemberArgs {
20049            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
20050            member: field_member.ok_or_else(|| ::serde::de::Error::missing_field("member"))?,
20051            access_level: field_access_level.ok_or_else(|| ::serde::de::Error::missing_field("access_level"))?,
20052        };
20053        Ok(Some(result))
20054    }
20055
20056    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
20057        &self,
20058        s: &mut S::SerializeStruct,
20059    ) -> Result<(), S::Error> {
20060        use serde::ser::SerializeStruct;
20061        s.serialize_field("file", &self.file)?;
20062        s.serialize_field("member", &self.member)?;
20063        s.serialize_field("access_level", &self.access_level)?;
20064        Ok(())
20065    }
20066}
20067
20068impl<'de> ::serde::de::Deserialize<'de> for UpdateFileMemberArgs {
20069    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
20070        // struct deserializer
20071        use serde::de::{MapAccess, Visitor};
20072        struct StructVisitor;
20073        impl<'de> Visitor<'de> for StructVisitor {
20074            type Value = UpdateFileMemberArgs;
20075            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
20076                f.write_str("a UpdateFileMemberArgs struct")
20077            }
20078            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
20079                UpdateFileMemberArgs::internal_deserialize(map)
20080            }
20081        }
20082        deserializer.deserialize_struct("UpdateFileMemberArgs", UPDATE_FILE_MEMBER_ARGS_FIELDS, StructVisitor)
20083    }
20084}
20085
20086impl ::serde::ser::Serialize for UpdateFileMemberArgs {
20087    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
20088        // struct serializer
20089        use serde::ser::SerializeStruct;
20090        let mut s = serializer.serialize_struct("UpdateFileMemberArgs", 3)?;
20091        self.internal_serialize::<S>(&mut s)?;
20092        s.end()
20093    }
20094}
20095
20096#[derive(Debug, Clone, PartialEq, Eq)]
20097#[non_exhaustive] // structs may have more fields added in the future.
20098pub struct UpdateFolderMemberArg {
20099    /// The ID for the shared folder.
20100    pub shared_folder_id: crate::types::common::SharedFolderId,
20101    /// The member of the shared folder to update.  Only the [`MemberSelector::DropboxId`] may be
20102    /// set at this time.
20103    pub member: MemberSelector,
20104    /// The new access level for `member`. [`AccessLevel::Owner`] is disallowed.
20105    pub access_level: AccessLevel,
20106}
20107
20108impl UpdateFolderMemberArg {
20109    pub fn new(
20110        shared_folder_id: crate::types::common::SharedFolderId,
20111        member: MemberSelector,
20112        access_level: AccessLevel,
20113    ) -> Self {
20114        UpdateFolderMemberArg {
20115            shared_folder_id,
20116            member,
20117            access_level,
20118        }
20119    }
20120}
20121
20122const UPDATE_FOLDER_MEMBER_ARG_FIELDS: &[&str] = &["shared_folder_id",
20123                                                   "member",
20124                                                   "access_level"];
20125impl UpdateFolderMemberArg {
20126    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
20127        map: V,
20128    ) -> Result<UpdateFolderMemberArg, V::Error> {
20129        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
20130    }
20131
20132    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
20133        mut map: V,
20134        optional: bool,
20135    ) -> Result<Option<UpdateFolderMemberArg>, V::Error> {
20136        let mut field_shared_folder_id = None;
20137        let mut field_member = None;
20138        let mut field_access_level = None;
20139        let mut nothing = true;
20140        while let Some(key) = map.next_key::<&str>()? {
20141            nothing = false;
20142            match key {
20143                "shared_folder_id" => {
20144                    if field_shared_folder_id.is_some() {
20145                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
20146                    }
20147                    field_shared_folder_id = Some(map.next_value()?);
20148                }
20149                "member" => {
20150                    if field_member.is_some() {
20151                        return Err(::serde::de::Error::duplicate_field("member"));
20152                    }
20153                    field_member = Some(map.next_value()?);
20154                }
20155                "access_level" => {
20156                    if field_access_level.is_some() {
20157                        return Err(::serde::de::Error::duplicate_field("access_level"));
20158                    }
20159                    field_access_level = Some(map.next_value()?);
20160                }
20161                _ => {
20162                    // unknown field allowed and ignored
20163                    map.next_value::<::serde_json::Value>()?;
20164                }
20165            }
20166        }
20167        if optional && nothing {
20168            return Ok(None);
20169        }
20170        let result = UpdateFolderMemberArg {
20171            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
20172            member: field_member.ok_or_else(|| ::serde::de::Error::missing_field("member"))?,
20173            access_level: field_access_level.ok_or_else(|| ::serde::de::Error::missing_field("access_level"))?,
20174        };
20175        Ok(Some(result))
20176    }
20177
20178    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
20179        &self,
20180        s: &mut S::SerializeStruct,
20181    ) -> Result<(), S::Error> {
20182        use serde::ser::SerializeStruct;
20183        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
20184        s.serialize_field("member", &self.member)?;
20185        s.serialize_field("access_level", &self.access_level)?;
20186        Ok(())
20187    }
20188}
20189
20190impl<'de> ::serde::de::Deserialize<'de> for UpdateFolderMemberArg {
20191    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
20192        // struct deserializer
20193        use serde::de::{MapAccess, Visitor};
20194        struct StructVisitor;
20195        impl<'de> Visitor<'de> for StructVisitor {
20196            type Value = UpdateFolderMemberArg;
20197            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
20198                f.write_str("a UpdateFolderMemberArg struct")
20199            }
20200            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
20201                UpdateFolderMemberArg::internal_deserialize(map)
20202            }
20203        }
20204        deserializer.deserialize_struct("UpdateFolderMemberArg", UPDATE_FOLDER_MEMBER_ARG_FIELDS, StructVisitor)
20205    }
20206}
20207
20208impl ::serde::ser::Serialize for UpdateFolderMemberArg {
20209    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
20210        // struct serializer
20211        use serde::ser::SerializeStruct;
20212        let mut s = serializer.serialize_struct("UpdateFolderMemberArg", 3)?;
20213        self.internal_serialize::<S>(&mut s)?;
20214        s.end()
20215    }
20216}
20217
20218#[derive(Debug, Clone, PartialEq, Eq)]
20219#[non_exhaustive] // variants may be added in the future
20220pub enum UpdateFolderMemberError {
20221    AccessError(SharedFolderAccessError),
20222    MemberError(SharedFolderMemberError),
20223    /// If updating the access type required the member to be added to the shared folder and there
20224    /// was an error when adding the member.
20225    NoExplicitAccess(AddFolderMemberError),
20226    /// The current user's account doesn't support this action. An example of this is when
20227    /// downgrading a member from editor to viewer. This action can only be performed by users that
20228    /// have upgraded to a Pro or Business plan.
20229    InsufficientPlan,
20230    /// The current user does not have permission to perform this action.
20231    NoPermission,
20232    /// Catch-all used for unrecognized values returned from the server. Encountering this value
20233    /// typically indicates that this SDK version is out of date.
20234    Other,
20235}
20236
20237impl<'de> ::serde::de::Deserialize<'de> for UpdateFolderMemberError {
20238    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
20239        // union deserializer
20240        use serde::de::{self, MapAccess, Visitor};
20241        struct EnumVisitor;
20242        impl<'de> Visitor<'de> for EnumVisitor {
20243            type Value = UpdateFolderMemberError;
20244            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
20245                f.write_str("a UpdateFolderMemberError structure")
20246            }
20247            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
20248                let tag: &str = match map.next_key()? {
20249                    Some(".tag") => map.next_value()?,
20250                    _ => return Err(de::Error::missing_field(".tag"))
20251                };
20252                let value = match tag {
20253                    "access_error" => {
20254                        match map.next_key()? {
20255                            Some("access_error") => UpdateFolderMemberError::AccessError(map.next_value()?),
20256                            None => return Err(de::Error::missing_field("access_error")),
20257                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
20258                        }
20259                    }
20260                    "member_error" => {
20261                        match map.next_key()? {
20262                            Some("member_error") => UpdateFolderMemberError::MemberError(map.next_value()?),
20263                            None => return Err(de::Error::missing_field("member_error")),
20264                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
20265                        }
20266                    }
20267                    "no_explicit_access" => {
20268                        match map.next_key()? {
20269                            Some("no_explicit_access") => UpdateFolderMemberError::NoExplicitAccess(map.next_value()?),
20270                            None => return Err(de::Error::missing_field("no_explicit_access")),
20271                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
20272                        }
20273                    }
20274                    "insufficient_plan" => UpdateFolderMemberError::InsufficientPlan,
20275                    "no_permission" => UpdateFolderMemberError::NoPermission,
20276                    _ => UpdateFolderMemberError::Other,
20277                };
20278                crate::eat_json_fields(&mut map)?;
20279                Ok(value)
20280            }
20281        }
20282        const VARIANTS: &[&str] = &["access_error",
20283                                    "member_error",
20284                                    "no_explicit_access",
20285                                    "insufficient_plan",
20286                                    "no_permission",
20287                                    "other"];
20288        deserializer.deserialize_struct("UpdateFolderMemberError", VARIANTS, EnumVisitor)
20289    }
20290}
20291
20292impl ::serde::ser::Serialize for UpdateFolderMemberError {
20293    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
20294        // union serializer
20295        use serde::ser::SerializeStruct;
20296        match self {
20297            UpdateFolderMemberError::AccessError(x) => {
20298                // union or polymporphic struct
20299                let mut s = serializer.serialize_struct("UpdateFolderMemberError", 2)?;
20300                s.serialize_field(".tag", "access_error")?;
20301                s.serialize_field("access_error", x)?;
20302                s.end()
20303            }
20304            UpdateFolderMemberError::MemberError(x) => {
20305                // union or polymporphic struct
20306                let mut s = serializer.serialize_struct("UpdateFolderMemberError", 2)?;
20307                s.serialize_field(".tag", "member_error")?;
20308                s.serialize_field("member_error", x)?;
20309                s.end()
20310            }
20311            UpdateFolderMemberError::NoExplicitAccess(x) => {
20312                // union or polymporphic struct
20313                let mut s = serializer.serialize_struct("UpdateFolderMemberError", 2)?;
20314                s.serialize_field(".tag", "no_explicit_access")?;
20315                s.serialize_field("no_explicit_access", x)?;
20316                s.end()
20317            }
20318            UpdateFolderMemberError::InsufficientPlan => {
20319                // unit
20320                let mut s = serializer.serialize_struct("UpdateFolderMemberError", 1)?;
20321                s.serialize_field(".tag", "insufficient_plan")?;
20322                s.end()
20323            }
20324            UpdateFolderMemberError::NoPermission => {
20325                // unit
20326                let mut s = serializer.serialize_struct("UpdateFolderMemberError", 1)?;
20327                s.serialize_field(".tag", "no_permission")?;
20328                s.end()
20329            }
20330            UpdateFolderMemberError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
20331        }
20332    }
20333}
20334
20335impl ::std::error::Error for UpdateFolderMemberError {
20336    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
20337        match self {
20338            UpdateFolderMemberError::AccessError(inner) => Some(inner),
20339            UpdateFolderMemberError::MemberError(inner) => Some(inner),
20340            UpdateFolderMemberError::NoExplicitAccess(inner) => Some(inner),
20341            _ => None,
20342        }
20343    }
20344}
20345
20346impl ::std::fmt::Display for UpdateFolderMemberError {
20347    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
20348        match self {
20349            UpdateFolderMemberError::AccessError(inner) => write!(f, "UpdateFolderMemberError: {}", inner),
20350            UpdateFolderMemberError::MemberError(inner) => write!(f, "UpdateFolderMemberError: {}", inner),
20351            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),
20352            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."),
20353            UpdateFolderMemberError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
20354            _ => write!(f, "{:?}", *self),
20355        }
20356    }
20357}
20358
20359/// If any of the policies are unset, then they retain their current setting.
20360#[derive(Debug, Clone, PartialEq, Eq)]
20361#[non_exhaustive] // structs may have more fields added in the future.
20362pub struct UpdateFolderPolicyArg {
20363    /// The ID for the shared folder.
20364    pub shared_folder_id: crate::types::common::SharedFolderId,
20365    /// Who can be a member of this shared folder. Only applicable if the current user is on a team.
20366    pub member_policy: Option<MemberPolicy>,
20367    /// Who can add and remove members of this shared folder.
20368    pub acl_update_policy: Option<AclUpdatePolicy>,
20369    /// Who can enable/disable viewer info for this shared folder.
20370    pub viewer_info_policy: Option<ViewerInfoPolicy>,
20371    /// The policy to apply to shared links created for content inside this shared folder. The
20372    /// current user must be on a team to set this policy to [`SharedLinkPolicy::Members`].
20373    pub shared_link_policy: Option<SharedLinkPolicy>,
20374    /// Settings on the link for this folder.
20375    pub link_settings: Option<LinkSettings>,
20376    /// A list of `FolderAction`s corresponding to `FolderPermission`s that should appear in the
20377    /// response's [`SharedFolderMetadata::permissions`](SharedFolderMetadata) field describing the
20378    /// actions the authenticated user can perform on the folder.
20379    pub actions: Option<Vec<FolderAction>>,
20380}
20381
20382impl UpdateFolderPolicyArg {
20383    pub fn new(shared_folder_id: crate::types::common::SharedFolderId) -> Self {
20384        UpdateFolderPolicyArg {
20385            shared_folder_id,
20386            member_policy: None,
20387            acl_update_policy: None,
20388            viewer_info_policy: None,
20389            shared_link_policy: None,
20390            link_settings: None,
20391            actions: None,
20392        }
20393    }
20394
20395    pub fn with_member_policy(mut self, value: MemberPolicy) -> Self {
20396        self.member_policy = Some(value);
20397        self
20398    }
20399
20400    pub fn with_acl_update_policy(mut self, value: AclUpdatePolicy) -> Self {
20401        self.acl_update_policy = Some(value);
20402        self
20403    }
20404
20405    pub fn with_viewer_info_policy(mut self, value: ViewerInfoPolicy) -> Self {
20406        self.viewer_info_policy = Some(value);
20407        self
20408    }
20409
20410    pub fn with_shared_link_policy(mut self, value: SharedLinkPolicy) -> Self {
20411        self.shared_link_policy = Some(value);
20412        self
20413    }
20414
20415    pub fn with_link_settings(mut self, value: LinkSettings) -> Self {
20416        self.link_settings = Some(value);
20417        self
20418    }
20419
20420    pub fn with_actions(mut self, value: Vec<FolderAction>) -> Self {
20421        self.actions = Some(value);
20422        self
20423    }
20424}
20425
20426const UPDATE_FOLDER_POLICY_ARG_FIELDS: &[&str] = &["shared_folder_id",
20427                                                   "member_policy",
20428                                                   "acl_update_policy",
20429                                                   "viewer_info_policy",
20430                                                   "shared_link_policy",
20431                                                   "link_settings",
20432                                                   "actions"];
20433impl UpdateFolderPolicyArg {
20434    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
20435        map: V,
20436    ) -> Result<UpdateFolderPolicyArg, V::Error> {
20437        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
20438    }
20439
20440    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
20441        mut map: V,
20442        optional: bool,
20443    ) -> Result<Option<UpdateFolderPolicyArg>, V::Error> {
20444        let mut field_shared_folder_id = None;
20445        let mut field_member_policy = None;
20446        let mut field_acl_update_policy = None;
20447        let mut field_viewer_info_policy = None;
20448        let mut field_shared_link_policy = None;
20449        let mut field_link_settings = None;
20450        let mut field_actions = None;
20451        let mut nothing = true;
20452        while let Some(key) = map.next_key::<&str>()? {
20453            nothing = false;
20454            match key {
20455                "shared_folder_id" => {
20456                    if field_shared_folder_id.is_some() {
20457                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
20458                    }
20459                    field_shared_folder_id = Some(map.next_value()?);
20460                }
20461                "member_policy" => {
20462                    if field_member_policy.is_some() {
20463                        return Err(::serde::de::Error::duplicate_field("member_policy"));
20464                    }
20465                    field_member_policy = Some(map.next_value()?);
20466                }
20467                "acl_update_policy" => {
20468                    if field_acl_update_policy.is_some() {
20469                        return Err(::serde::de::Error::duplicate_field("acl_update_policy"));
20470                    }
20471                    field_acl_update_policy = Some(map.next_value()?);
20472                }
20473                "viewer_info_policy" => {
20474                    if field_viewer_info_policy.is_some() {
20475                        return Err(::serde::de::Error::duplicate_field("viewer_info_policy"));
20476                    }
20477                    field_viewer_info_policy = Some(map.next_value()?);
20478                }
20479                "shared_link_policy" => {
20480                    if field_shared_link_policy.is_some() {
20481                        return Err(::serde::de::Error::duplicate_field("shared_link_policy"));
20482                    }
20483                    field_shared_link_policy = Some(map.next_value()?);
20484                }
20485                "link_settings" => {
20486                    if field_link_settings.is_some() {
20487                        return Err(::serde::de::Error::duplicate_field("link_settings"));
20488                    }
20489                    field_link_settings = Some(map.next_value()?);
20490                }
20491                "actions" => {
20492                    if field_actions.is_some() {
20493                        return Err(::serde::de::Error::duplicate_field("actions"));
20494                    }
20495                    field_actions = Some(map.next_value()?);
20496                }
20497                _ => {
20498                    // unknown field allowed and ignored
20499                    map.next_value::<::serde_json::Value>()?;
20500                }
20501            }
20502        }
20503        if optional && nothing {
20504            return Ok(None);
20505        }
20506        let result = UpdateFolderPolicyArg {
20507            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
20508            member_policy: field_member_policy.and_then(Option::flatten),
20509            acl_update_policy: field_acl_update_policy.and_then(Option::flatten),
20510            viewer_info_policy: field_viewer_info_policy.and_then(Option::flatten),
20511            shared_link_policy: field_shared_link_policy.and_then(Option::flatten),
20512            link_settings: field_link_settings.and_then(Option::flatten),
20513            actions: field_actions.and_then(Option::flatten),
20514        };
20515        Ok(Some(result))
20516    }
20517
20518    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
20519        &self,
20520        s: &mut S::SerializeStruct,
20521    ) -> Result<(), S::Error> {
20522        use serde::ser::SerializeStruct;
20523        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
20524        if let Some(val) = &self.member_policy {
20525            s.serialize_field("member_policy", val)?;
20526        }
20527        if let Some(val) = &self.acl_update_policy {
20528            s.serialize_field("acl_update_policy", val)?;
20529        }
20530        if let Some(val) = &self.viewer_info_policy {
20531            s.serialize_field("viewer_info_policy", val)?;
20532        }
20533        if let Some(val) = &self.shared_link_policy {
20534            s.serialize_field("shared_link_policy", val)?;
20535        }
20536        if let Some(val) = &self.link_settings {
20537            s.serialize_field("link_settings", val)?;
20538        }
20539        if let Some(val) = &self.actions {
20540            s.serialize_field("actions", val)?;
20541        }
20542        Ok(())
20543    }
20544}
20545
20546impl<'de> ::serde::de::Deserialize<'de> for UpdateFolderPolicyArg {
20547    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
20548        // struct deserializer
20549        use serde::de::{MapAccess, Visitor};
20550        struct StructVisitor;
20551        impl<'de> Visitor<'de> for StructVisitor {
20552            type Value = UpdateFolderPolicyArg;
20553            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
20554                f.write_str("a UpdateFolderPolicyArg struct")
20555            }
20556            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
20557                UpdateFolderPolicyArg::internal_deserialize(map)
20558            }
20559        }
20560        deserializer.deserialize_struct("UpdateFolderPolicyArg", UPDATE_FOLDER_POLICY_ARG_FIELDS, StructVisitor)
20561    }
20562}
20563
20564impl ::serde::ser::Serialize for UpdateFolderPolicyArg {
20565    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
20566        // struct serializer
20567        use serde::ser::SerializeStruct;
20568        let mut s = serializer.serialize_struct("UpdateFolderPolicyArg", 7)?;
20569        self.internal_serialize::<S>(&mut s)?;
20570        s.end()
20571    }
20572}
20573
20574#[derive(Debug, Clone, PartialEq, Eq)]
20575#[non_exhaustive] // variants may be added in the future
20576pub enum UpdateFolderPolicyError {
20577    AccessError(SharedFolderAccessError),
20578    /// [`UpdateFolderPolicyArg::member_policy`](UpdateFolderPolicyArg) was set even though user is
20579    /// not on a team.
20580    NotOnTeam,
20581    /// Team policy or group sharing settings are more restrictive than
20582    /// [`ShareFolderArg::member_policy`](ShareFolderArg).
20583    TeamPolicyDisallowsMemberPolicy,
20584    /// The current account is not allowed to select the specified
20585    /// [`ShareFolderArg::shared_link_policy`](ShareFolderArg).
20586    DisallowedSharedLinkPolicy,
20587    /// The current user does not have permission to perform this action.
20588    NoPermission,
20589    /// This action cannot be performed on a team shared folder.
20590    TeamFolder,
20591    /// Catch-all used for unrecognized values returned from the server. Encountering this value
20592    /// typically indicates that this SDK version is out of date.
20593    Other,
20594}
20595
20596impl<'de> ::serde::de::Deserialize<'de> for UpdateFolderPolicyError {
20597    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
20598        // union deserializer
20599        use serde::de::{self, MapAccess, Visitor};
20600        struct EnumVisitor;
20601        impl<'de> Visitor<'de> for EnumVisitor {
20602            type Value = UpdateFolderPolicyError;
20603            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
20604                f.write_str("a UpdateFolderPolicyError structure")
20605            }
20606            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
20607                let tag: &str = match map.next_key()? {
20608                    Some(".tag") => map.next_value()?,
20609                    _ => return Err(de::Error::missing_field(".tag"))
20610                };
20611                let value = match tag {
20612                    "access_error" => {
20613                        match map.next_key()? {
20614                            Some("access_error") => UpdateFolderPolicyError::AccessError(map.next_value()?),
20615                            None => return Err(de::Error::missing_field("access_error")),
20616                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
20617                        }
20618                    }
20619                    "not_on_team" => UpdateFolderPolicyError::NotOnTeam,
20620                    "team_policy_disallows_member_policy" => UpdateFolderPolicyError::TeamPolicyDisallowsMemberPolicy,
20621                    "disallowed_shared_link_policy" => UpdateFolderPolicyError::DisallowedSharedLinkPolicy,
20622                    "no_permission" => UpdateFolderPolicyError::NoPermission,
20623                    "team_folder" => UpdateFolderPolicyError::TeamFolder,
20624                    _ => UpdateFolderPolicyError::Other,
20625                };
20626                crate::eat_json_fields(&mut map)?;
20627                Ok(value)
20628            }
20629        }
20630        const VARIANTS: &[&str] = &["access_error",
20631                                    "not_on_team",
20632                                    "team_policy_disallows_member_policy",
20633                                    "disallowed_shared_link_policy",
20634                                    "no_permission",
20635                                    "team_folder",
20636                                    "other"];
20637        deserializer.deserialize_struct("UpdateFolderPolicyError", VARIANTS, EnumVisitor)
20638    }
20639}
20640
20641impl ::serde::ser::Serialize for UpdateFolderPolicyError {
20642    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
20643        // union serializer
20644        use serde::ser::SerializeStruct;
20645        match self {
20646            UpdateFolderPolicyError::AccessError(x) => {
20647                // union or polymporphic struct
20648                let mut s = serializer.serialize_struct("UpdateFolderPolicyError", 2)?;
20649                s.serialize_field(".tag", "access_error")?;
20650                s.serialize_field("access_error", x)?;
20651                s.end()
20652            }
20653            UpdateFolderPolicyError::NotOnTeam => {
20654                // unit
20655                let mut s = serializer.serialize_struct("UpdateFolderPolicyError", 1)?;
20656                s.serialize_field(".tag", "not_on_team")?;
20657                s.end()
20658            }
20659            UpdateFolderPolicyError::TeamPolicyDisallowsMemberPolicy => {
20660                // unit
20661                let mut s = serializer.serialize_struct("UpdateFolderPolicyError", 1)?;
20662                s.serialize_field(".tag", "team_policy_disallows_member_policy")?;
20663                s.end()
20664            }
20665            UpdateFolderPolicyError::DisallowedSharedLinkPolicy => {
20666                // unit
20667                let mut s = serializer.serialize_struct("UpdateFolderPolicyError", 1)?;
20668                s.serialize_field(".tag", "disallowed_shared_link_policy")?;
20669                s.end()
20670            }
20671            UpdateFolderPolicyError::NoPermission => {
20672                // unit
20673                let mut s = serializer.serialize_struct("UpdateFolderPolicyError", 1)?;
20674                s.serialize_field(".tag", "no_permission")?;
20675                s.end()
20676            }
20677            UpdateFolderPolicyError::TeamFolder => {
20678                // unit
20679                let mut s = serializer.serialize_struct("UpdateFolderPolicyError", 1)?;
20680                s.serialize_field(".tag", "team_folder")?;
20681                s.end()
20682            }
20683            UpdateFolderPolicyError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
20684        }
20685    }
20686}
20687
20688impl ::std::error::Error for UpdateFolderPolicyError {
20689    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
20690        match self {
20691            UpdateFolderPolicyError::AccessError(inner) => Some(inner),
20692            _ => None,
20693        }
20694    }
20695}
20696
20697impl ::std::fmt::Display for UpdateFolderPolicyError {
20698    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
20699        match self {
20700            UpdateFolderPolicyError::AccessError(inner) => write!(f, "UpdateFolderPolicyError: {}", inner),
20701            UpdateFolderPolicyError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
20702            UpdateFolderPolicyError::TeamFolder => f.write_str("This action cannot be performed on a team shared folder."),
20703            _ => write!(f, "{:?}", *self),
20704        }
20705    }
20706}
20707
20708/// The information about a user member of the shared content with an appended last seen timestamp.
20709#[derive(Debug, Clone, PartialEq, Eq)]
20710#[non_exhaustive] // structs may have more fields added in the future.
20711pub struct UserFileMembershipInfo {
20712    /// The access type for this member. It contains inherited access type from parent folder, and
20713    /// acquired access type from this folder.
20714    pub access_type: AccessLevel,
20715    /// The account information for the membership user.
20716    pub user: UserInfo,
20717    /// The permissions that requesting user has on this member. The set of permissions corresponds
20718    /// to the MemberActions in the request.
20719    pub permissions: Option<Vec<MemberPermission>>,
20720    /// Never set.
20721    pub initials: Option<String>,
20722    /// True if the member has access on a parent folder.
20723    pub is_inherited: bool,
20724    /// The UTC timestamp of when the user has last seen the content. Only populated if the user has
20725    /// seen the content and the caller has a plan that includes viewer history.
20726    pub time_last_seen: Option<crate::types::common::DropboxTimestamp>,
20727    /// The platform on which the user has last seen the content, or unknown.
20728    pub platform_type: Option<crate::types::seen_state::PlatformType>,
20729}
20730
20731impl UserFileMembershipInfo {
20732    pub fn new(access_type: AccessLevel, user: UserInfo) -> Self {
20733        UserFileMembershipInfo {
20734            access_type,
20735            user,
20736            permissions: None,
20737            initials: None,
20738            is_inherited: false,
20739            time_last_seen: None,
20740            platform_type: None,
20741        }
20742    }
20743
20744    pub fn with_permissions(mut self, value: Vec<MemberPermission>) -> Self {
20745        self.permissions = Some(value);
20746        self
20747    }
20748
20749    pub fn with_initials(mut self, value: String) -> Self {
20750        self.initials = Some(value);
20751        self
20752    }
20753
20754    pub fn with_is_inherited(mut self, value: bool) -> Self {
20755        self.is_inherited = value;
20756        self
20757    }
20758
20759    pub fn with_time_last_seen(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
20760        self.time_last_seen = Some(value);
20761        self
20762    }
20763
20764    pub fn with_platform_type(mut self, value: crate::types::seen_state::PlatformType) -> Self {
20765        self.platform_type = Some(value);
20766        self
20767    }
20768}
20769
20770const USER_FILE_MEMBERSHIP_INFO_FIELDS: &[&str] = &["access_type",
20771                                                    "user",
20772                                                    "permissions",
20773                                                    "initials",
20774                                                    "is_inherited",
20775                                                    "time_last_seen",
20776                                                    "platform_type"];
20777impl UserFileMembershipInfo {
20778    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
20779        map: V,
20780    ) -> Result<UserFileMembershipInfo, V::Error> {
20781        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
20782    }
20783
20784    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
20785        mut map: V,
20786        optional: bool,
20787    ) -> Result<Option<UserFileMembershipInfo>, V::Error> {
20788        let mut field_access_type = None;
20789        let mut field_user = None;
20790        let mut field_permissions = None;
20791        let mut field_initials = None;
20792        let mut field_is_inherited = None;
20793        let mut field_time_last_seen = None;
20794        let mut field_platform_type = None;
20795        let mut nothing = true;
20796        while let Some(key) = map.next_key::<&str>()? {
20797            nothing = false;
20798            match key {
20799                "access_type" => {
20800                    if field_access_type.is_some() {
20801                        return Err(::serde::de::Error::duplicate_field("access_type"));
20802                    }
20803                    field_access_type = Some(map.next_value()?);
20804                }
20805                "user" => {
20806                    if field_user.is_some() {
20807                        return Err(::serde::de::Error::duplicate_field("user"));
20808                    }
20809                    field_user = Some(map.next_value()?);
20810                }
20811                "permissions" => {
20812                    if field_permissions.is_some() {
20813                        return Err(::serde::de::Error::duplicate_field("permissions"));
20814                    }
20815                    field_permissions = Some(map.next_value()?);
20816                }
20817                "initials" => {
20818                    if field_initials.is_some() {
20819                        return Err(::serde::de::Error::duplicate_field("initials"));
20820                    }
20821                    field_initials = Some(map.next_value()?);
20822                }
20823                "is_inherited" => {
20824                    if field_is_inherited.is_some() {
20825                        return Err(::serde::de::Error::duplicate_field("is_inherited"));
20826                    }
20827                    field_is_inherited = Some(map.next_value()?);
20828                }
20829                "time_last_seen" => {
20830                    if field_time_last_seen.is_some() {
20831                        return Err(::serde::de::Error::duplicate_field("time_last_seen"));
20832                    }
20833                    field_time_last_seen = Some(map.next_value()?);
20834                }
20835                "platform_type" => {
20836                    if field_platform_type.is_some() {
20837                        return Err(::serde::de::Error::duplicate_field("platform_type"));
20838                    }
20839                    field_platform_type = Some(map.next_value()?);
20840                }
20841                _ => {
20842                    // unknown field allowed and ignored
20843                    map.next_value::<::serde_json::Value>()?;
20844                }
20845            }
20846        }
20847        if optional && nothing {
20848            return Ok(None);
20849        }
20850        let result = UserFileMembershipInfo {
20851            access_type: field_access_type.ok_or_else(|| ::serde::de::Error::missing_field("access_type"))?,
20852            user: field_user.ok_or_else(|| ::serde::de::Error::missing_field("user"))?,
20853            permissions: field_permissions.and_then(Option::flatten),
20854            initials: field_initials.and_then(Option::flatten),
20855            is_inherited: field_is_inherited.unwrap_or(false),
20856            time_last_seen: field_time_last_seen.and_then(Option::flatten),
20857            platform_type: field_platform_type.and_then(Option::flatten),
20858        };
20859        Ok(Some(result))
20860    }
20861
20862    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
20863        &self,
20864        s: &mut S::SerializeStruct,
20865    ) -> Result<(), S::Error> {
20866        use serde::ser::SerializeStruct;
20867        s.serialize_field("access_type", &self.access_type)?;
20868        s.serialize_field("user", &self.user)?;
20869        if let Some(val) = &self.permissions {
20870            s.serialize_field("permissions", val)?;
20871        }
20872        if let Some(val) = &self.initials {
20873            s.serialize_field("initials", val)?;
20874        }
20875        if self.is_inherited {
20876            s.serialize_field("is_inherited", &self.is_inherited)?;
20877        }
20878        if let Some(val) = &self.time_last_seen {
20879            s.serialize_field("time_last_seen", val)?;
20880        }
20881        if let Some(val) = &self.platform_type {
20882            s.serialize_field("platform_type", val)?;
20883        }
20884        Ok(())
20885    }
20886}
20887
20888impl<'de> ::serde::de::Deserialize<'de> for UserFileMembershipInfo {
20889    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
20890        // struct deserializer
20891        use serde::de::{MapAccess, Visitor};
20892        struct StructVisitor;
20893        impl<'de> Visitor<'de> for StructVisitor {
20894            type Value = UserFileMembershipInfo;
20895            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
20896                f.write_str("a UserFileMembershipInfo struct")
20897            }
20898            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
20899                UserFileMembershipInfo::internal_deserialize(map)
20900            }
20901        }
20902        deserializer.deserialize_struct("UserFileMembershipInfo", USER_FILE_MEMBERSHIP_INFO_FIELDS, StructVisitor)
20903    }
20904}
20905
20906impl ::serde::ser::Serialize for UserFileMembershipInfo {
20907    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
20908        // struct serializer
20909        use serde::ser::SerializeStruct;
20910        let mut s = serializer.serialize_struct("UserFileMembershipInfo", 7)?;
20911        self.internal_serialize::<S>(&mut s)?;
20912        s.end()
20913    }
20914}
20915
20916// struct extends UserMembershipInfo
20917impl From<UserFileMembershipInfo> for UserMembershipInfo {
20918    fn from(subtype: UserFileMembershipInfo) -> Self {
20919        Self {
20920            access_type: subtype.access_type,
20921            user: subtype.user,
20922            permissions: subtype.permissions,
20923            initials: subtype.initials,
20924            is_inherited: subtype.is_inherited,
20925        }
20926    }
20927}
20928/// Basic information about a user. Use [`users::get_account()`](crate::users::get_account) and
20929/// [`users::get_account_batch()`](crate::users::get_account_batch) to obtain more detailed
20930/// information.
20931#[derive(Debug, Clone, PartialEq, Eq)]
20932#[non_exhaustive] // structs may have more fields added in the future.
20933pub struct UserInfo {
20934    /// The account ID of the user.
20935    pub account_id: crate::types::users_common::AccountId,
20936    /// Email address of user.
20937    pub email: String,
20938    /// The display name of the user.
20939    pub display_name: String,
20940    /// If the user is in the same team as current user.
20941    pub same_team: bool,
20942    /// The team member ID of the shared folder member. Only present if `same_team` is true.
20943    pub team_member_id: Option<String>,
20944}
20945
20946impl UserInfo {
20947    pub fn new(
20948        account_id: crate::types::users_common::AccountId,
20949        email: String,
20950        display_name: String,
20951        same_team: bool,
20952    ) -> Self {
20953        UserInfo {
20954            account_id,
20955            email,
20956            display_name,
20957            same_team,
20958            team_member_id: None,
20959        }
20960    }
20961
20962    pub fn with_team_member_id(mut self, value: String) -> Self {
20963        self.team_member_id = Some(value);
20964        self
20965    }
20966}
20967
20968const USER_INFO_FIELDS: &[&str] = &["account_id",
20969                                    "email",
20970                                    "display_name",
20971                                    "same_team",
20972                                    "team_member_id"];
20973impl UserInfo {
20974    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
20975        map: V,
20976    ) -> Result<UserInfo, V::Error> {
20977        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
20978    }
20979
20980    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
20981        mut map: V,
20982        optional: bool,
20983    ) -> Result<Option<UserInfo>, V::Error> {
20984        let mut field_account_id = None;
20985        let mut field_email = None;
20986        let mut field_display_name = None;
20987        let mut field_same_team = None;
20988        let mut field_team_member_id = None;
20989        let mut nothing = true;
20990        while let Some(key) = map.next_key::<&str>()? {
20991            nothing = false;
20992            match key {
20993                "account_id" => {
20994                    if field_account_id.is_some() {
20995                        return Err(::serde::de::Error::duplicate_field("account_id"));
20996                    }
20997                    field_account_id = Some(map.next_value()?);
20998                }
20999                "email" => {
21000                    if field_email.is_some() {
21001                        return Err(::serde::de::Error::duplicate_field("email"));
21002                    }
21003                    field_email = Some(map.next_value()?);
21004                }
21005                "display_name" => {
21006                    if field_display_name.is_some() {
21007                        return Err(::serde::de::Error::duplicate_field("display_name"));
21008                    }
21009                    field_display_name = Some(map.next_value()?);
21010                }
21011                "same_team" => {
21012                    if field_same_team.is_some() {
21013                        return Err(::serde::de::Error::duplicate_field("same_team"));
21014                    }
21015                    field_same_team = Some(map.next_value()?);
21016                }
21017                "team_member_id" => {
21018                    if field_team_member_id.is_some() {
21019                        return Err(::serde::de::Error::duplicate_field("team_member_id"));
21020                    }
21021                    field_team_member_id = Some(map.next_value()?);
21022                }
21023                _ => {
21024                    // unknown field allowed and ignored
21025                    map.next_value::<::serde_json::Value>()?;
21026                }
21027            }
21028        }
21029        if optional && nothing {
21030            return Ok(None);
21031        }
21032        let result = UserInfo {
21033            account_id: field_account_id.ok_or_else(|| ::serde::de::Error::missing_field("account_id"))?,
21034            email: field_email.ok_or_else(|| ::serde::de::Error::missing_field("email"))?,
21035            display_name: field_display_name.ok_or_else(|| ::serde::de::Error::missing_field("display_name"))?,
21036            same_team: field_same_team.ok_or_else(|| ::serde::de::Error::missing_field("same_team"))?,
21037            team_member_id: field_team_member_id.and_then(Option::flatten),
21038        };
21039        Ok(Some(result))
21040    }
21041
21042    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
21043        &self,
21044        s: &mut S::SerializeStruct,
21045    ) -> Result<(), S::Error> {
21046        use serde::ser::SerializeStruct;
21047        s.serialize_field("account_id", &self.account_id)?;
21048        s.serialize_field("email", &self.email)?;
21049        s.serialize_field("display_name", &self.display_name)?;
21050        s.serialize_field("same_team", &self.same_team)?;
21051        if let Some(val) = &self.team_member_id {
21052            s.serialize_field("team_member_id", val)?;
21053        }
21054        Ok(())
21055    }
21056}
21057
21058impl<'de> ::serde::de::Deserialize<'de> for UserInfo {
21059    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
21060        // struct deserializer
21061        use serde::de::{MapAccess, Visitor};
21062        struct StructVisitor;
21063        impl<'de> Visitor<'de> for StructVisitor {
21064            type Value = UserInfo;
21065            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
21066                f.write_str("a UserInfo struct")
21067            }
21068            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
21069                UserInfo::internal_deserialize(map)
21070            }
21071        }
21072        deserializer.deserialize_struct("UserInfo", USER_INFO_FIELDS, StructVisitor)
21073    }
21074}
21075
21076impl ::serde::ser::Serialize for UserInfo {
21077    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
21078        // struct serializer
21079        use serde::ser::SerializeStruct;
21080        let mut s = serializer.serialize_struct("UserInfo", 5)?;
21081        self.internal_serialize::<S>(&mut s)?;
21082        s.end()
21083    }
21084}
21085
21086/// The information about a user member of the shared content.
21087#[derive(Debug, Clone, PartialEq, Eq)]
21088#[non_exhaustive] // structs may have more fields added in the future.
21089pub struct UserMembershipInfo {
21090    /// The access type for this member. It contains inherited access type from parent folder, and
21091    /// acquired access type from this folder.
21092    pub access_type: AccessLevel,
21093    /// The account information for the membership user.
21094    pub user: UserInfo,
21095    /// The permissions that requesting user has on this member. The set of permissions corresponds
21096    /// to the MemberActions in the request.
21097    pub permissions: Option<Vec<MemberPermission>>,
21098    /// Never set.
21099    pub initials: Option<String>,
21100    /// True if the member has access on a parent folder.
21101    pub is_inherited: bool,
21102}
21103
21104impl UserMembershipInfo {
21105    pub fn new(access_type: AccessLevel, user: UserInfo) -> Self {
21106        UserMembershipInfo {
21107            access_type,
21108            user,
21109            permissions: None,
21110            initials: None,
21111            is_inherited: false,
21112        }
21113    }
21114
21115    pub fn with_permissions(mut self, value: Vec<MemberPermission>) -> Self {
21116        self.permissions = Some(value);
21117        self
21118    }
21119
21120    pub fn with_initials(mut self, value: String) -> Self {
21121        self.initials = Some(value);
21122        self
21123    }
21124
21125    pub fn with_is_inherited(mut self, value: bool) -> Self {
21126        self.is_inherited = value;
21127        self
21128    }
21129}
21130
21131const USER_MEMBERSHIP_INFO_FIELDS: &[&str] = &["access_type",
21132                                               "user",
21133                                               "permissions",
21134                                               "initials",
21135                                               "is_inherited"];
21136impl UserMembershipInfo {
21137    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
21138        map: V,
21139    ) -> Result<UserMembershipInfo, V::Error> {
21140        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
21141    }
21142
21143    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
21144        mut map: V,
21145        optional: bool,
21146    ) -> Result<Option<UserMembershipInfo>, V::Error> {
21147        let mut field_access_type = None;
21148        let mut field_user = None;
21149        let mut field_permissions = None;
21150        let mut field_initials = None;
21151        let mut field_is_inherited = None;
21152        let mut nothing = true;
21153        while let Some(key) = map.next_key::<&str>()? {
21154            nothing = false;
21155            match key {
21156                "access_type" => {
21157                    if field_access_type.is_some() {
21158                        return Err(::serde::de::Error::duplicate_field("access_type"));
21159                    }
21160                    field_access_type = Some(map.next_value()?);
21161                }
21162                "user" => {
21163                    if field_user.is_some() {
21164                        return Err(::serde::de::Error::duplicate_field("user"));
21165                    }
21166                    field_user = Some(map.next_value()?);
21167                }
21168                "permissions" => {
21169                    if field_permissions.is_some() {
21170                        return Err(::serde::de::Error::duplicate_field("permissions"));
21171                    }
21172                    field_permissions = Some(map.next_value()?);
21173                }
21174                "initials" => {
21175                    if field_initials.is_some() {
21176                        return Err(::serde::de::Error::duplicate_field("initials"));
21177                    }
21178                    field_initials = Some(map.next_value()?);
21179                }
21180                "is_inherited" => {
21181                    if field_is_inherited.is_some() {
21182                        return Err(::serde::de::Error::duplicate_field("is_inherited"));
21183                    }
21184                    field_is_inherited = Some(map.next_value()?);
21185                }
21186                _ => {
21187                    // unknown field allowed and ignored
21188                    map.next_value::<::serde_json::Value>()?;
21189                }
21190            }
21191        }
21192        if optional && nothing {
21193            return Ok(None);
21194        }
21195        let result = UserMembershipInfo {
21196            access_type: field_access_type.ok_or_else(|| ::serde::de::Error::missing_field("access_type"))?,
21197            user: field_user.ok_or_else(|| ::serde::de::Error::missing_field("user"))?,
21198            permissions: field_permissions.and_then(Option::flatten),
21199            initials: field_initials.and_then(Option::flatten),
21200            is_inherited: field_is_inherited.unwrap_or(false),
21201        };
21202        Ok(Some(result))
21203    }
21204
21205    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
21206        &self,
21207        s: &mut S::SerializeStruct,
21208    ) -> Result<(), S::Error> {
21209        use serde::ser::SerializeStruct;
21210        s.serialize_field("access_type", &self.access_type)?;
21211        s.serialize_field("user", &self.user)?;
21212        if let Some(val) = &self.permissions {
21213            s.serialize_field("permissions", val)?;
21214        }
21215        if let Some(val) = &self.initials {
21216            s.serialize_field("initials", val)?;
21217        }
21218        if self.is_inherited {
21219            s.serialize_field("is_inherited", &self.is_inherited)?;
21220        }
21221        Ok(())
21222    }
21223}
21224
21225impl<'de> ::serde::de::Deserialize<'de> for UserMembershipInfo {
21226    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
21227        // struct deserializer
21228        use serde::de::{MapAccess, Visitor};
21229        struct StructVisitor;
21230        impl<'de> Visitor<'de> for StructVisitor {
21231            type Value = UserMembershipInfo;
21232            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
21233                f.write_str("a UserMembershipInfo struct")
21234            }
21235            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
21236                UserMembershipInfo::internal_deserialize(map)
21237            }
21238        }
21239        deserializer.deserialize_struct("UserMembershipInfo", USER_MEMBERSHIP_INFO_FIELDS, StructVisitor)
21240    }
21241}
21242
21243impl ::serde::ser::Serialize for UserMembershipInfo {
21244    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
21245        // struct serializer
21246        use serde::ser::SerializeStruct;
21247        let mut s = serializer.serialize_struct("UserMembershipInfo", 5)?;
21248        self.internal_serialize::<S>(&mut s)?;
21249        s.end()
21250    }
21251}
21252
21253// struct extends MembershipInfo
21254impl From<UserMembershipInfo> for MembershipInfo {
21255    fn from(subtype: UserMembershipInfo) -> Self {
21256        Self {
21257            access_type: subtype.access_type,
21258            permissions: subtype.permissions,
21259            initials: subtype.initials,
21260            is_inherited: subtype.is_inherited,
21261        }
21262    }
21263}
21264#[derive(Debug, Clone, PartialEq, Eq)]
21265#[non_exhaustive] // variants may be added in the future
21266pub enum ViewerInfoPolicy {
21267    /// Viewer information is available on this file.
21268    Enabled,
21269    /// Viewer information is disabled on this file.
21270    Disabled,
21271    /// Catch-all used for unrecognized values returned from the server. Encountering this value
21272    /// typically indicates that this SDK version is out of date.
21273    Other,
21274}
21275
21276impl<'de> ::serde::de::Deserialize<'de> for ViewerInfoPolicy {
21277    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
21278        // union deserializer
21279        use serde::de::{self, MapAccess, Visitor};
21280        struct EnumVisitor;
21281        impl<'de> Visitor<'de> for EnumVisitor {
21282            type Value = ViewerInfoPolicy;
21283            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
21284                f.write_str("a ViewerInfoPolicy structure")
21285            }
21286            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
21287                let tag: &str = match map.next_key()? {
21288                    Some(".tag") => map.next_value()?,
21289                    _ => return Err(de::Error::missing_field(".tag"))
21290                };
21291                let value = match tag {
21292                    "enabled" => ViewerInfoPolicy::Enabled,
21293                    "disabled" => ViewerInfoPolicy::Disabled,
21294                    _ => ViewerInfoPolicy::Other,
21295                };
21296                crate::eat_json_fields(&mut map)?;
21297                Ok(value)
21298            }
21299        }
21300        const VARIANTS: &[&str] = &["enabled",
21301                                    "disabled",
21302                                    "other"];
21303        deserializer.deserialize_struct("ViewerInfoPolicy", VARIANTS, EnumVisitor)
21304    }
21305}
21306
21307impl ::serde::ser::Serialize for ViewerInfoPolicy {
21308    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
21309        // union serializer
21310        use serde::ser::SerializeStruct;
21311        match self {
21312            ViewerInfoPolicy::Enabled => {
21313                // unit
21314                let mut s = serializer.serialize_struct("ViewerInfoPolicy", 1)?;
21315                s.serialize_field(".tag", "enabled")?;
21316                s.end()
21317            }
21318            ViewerInfoPolicy::Disabled => {
21319                // unit
21320                let mut s = serializer.serialize_struct("ViewerInfoPolicy", 1)?;
21321                s.serialize_field(".tag", "disabled")?;
21322                s.end()
21323            }
21324            ViewerInfoPolicy::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
21325        }
21326    }
21327}
21328
21329/// Who can access a shared link. The most open visibility is [`Public`](Visibility::Public). The
21330/// default depends on many aspects, such as team and user preferences and shared folder settings.
21331#[derive(Debug, Clone, PartialEq, Eq)]
21332#[non_exhaustive] // variants may be added in the future
21333pub enum Visibility {
21334    /// Anyone who has received the link can access it. No login required.
21335    Public,
21336    /// Only members of the same team can access the link. Login is required.
21337    TeamOnly,
21338    /// A link-specific password is required to access the link. Login is not required.
21339    Password,
21340    /// Only members of the same team who have the link-specific password can access the link.
21341    TeamAndPassword,
21342    /// Only members of the shared folder containing the linked file can access the link. Login is
21343    /// required.
21344    SharedFolderOnly,
21345    /// Catch-all used for unrecognized values returned from the server. Encountering this value
21346    /// typically indicates that this SDK version is out of date.
21347    Other,
21348}
21349
21350impl<'de> ::serde::de::Deserialize<'de> for Visibility {
21351    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
21352        // union deserializer
21353        use serde::de::{self, MapAccess, Visitor};
21354        struct EnumVisitor;
21355        impl<'de> Visitor<'de> for EnumVisitor {
21356            type Value = Visibility;
21357            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
21358                f.write_str("a Visibility structure")
21359            }
21360            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
21361                let tag: &str = match map.next_key()? {
21362                    Some(".tag") => map.next_value()?,
21363                    _ => return Err(de::Error::missing_field(".tag"))
21364                };
21365                let value = match tag {
21366                    "public" => Visibility::Public,
21367                    "team_only" => Visibility::TeamOnly,
21368                    "password" => Visibility::Password,
21369                    "team_and_password" => Visibility::TeamAndPassword,
21370                    "shared_folder_only" => Visibility::SharedFolderOnly,
21371                    _ => Visibility::Other,
21372                };
21373                crate::eat_json_fields(&mut map)?;
21374                Ok(value)
21375            }
21376        }
21377        const VARIANTS: &[&str] = &["public",
21378                                    "team_only",
21379                                    "password",
21380                                    "team_and_password",
21381                                    "shared_folder_only",
21382                                    "other"];
21383        deserializer.deserialize_struct("Visibility", VARIANTS, EnumVisitor)
21384    }
21385}
21386
21387impl ::serde::ser::Serialize for Visibility {
21388    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
21389        // union serializer
21390        use serde::ser::SerializeStruct;
21391        match self {
21392            Visibility::Public => {
21393                // unit
21394                let mut s = serializer.serialize_struct("Visibility", 1)?;
21395                s.serialize_field(".tag", "public")?;
21396                s.end()
21397            }
21398            Visibility::TeamOnly => {
21399                // unit
21400                let mut s = serializer.serialize_struct("Visibility", 1)?;
21401                s.serialize_field(".tag", "team_only")?;
21402                s.end()
21403            }
21404            Visibility::Password => {
21405                // unit
21406                let mut s = serializer.serialize_struct("Visibility", 1)?;
21407                s.serialize_field(".tag", "password")?;
21408                s.end()
21409            }
21410            Visibility::TeamAndPassword => {
21411                // unit
21412                let mut s = serializer.serialize_struct("Visibility", 1)?;
21413                s.serialize_field(".tag", "team_and_password")?;
21414                s.end()
21415            }
21416            Visibility::SharedFolderOnly => {
21417                // unit
21418                let mut s = serializer.serialize_struct("Visibility", 1)?;
21419                s.serialize_field(".tag", "shared_folder_only")?;
21420                s.end()
21421            }
21422            Visibility::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
21423        }
21424    }
21425}
21426
21427#[derive(Debug, Clone, PartialEq, Eq)]
21428#[non_exhaustive] // structs may have more fields added in the future.
21429pub struct VisibilityPolicy {
21430    /// This is the value to submit when saving the visibility setting.
21431    pub policy: RequestedVisibility,
21432    /// This is what the effective policy would be, if you selected this option. The resolved policy
21433    /// is obtained after considering external effects such as shared folder settings and team
21434    /// policy. This value is guaranteed to be provided.
21435    pub resolved_policy: AlphaResolvedVisibility,
21436    /// Whether the user is permitted to set the visibility to this policy.
21437    pub allowed: bool,
21438    /// If `allowed` is `false`, this will provide the reason that the user is not permitted to set
21439    /// the visibility to this policy.
21440    pub disallowed_reason: Option<VisibilityPolicyDisallowedReason>,
21441}
21442
21443impl VisibilityPolicy {
21444    pub fn new(
21445        policy: RequestedVisibility,
21446        resolved_policy: AlphaResolvedVisibility,
21447        allowed: bool,
21448    ) -> Self {
21449        VisibilityPolicy {
21450            policy,
21451            resolved_policy,
21452            allowed,
21453            disallowed_reason: None,
21454        }
21455    }
21456
21457    pub fn with_disallowed_reason(mut self, value: VisibilityPolicyDisallowedReason) -> Self {
21458        self.disallowed_reason = Some(value);
21459        self
21460    }
21461}
21462
21463const VISIBILITY_POLICY_FIELDS: &[&str] = &["policy",
21464                                            "resolved_policy",
21465                                            "allowed",
21466                                            "disallowed_reason"];
21467impl VisibilityPolicy {
21468    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
21469        map: V,
21470    ) -> Result<VisibilityPolicy, V::Error> {
21471        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
21472    }
21473
21474    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
21475        mut map: V,
21476        optional: bool,
21477    ) -> Result<Option<VisibilityPolicy>, V::Error> {
21478        let mut field_policy = None;
21479        let mut field_resolved_policy = None;
21480        let mut field_allowed = None;
21481        let mut field_disallowed_reason = None;
21482        let mut nothing = true;
21483        while let Some(key) = map.next_key::<&str>()? {
21484            nothing = false;
21485            match key {
21486                "policy" => {
21487                    if field_policy.is_some() {
21488                        return Err(::serde::de::Error::duplicate_field("policy"));
21489                    }
21490                    field_policy = Some(map.next_value()?);
21491                }
21492                "resolved_policy" => {
21493                    if field_resolved_policy.is_some() {
21494                        return Err(::serde::de::Error::duplicate_field("resolved_policy"));
21495                    }
21496                    field_resolved_policy = Some(map.next_value()?);
21497                }
21498                "allowed" => {
21499                    if field_allowed.is_some() {
21500                        return Err(::serde::de::Error::duplicate_field("allowed"));
21501                    }
21502                    field_allowed = Some(map.next_value()?);
21503                }
21504                "disallowed_reason" => {
21505                    if field_disallowed_reason.is_some() {
21506                        return Err(::serde::de::Error::duplicate_field("disallowed_reason"));
21507                    }
21508                    field_disallowed_reason = Some(map.next_value()?);
21509                }
21510                _ => {
21511                    // unknown field allowed and ignored
21512                    map.next_value::<::serde_json::Value>()?;
21513                }
21514            }
21515        }
21516        if optional && nothing {
21517            return Ok(None);
21518        }
21519        let result = VisibilityPolicy {
21520            policy: field_policy.ok_or_else(|| ::serde::de::Error::missing_field("policy"))?,
21521            resolved_policy: field_resolved_policy.ok_or_else(|| ::serde::de::Error::missing_field("resolved_policy"))?,
21522            allowed: field_allowed.ok_or_else(|| ::serde::de::Error::missing_field("allowed"))?,
21523            disallowed_reason: field_disallowed_reason.and_then(Option::flatten),
21524        };
21525        Ok(Some(result))
21526    }
21527
21528    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
21529        &self,
21530        s: &mut S::SerializeStruct,
21531    ) -> Result<(), S::Error> {
21532        use serde::ser::SerializeStruct;
21533        s.serialize_field("policy", &self.policy)?;
21534        s.serialize_field("resolved_policy", &self.resolved_policy)?;
21535        s.serialize_field("allowed", &self.allowed)?;
21536        if let Some(val) = &self.disallowed_reason {
21537            s.serialize_field("disallowed_reason", val)?;
21538        }
21539        Ok(())
21540    }
21541}
21542
21543impl<'de> ::serde::de::Deserialize<'de> for VisibilityPolicy {
21544    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
21545        // struct deserializer
21546        use serde::de::{MapAccess, Visitor};
21547        struct StructVisitor;
21548        impl<'de> Visitor<'de> for StructVisitor {
21549            type Value = VisibilityPolicy;
21550            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
21551                f.write_str("a VisibilityPolicy struct")
21552            }
21553            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
21554                VisibilityPolicy::internal_deserialize(map)
21555            }
21556        }
21557        deserializer.deserialize_struct("VisibilityPolicy", VISIBILITY_POLICY_FIELDS, StructVisitor)
21558    }
21559}
21560
21561impl ::serde::ser::Serialize for VisibilityPolicy {
21562    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
21563        // struct serializer
21564        use serde::ser::SerializeStruct;
21565        let mut s = serializer.serialize_struct("VisibilityPolicy", 4)?;
21566        self.internal_serialize::<S>(&mut s)?;
21567        s.end()
21568    }
21569}
21570
21571#[derive(Debug, Clone, PartialEq, Eq)]
21572#[non_exhaustive] // variants may be added in the future
21573pub enum VisibilityPolicyDisallowedReason {
21574    /// The user needs to delete and recreate the link to change the visibility policy.
21575    DeleteAndRecreate,
21576    /// The parent shared folder restricts sharing of links outside the shared folder. To change the
21577    /// visibility policy, remove the restriction from the parent shared folder.
21578    RestrictedBySharedFolder,
21579    /// The team policy prevents links being shared outside the team.
21580    RestrictedByTeam,
21581    /// The user needs to be on a team to set this policy.
21582    UserNotOnTeam,
21583    /// The user is a basic user or is on a limited team.
21584    UserAccountType,
21585    /// The user does not have permission.
21586    PermissionDenied,
21587    /// Catch-all used for unrecognized values returned from the server. Encountering this value
21588    /// typically indicates that this SDK version is out of date.
21589    Other,
21590}
21591
21592impl<'de> ::serde::de::Deserialize<'de> for VisibilityPolicyDisallowedReason {
21593    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
21594        // union deserializer
21595        use serde::de::{self, MapAccess, Visitor};
21596        struct EnumVisitor;
21597        impl<'de> Visitor<'de> for EnumVisitor {
21598            type Value = VisibilityPolicyDisallowedReason;
21599            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
21600                f.write_str("a VisibilityPolicyDisallowedReason structure")
21601            }
21602            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
21603                let tag: &str = match map.next_key()? {
21604                    Some(".tag") => map.next_value()?,
21605                    _ => return Err(de::Error::missing_field(".tag"))
21606                };
21607                let value = match tag {
21608                    "delete_and_recreate" => VisibilityPolicyDisallowedReason::DeleteAndRecreate,
21609                    "restricted_by_shared_folder" => VisibilityPolicyDisallowedReason::RestrictedBySharedFolder,
21610                    "restricted_by_team" => VisibilityPolicyDisallowedReason::RestrictedByTeam,
21611                    "user_not_on_team" => VisibilityPolicyDisallowedReason::UserNotOnTeam,
21612                    "user_account_type" => VisibilityPolicyDisallowedReason::UserAccountType,
21613                    "permission_denied" => VisibilityPolicyDisallowedReason::PermissionDenied,
21614                    _ => VisibilityPolicyDisallowedReason::Other,
21615                };
21616                crate::eat_json_fields(&mut map)?;
21617                Ok(value)
21618            }
21619        }
21620        const VARIANTS: &[&str] = &["delete_and_recreate",
21621                                    "restricted_by_shared_folder",
21622                                    "restricted_by_team",
21623                                    "user_not_on_team",
21624                                    "user_account_type",
21625                                    "permission_denied",
21626                                    "other"];
21627        deserializer.deserialize_struct("VisibilityPolicyDisallowedReason", VARIANTS, EnumVisitor)
21628    }
21629}
21630
21631impl ::serde::ser::Serialize for VisibilityPolicyDisallowedReason {
21632    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
21633        // union serializer
21634        use serde::ser::SerializeStruct;
21635        match self {
21636            VisibilityPolicyDisallowedReason::DeleteAndRecreate => {
21637                // unit
21638                let mut s = serializer.serialize_struct("VisibilityPolicyDisallowedReason", 1)?;
21639                s.serialize_field(".tag", "delete_and_recreate")?;
21640                s.end()
21641            }
21642            VisibilityPolicyDisallowedReason::RestrictedBySharedFolder => {
21643                // unit
21644                let mut s = serializer.serialize_struct("VisibilityPolicyDisallowedReason", 1)?;
21645                s.serialize_field(".tag", "restricted_by_shared_folder")?;
21646                s.end()
21647            }
21648            VisibilityPolicyDisallowedReason::RestrictedByTeam => {
21649                // unit
21650                let mut s = serializer.serialize_struct("VisibilityPolicyDisallowedReason", 1)?;
21651                s.serialize_field(".tag", "restricted_by_team")?;
21652                s.end()
21653            }
21654            VisibilityPolicyDisallowedReason::UserNotOnTeam => {
21655                // unit
21656                let mut s = serializer.serialize_struct("VisibilityPolicyDisallowedReason", 1)?;
21657                s.serialize_field(".tag", "user_not_on_team")?;
21658                s.end()
21659            }
21660            VisibilityPolicyDisallowedReason::UserAccountType => {
21661                // unit
21662                let mut s = serializer.serialize_struct("VisibilityPolicyDisallowedReason", 1)?;
21663                s.serialize_field(".tag", "user_account_type")?;
21664                s.end()
21665            }
21666            VisibilityPolicyDisallowedReason::PermissionDenied => {
21667                // unit
21668                let mut s = serializer.serialize_struct("VisibilityPolicyDisallowedReason", 1)?;
21669                s.serialize_field(".tag", "permission_denied")?;
21670                s.end()
21671            }
21672            VisibilityPolicyDisallowedReason::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
21673        }
21674    }
21675}
21676