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)]
10
11//! This namespace contains endpoints and data types for creating and managing shared links and
12//! shared folders.
13
14pub type DropboxId = String;
15pub type GetSharedLinkFileArg = GetSharedLinkMetadataArg;
16pub type Id = crate::types::files::Id;
17pub type Path = crate::types::files::Path;
18pub type PathOrId = String;
19pub type ReadPath = crate::types::files::ReadPath;
20pub type Rev = crate::types::files::Rev;
21pub type TeamInfo = crate::types::users::Team;
22
23/// Information about the inheritance policy of a shared folder.
24#[derive(Debug, Clone, PartialEq, Eq)]
25#[non_exhaustive] // variants may be added in the future
26pub enum AccessInheritance {
27    /// The shared folder inherits its members from the parent folder.
28    Inherit,
29    /// The shared folder does not inherit its members from the parent folder.
30    NoInherit,
31    /// Catch-all used for unrecognized values returned from the server. Encountering this value
32    /// typically indicates that this SDK version is out of date.
33    Other,
34}
35
36impl<'de> ::serde::de::Deserialize<'de> for AccessInheritance {
37    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
38        // union deserializer
39        use serde::de::{self, MapAccess, Visitor};
40        struct EnumVisitor;
41        impl<'de> Visitor<'de> for EnumVisitor {
42            type Value = AccessInheritance;
43            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
44                f.write_str("a AccessInheritance structure")
45            }
46            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
47                let tag: &str = match map.next_key()? {
48                    Some(".tag") => map.next_value()?,
49                    _ => return Err(de::Error::missing_field(".tag"))
50                };
51                let value = match tag {
52                    "inherit" => AccessInheritance::Inherit,
53                    "no_inherit" => AccessInheritance::NoInherit,
54                    _ => AccessInheritance::Other,
55                };
56                crate::eat_json_fields(&mut map)?;
57                Ok(value)
58            }
59        }
60        const VARIANTS: &[&str] = &["inherit",
61                                    "no_inherit",
62                                    "other"];
63        deserializer.deserialize_struct("AccessInheritance", VARIANTS, EnumVisitor)
64    }
65}
66
67impl ::serde::ser::Serialize for AccessInheritance {
68    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
69        // union serializer
70        use serde::ser::SerializeStruct;
71        match self {
72            AccessInheritance::Inherit => {
73                // unit
74                let mut s = serializer.serialize_struct("AccessInheritance", 1)?;
75                s.serialize_field(".tag", "inherit")?;
76                s.end()
77            }
78            AccessInheritance::NoInherit => {
79                // unit
80                let mut s = serializer.serialize_struct("AccessInheritance", 1)?;
81                s.serialize_field(".tag", "no_inherit")?;
82                s.end()
83            }
84            AccessInheritance::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
85        }
86    }
87}
88
89/// Defines the access levels for collaborators.
90#[derive(Debug, Clone, PartialEq, Eq)]
91#[non_exhaustive] // variants may be added in the future
92pub enum AccessLevel {
93    /// The collaborator is the owner of the shared folder. Owners can view and edit the shared
94    /// folder as well as set the folder's policies using
95    /// [`update_folder_policy()`](crate::sharing::update_folder_policy).
96    Owner,
97    /// The collaborator can both view and edit the shared folder.
98    Editor,
99    /// The collaborator can only view the shared folder.
100    Viewer,
101    /// The collaborator can only view the shared folder and does not have any access to comments.
102    ViewerNoComment,
103    /// The collaborator can only view the shared folder that they have access to.
104    Traverse,
105    /// If there is a Righteous Link on the folder which grants access and the user has visited such
106    /// link, they are allowed to perform certain action (i.e. add themselves to the folder) via the
107    /// link access even though the user themselves are not a member on the shared folder yet.
108    NoAccess,
109    /// Catch-all used for unrecognized values returned from the server. Encountering this value
110    /// typically indicates that this SDK version is out of date.
111    Other,
112}
113
114impl<'de> ::serde::de::Deserialize<'de> for AccessLevel {
115    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
116        // union deserializer
117        use serde::de::{self, MapAccess, Visitor};
118        struct EnumVisitor;
119        impl<'de> Visitor<'de> for EnumVisitor {
120            type Value = AccessLevel;
121            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
122                f.write_str("a AccessLevel structure")
123            }
124            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
125                let tag: &str = match map.next_key()? {
126                    Some(".tag") => map.next_value()?,
127                    _ => return Err(de::Error::missing_field(".tag"))
128                };
129                let value = match tag {
130                    "owner" => AccessLevel::Owner,
131                    "editor" => AccessLevel::Editor,
132                    "viewer" => AccessLevel::Viewer,
133                    "viewer_no_comment" => AccessLevel::ViewerNoComment,
134                    "traverse" => AccessLevel::Traverse,
135                    "no_access" => AccessLevel::NoAccess,
136                    _ => AccessLevel::Other,
137                };
138                crate::eat_json_fields(&mut map)?;
139                Ok(value)
140            }
141        }
142        const VARIANTS: &[&str] = &["owner",
143                                    "editor",
144                                    "viewer",
145                                    "viewer_no_comment",
146                                    "traverse",
147                                    "no_access",
148                                    "other"];
149        deserializer.deserialize_struct("AccessLevel", VARIANTS, EnumVisitor)
150    }
151}
152
153impl ::serde::ser::Serialize for AccessLevel {
154    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
155        // union serializer
156        use serde::ser::SerializeStruct;
157        match self {
158            AccessLevel::Owner => {
159                // unit
160                let mut s = serializer.serialize_struct("AccessLevel", 1)?;
161                s.serialize_field(".tag", "owner")?;
162                s.end()
163            }
164            AccessLevel::Editor => {
165                // unit
166                let mut s = serializer.serialize_struct("AccessLevel", 1)?;
167                s.serialize_field(".tag", "editor")?;
168                s.end()
169            }
170            AccessLevel::Viewer => {
171                // unit
172                let mut s = serializer.serialize_struct("AccessLevel", 1)?;
173                s.serialize_field(".tag", "viewer")?;
174                s.end()
175            }
176            AccessLevel::ViewerNoComment => {
177                // unit
178                let mut s = serializer.serialize_struct("AccessLevel", 1)?;
179                s.serialize_field(".tag", "viewer_no_comment")?;
180                s.end()
181            }
182            AccessLevel::Traverse => {
183                // unit
184                let mut s = serializer.serialize_struct("AccessLevel", 1)?;
185                s.serialize_field(".tag", "traverse")?;
186                s.end()
187            }
188            AccessLevel::NoAccess => {
189                // unit
190                let mut s = serializer.serialize_struct("AccessLevel", 1)?;
191                s.serialize_field(".tag", "no_access")?;
192                s.end()
193            }
194            AccessLevel::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
195        }
196    }
197}
198
199/// Who can change a shared folder's access control list (ACL). In other words, who can add, remove,
200/// or change the privileges of members.
201#[derive(Debug, Clone, PartialEq, Eq)]
202#[non_exhaustive] // variants may be added in the future
203pub enum AclUpdatePolicy {
204    /// Only the owner can update the ACL.
205    Owner,
206    /// Any editor can update the ACL. This may be further restricted to editors on the same team.
207    Editors,
208    /// Catch-all used for unrecognized values returned from the server. Encountering this value
209    /// typically indicates that this SDK version is out of date.
210    Other,
211}
212
213impl<'de> ::serde::de::Deserialize<'de> for AclUpdatePolicy {
214    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
215        // union deserializer
216        use serde::de::{self, MapAccess, Visitor};
217        struct EnumVisitor;
218        impl<'de> Visitor<'de> for EnumVisitor {
219            type Value = AclUpdatePolicy;
220            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
221                f.write_str("a AclUpdatePolicy structure")
222            }
223            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
224                let tag: &str = match map.next_key()? {
225                    Some(".tag") => map.next_value()?,
226                    _ => return Err(de::Error::missing_field(".tag"))
227                };
228                let value = match tag {
229                    "owner" => AclUpdatePolicy::Owner,
230                    "editors" => AclUpdatePolicy::Editors,
231                    _ => AclUpdatePolicy::Other,
232                };
233                crate::eat_json_fields(&mut map)?;
234                Ok(value)
235            }
236        }
237        const VARIANTS: &[&str] = &["owner",
238                                    "editors",
239                                    "other"];
240        deserializer.deserialize_struct("AclUpdatePolicy", VARIANTS, EnumVisitor)
241    }
242}
243
244impl ::serde::ser::Serialize for AclUpdatePolicy {
245    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
246        // union serializer
247        use serde::ser::SerializeStruct;
248        match self {
249            AclUpdatePolicy::Owner => {
250                // unit
251                let mut s = serializer.serialize_struct("AclUpdatePolicy", 1)?;
252                s.serialize_field(".tag", "owner")?;
253                s.end()
254            }
255            AclUpdatePolicy::Editors => {
256                // unit
257                let mut s = serializer.serialize_struct("AclUpdatePolicy", 1)?;
258                s.serialize_field(".tag", "editors")?;
259                s.end()
260            }
261            AclUpdatePolicy::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
262        }
263    }
264}
265
266/// Arguments for [`add_file_member()`](crate::sharing::add_file_member).
267#[derive(Debug, Clone, PartialEq, Eq)]
268#[non_exhaustive] // structs may have more fields added in the future.
269pub struct AddFileMemberArgs {
270    /// File to which to add members.
271    pub file: PathOrId,
272    /// Members to add. Note that even an email address is given, this may result in a user being
273    /// directly added to the membership if that email is the user's main account email.
274    pub members: Vec<MemberSelector>,
275    /// Message to send to added members in their invitation.
276    pub custom_message: Option<String>,
277    /// Whether added members should be notified via email and device notifications of their
278    /// invitation.
279    pub quiet: bool,
280    /// AccessLevel union object, describing what access level we want to give new members.
281    pub access_level: AccessLevel,
282    /// If the custom message should be added as a comment on the file.
283    pub add_message_as_comment: bool,
284}
285
286impl AddFileMemberArgs {
287    pub fn new(file: PathOrId, members: Vec<MemberSelector>) -> Self {
288        AddFileMemberArgs {
289            file,
290            members,
291            custom_message: None,
292            quiet: false,
293            access_level: AccessLevel::Viewer,
294            add_message_as_comment: false,
295        }
296    }
297
298    pub fn with_custom_message(mut self, value: String) -> Self {
299        self.custom_message = Some(value);
300        self
301    }
302
303    pub fn with_quiet(mut self, value: bool) -> Self {
304        self.quiet = value;
305        self
306    }
307
308    pub fn with_access_level(mut self, value: AccessLevel) -> Self {
309        self.access_level = value;
310        self
311    }
312
313    pub fn with_add_message_as_comment(mut self, value: bool) -> Self {
314        self.add_message_as_comment = value;
315        self
316    }
317}
318
319const ADD_FILE_MEMBER_ARGS_FIELDS: &[&str] = &["file",
320                                               "members",
321                                               "custom_message",
322                                               "quiet",
323                                               "access_level",
324                                               "add_message_as_comment"];
325impl AddFileMemberArgs {
326    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
327        map: V,
328    ) -> Result<AddFileMemberArgs, V::Error> {
329        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
330    }
331
332    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
333        mut map: V,
334        optional: bool,
335    ) -> Result<Option<AddFileMemberArgs>, V::Error> {
336        let mut field_file = None;
337        let mut field_members = None;
338        let mut field_custom_message = None;
339        let mut field_quiet = None;
340        let mut field_access_level = None;
341        let mut field_add_message_as_comment = None;
342        let mut nothing = true;
343        while let Some(key) = map.next_key::<&str>()? {
344            nothing = false;
345            match key {
346                "file" => {
347                    if field_file.is_some() {
348                        return Err(::serde::de::Error::duplicate_field("file"));
349                    }
350                    field_file = Some(map.next_value()?);
351                }
352                "members" => {
353                    if field_members.is_some() {
354                        return Err(::serde::de::Error::duplicate_field("members"));
355                    }
356                    field_members = Some(map.next_value()?);
357                }
358                "custom_message" => {
359                    if field_custom_message.is_some() {
360                        return Err(::serde::de::Error::duplicate_field("custom_message"));
361                    }
362                    field_custom_message = Some(map.next_value()?);
363                }
364                "quiet" => {
365                    if field_quiet.is_some() {
366                        return Err(::serde::de::Error::duplicate_field("quiet"));
367                    }
368                    field_quiet = Some(map.next_value()?);
369                }
370                "access_level" => {
371                    if field_access_level.is_some() {
372                        return Err(::serde::de::Error::duplicate_field("access_level"));
373                    }
374                    field_access_level = Some(map.next_value()?);
375                }
376                "add_message_as_comment" => {
377                    if field_add_message_as_comment.is_some() {
378                        return Err(::serde::de::Error::duplicate_field("add_message_as_comment"));
379                    }
380                    field_add_message_as_comment = Some(map.next_value()?);
381                }
382                _ => {
383                    // unknown field allowed and ignored
384                    map.next_value::<::serde_json::Value>()?;
385                }
386            }
387        }
388        if optional && nothing {
389            return Ok(None);
390        }
391        let result = AddFileMemberArgs {
392            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
393            members: field_members.ok_or_else(|| ::serde::de::Error::missing_field("members"))?,
394            custom_message: field_custom_message.and_then(Option::flatten),
395            quiet: field_quiet.unwrap_or(false),
396            access_level: field_access_level.unwrap_or(AccessLevel::Viewer),
397            add_message_as_comment: field_add_message_as_comment.unwrap_or(false),
398        };
399        Ok(Some(result))
400    }
401
402    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
403        &self,
404        s: &mut S::SerializeStruct,
405    ) -> Result<(), S::Error> {
406        use serde::ser::SerializeStruct;
407        s.serialize_field("file", &self.file)?;
408        s.serialize_field("members", &self.members)?;
409        if let Some(val) = &self.custom_message {
410            s.serialize_field("custom_message", val)?;
411        }
412        if self.quiet {
413            s.serialize_field("quiet", &self.quiet)?;
414        }
415        if self.access_level != AccessLevel::Viewer {
416            s.serialize_field("access_level", &self.access_level)?;
417        }
418        if self.add_message_as_comment {
419            s.serialize_field("add_message_as_comment", &self.add_message_as_comment)?;
420        }
421        Ok(())
422    }
423}
424
425impl<'de> ::serde::de::Deserialize<'de> for AddFileMemberArgs {
426    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
427        // struct deserializer
428        use serde::de::{MapAccess, Visitor};
429        struct StructVisitor;
430        impl<'de> Visitor<'de> for StructVisitor {
431            type Value = AddFileMemberArgs;
432            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
433                f.write_str("a AddFileMemberArgs struct")
434            }
435            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
436                AddFileMemberArgs::internal_deserialize(map)
437            }
438        }
439        deserializer.deserialize_struct("AddFileMemberArgs", ADD_FILE_MEMBER_ARGS_FIELDS, StructVisitor)
440    }
441}
442
443impl ::serde::ser::Serialize for AddFileMemberArgs {
444    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
445        // struct serializer
446        use serde::ser::SerializeStruct;
447        let mut s = serializer.serialize_struct("AddFileMemberArgs", 6)?;
448        self.internal_serialize::<S>(&mut s)?;
449        s.end()
450    }
451}
452
453/// Errors for [`add_file_member()`](crate::sharing::add_file_member).
454#[derive(Debug, Clone, PartialEq, Eq)]
455#[non_exhaustive] // variants may be added in the future
456pub enum AddFileMemberError {
457    UserError(SharingUserError),
458    AccessError(SharingFileAccessError),
459    /// The user has reached the rate limit for invitations.
460    RateLimit,
461    /// The custom message did not pass comment permissions checks.
462    InvalidComment,
463    /// Catch-all used for unrecognized values returned from the server. Encountering this value
464    /// typically indicates that this SDK version is out of date.
465    Other,
466}
467
468impl<'de> ::serde::de::Deserialize<'de> for AddFileMemberError {
469    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
470        // union deserializer
471        use serde::de::{self, MapAccess, Visitor};
472        struct EnumVisitor;
473        impl<'de> Visitor<'de> for EnumVisitor {
474            type Value = AddFileMemberError;
475            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
476                f.write_str("a AddFileMemberError structure")
477            }
478            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
479                let tag: &str = match map.next_key()? {
480                    Some(".tag") => map.next_value()?,
481                    _ => return Err(de::Error::missing_field(".tag"))
482                };
483                let value = match tag {
484                    "user_error" => {
485                        match map.next_key()? {
486                            Some("user_error") => AddFileMemberError::UserError(map.next_value()?),
487                            None => return Err(de::Error::missing_field("user_error")),
488                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
489                        }
490                    }
491                    "access_error" => {
492                        match map.next_key()? {
493                            Some("access_error") => AddFileMemberError::AccessError(map.next_value()?),
494                            None => return Err(de::Error::missing_field("access_error")),
495                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
496                        }
497                    }
498                    "rate_limit" => AddFileMemberError::RateLimit,
499                    "invalid_comment" => AddFileMemberError::InvalidComment,
500                    _ => AddFileMemberError::Other,
501                };
502                crate::eat_json_fields(&mut map)?;
503                Ok(value)
504            }
505        }
506        const VARIANTS: &[&str] = &["user_error",
507                                    "access_error",
508                                    "rate_limit",
509                                    "invalid_comment",
510                                    "other"];
511        deserializer.deserialize_struct("AddFileMemberError", VARIANTS, EnumVisitor)
512    }
513}
514
515impl ::serde::ser::Serialize for AddFileMemberError {
516    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
517        // union serializer
518        use serde::ser::SerializeStruct;
519        match self {
520            AddFileMemberError::UserError(x) => {
521                // union or polymporphic struct
522                let mut s = serializer.serialize_struct("AddFileMemberError", 2)?;
523                s.serialize_field(".tag", "user_error")?;
524                s.serialize_field("user_error", x)?;
525                s.end()
526            }
527            AddFileMemberError::AccessError(x) => {
528                // union or polymporphic struct
529                let mut s = serializer.serialize_struct("AddFileMemberError", 2)?;
530                s.serialize_field(".tag", "access_error")?;
531                s.serialize_field("access_error", x)?;
532                s.end()
533            }
534            AddFileMemberError::RateLimit => {
535                // unit
536                let mut s = serializer.serialize_struct("AddFileMemberError", 1)?;
537                s.serialize_field(".tag", "rate_limit")?;
538                s.end()
539            }
540            AddFileMemberError::InvalidComment => {
541                // unit
542                let mut s = serializer.serialize_struct("AddFileMemberError", 1)?;
543                s.serialize_field(".tag", "invalid_comment")?;
544                s.end()
545            }
546            AddFileMemberError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
547        }
548    }
549}
550
551impl ::std::error::Error for AddFileMemberError {
552    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
553        match self {
554            AddFileMemberError::UserError(inner) => Some(inner),
555            AddFileMemberError::AccessError(inner) => Some(inner),
556            _ => None,
557        }
558    }
559}
560
561impl ::std::fmt::Display for AddFileMemberError {
562    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
563        match self {
564            AddFileMemberError::UserError(inner) => write!(f, "AddFileMemberError: {}", inner),
565            AddFileMemberError::AccessError(inner) => write!(f, "AddFileMemberError: {}", inner),
566            AddFileMemberError::RateLimit => f.write_str("The user has reached the rate limit for invitations."),
567            AddFileMemberError::InvalidComment => f.write_str("The custom message did not pass comment permissions checks."),
568            _ => write!(f, "{:?}", *self),
569        }
570    }
571}
572
573#[derive(Debug, Clone, PartialEq, Eq)]
574#[non_exhaustive] // structs may have more fields added in the future.
575pub struct AddFolderMemberArg {
576    /// The ID for the shared folder.
577    pub shared_folder_id: crate::types::common::SharedFolderId,
578    /// The intended list of members to add.  Added members will receive invites to join the shared
579    /// folder.
580    pub members: Vec<AddMember>,
581    /// Whether added members should be notified via email and device notifications of their invite.
582    pub quiet: bool,
583    /// Optional message to display to added members in their invitation.
584    pub custom_message: Option<String>,
585}
586
587impl AddFolderMemberArg {
588    pub fn new(
589        shared_folder_id: crate::types::common::SharedFolderId,
590        members: Vec<AddMember>,
591    ) -> Self {
592        AddFolderMemberArg {
593            shared_folder_id,
594            members,
595            quiet: false,
596            custom_message: None,
597        }
598    }
599
600    pub fn with_quiet(mut self, value: bool) -> Self {
601        self.quiet = value;
602        self
603    }
604
605    pub fn with_custom_message(mut self, value: String) -> Self {
606        self.custom_message = Some(value);
607        self
608    }
609}
610
611const ADD_FOLDER_MEMBER_ARG_FIELDS: &[&str] = &["shared_folder_id",
612                                                "members",
613                                                "quiet",
614                                                "custom_message"];
615impl AddFolderMemberArg {
616    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
617        map: V,
618    ) -> Result<AddFolderMemberArg, V::Error> {
619        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
620    }
621
622    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
623        mut map: V,
624        optional: bool,
625    ) -> Result<Option<AddFolderMemberArg>, V::Error> {
626        let mut field_shared_folder_id = None;
627        let mut field_members = None;
628        let mut field_quiet = None;
629        let mut field_custom_message = None;
630        let mut nothing = true;
631        while let Some(key) = map.next_key::<&str>()? {
632            nothing = false;
633            match key {
634                "shared_folder_id" => {
635                    if field_shared_folder_id.is_some() {
636                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
637                    }
638                    field_shared_folder_id = Some(map.next_value()?);
639                }
640                "members" => {
641                    if field_members.is_some() {
642                        return Err(::serde::de::Error::duplicate_field("members"));
643                    }
644                    field_members = Some(map.next_value()?);
645                }
646                "quiet" => {
647                    if field_quiet.is_some() {
648                        return Err(::serde::de::Error::duplicate_field("quiet"));
649                    }
650                    field_quiet = Some(map.next_value()?);
651                }
652                "custom_message" => {
653                    if field_custom_message.is_some() {
654                        return Err(::serde::de::Error::duplicate_field("custom_message"));
655                    }
656                    field_custom_message = Some(map.next_value()?);
657                }
658                _ => {
659                    // unknown field allowed and ignored
660                    map.next_value::<::serde_json::Value>()?;
661                }
662            }
663        }
664        if optional && nothing {
665            return Ok(None);
666        }
667        let result = AddFolderMemberArg {
668            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
669            members: field_members.ok_or_else(|| ::serde::de::Error::missing_field("members"))?,
670            quiet: field_quiet.unwrap_or(false),
671            custom_message: field_custom_message.and_then(Option::flatten),
672        };
673        Ok(Some(result))
674    }
675
676    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
677        &self,
678        s: &mut S::SerializeStruct,
679    ) -> Result<(), S::Error> {
680        use serde::ser::SerializeStruct;
681        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
682        s.serialize_field("members", &self.members)?;
683        if self.quiet {
684            s.serialize_field("quiet", &self.quiet)?;
685        }
686        if let Some(val) = &self.custom_message {
687            s.serialize_field("custom_message", val)?;
688        }
689        Ok(())
690    }
691}
692
693impl<'de> ::serde::de::Deserialize<'de> for AddFolderMemberArg {
694    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
695        // struct deserializer
696        use serde::de::{MapAccess, Visitor};
697        struct StructVisitor;
698        impl<'de> Visitor<'de> for StructVisitor {
699            type Value = AddFolderMemberArg;
700            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
701                f.write_str("a AddFolderMemberArg struct")
702            }
703            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
704                AddFolderMemberArg::internal_deserialize(map)
705            }
706        }
707        deserializer.deserialize_struct("AddFolderMemberArg", ADD_FOLDER_MEMBER_ARG_FIELDS, StructVisitor)
708    }
709}
710
711impl ::serde::ser::Serialize for AddFolderMemberArg {
712    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
713        // struct serializer
714        use serde::ser::SerializeStruct;
715        let mut s = serializer.serialize_struct("AddFolderMemberArg", 4)?;
716        self.internal_serialize::<S>(&mut s)?;
717        s.end()
718    }
719}
720
721#[derive(Debug, Clone, PartialEq, Eq)]
722#[non_exhaustive] // variants may be added in the future
723pub enum AddFolderMemberError {
724    /// Unable to access shared folder.
725    AccessError(SharedFolderAccessError),
726    /// This user's email address is not verified. This functionality is only available on accounts
727    /// with a verified email address. Users can verify their email address
728    /// [here](https://www.dropbox.com/help/317).
729    EmailUnverified,
730    /// The current user has been banned.
731    BannedMember,
732    /// [`AddFolderMemberArg::members`](AddFolderMemberArg) contains a bad invitation recipient.
733    BadMember(AddMemberSelectorError),
734    /// Your team policy does not allow sharing outside of the team.
735    CantShareOutsideTeam,
736    /// The value is the member limit that was reached.
737    TooManyMembers(u64),
738    /// The value is the pending invite limit that was reached.
739    TooManyPendingInvites(u64),
740    /// The current user has hit the limit of invites they can send per day. Try again in 24 hours.
741    RateLimit,
742    /// The current user is trying to share with too many people at once.
743    TooManyInvitees,
744    /// The current user's account doesn't support this action. An example of this is when adding a
745    /// read-only member. This action can only be performed by users that have upgraded to a Pro or
746    /// Business plan.
747    InsufficientPlan,
748    /// This action cannot be performed on a team shared folder.
749    TeamFolder,
750    /// The current user does not have permission to perform this action.
751    NoPermission,
752    /// Invalid shared folder error will be returned as an access_error.
753    InvalidSharedFolder,
754    /// Catch-all used for unrecognized values returned from the server. Encountering this value
755    /// typically indicates that this SDK version is out of date.
756    Other,
757}
758
759impl<'de> ::serde::de::Deserialize<'de> for AddFolderMemberError {
760    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
761        // union deserializer
762        use serde::de::{self, MapAccess, Visitor};
763        struct EnumVisitor;
764        impl<'de> Visitor<'de> for EnumVisitor {
765            type Value = AddFolderMemberError;
766            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
767                f.write_str("a AddFolderMemberError structure")
768            }
769            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
770                let tag: &str = match map.next_key()? {
771                    Some(".tag") => map.next_value()?,
772                    _ => return Err(de::Error::missing_field(".tag"))
773                };
774                let value = match tag {
775                    "access_error" => {
776                        match map.next_key()? {
777                            Some("access_error") => AddFolderMemberError::AccessError(map.next_value()?),
778                            None => return Err(de::Error::missing_field("access_error")),
779                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
780                        }
781                    }
782                    "email_unverified" => AddFolderMemberError::EmailUnverified,
783                    "banned_member" => AddFolderMemberError::BannedMember,
784                    "bad_member" => {
785                        match map.next_key()? {
786                            Some("bad_member") => AddFolderMemberError::BadMember(map.next_value()?),
787                            None => return Err(de::Error::missing_field("bad_member")),
788                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
789                        }
790                    }
791                    "cant_share_outside_team" => AddFolderMemberError::CantShareOutsideTeam,
792                    "too_many_members" => {
793                        match map.next_key()? {
794                            Some("too_many_members") => AddFolderMemberError::TooManyMembers(map.next_value()?),
795                            None => return Err(de::Error::missing_field("too_many_members")),
796                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
797                        }
798                    }
799                    "too_many_pending_invites" => {
800                        match map.next_key()? {
801                            Some("too_many_pending_invites") => AddFolderMemberError::TooManyPendingInvites(map.next_value()?),
802                            None => return Err(de::Error::missing_field("too_many_pending_invites")),
803                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
804                        }
805                    }
806                    "rate_limit" => AddFolderMemberError::RateLimit,
807                    "too_many_invitees" => AddFolderMemberError::TooManyInvitees,
808                    "insufficient_plan" => AddFolderMemberError::InsufficientPlan,
809                    "team_folder" => AddFolderMemberError::TeamFolder,
810                    "no_permission" => AddFolderMemberError::NoPermission,
811                    "invalid_shared_folder" => AddFolderMemberError::InvalidSharedFolder,
812                    _ => AddFolderMemberError::Other,
813                };
814                crate::eat_json_fields(&mut map)?;
815                Ok(value)
816            }
817        }
818        const VARIANTS: &[&str] = &["access_error",
819                                    "email_unverified",
820                                    "banned_member",
821                                    "bad_member",
822                                    "cant_share_outside_team",
823                                    "too_many_members",
824                                    "too_many_pending_invites",
825                                    "rate_limit",
826                                    "too_many_invitees",
827                                    "insufficient_plan",
828                                    "team_folder",
829                                    "no_permission",
830                                    "invalid_shared_folder",
831                                    "other"];
832        deserializer.deserialize_struct("AddFolderMemberError", VARIANTS, EnumVisitor)
833    }
834}
835
836impl ::serde::ser::Serialize for AddFolderMemberError {
837    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
838        // union serializer
839        use serde::ser::SerializeStruct;
840        match self {
841            AddFolderMemberError::AccessError(x) => {
842                // union or polymporphic struct
843                let mut s = serializer.serialize_struct("AddFolderMemberError", 2)?;
844                s.serialize_field(".tag", "access_error")?;
845                s.serialize_field("access_error", x)?;
846                s.end()
847            }
848            AddFolderMemberError::EmailUnverified => {
849                // unit
850                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
851                s.serialize_field(".tag", "email_unverified")?;
852                s.end()
853            }
854            AddFolderMemberError::BannedMember => {
855                // unit
856                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
857                s.serialize_field(".tag", "banned_member")?;
858                s.end()
859            }
860            AddFolderMemberError::BadMember(x) => {
861                // union or polymporphic struct
862                let mut s = serializer.serialize_struct("AddFolderMemberError", 2)?;
863                s.serialize_field(".tag", "bad_member")?;
864                s.serialize_field("bad_member", x)?;
865                s.end()
866            }
867            AddFolderMemberError::CantShareOutsideTeam => {
868                // unit
869                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
870                s.serialize_field(".tag", "cant_share_outside_team")?;
871                s.end()
872            }
873            AddFolderMemberError::TooManyMembers(x) => {
874                // primitive
875                let mut s = serializer.serialize_struct("AddFolderMemberError", 2)?;
876                s.serialize_field(".tag", "too_many_members")?;
877                s.serialize_field("too_many_members", x)?;
878                s.end()
879            }
880            AddFolderMemberError::TooManyPendingInvites(x) => {
881                // primitive
882                let mut s = serializer.serialize_struct("AddFolderMemberError", 2)?;
883                s.serialize_field(".tag", "too_many_pending_invites")?;
884                s.serialize_field("too_many_pending_invites", x)?;
885                s.end()
886            }
887            AddFolderMemberError::RateLimit => {
888                // unit
889                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
890                s.serialize_field(".tag", "rate_limit")?;
891                s.end()
892            }
893            AddFolderMemberError::TooManyInvitees => {
894                // unit
895                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
896                s.serialize_field(".tag", "too_many_invitees")?;
897                s.end()
898            }
899            AddFolderMemberError::InsufficientPlan => {
900                // unit
901                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
902                s.serialize_field(".tag", "insufficient_plan")?;
903                s.end()
904            }
905            AddFolderMemberError::TeamFolder => {
906                // unit
907                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
908                s.serialize_field(".tag", "team_folder")?;
909                s.end()
910            }
911            AddFolderMemberError::NoPermission => {
912                // unit
913                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
914                s.serialize_field(".tag", "no_permission")?;
915                s.end()
916            }
917            AddFolderMemberError::InvalidSharedFolder => {
918                // unit
919                let mut s = serializer.serialize_struct("AddFolderMemberError", 1)?;
920                s.serialize_field(".tag", "invalid_shared_folder")?;
921                s.end()
922            }
923            AddFolderMemberError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
924        }
925    }
926}
927
928impl ::std::error::Error for AddFolderMemberError {
929    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
930        match self {
931            AddFolderMemberError::AccessError(inner) => Some(inner),
932            AddFolderMemberError::BadMember(inner) => Some(inner),
933            _ => None,
934        }
935    }
936}
937
938impl ::std::fmt::Display for AddFolderMemberError {
939    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
940        match self {
941            AddFolderMemberError::AccessError(inner) => write!(f, "Unable to access shared folder: {}", inner),
942            AddFolderMemberError::BannedMember => f.write_str("The current user has been banned."),
943            AddFolderMemberError::BadMember(inner) => write!(f, "AddFolderMemberError: {}", inner),
944            AddFolderMemberError::CantShareOutsideTeam => f.write_str("Your team policy does not allow sharing outside of the team."),
945            AddFolderMemberError::TooManyMembers(inner) => write!(f, "The value is the member limit that was reached: {:?}", inner),
946            AddFolderMemberError::TooManyPendingInvites(inner) => write!(f, "The value is the pending invite limit that was reached: {:?}", inner),
947            AddFolderMemberError::RateLimit => f.write_str("The current user has hit the limit of invites they can send per day. Try again in 24 hours."),
948            AddFolderMemberError::TooManyInvitees => f.write_str("The current user is trying to share with too many people at once."),
949            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."),
950            AddFolderMemberError::TeamFolder => f.write_str("This action cannot be performed on a team shared folder."),
951            AddFolderMemberError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
952            AddFolderMemberError::InvalidSharedFolder => f.write_str("Invalid shared folder error will be returned as an access_error."),
953            _ => write!(f, "{:?}", *self),
954        }
955    }
956}
957
958/// The member and type of access the member should have when added to a shared folder.
959#[derive(Debug, Clone, PartialEq, Eq)]
960#[non_exhaustive] // structs may have more fields added in the future.
961pub struct AddMember {
962    /// The member to add to the shared folder.
963    pub member: MemberSelector,
964    /// The access level to grant `member` to the shared folder.  [`AccessLevel::Owner`] is
965    /// disallowed.
966    pub access_level: AccessLevel,
967}
968
969impl AddMember {
970    pub fn new(member: MemberSelector) -> Self {
971        AddMember {
972            member,
973            access_level: AccessLevel::Viewer,
974        }
975    }
976
977    pub fn with_access_level(mut self, value: AccessLevel) -> Self {
978        self.access_level = value;
979        self
980    }
981}
982
983const ADD_MEMBER_FIELDS: &[&str] = &["member",
984                                     "access_level"];
985impl AddMember {
986    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
987        map: V,
988    ) -> Result<AddMember, V::Error> {
989        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
990    }
991
992    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
993        mut map: V,
994        optional: bool,
995    ) -> Result<Option<AddMember>, V::Error> {
996        let mut field_member = None;
997        let mut field_access_level = None;
998        let mut nothing = true;
999        while let Some(key) = map.next_key::<&str>()? {
1000            nothing = false;
1001            match key {
1002                "member" => {
1003                    if field_member.is_some() {
1004                        return Err(::serde::de::Error::duplicate_field("member"));
1005                    }
1006                    field_member = Some(map.next_value()?);
1007                }
1008                "access_level" => {
1009                    if field_access_level.is_some() {
1010                        return Err(::serde::de::Error::duplicate_field("access_level"));
1011                    }
1012                    field_access_level = Some(map.next_value()?);
1013                }
1014                _ => {
1015                    // unknown field allowed and ignored
1016                    map.next_value::<::serde_json::Value>()?;
1017                }
1018            }
1019        }
1020        if optional && nothing {
1021            return Ok(None);
1022        }
1023        let result = AddMember {
1024            member: field_member.ok_or_else(|| ::serde::de::Error::missing_field("member"))?,
1025            access_level: field_access_level.unwrap_or(AccessLevel::Viewer),
1026        };
1027        Ok(Some(result))
1028    }
1029
1030    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
1031        &self,
1032        s: &mut S::SerializeStruct,
1033    ) -> Result<(), S::Error> {
1034        use serde::ser::SerializeStruct;
1035        s.serialize_field("member", &self.member)?;
1036        if self.access_level != AccessLevel::Viewer {
1037            s.serialize_field("access_level", &self.access_level)?;
1038        }
1039        Ok(())
1040    }
1041}
1042
1043impl<'de> ::serde::de::Deserialize<'de> for AddMember {
1044    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1045        // struct deserializer
1046        use serde::de::{MapAccess, Visitor};
1047        struct StructVisitor;
1048        impl<'de> Visitor<'de> for StructVisitor {
1049            type Value = AddMember;
1050            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1051                f.write_str("a AddMember struct")
1052            }
1053            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
1054                AddMember::internal_deserialize(map)
1055            }
1056        }
1057        deserializer.deserialize_struct("AddMember", ADD_MEMBER_FIELDS, StructVisitor)
1058    }
1059}
1060
1061impl ::serde::ser::Serialize for AddMember {
1062    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1063        // struct serializer
1064        use serde::ser::SerializeStruct;
1065        let mut s = serializer.serialize_struct("AddMember", 2)?;
1066        self.internal_serialize::<S>(&mut s)?;
1067        s.end()
1068    }
1069}
1070
1071#[derive(Debug, Clone, PartialEq, Eq)]
1072#[non_exhaustive] // variants may be added in the future
1073pub enum AddMemberSelectorError {
1074    /// Automatically created groups can only be added to team folders.
1075    AutomaticGroup,
1076    /// The value is the ID that could not be identified.
1077    InvalidDropboxId(DropboxId),
1078    /// The value is the e-email address that is malformed.
1079    InvalidEmail(crate::types::common::EmailAddress),
1080    /// The value is the ID of the Dropbox user with an unverified email address. Invite unverified
1081    /// users by email address instead of by their Dropbox ID.
1082    UnverifiedDropboxId(DropboxId),
1083    /// At least one of the specified groups in [`AddFolderMemberArg::members`](AddFolderMemberArg)
1084    /// is deleted.
1085    GroupDeleted,
1086    /// Sharing to a group that is not on the current user's team.
1087    GroupNotOnTeam,
1088    /// Catch-all used for unrecognized values returned from the server. Encountering this value
1089    /// typically indicates that this SDK version is out of date.
1090    Other,
1091}
1092
1093impl<'de> ::serde::de::Deserialize<'de> for AddMemberSelectorError {
1094    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1095        // union deserializer
1096        use serde::de::{self, MapAccess, Visitor};
1097        struct EnumVisitor;
1098        impl<'de> Visitor<'de> for EnumVisitor {
1099            type Value = AddMemberSelectorError;
1100            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1101                f.write_str("a AddMemberSelectorError structure")
1102            }
1103            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
1104                let tag: &str = match map.next_key()? {
1105                    Some(".tag") => map.next_value()?,
1106                    _ => return Err(de::Error::missing_field(".tag"))
1107                };
1108                let value = match tag {
1109                    "automatic_group" => AddMemberSelectorError::AutomaticGroup,
1110                    "invalid_dropbox_id" => {
1111                        match map.next_key()? {
1112                            Some("invalid_dropbox_id") => AddMemberSelectorError::InvalidDropboxId(map.next_value()?),
1113                            None => return Err(de::Error::missing_field("invalid_dropbox_id")),
1114                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
1115                        }
1116                    }
1117                    "invalid_email" => {
1118                        match map.next_key()? {
1119                            Some("invalid_email") => AddMemberSelectorError::InvalidEmail(map.next_value()?),
1120                            None => return Err(de::Error::missing_field("invalid_email")),
1121                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
1122                        }
1123                    }
1124                    "unverified_dropbox_id" => {
1125                        match map.next_key()? {
1126                            Some("unverified_dropbox_id") => AddMemberSelectorError::UnverifiedDropboxId(map.next_value()?),
1127                            None => return Err(de::Error::missing_field("unverified_dropbox_id")),
1128                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
1129                        }
1130                    }
1131                    "group_deleted" => AddMemberSelectorError::GroupDeleted,
1132                    "group_not_on_team" => AddMemberSelectorError::GroupNotOnTeam,
1133                    _ => AddMemberSelectorError::Other,
1134                };
1135                crate::eat_json_fields(&mut map)?;
1136                Ok(value)
1137            }
1138        }
1139        const VARIANTS: &[&str] = &["automatic_group",
1140                                    "invalid_dropbox_id",
1141                                    "invalid_email",
1142                                    "unverified_dropbox_id",
1143                                    "group_deleted",
1144                                    "group_not_on_team",
1145                                    "other"];
1146        deserializer.deserialize_struct("AddMemberSelectorError", VARIANTS, EnumVisitor)
1147    }
1148}
1149
1150impl ::serde::ser::Serialize for AddMemberSelectorError {
1151    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1152        // union serializer
1153        use serde::ser::SerializeStruct;
1154        match self {
1155            AddMemberSelectorError::AutomaticGroup => {
1156                // unit
1157                let mut s = serializer.serialize_struct("AddMemberSelectorError", 1)?;
1158                s.serialize_field(".tag", "automatic_group")?;
1159                s.end()
1160            }
1161            AddMemberSelectorError::InvalidDropboxId(x) => {
1162                // primitive
1163                let mut s = serializer.serialize_struct("AddMemberSelectorError", 2)?;
1164                s.serialize_field(".tag", "invalid_dropbox_id")?;
1165                s.serialize_field("invalid_dropbox_id", x)?;
1166                s.end()
1167            }
1168            AddMemberSelectorError::InvalidEmail(x) => {
1169                // primitive
1170                let mut s = serializer.serialize_struct("AddMemberSelectorError", 2)?;
1171                s.serialize_field(".tag", "invalid_email")?;
1172                s.serialize_field("invalid_email", x)?;
1173                s.end()
1174            }
1175            AddMemberSelectorError::UnverifiedDropboxId(x) => {
1176                // primitive
1177                let mut s = serializer.serialize_struct("AddMemberSelectorError", 2)?;
1178                s.serialize_field(".tag", "unverified_dropbox_id")?;
1179                s.serialize_field("unverified_dropbox_id", x)?;
1180                s.end()
1181            }
1182            AddMemberSelectorError::GroupDeleted => {
1183                // unit
1184                let mut s = serializer.serialize_struct("AddMemberSelectorError", 1)?;
1185                s.serialize_field(".tag", "group_deleted")?;
1186                s.end()
1187            }
1188            AddMemberSelectorError::GroupNotOnTeam => {
1189                // unit
1190                let mut s = serializer.serialize_struct("AddMemberSelectorError", 1)?;
1191                s.serialize_field(".tag", "group_not_on_team")?;
1192                s.end()
1193            }
1194            AddMemberSelectorError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
1195        }
1196    }
1197}
1198
1199impl ::std::error::Error for AddMemberSelectorError {
1200}
1201
1202impl ::std::fmt::Display for AddMemberSelectorError {
1203    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1204        match self {
1205            AddMemberSelectorError::AutomaticGroup => f.write_str("Automatically created groups can only be added to team folders."),
1206            AddMemberSelectorError::InvalidDropboxId(inner) => write!(f, "The value is the ID that could not be identified: {:?}", inner),
1207            AddMemberSelectorError::InvalidEmail(inner) => write!(f, "The value is the e-email address that is malformed: {:?}", inner),
1208            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),
1209            AddMemberSelectorError::GroupNotOnTeam => f.write_str("Sharing to a group that is not on the current user's team."),
1210            _ => write!(f, "{:?}", *self),
1211        }
1212    }
1213}
1214
1215/// check documentation for ResolvedVisibility.
1216#[derive(Debug, Clone, PartialEq, Eq)]
1217#[non_exhaustive] // variants may be added in the future
1218pub enum AlphaResolvedVisibility {
1219    /// Anyone who has received the link can access it. No login required.
1220    Public,
1221    /// Only members of the same team can access the link. Login is required.
1222    TeamOnly,
1223    /// A link-specific password is required to access the link. Login is not required.
1224    Password,
1225    /// Only members of the same team who have the link-specific password can access the link. Login
1226    /// is required.
1227    TeamAndPassword,
1228    /// Only members of the shared folder containing the linked file can access the link. Login is
1229    /// required.
1230    SharedFolderOnly,
1231    /// The link merely points the user to the content, and does not grant any additional rights.
1232    /// Existing members of the content who use this link can only access the content with their
1233    /// pre-existing access rights. Either on the file directly, or inherited from a parent folder.
1234    NoOne,
1235    /// Only the current user can view this link.
1236    OnlyYou,
1237    /// Catch-all used for unrecognized values returned from the server. Encountering this value
1238    /// typically indicates that this SDK version is out of date.
1239    Other,
1240}
1241
1242impl<'de> ::serde::de::Deserialize<'de> for AlphaResolvedVisibility {
1243    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1244        // union deserializer
1245        use serde::de::{self, MapAccess, Visitor};
1246        struct EnumVisitor;
1247        impl<'de> Visitor<'de> for EnumVisitor {
1248            type Value = AlphaResolvedVisibility;
1249            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1250                f.write_str("a AlphaResolvedVisibility structure")
1251            }
1252            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
1253                let tag: &str = match map.next_key()? {
1254                    Some(".tag") => map.next_value()?,
1255                    _ => return Err(de::Error::missing_field(".tag"))
1256                };
1257                let value = match tag {
1258                    "public" => AlphaResolvedVisibility::Public,
1259                    "team_only" => AlphaResolvedVisibility::TeamOnly,
1260                    "password" => AlphaResolvedVisibility::Password,
1261                    "team_and_password" => AlphaResolvedVisibility::TeamAndPassword,
1262                    "shared_folder_only" => AlphaResolvedVisibility::SharedFolderOnly,
1263                    "no_one" => AlphaResolvedVisibility::NoOne,
1264                    "only_you" => AlphaResolvedVisibility::OnlyYou,
1265                    _ => AlphaResolvedVisibility::Other,
1266                };
1267                crate::eat_json_fields(&mut map)?;
1268                Ok(value)
1269            }
1270        }
1271        const VARIANTS: &[&str] = &["public",
1272                                    "team_only",
1273                                    "password",
1274                                    "team_and_password",
1275                                    "shared_folder_only",
1276                                    "no_one",
1277                                    "only_you",
1278                                    "other"];
1279        deserializer.deserialize_struct("AlphaResolvedVisibility", VARIANTS, EnumVisitor)
1280    }
1281}
1282
1283impl ::serde::ser::Serialize for AlphaResolvedVisibility {
1284    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1285        // union serializer
1286        use serde::ser::SerializeStruct;
1287        match self {
1288            AlphaResolvedVisibility::Public => {
1289                // unit
1290                let mut s = serializer.serialize_struct("AlphaResolvedVisibility", 1)?;
1291                s.serialize_field(".tag", "public")?;
1292                s.end()
1293            }
1294            AlphaResolvedVisibility::TeamOnly => {
1295                // unit
1296                let mut s = serializer.serialize_struct("AlphaResolvedVisibility", 1)?;
1297                s.serialize_field(".tag", "team_only")?;
1298                s.end()
1299            }
1300            AlphaResolvedVisibility::Password => {
1301                // unit
1302                let mut s = serializer.serialize_struct("AlphaResolvedVisibility", 1)?;
1303                s.serialize_field(".tag", "password")?;
1304                s.end()
1305            }
1306            AlphaResolvedVisibility::TeamAndPassword => {
1307                // unit
1308                let mut s = serializer.serialize_struct("AlphaResolvedVisibility", 1)?;
1309                s.serialize_field(".tag", "team_and_password")?;
1310                s.end()
1311            }
1312            AlphaResolvedVisibility::SharedFolderOnly => {
1313                // unit
1314                let mut s = serializer.serialize_struct("AlphaResolvedVisibility", 1)?;
1315                s.serialize_field(".tag", "shared_folder_only")?;
1316                s.end()
1317            }
1318            AlphaResolvedVisibility::NoOne => {
1319                // unit
1320                let mut s = serializer.serialize_struct("AlphaResolvedVisibility", 1)?;
1321                s.serialize_field(".tag", "no_one")?;
1322                s.end()
1323            }
1324            AlphaResolvedVisibility::OnlyYou => {
1325                // unit
1326                let mut s = serializer.serialize_struct("AlphaResolvedVisibility", 1)?;
1327                s.serialize_field(".tag", "only_you")?;
1328                s.end()
1329            }
1330            AlphaResolvedVisibility::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
1331        }
1332    }
1333}
1334
1335// union extends ResolvedVisibility
1336impl From<ResolvedVisibility> for AlphaResolvedVisibility {
1337    fn from(parent: ResolvedVisibility) -> Self {
1338        match parent {
1339            ResolvedVisibility::Public => AlphaResolvedVisibility::Public,
1340            ResolvedVisibility::TeamOnly => AlphaResolvedVisibility::TeamOnly,
1341            ResolvedVisibility::Password => AlphaResolvedVisibility::Password,
1342            ResolvedVisibility::TeamAndPassword => AlphaResolvedVisibility::TeamAndPassword,
1343            ResolvedVisibility::SharedFolderOnly => AlphaResolvedVisibility::SharedFolderOnly,
1344            ResolvedVisibility::NoOne => AlphaResolvedVisibility::NoOne,
1345            ResolvedVisibility::OnlyYou => AlphaResolvedVisibility::OnlyYou,
1346            ResolvedVisibility::Other => AlphaResolvedVisibility::Other,
1347        }
1348    }
1349}
1350/// Information about the content that has a link audience different than that of this folder.
1351#[derive(Debug, Clone, PartialEq, Eq)]
1352#[non_exhaustive] // structs may have more fields added in the future.
1353pub struct AudienceExceptionContentInfo {
1354    /// The name of the content, which is either a file or a folder.
1355    pub name: String,
1356}
1357
1358impl AudienceExceptionContentInfo {
1359    pub fn new(name: String) -> Self {
1360        AudienceExceptionContentInfo {
1361            name,
1362        }
1363    }
1364}
1365
1366const AUDIENCE_EXCEPTION_CONTENT_INFO_FIELDS: &[&str] = &["name"];
1367impl AudienceExceptionContentInfo {
1368    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
1369        map: V,
1370    ) -> Result<AudienceExceptionContentInfo, V::Error> {
1371        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
1372    }
1373
1374    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
1375        mut map: V,
1376        optional: bool,
1377    ) -> Result<Option<AudienceExceptionContentInfo>, V::Error> {
1378        let mut field_name = None;
1379        let mut nothing = true;
1380        while let Some(key) = map.next_key::<&str>()? {
1381            nothing = false;
1382            match key {
1383                "name" => {
1384                    if field_name.is_some() {
1385                        return Err(::serde::de::Error::duplicate_field("name"));
1386                    }
1387                    field_name = Some(map.next_value()?);
1388                }
1389                _ => {
1390                    // unknown field allowed and ignored
1391                    map.next_value::<::serde_json::Value>()?;
1392                }
1393            }
1394        }
1395        if optional && nothing {
1396            return Ok(None);
1397        }
1398        let result = AudienceExceptionContentInfo {
1399            name: field_name.ok_or_else(|| ::serde::de::Error::missing_field("name"))?,
1400        };
1401        Ok(Some(result))
1402    }
1403
1404    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
1405        &self,
1406        s: &mut S::SerializeStruct,
1407    ) -> Result<(), S::Error> {
1408        use serde::ser::SerializeStruct;
1409        s.serialize_field("name", &self.name)?;
1410        Ok(())
1411    }
1412}
1413
1414impl<'de> ::serde::de::Deserialize<'de> for AudienceExceptionContentInfo {
1415    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1416        // struct deserializer
1417        use serde::de::{MapAccess, Visitor};
1418        struct StructVisitor;
1419        impl<'de> Visitor<'de> for StructVisitor {
1420            type Value = AudienceExceptionContentInfo;
1421            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1422                f.write_str("a AudienceExceptionContentInfo struct")
1423            }
1424            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
1425                AudienceExceptionContentInfo::internal_deserialize(map)
1426            }
1427        }
1428        deserializer.deserialize_struct("AudienceExceptionContentInfo", AUDIENCE_EXCEPTION_CONTENT_INFO_FIELDS, StructVisitor)
1429    }
1430}
1431
1432impl ::serde::ser::Serialize for AudienceExceptionContentInfo {
1433    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1434        // struct serializer
1435        use serde::ser::SerializeStruct;
1436        let mut s = serializer.serialize_struct("AudienceExceptionContentInfo", 1)?;
1437        self.internal_serialize::<S>(&mut s)?;
1438        s.end()
1439    }
1440}
1441
1442/// The total count and truncated list of information of content inside this folder that has a
1443/// different audience than the link on this folder. This is only returned for folders.
1444#[derive(Debug, Clone, PartialEq, Eq)]
1445#[non_exhaustive] // structs may have more fields added in the future.
1446pub struct AudienceExceptions {
1447    pub count: u32,
1448    /// A truncated list of some of the content that is an exception. The length of this list could
1449    /// be smaller than the count since it is only a sample but will not be empty as long as count
1450    /// is not 0.
1451    pub exceptions: Vec<AudienceExceptionContentInfo>,
1452}
1453
1454impl AudienceExceptions {
1455    pub fn new(count: u32, exceptions: Vec<AudienceExceptionContentInfo>) -> Self {
1456        AudienceExceptions {
1457            count,
1458            exceptions,
1459        }
1460    }
1461}
1462
1463const AUDIENCE_EXCEPTIONS_FIELDS: &[&str] = &["count",
1464                                              "exceptions"];
1465impl AudienceExceptions {
1466    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
1467        map: V,
1468    ) -> Result<AudienceExceptions, V::Error> {
1469        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
1470    }
1471
1472    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
1473        mut map: V,
1474        optional: bool,
1475    ) -> Result<Option<AudienceExceptions>, V::Error> {
1476        let mut field_count = None;
1477        let mut field_exceptions = None;
1478        let mut nothing = true;
1479        while let Some(key) = map.next_key::<&str>()? {
1480            nothing = false;
1481            match key {
1482                "count" => {
1483                    if field_count.is_some() {
1484                        return Err(::serde::de::Error::duplicate_field("count"));
1485                    }
1486                    field_count = Some(map.next_value()?);
1487                }
1488                "exceptions" => {
1489                    if field_exceptions.is_some() {
1490                        return Err(::serde::de::Error::duplicate_field("exceptions"));
1491                    }
1492                    field_exceptions = Some(map.next_value()?);
1493                }
1494                _ => {
1495                    // unknown field allowed and ignored
1496                    map.next_value::<::serde_json::Value>()?;
1497                }
1498            }
1499        }
1500        if optional && nothing {
1501            return Ok(None);
1502        }
1503        let result = AudienceExceptions {
1504            count: field_count.ok_or_else(|| ::serde::de::Error::missing_field("count"))?,
1505            exceptions: field_exceptions.ok_or_else(|| ::serde::de::Error::missing_field("exceptions"))?,
1506        };
1507        Ok(Some(result))
1508    }
1509
1510    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
1511        &self,
1512        s: &mut S::SerializeStruct,
1513    ) -> Result<(), S::Error> {
1514        use serde::ser::SerializeStruct;
1515        s.serialize_field("count", &self.count)?;
1516        s.serialize_field("exceptions", &self.exceptions)?;
1517        Ok(())
1518    }
1519}
1520
1521impl<'de> ::serde::de::Deserialize<'de> for AudienceExceptions {
1522    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1523        // struct deserializer
1524        use serde::de::{MapAccess, Visitor};
1525        struct StructVisitor;
1526        impl<'de> Visitor<'de> for StructVisitor {
1527            type Value = AudienceExceptions;
1528            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1529                f.write_str("a AudienceExceptions struct")
1530            }
1531            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
1532                AudienceExceptions::internal_deserialize(map)
1533            }
1534        }
1535        deserializer.deserialize_struct("AudienceExceptions", AUDIENCE_EXCEPTIONS_FIELDS, StructVisitor)
1536    }
1537}
1538
1539impl ::serde::ser::Serialize for AudienceExceptions {
1540    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1541        // struct serializer
1542        use serde::ser::SerializeStruct;
1543        let mut s = serializer.serialize_struct("AudienceExceptions", 2)?;
1544        self.internal_serialize::<S>(&mut s)?;
1545        s.end()
1546    }
1547}
1548
1549/// Information about the shared folder that prevents the link audience for this link from being
1550/// more restrictive.
1551#[derive(Debug, Clone, PartialEq, Eq)]
1552#[non_exhaustive] // structs may have more fields added in the future.
1553pub struct AudienceRestrictingSharedFolder {
1554    /// The ID of the shared folder.
1555    pub shared_folder_id: crate::types::common::SharedFolderId,
1556    /// The name of the shared folder.
1557    pub name: String,
1558    /// The link audience of the shared folder.
1559    pub audience: LinkAudience,
1560}
1561
1562impl AudienceRestrictingSharedFolder {
1563    pub fn new(
1564        shared_folder_id: crate::types::common::SharedFolderId,
1565        name: String,
1566        audience: LinkAudience,
1567    ) -> Self {
1568        AudienceRestrictingSharedFolder {
1569            shared_folder_id,
1570            name,
1571            audience,
1572        }
1573    }
1574}
1575
1576const AUDIENCE_RESTRICTING_SHARED_FOLDER_FIELDS: &[&str] = &["shared_folder_id",
1577                                                             "name",
1578                                                             "audience"];
1579impl AudienceRestrictingSharedFolder {
1580    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
1581        map: V,
1582    ) -> Result<AudienceRestrictingSharedFolder, V::Error> {
1583        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
1584    }
1585
1586    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
1587        mut map: V,
1588        optional: bool,
1589    ) -> Result<Option<AudienceRestrictingSharedFolder>, V::Error> {
1590        let mut field_shared_folder_id = None;
1591        let mut field_name = None;
1592        let mut field_audience = None;
1593        let mut nothing = true;
1594        while let Some(key) = map.next_key::<&str>()? {
1595            nothing = false;
1596            match key {
1597                "shared_folder_id" => {
1598                    if field_shared_folder_id.is_some() {
1599                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
1600                    }
1601                    field_shared_folder_id = Some(map.next_value()?);
1602                }
1603                "name" => {
1604                    if field_name.is_some() {
1605                        return Err(::serde::de::Error::duplicate_field("name"));
1606                    }
1607                    field_name = Some(map.next_value()?);
1608                }
1609                "audience" => {
1610                    if field_audience.is_some() {
1611                        return Err(::serde::de::Error::duplicate_field("audience"));
1612                    }
1613                    field_audience = Some(map.next_value()?);
1614                }
1615                _ => {
1616                    // unknown field allowed and ignored
1617                    map.next_value::<::serde_json::Value>()?;
1618                }
1619            }
1620        }
1621        if optional && nothing {
1622            return Ok(None);
1623        }
1624        let result = AudienceRestrictingSharedFolder {
1625            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
1626            name: field_name.ok_or_else(|| ::serde::de::Error::missing_field("name"))?,
1627            audience: field_audience.ok_or_else(|| ::serde::de::Error::missing_field("audience"))?,
1628        };
1629        Ok(Some(result))
1630    }
1631
1632    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
1633        &self,
1634        s: &mut S::SerializeStruct,
1635    ) -> Result<(), S::Error> {
1636        use serde::ser::SerializeStruct;
1637        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
1638        s.serialize_field("name", &self.name)?;
1639        s.serialize_field("audience", &self.audience)?;
1640        Ok(())
1641    }
1642}
1643
1644impl<'de> ::serde::de::Deserialize<'de> for AudienceRestrictingSharedFolder {
1645    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1646        // struct deserializer
1647        use serde::de::{MapAccess, Visitor};
1648        struct StructVisitor;
1649        impl<'de> Visitor<'de> for StructVisitor {
1650            type Value = AudienceRestrictingSharedFolder;
1651            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1652                f.write_str("a AudienceRestrictingSharedFolder struct")
1653            }
1654            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
1655                AudienceRestrictingSharedFolder::internal_deserialize(map)
1656            }
1657        }
1658        deserializer.deserialize_struct("AudienceRestrictingSharedFolder", AUDIENCE_RESTRICTING_SHARED_FOLDER_FIELDS, StructVisitor)
1659    }
1660}
1661
1662impl ::serde::ser::Serialize for AudienceRestrictingSharedFolder {
1663    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1664        // struct serializer
1665        use serde::ser::SerializeStruct;
1666        let mut s = serializer.serialize_struct("AudienceRestrictingSharedFolder", 3)?;
1667        self.internal_serialize::<S>(&mut s)?;
1668        s.end()
1669    }
1670}
1671
1672/// Metadata for a collection-based shared link.
1673#[derive(Debug, Clone, PartialEq, Eq)]
1674#[non_exhaustive] // structs may have more fields added in the future.
1675pub struct CollectionLinkMetadata {
1676    /// URL of the shared link.
1677    pub url: String,
1678    /// Who can access the link.
1679    pub visibility: Visibility,
1680    /// Expiration time, if set. By default the link won't expire.
1681    pub expires: Option<crate::types::common::DropboxTimestamp>,
1682}
1683
1684impl CollectionLinkMetadata {
1685    pub fn new(url: String, visibility: Visibility) -> Self {
1686        CollectionLinkMetadata {
1687            url,
1688            visibility,
1689            expires: None,
1690        }
1691    }
1692
1693    pub fn with_expires(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
1694        self.expires = Some(value);
1695        self
1696    }
1697}
1698
1699const COLLECTION_LINK_METADATA_FIELDS: &[&str] = &["url",
1700                                                   "visibility",
1701                                                   "expires"];
1702impl CollectionLinkMetadata {
1703    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
1704        map: V,
1705    ) -> Result<CollectionLinkMetadata, V::Error> {
1706        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
1707    }
1708
1709    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
1710        mut map: V,
1711        optional: bool,
1712    ) -> Result<Option<CollectionLinkMetadata>, V::Error> {
1713        let mut field_url = None;
1714        let mut field_visibility = None;
1715        let mut field_expires = None;
1716        let mut nothing = true;
1717        while let Some(key) = map.next_key::<&str>()? {
1718            nothing = false;
1719            match key {
1720                "url" => {
1721                    if field_url.is_some() {
1722                        return Err(::serde::de::Error::duplicate_field("url"));
1723                    }
1724                    field_url = Some(map.next_value()?);
1725                }
1726                "visibility" => {
1727                    if field_visibility.is_some() {
1728                        return Err(::serde::de::Error::duplicate_field("visibility"));
1729                    }
1730                    field_visibility = Some(map.next_value()?);
1731                }
1732                "expires" => {
1733                    if field_expires.is_some() {
1734                        return Err(::serde::de::Error::duplicate_field("expires"));
1735                    }
1736                    field_expires = Some(map.next_value()?);
1737                }
1738                _ => {
1739                    // unknown field allowed and ignored
1740                    map.next_value::<::serde_json::Value>()?;
1741                }
1742            }
1743        }
1744        if optional && nothing {
1745            return Ok(None);
1746        }
1747        let result = CollectionLinkMetadata {
1748            url: field_url.ok_or_else(|| ::serde::de::Error::missing_field("url"))?,
1749            visibility: field_visibility.ok_or_else(|| ::serde::de::Error::missing_field("visibility"))?,
1750            expires: field_expires.and_then(Option::flatten),
1751        };
1752        Ok(Some(result))
1753    }
1754
1755    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
1756        &self,
1757        s: &mut S::SerializeStruct,
1758    ) -> Result<(), S::Error> {
1759        use serde::ser::SerializeStruct;
1760        s.serialize_field("url", &self.url)?;
1761        s.serialize_field("visibility", &self.visibility)?;
1762        if let Some(val) = &self.expires {
1763            s.serialize_field("expires", val)?;
1764        }
1765        Ok(())
1766    }
1767}
1768
1769impl<'de> ::serde::de::Deserialize<'de> for CollectionLinkMetadata {
1770    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1771        // struct deserializer
1772        use serde::de::{MapAccess, Visitor};
1773        struct StructVisitor;
1774        impl<'de> Visitor<'de> for StructVisitor {
1775            type Value = CollectionLinkMetadata;
1776            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1777                f.write_str("a CollectionLinkMetadata struct")
1778            }
1779            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
1780                CollectionLinkMetadata::internal_deserialize(map)
1781            }
1782        }
1783        deserializer.deserialize_struct("CollectionLinkMetadata", COLLECTION_LINK_METADATA_FIELDS, StructVisitor)
1784    }
1785}
1786
1787impl ::serde::ser::Serialize for CollectionLinkMetadata {
1788    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1789        // struct serializer
1790        use serde::ser::SerializeStruct;
1791        let mut s = serializer.serialize_struct("CollectionLinkMetadata", 3)?;
1792        self.internal_serialize::<S>(&mut s)?;
1793        s.end()
1794    }
1795}
1796
1797// struct extends polymorphic struct LinkMetadata
1798impl From<CollectionLinkMetadata> for LinkMetadata {
1799    fn from(subtype: CollectionLinkMetadata) -> Self {
1800        LinkMetadata::Collection(subtype)
1801    }
1802}
1803#[derive(Debug, Clone, PartialEq, Eq)]
1804#[non_exhaustive] // structs may have more fields added in the future.
1805pub struct CreateSharedLinkArg {
1806    /// The path to share.
1807    pub path: String,
1808    pub short_url: bool,
1809    /// If it's okay to share a path that does not yet exist, set this to either
1810    /// [`PendingUploadMode::File`] or [`PendingUploadMode::Folder`] to indicate whether to assume
1811    /// it's a file or folder.
1812    pub pending_upload: Option<PendingUploadMode>,
1813}
1814
1815impl CreateSharedLinkArg {
1816    pub fn new(path: String) -> Self {
1817        CreateSharedLinkArg {
1818            path,
1819            short_url: false,
1820            pending_upload: None,
1821        }
1822    }
1823
1824    pub fn with_short_url(mut self, value: bool) -> Self {
1825        self.short_url = value;
1826        self
1827    }
1828
1829    pub fn with_pending_upload(mut self, value: PendingUploadMode) -> Self {
1830        self.pending_upload = Some(value);
1831        self
1832    }
1833}
1834
1835const CREATE_SHARED_LINK_ARG_FIELDS: &[&str] = &["path",
1836                                                 "short_url",
1837                                                 "pending_upload"];
1838impl CreateSharedLinkArg {
1839    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
1840        map: V,
1841    ) -> Result<CreateSharedLinkArg, V::Error> {
1842        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
1843    }
1844
1845    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
1846        mut map: V,
1847        optional: bool,
1848    ) -> Result<Option<CreateSharedLinkArg>, V::Error> {
1849        let mut field_path = None;
1850        let mut field_short_url = None;
1851        let mut field_pending_upload = None;
1852        let mut nothing = true;
1853        while let Some(key) = map.next_key::<&str>()? {
1854            nothing = false;
1855            match key {
1856                "path" => {
1857                    if field_path.is_some() {
1858                        return Err(::serde::de::Error::duplicate_field("path"));
1859                    }
1860                    field_path = Some(map.next_value()?);
1861                }
1862                "short_url" => {
1863                    if field_short_url.is_some() {
1864                        return Err(::serde::de::Error::duplicate_field("short_url"));
1865                    }
1866                    field_short_url = Some(map.next_value()?);
1867                }
1868                "pending_upload" => {
1869                    if field_pending_upload.is_some() {
1870                        return Err(::serde::de::Error::duplicate_field("pending_upload"));
1871                    }
1872                    field_pending_upload = Some(map.next_value()?);
1873                }
1874                _ => {
1875                    // unknown field allowed and ignored
1876                    map.next_value::<::serde_json::Value>()?;
1877                }
1878            }
1879        }
1880        if optional && nothing {
1881            return Ok(None);
1882        }
1883        let result = CreateSharedLinkArg {
1884            path: field_path.ok_or_else(|| ::serde::de::Error::missing_field("path"))?,
1885            short_url: field_short_url.unwrap_or(false),
1886            pending_upload: field_pending_upload.and_then(Option::flatten),
1887        };
1888        Ok(Some(result))
1889    }
1890
1891    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
1892        &self,
1893        s: &mut S::SerializeStruct,
1894    ) -> Result<(), S::Error> {
1895        use serde::ser::SerializeStruct;
1896        s.serialize_field("path", &self.path)?;
1897        if self.short_url {
1898            s.serialize_field("short_url", &self.short_url)?;
1899        }
1900        if let Some(val) = &self.pending_upload {
1901            s.serialize_field("pending_upload", val)?;
1902        }
1903        Ok(())
1904    }
1905}
1906
1907impl<'de> ::serde::de::Deserialize<'de> for CreateSharedLinkArg {
1908    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1909        // struct deserializer
1910        use serde::de::{MapAccess, Visitor};
1911        struct StructVisitor;
1912        impl<'de> Visitor<'de> for StructVisitor {
1913            type Value = CreateSharedLinkArg;
1914            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1915                f.write_str("a CreateSharedLinkArg struct")
1916            }
1917            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
1918                CreateSharedLinkArg::internal_deserialize(map)
1919            }
1920        }
1921        deserializer.deserialize_struct("CreateSharedLinkArg", CREATE_SHARED_LINK_ARG_FIELDS, StructVisitor)
1922    }
1923}
1924
1925impl ::serde::ser::Serialize for CreateSharedLinkArg {
1926    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1927        // struct serializer
1928        use serde::ser::SerializeStruct;
1929        let mut s = serializer.serialize_struct("CreateSharedLinkArg", 3)?;
1930        self.internal_serialize::<S>(&mut s)?;
1931        s.end()
1932    }
1933}
1934
1935#[derive(Debug, Clone, PartialEq, Eq)]
1936#[non_exhaustive] // variants may be added in the future
1937pub enum CreateSharedLinkError {
1938    Path(crate::types::files::LookupError),
1939    /// Catch-all used for unrecognized values returned from the server. Encountering this value
1940    /// typically indicates that this SDK version is out of date.
1941    Other,
1942}
1943
1944impl<'de> ::serde::de::Deserialize<'de> for CreateSharedLinkError {
1945    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1946        // union deserializer
1947        use serde::de::{self, MapAccess, Visitor};
1948        struct EnumVisitor;
1949        impl<'de> Visitor<'de> for EnumVisitor {
1950            type Value = CreateSharedLinkError;
1951            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1952                f.write_str("a CreateSharedLinkError structure")
1953            }
1954            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
1955                let tag: &str = match map.next_key()? {
1956                    Some(".tag") => map.next_value()?,
1957                    _ => return Err(de::Error::missing_field(".tag"))
1958                };
1959                let value = match tag {
1960                    "path" => {
1961                        match map.next_key()? {
1962                            Some("path") => CreateSharedLinkError::Path(map.next_value()?),
1963                            None => return Err(de::Error::missing_field("path")),
1964                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
1965                        }
1966                    }
1967                    _ => CreateSharedLinkError::Other,
1968                };
1969                crate::eat_json_fields(&mut map)?;
1970                Ok(value)
1971            }
1972        }
1973        const VARIANTS: &[&str] = &["path",
1974                                    "other"];
1975        deserializer.deserialize_struct("CreateSharedLinkError", VARIANTS, EnumVisitor)
1976    }
1977}
1978
1979impl ::serde::ser::Serialize for CreateSharedLinkError {
1980    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1981        // union serializer
1982        use serde::ser::SerializeStruct;
1983        match self {
1984            CreateSharedLinkError::Path(x) => {
1985                // union or polymporphic struct
1986                let mut s = serializer.serialize_struct("CreateSharedLinkError", 2)?;
1987                s.serialize_field(".tag", "path")?;
1988                s.serialize_field("path", x)?;
1989                s.end()
1990            }
1991            CreateSharedLinkError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
1992        }
1993    }
1994}
1995
1996impl ::std::error::Error for CreateSharedLinkError {
1997    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
1998        match self {
1999            CreateSharedLinkError::Path(inner) => Some(inner),
2000            _ => None,
2001        }
2002    }
2003}
2004
2005impl ::std::fmt::Display for CreateSharedLinkError {
2006    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
2007        match self {
2008            CreateSharedLinkError::Path(inner) => write!(f, "CreateSharedLinkError: {}", inner),
2009            _ => write!(f, "{:?}", *self),
2010        }
2011    }
2012}
2013
2014#[derive(Debug, Clone, PartialEq, Eq)]
2015#[non_exhaustive] // structs may have more fields added in the future.
2016pub struct CreateSharedLinkWithSettingsArg {
2017    /// The path to be shared by the shared link.
2018    pub path: ReadPath,
2019    /// The requested settings for the newly created shared link.
2020    pub settings: Option<SharedLinkSettings>,
2021}
2022
2023impl CreateSharedLinkWithSettingsArg {
2024    pub fn new(path: ReadPath) -> Self {
2025        CreateSharedLinkWithSettingsArg {
2026            path,
2027            settings: None,
2028        }
2029    }
2030
2031    pub fn with_settings(mut self, value: SharedLinkSettings) -> Self {
2032        self.settings = Some(value);
2033        self
2034    }
2035}
2036
2037const CREATE_SHARED_LINK_WITH_SETTINGS_ARG_FIELDS: &[&str] = &["path",
2038                                                               "settings"];
2039impl CreateSharedLinkWithSettingsArg {
2040    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
2041        map: V,
2042    ) -> Result<CreateSharedLinkWithSettingsArg, V::Error> {
2043        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
2044    }
2045
2046    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
2047        mut map: V,
2048        optional: bool,
2049    ) -> Result<Option<CreateSharedLinkWithSettingsArg>, V::Error> {
2050        let mut field_path = None;
2051        let mut field_settings = None;
2052        let mut nothing = true;
2053        while let Some(key) = map.next_key::<&str>()? {
2054            nothing = false;
2055            match key {
2056                "path" => {
2057                    if field_path.is_some() {
2058                        return Err(::serde::de::Error::duplicate_field("path"));
2059                    }
2060                    field_path = Some(map.next_value()?);
2061                }
2062                "settings" => {
2063                    if field_settings.is_some() {
2064                        return Err(::serde::de::Error::duplicate_field("settings"));
2065                    }
2066                    field_settings = Some(map.next_value()?);
2067                }
2068                _ => {
2069                    // unknown field allowed and ignored
2070                    map.next_value::<::serde_json::Value>()?;
2071                }
2072            }
2073        }
2074        if optional && nothing {
2075            return Ok(None);
2076        }
2077        let result = CreateSharedLinkWithSettingsArg {
2078            path: field_path.ok_or_else(|| ::serde::de::Error::missing_field("path"))?,
2079            settings: field_settings.and_then(Option::flatten),
2080        };
2081        Ok(Some(result))
2082    }
2083
2084    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
2085        &self,
2086        s: &mut S::SerializeStruct,
2087    ) -> Result<(), S::Error> {
2088        use serde::ser::SerializeStruct;
2089        s.serialize_field("path", &self.path)?;
2090        if let Some(val) = &self.settings {
2091            s.serialize_field("settings", val)?;
2092        }
2093        Ok(())
2094    }
2095}
2096
2097impl<'de> ::serde::de::Deserialize<'de> for CreateSharedLinkWithSettingsArg {
2098    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2099        // struct deserializer
2100        use serde::de::{MapAccess, Visitor};
2101        struct StructVisitor;
2102        impl<'de> Visitor<'de> for StructVisitor {
2103            type Value = CreateSharedLinkWithSettingsArg;
2104            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
2105                f.write_str("a CreateSharedLinkWithSettingsArg struct")
2106            }
2107            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
2108                CreateSharedLinkWithSettingsArg::internal_deserialize(map)
2109            }
2110        }
2111        deserializer.deserialize_struct("CreateSharedLinkWithSettingsArg", CREATE_SHARED_LINK_WITH_SETTINGS_ARG_FIELDS, StructVisitor)
2112    }
2113}
2114
2115impl ::serde::ser::Serialize for CreateSharedLinkWithSettingsArg {
2116    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
2117        // struct serializer
2118        use serde::ser::SerializeStruct;
2119        let mut s = serializer.serialize_struct("CreateSharedLinkWithSettingsArg", 2)?;
2120        self.internal_serialize::<S>(&mut s)?;
2121        s.end()
2122    }
2123}
2124
2125#[derive(Debug, Clone, PartialEq, Eq)]
2126pub enum CreateSharedLinkWithSettingsError {
2127    Path(crate::types::files::LookupError),
2128    /// This user's email address is not verified. This functionality is only available on accounts
2129    /// with a verified email address. Users can verify their email address
2130    /// [here](https://www.dropbox.com/help/317).
2131    EmailNotVerified,
2132    /// The shared link already exists. You can call
2133    /// [`list_shared_links()`](crate::sharing::list_shared_links) to get the  existing link, or use
2134    /// the provided metadata if it is returned.
2135    SharedLinkAlreadyExists(Option<SharedLinkAlreadyExistsMetadata>),
2136    /// There is an error with the given settings.
2137    SettingsError(SharedLinkSettingsError),
2138    /// The user is not allowed to create a shared link to the specified file. For  example, this
2139    /// can occur if the file is restricted or if the user's links are
2140    /// [banned](https://help.dropbox.com/files-folders/share/banned-links).
2141    AccessDenied,
2142}
2143
2144impl<'de> ::serde::de::Deserialize<'de> for CreateSharedLinkWithSettingsError {
2145    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2146        // union deserializer
2147        use serde::de::{self, MapAccess, Visitor};
2148        struct EnumVisitor;
2149        impl<'de> Visitor<'de> for EnumVisitor {
2150            type Value = CreateSharedLinkWithSettingsError;
2151            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
2152                f.write_str("a CreateSharedLinkWithSettingsError structure")
2153            }
2154            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
2155                let tag: &str = match map.next_key()? {
2156                    Some(".tag") => map.next_value()?,
2157                    _ => return Err(de::Error::missing_field(".tag"))
2158                };
2159                let value = match tag {
2160                    "path" => {
2161                        match map.next_key()? {
2162                            Some("path") => CreateSharedLinkWithSettingsError::Path(map.next_value()?),
2163                            None => return Err(de::Error::missing_field("path")),
2164                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
2165                        }
2166                    }
2167                    "email_not_verified" => CreateSharedLinkWithSettingsError::EmailNotVerified,
2168                    "shared_link_already_exists" => {
2169                        match map.next_key()? {
2170                            Some("shared_link_already_exists") => CreateSharedLinkWithSettingsError::SharedLinkAlreadyExists(map.next_value()?),
2171                            None => CreateSharedLinkWithSettingsError::SharedLinkAlreadyExists(None),
2172                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
2173                        }
2174                    }
2175                    "settings_error" => {
2176                        match map.next_key()? {
2177                            Some("settings_error") => CreateSharedLinkWithSettingsError::SettingsError(map.next_value()?),
2178                            None => return Err(de::Error::missing_field("settings_error")),
2179                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
2180                        }
2181                    }
2182                    "access_denied" => CreateSharedLinkWithSettingsError::AccessDenied,
2183                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
2184                };
2185                crate::eat_json_fields(&mut map)?;
2186                Ok(value)
2187            }
2188        }
2189        const VARIANTS: &[&str] = &["path",
2190                                    "email_not_verified",
2191                                    "shared_link_already_exists",
2192                                    "settings_error",
2193                                    "access_denied"];
2194        deserializer.deserialize_struct("CreateSharedLinkWithSettingsError", VARIANTS, EnumVisitor)
2195    }
2196}
2197
2198impl ::serde::ser::Serialize for CreateSharedLinkWithSettingsError {
2199    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
2200        // union serializer
2201        use serde::ser::SerializeStruct;
2202        match self {
2203            CreateSharedLinkWithSettingsError::Path(x) => {
2204                // union or polymporphic struct
2205                let mut s = serializer.serialize_struct("CreateSharedLinkWithSettingsError", 2)?;
2206                s.serialize_field(".tag", "path")?;
2207                s.serialize_field("path", x)?;
2208                s.end()
2209            }
2210            CreateSharedLinkWithSettingsError::EmailNotVerified => {
2211                // unit
2212                let mut s = serializer.serialize_struct("CreateSharedLinkWithSettingsError", 1)?;
2213                s.serialize_field(".tag", "email_not_verified")?;
2214                s.end()
2215            }
2216            CreateSharedLinkWithSettingsError::SharedLinkAlreadyExists(x) => {
2217                // union or polymporphic struct
2218                let mut s = serializer.serialize_struct("CreateSharedLinkWithSettingsError", 2)?;
2219                s.serialize_field(".tag", "shared_link_already_exists")?;
2220                s.serialize_field("shared_link_already_exists", x)?;
2221                s.end()
2222            }
2223            CreateSharedLinkWithSettingsError::SettingsError(x) => {
2224                // union or polymporphic struct
2225                let mut s = serializer.serialize_struct("CreateSharedLinkWithSettingsError", 2)?;
2226                s.serialize_field(".tag", "settings_error")?;
2227                s.serialize_field("settings_error", x)?;
2228                s.end()
2229            }
2230            CreateSharedLinkWithSettingsError::AccessDenied => {
2231                // unit
2232                let mut s = serializer.serialize_struct("CreateSharedLinkWithSettingsError", 1)?;
2233                s.serialize_field(".tag", "access_denied")?;
2234                s.end()
2235            }
2236        }
2237    }
2238}
2239
2240impl ::std::error::Error for CreateSharedLinkWithSettingsError {
2241    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
2242        match self {
2243            CreateSharedLinkWithSettingsError::Path(inner) => Some(inner),
2244            CreateSharedLinkWithSettingsError::SettingsError(inner) => Some(inner),
2245            _ => None,
2246        }
2247    }
2248}
2249
2250impl ::std::fmt::Display for CreateSharedLinkWithSettingsError {
2251    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
2252        match self {
2253            CreateSharedLinkWithSettingsError::Path(inner) => write!(f, "CreateSharedLinkWithSettingsError: {}", inner),
2254            CreateSharedLinkWithSettingsError::SharedLinkAlreadyExists(None) => f.write_str("shared_link_already_exists"),
2255            CreateSharedLinkWithSettingsError::SharedLinkAlreadyExists(Some(inner)) => write!(f, "shared_link_already_exists: {:?}", inner),
2256            CreateSharedLinkWithSettingsError::SettingsError(inner) => write!(f, "There is an error with the given settings: {}", inner),
2257            _ => write!(f, "{:?}", *self),
2258        }
2259    }
2260}
2261
2262/// The expected metadata of a shared link for a file or folder when a link is first created for the
2263/// content. Absent if the link already exists.
2264#[derive(Debug, Clone, PartialEq, Eq)]
2265#[non_exhaustive] // structs may have more fields added in the future.
2266pub struct ExpectedSharedContentLinkMetadata {
2267    /// The audience options that are available for the content. Some audience options may be
2268    /// unavailable. For example, team_only may be unavailable if the content is not owned by a user
2269    /// on a team. The 'default' audience option is always available if the user can modify link
2270    /// settings.
2271    pub audience_options: Vec<LinkAudience>,
2272    /// The current audience of the link.
2273    pub current_audience: LinkAudience,
2274    /// A list of permissions for actions you can perform on the link.
2275    pub link_permissions: Vec<LinkPermission>,
2276    /// Whether the link is protected by a password.
2277    pub password_protected: bool,
2278    /// The access level on the link for this file.
2279    pub access_level: Option<AccessLevel>,
2280    /// The shared folder that prevents the link audience for this link from being more restrictive.
2281    pub audience_restricting_shared_folder: Option<AudienceRestrictingSharedFolder>,
2282    /// Whether the link has an expiry set on it. A link with an expiry will have its  audience
2283    /// changed to members when the expiry is reached.
2284    pub expiry: Option<crate::types::common::DropboxTimestamp>,
2285}
2286
2287impl ExpectedSharedContentLinkMetadata {
2288    pub fn new(
2289        audience_options: Vec<LinkAudience>,
2290        current_audience: LinkAudience,
2291        link_permissions: Vec<LinkPermission>,
2292        password_protected: bool,
2293    ) -> Self {
2294        ExpectedSharedContentLinkMetadata {
2295            audience_options,
2296            current_audience,
2297            link_permissions,
2298            password_protected,
2299            access_level: None,
2300            audience_restricting_shared_folder: None,
2301            expiry: None,
2302        }
2303    }
2304
2305    pub fn with_access_level(mut self, value: AccessLevel) -> Self {
2306        self.access_level = Some(value);
2307        self
2308    }
2309
2310    pub fn with_audience_restricting_shared_folder(
2311        mut self,
2312        value: AudienceRestrictingSharedFolder,
2313    ) -> Self {
2314        self.audience_restricting_shared_folder = Some(value);
2315        self
2316    }
2317
2318    pub fn with_expiry(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
2319        self.expiry = Some(value);
2320        self
2321    }
2322}
2323
2324const EXPECTED_SHARED_CONTENT_LINK_METADATA_FIELDS: &[&str] = &["audience_options",
2325                                                                "current_audience",
2326                                                                "link_permissions",
2327                                                                "password_protected",
2328                                                                "access_level",
2329                                                                "audience_restricting_shared_folder",
2330                                                                "expiry"];
2331impl ExpectedSharedContentLinkMetadata {
2332    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
2333        map: V,
2334    ) -> Result<ExpectedSharedContentLinkMetadata, V::Error> {
2335        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
2336    }
2337
2338    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
2339        mut map: V,
2340        optional: bool,
2341    ) -> Result<Option<ExpectedSharedContentLinkMetadata>, V::Error> {
2342        let mut field_audience_options = None;
2343        let mut field_current_audience = None;
2344        let mut field_link_permissions = None;
2345        let mut field_password_protected = None;
2346        let mut field_access_level = None;
2347        let mut field_audience_restricting_shared_folder = None;
2348        let mut field_expiry = None;
2349        let mut nothing = true;
2350        while let Some(key) = map.next_key::<&str>()? {
2351            nothing = false;
2352            match key {
2353                "audience_options" => {
2354                    if field_audience_options.is_some() {
2355                        return Err(::serde::de::Error::duplicate_field("audience_options"));
2356                    }
2357                    field_audience_options = Some(map.next_value()?);
2358                }
2359                "current_audience" => {
2360                    if field_current_audience.is_some() {
2361                        return Err(::serde::de::Error::duplicate_field("current_audience"));
2362                    }
2363                    field_current_audience = Some(map.next_value()?);
2364                }
2365                "link_permissions" => {
2366                    if field_link_permissions.is_some() {
2367                        return Err(::serde::de::Error::duplicate_field("link_permissions"));
2368                    }
2369                    field_link_permissions = Some(map.next_value()?);
2370                }
2371                "password_protected" => {
2372                    if field_password_protected.is_some() {
2373                        return Err(::serde::de::Error::duplicate_field("password_protected"));
2374                    }
2375                    field_password_protected = Some(map.next_value()?);
2376                }
2377                "access_level" => {
2378                    if field_access_level.is_some() {
2379                        return Err(::serde::de::Error::duplicate_field("access_level"));
2380                    }
2381                    field_access_level = Some(map.next_value()?);
2382                }
2383                "audience_restricting_shared_folder" => {
2384                    if field_audience_restricting_shared_folder.is_some() {
2385                        return Err(::serde::de::Error::duplicate_field("audience_restricting_shared_folder"));
2386                    }
2387                    field_audience_restricting_shared_folder = Some(map.next_value()?);
2388                }
2389                "expiry" => {
2390                    if field_expiry.is_some() {
2391                        return Err(::serde::de::Error::duplicate_field("expiry"));
2392                    }
2393                    field_expiry = Some(map.next_value()?);
2394                }
2395                _ => {
2396                    // unknown field allowed and ignored
2397                    map.next_value::<::serde_json::Value>()?;
2398                }
2399            }
2400        }
2401        if optional && nothing {
2402            return Ok(None);
2403        }
2404        let result = ExpectedSharedContentLinkMetadata {
2405            audience_options: field_audience_options.ok_or_else(|| ::serde::de::Error::missing_field("audience_options"))?,
2406            current_audience: field_current_audience.ok_or_else(|| ::serde::de::Error::missing_field("current_audience"))?,
2407            link_permissions: field_link_permissions.ok_or_else(|| ::serde::de::Error::missing_field("link_permissions"))?,
2408            password_protected: field_password_protected.ok_or_else(|| ::serde::de::Error::missing_field("password_protected"))?,
2409            access_level: field_access_level.and_then(Option::flatten),
2410            audience_restricting_shared_folder: field_audience_restricting_shared_folder.and_then(Option::flatten),
2411            expiry: field_expiry.and_then(Option::flatten),
2412        };
2413        Ok(Some(result))
2414    }
2415
2416    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
2417        &self,
2418        s: &mut S::SerializeStruct,
2419    ) -> Result<(), S::Error> {
2420        use serde::ser::SerializeStruct;
2421        s.serialize_field("audience_options", &self.audience_options)?;
2422        s.serialize_field("current_audience", &self.current_audience)?;
2423        s.serialize_field("link_permissions", &self.link_permissions)?;
2424        s.serialize_field("password_protected", &self.password_protected)?;
2425        if let Some(val) = &self.access_level {
2426            s.serialize_field("access_level", val)?;
2427        }
2428        if let Some(val) = &self.audience_restricting_shared_folder {
2429            s.serialize_field("audience_restricting_shared_folder", val)?;
2430        }
2431        if let Some(val) = &self.expiry {
2432            s.serialize_field("expiry", val)?;
2433        }
2434        Ok(())
2435    }
2436}
2437
2438impl<'de> ::serde::de::Deserialize<'de> for ExpectedSharedContentLinkMetadata {
2439    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2440        // struct deserializer
2441        use serde::de::{MapAccess, Visitor};
2442        struct StructVisitor;
2443        impl<'de> Visitor<'de> for StructVisitor {
2444            type Value = ExpectedSharedContentLinkMetadata;
2445            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
2446                f.write_str("a ExpectedSharedContentLinkMetadata struct")
2447            }
2448            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
2449                ExpectedSharedContentLinkMetadata::internal_deserialize(map)
2450            }
2451        }
2452        deserializer.deserialize_struct("ExpectedSharedContentLinkMetadata", EXPECTED_SHARED_CONTENT_LINK_METADATA_FIELDS, StructVisitor)
2453    }
2454}
2455
2456impl ::serde::ser::Serialize for ExpectedSharedContentLinkMetadata {
2457    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
2458        // struct serializer
2459        use serde::ser::SerializeStruct;
2460        let mut s = serializer.serialize_struct("ExpectedSharedContentLinkMetadata", 7)?;
2461        self.internal_serialize::<S>(&mut s)?;
2462        s.end()
2463    }
2464}
2465
2466// struct extends SharedContentLinkMetadataBase
2467impl From<ExpectedSharedContentLinkMetadata> for SharedContentLinkMetadataBase {
2468    fn from(subtype: ExpectedSharedContentLinkMetadata) -> Self {
2469        Self {
2470            audience_options: subtype.audience_options,
2471            current_audience: subtype.current_audience,
2472            link_permissions: subtype.link_permissions,
2473            password_protected: subtype.password_protected,
2474            access_level: subtype.access_level,
2475            audience_restricting_shared_folder: subtype.audience_restricting_shared_folder,
2476            expiry: subtype.expiry,
2477        }
2478    }
2479}
2480/// Sharing actions that may be taken on files.
2481#[derive(Debug, Clone, PartialEq, Eq)]
2482#[non_exhaustive] // variants may be added in the future
2483pub enum FileAction {
2484    /// Disable viewer information on the file.
2485    DisableViewerInfo,
2486    /// Change or edit contents of the file.
2487    EditContents,
2488    /// Enable viewer information on the file.
2489    EnableViewerInfo,
2490    /// Add a member with view permissions.
2491    InviteViewer,
2492    /// Add a member with view permissions but no comment permissions.
2493    InviteViewerNoComment,
2494    /// Add a member with edit permissions.
2495    InviteEditor,
2496    /// Stop sharing this file.
2497    Unshare,
2498    /// Relinquish one's own membership to the file.
2499    RelinquishMembership,
2500    /// Use create_view_link and create_edit_link instead.
2501    ShareLink,
2502    /// Use create_view_link and create_edit_link instead.
2503    CreateLink,
2504    /// Create a shared link to a file that only allows users to view the content.
2505    CreateViewLink,
2506    /// Create a shared link to a file that allows users to edit the content.
2507    CreateEditLink,
2508    /// Catch-all used for unrecognized values returned from the server. Encountering this value
2509    /// typically indicates that this SDK version is out of date.
2510    Other,
2511}
2512
2513impl<'de> ::serde::de::Deserialize<'de> for FileAction {
2514    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2515        // union deserializer
2516        use serde::de::{self, MapAccess, Visitor};
2517        struct EnumVisitor;
2518        impl<'de> Visitor<'de> for EnumVisitor {
2519            type Value = FileAction;
2520            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
2521                f.write_str("a FileAction structure")
2522            }
2523            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
2524                let tag: &str = match map.next_key()? {
2525                    Some(".tag") => map.next_value()?,
2526                    _ => return Err(de::Error::missing_field(".tag"))
2527                };
2528                let value = match tag {
2529                    "disable_viewer_info" => FileAction::DisableViewerInfo,
2530                    "edit_contents" => FileAction::EditContents,
2531                    "enable_viewer_info" => FileAction::EnableViewerInfo,
2532                    "invite_viewer" => FileAction::InviteViewer,
2533                    "invite_viewer_no_comment" => FileAction::InviteViewerNoComment,
2534                    "invite_editor" => FileAction::InviteEditor,
2535                    "unshare" => FileAction::Unshare,
2536                    "relinquish_membership" => FileAction::RelinquishMembership,
2537                    "share_link" => FileAction::ShareLink,
2538                    "create_link" => FileAction::CreateLink,
2539                    "create_view_link" => FileAction::CreateViewLink,
2540                    "create_edit_link" => FileAction::CreateEditLink,
2541                    _ => FileAction::Other,
2542                };
2543                crate::eat_json_fields(&mut map)?;
2544                Ok(value)
2545            }
2546        }
2547        const VARIANTS: &[&str] = &["disable_viewer_info",
2548                                    "edit_contents",
2549                                    "enable_viewer_info",
2550                                    "invite_viewer",
2551                                    "invite_viewer_no_comment",
2552                                    "invite_editor",
2553                                    "unshare",
2554                                    "relinquish_membership",
2555                                    "share_link",
2556                                    "create_link",
2557                                    "create_view_link",
2558                                    "create_edit_link",
2559                                    "other"];
2560        deserializer.deserialize_struct("FileAction", VARIANTS, EnumVisitor)
2561    }
2562}
2563
2564impl ::serde::ser::Serialize for FileAction {
2565    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
2566        // union serializer
2567        use serde::ser::SerializeStruct;
2568        match self {
2569            FileAction::DisableViewerInfo => {
2570                // unit
2571                let mut s = serializer.serialize_struct("FileAction", 1)?;
2572                s.serialize_field(".tag", "disable_viewer_info")?;
2573                s.end()
2574            }
2575            FileAction::EditContents => {
2576                // unit
2577                let mut s = serializer.serialize_struct("FileAction", 1)?;
2578                s.serialize_field(".tag", "edit_contents")?;
2579                s.end()
2580            }
2581            FileAction::EnableViewerInfo => {
2582                // unit
2583                let mut s = serializer.serialize_struct("FileAction", 1)?;
2584                s.serialize_field(".tag", "enable_viewer_info")?;
2585                s.end()
2586            }
2587            FileAction::InviteViewer => {
2588                // unit
2589                let mut s = serializer.serialize_struct("FileAction", 1)?;
2590                s.serialize_field(".tag", "invite_viewer")?;
2591                s.end()
2592            }
2593            FileAction::InviteViewerNoComment => {
2594                // unit
2595                let mut s = serializer.serialize_struct("FileAction", 1)?;
2596                s.serialize_field(".tag", "invite_viewer_no_comment")?;
2597                s.end()
2598            }
2599            FileAction::InviteEditor => {
2600                // unit
2601                let mut s = serializer.serialize_struct("FileAction", 1)?;
2602                s.serialize_field(".tag", "invite_editor")?;
2603                s.end()
2604            }
2605            FileAction::Unshare => {
2606                // unit
2607                let mut s = serializer.serialize_struct("FileAction", 1)?;
2608                s.serialize_field(".tag", "unshare")?;
2609                s.end()
2610            }
2611            FileAction::RelinquishMembership => {
2612                // unit
2613                let mut s = serializer.serialize_struct("FileAction", 1)?;
2614                s.serialize_field(".tag", "relinquish_membership")?;
2615                s.end()
2616            }
2617            FileAction::ShareLink => {
2618                // unit
2619                let mut s = serializer.serialize_struct("FileAction", 1)?;
2620                s.serialize_field(".tag", "share_link")?;
2621                s.end()
2622            }
2623            FileAction::CreateLink => {
2624                // unit
2625                let mut s = serializer.serialize_struct("FileAction", 1)?;
2626                s.serialize_field(".tag", "create_link")?;
2627                s.end()
2628            }
2629            FileAction::CreateViewLink => {
2630                // unit
2631                let mut s = serializer.serialize_struct("FileAction", 1)?;
2632                s.serialize_field(".tag", "create_view_link")?;
2633                s.end()
2634            }
2635            FileAction::CreateEditLink => {
2636                // unit
2637                let mut s = serializer.serialize_struct("FileAction", 1)?;
2638                s.serialize_field(".tag", "create_edit_link")?;
2639                s.end()
2640            }
2641            FileAction::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
2642        }
2643    }
2644}
2645
2646#[derive(Debug, Clone, PartialEq, Eq)]
2647#[non_exhaustive] // variants may be added in the future
2648pub enum FileErrorResult {
2649    /// File specified by id was not found.
2650    FileNotFoundError(crate::types::files::Id),
2651    /// User does not have permission to take the specified action on the file.
2652    InvalidFileActionError(crate::types::files::Id),
2653    /// User does not have permission to access file specified by file.Id.
2654    PermissionDeniedError(crate::types::files::Id),
2655    /// Catch-all used for unrecognized values returned from the server. Encountering this value
2656    /// typically indicates that this SDK version is out of date.
2657    Other,
2658}
2659
2660impl<'de> ::serde::de::Deserialize<'de> for FileErrorResult {
2661    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2662        // union deserializer
2663        use serde::de::{self, MapAccess, Visitor};
2664        struct EnumVisitor;
2665        impl<'de> Visitor<'de> for EnumVisitor {
2666            type Value = FileErrorResult;
2667            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
2668                f.write_str("a FileErrorResult structure")
2669            }
2670            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
2671                let tag: &str = match map.next_key()? {
2672                    Some(".tag") => map.next_value()?,
2673                    _ => return Err(de::Error::missing_field(".tag"))
2674                };
2675                let value = match tag {
2676                    "file_not_found_error" => {
2677                        match map.next_key()? {
2678                            Some("file_not_found_error") => FileErrorResult::FileNotFoundError(map.next_value()?),
2679                            None => return Err(de::Error::missing_field("file_not_found_error")),
2680                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
2681                        }
2682                    }
2683                    "invalid_file_action_error" => {
2684                        match map.next_key()? {
2685                            Some("invalid_file_action_error") => FileErrorResult::InvalidFileActionError(map.next_value()?),
2686                            None => return Err(de::Error::missing_field("invalid_file_action_error")),
2687                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
2688                        }
2689                    }
2690                    "permission_denied_error" => {
2691                        match map.next_key()? {
2692                            Some("permission_denied_error") => FileErrorResult::PermissionDeniedError(map.next_value()?),
2693                            None => return Err(de::Error::missing_field("permission_denied_error")),
2694                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
2695                        }
2696                    }
2697                    _ => FileErrorResult::Other,
2698                };
2699                crate::eat_json_fields(&mut map)?;
2700                Ok(value)
2701            }
2702        }
2703        const VARIANTS: &[&str] = &["file_not_found_error",
2704                                    "invalid_file_action_error",
2705                                    "permission_denied_error",
2706                                    "other"];
2707        deserializer.deserialize_struct("FileErrorResult", VARIANTS, EnumVisitor)
2708    }
2709}
2710
2711impl ::serde::ser::Serialize for FileErrorResult {
2712    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
2713        // union serializer
2714        use serde::ser::SerializeStruct;
2715        match self {
2716            FileErrorResult::FileNotFoundError(x) => {
2717                // primitive
2718                let mut s = serializer.serialize_struct("FileErrorResult", 2)?;
2719                s.serialize_field(".tag", "file_not_found_error")?;
2720                s.serialize_field("file_not_found_error", x)?;
2721                s.end()
2722            }
2723            FileErrorResult::InvalidFileActionError(x) => {
2724                // primitive
2725                let mut s = serializer.serialize_struct("FileErrorResult", 2)?;
2726                s.serialize_field(".tag", "invalid_file_action_error")?;
2727                s.serialize_field("invalid_file_action_error", x)?;
2728                s.end()
2729            }
2730            FileErrorResult::PermissionDeniedError(x) => {
2731                // primitive
2732                let mut s = serializer.serialize_struct("FileErrorResult", 2)?;
2733                s.serialize_field(".tag", "permission_denied_error")?;
2734                s.serialize_field("permission_denied_error", x)?;
2735                s.end()
2736            }
2737            FileErrorResult::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
2738        }
2739    }
2740}
2741
2742/// The metadata of a file shared link.
2743#[derive(Debug, Clone, PartialEq, Eq)]
2744#[non_exhaustive] // structs may have more fields added in the future.
2745pub struct FileLinkMetadata {
2746    /// URL of the shared link.
2747    pub url: String,
2748    /// The linked file name (including extension). This never contains a slash.
2749    pub name: String,
2750    /// The link's access permissions.
2751    pub link_permissions: LinkPermissions,
2752    /// The modification time set by the desktop client when the file was added to Dropbox. Since
2753    /// this time is not verified (the Dropbox server stores whatever the desktop client sends up),
2754    /// this should only be used for display purposes (such as sorting) and not, for example, to
2755    /// determine if a file has changed or not.
2756    pub client_modified: crate::types::common::DropboxTimestamp,
2757    /// The last time the file was modified on Dropbox.
2758    pub server_modified: crate::types::common::DropboxTimestamp,
2759    /// A unique identifier for the current revision of a file. This field is the same rev as
2760    /// elsewhere in the API and can be used to detect changes and avoid conflicts.
2761    pub rev: Rev,
2762    /// The file size in bytes.
2763    pub size: u64,
2764    /// A unique identifier for the linked file.
2765    pub id: Option<Id>,
2766    /// Expiration time, if set. By default the link won't expire.
2767    pub expires: Option<crate::types::common::DropboxTimestamp>,
2768    /// The lowercased full path in the user's Dropbox. This always starts with a slash. This field
2769    /// will only be present only if the linked file is in the authenticated user's  dropbox.
2770    pub path_lower: Option<String>,
2771    /// The team membership information of the link's owner.  This field will only be present  if
2772    /// the link's owner is a team member.
2773    pub team_member_info: Option<TeamMemberInfo>,
2774    /// The team information of the content's owner. This field will only be present if the
2775    /// content's owner is a team member and the content's owner team is different from the link's
2776    /// owner team.
2777    pub content_owner_team_info: Option<TeamInfo>,
2778}
2779
2780impl FileLinkMetadata {
2781    pub fn new(
2782        url: String,
2783        name: String,
2784        link_permissions: LinkPermissions,
2785        client_modified: crate::types::common::DropboxTimestamp,
2786        server_modified: crate::types::common::DropboxTimestamp,
2787        rev: Rev,
2788        size: u64,
2789    ) -> Self {
2790        FileLinkMetadata {
2791            url,
2792            name,
2793            link_permissions,
2794            client_modified,
2795            server_modified,
2796            rev,
2797            size,
2798            id: None,
2799            expires: None,
2800            path_lower: None,
2801            team_member_info: None,
2802            content_owner_team_info: None,
2803        }
2804    }
2805
2806    pub fn with_id(mut self, value: Id) -> Self {
2807        self.id = Some(value);
2808        self
2809    }
2810
2811    pub fn with_expires(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
2812        self.expires = Some(value);
2813        self
2814    }
2815
2816    pub fn with_path_lower(mut self, value: String) -> Self {
2817        self.path_lower = Some(value);
2818        self
2819    }
2820
2821    pub fn with_team_member_info(mut self, value: TeamMemberInfo) -> Self {
2822        self.team_member_info = Some(value);
2823        self
2824    }
2825
2826    pub fn with_content_owner_team_info(mut self, value: TeamInfo) -> Self {
2827        self.content_owner_team_info = Some(value);
2828        self
2829    }
2830}
2831
2832const FILE_LINK_METADATA_FIELDS: &[&str] = &["url",
2833                                             "name",
2834                                             "link_permissions",
2835                                             "client_modified",
2836                                             "server_modified",
2837                                             "rev",
2838                                             "size",
2839                                             "id",
2840                                             "expires",
2841                                             "path_lower",
2842                                             "team_member_info",
2843                                             "content_owner_team_info"];
2844impl FileLinkMetadata {
2845    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
2846        map: V,
2847    ) -> Result<FileLinkMetadata, V::Error> {
2848        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
2849    }
2850
2851    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
2852        mut map: V,
2853        optional: bool,
2854    ) -> Result<Option<FileLinkMetadata>, V::Error> {
2855        let mut field_url = None;
2856        let mut field_name = None;
2857        let mut field_link_permissions = None;
2858        let mut field_client_modified = None;
2859        let mut field_server_modified = None;
2860        let mut field_rev = None;
2861        let mut field_size = None;
2862        let mut field_id = None;
2863        let mut field_expires = None;
2864        let mut field_path_lower = None;
2865        let mut field_team_member_info = None;
2866        let mut field_content_owner_team_info = None;
2867        let mut nothing = true;
2868        while let Some(key) = map.next_key::<&str>()? {
2869            nothing = false;
2870            match key {
2871                "url" => {
2872                    if field_url.is_some() {
2873                        return Err(::serde::de::Error::duplicate_field("url"));
2874                    }
2875                    field_url = Some(map.next_value()?);
2876                }
2877                "name" => {
2878                    if field_name.is_some() {
2879                        return Err(::serde::de::Error::duplicate_field("name"));
2880                    }
2881                    field_name = Some(map.next_value()?);
2882                }
2883                "link_permissions" => {
2884                    if field_link_permissions.is_some() {
2885                        return Err(::serde::de::Error::duplicate_field("link_permissions"));
2886                    }
2887                    field_link_permissions = Some(map.next_value()?);
2888                }
2889                "client_modified" => {
2890                    if field_client_modified.is_some() {
2891                        return Err(::serde::de::Error::duplicate_field("client_modified"));
2892                    }
2893                    field_client_modified = Some(map.next_value()?);
2894                }
2895                "server_modified" => {
2896                    if field_server_modified.is_some() {
2897                        return Err(::serde::de::Error::duplicate_field("server_modified"));
2898                    }
2899                    field_server_modified = Some(map.next_value()?);
2900                }
2901                "rev" => {
2902                    if field_rev.is_some() {
2903                        return Err(::serde::de::Error::duplicate_field("rev"));
2904                    }
2905                    field_rev = Some(map.next_value()?);
2906                }
2907                "size" => {
2908                    if field_size.is_some() {
2909                        return Err(::serde::de::Error::duplicate_field("size"));
2910                    }
2911                    field_size = Some(map.next_value()?);
2912                }
2913                "id" => {
2914                    if field_id.is_some() {
2915                        return Err(::serde::de::Error::duplicate_field("id"));
2916                    }
2917                    field_id = Some(map.next_value()?);
2918                }
2919                "expires" => {
2920                    if field_expires.is_some() {
2921                        return Err(::serde::de::Error::duplicate_field("expires"));
2922                    }
2923                    field_expires = Some(map.next_value()?);
2924                }
2925                "path_lower" => {
2926                    if field_path_lower.is_some() {
2927                        return Err(::serde::de::Error::duplicate_field("path_lower"));
2928                    }
2929                    field_path_lower = Some(map.next_value()?);
2930                }
2931                "team_member_info" => {
2932                    if field_team_member_info.is_some() {
2933                        return Err(::serde::de::Error::duplicate_field("team_member_info"));
2934                    }
2935                    field_team_member_info = Some(map.next_value()?);
2936                }
2937                "content_owner_team_info" => {
2938                    if field_content_owner_team_info.is_some() {
2939                        return Err(::serde::de::Error::duplicate_field("content_owner_team_info"));
2940                    }
2941                    field_content_owner_team_info = Some(map.next_value()?);
2942                }
2943                _ => {
2944                    // unknown field allowed and ignored
2945                    map.next_value::<::serde_json::Value>()?;
2946                }
2947            }
2948        }
2949        if optional && nothing {
2950            return Ok(None);
2951        }
2952        let result = FileLinkMetadata {
2953            url: field_url.ok_or_else(|| ::serde::de::Error::missing_field("url"))?,
2954            name: field_name.ok_or_else(|| ::serde::de::Error::missing_field("name"))?,
2955            link_permissions: field_link_permissions.ok_or_else(|| ::serde::de::Error::missing_field("link_permissions"))?,
2956            client_modified: field_client_modified.ok_or_else(|| ::serde::de::Error::missing_field("client_modified"))?,
2957            server_modified: field_server_modified.ok_or_else(|| ::serde::de::Error::missing_field("server_modified"))?,
2958            rev: field_rev.ok_or_else(|| ::serde::de::Error::missing_field("rev"))?,
2959            size: field_size.ok_or_else(|| ::serde::de::Error::missing_field("size"))?,
2960            id: field_id.and_then(Option::flatten),
2961            expires: field_expires.and_then(Option::flatten),
2962            path_lower: field_path_lower.and_then(Option::flatten),
2963            team_member_info: field_team_member_info.and_then(Option::flatten),
2964            content_owner_team_info: field_content_owner_team_info.and_then(Option::flatten),
2965        };
2966        Ok(Some(result))
2967    }
2968
2969    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
2970        &self,
2971        s: &mut S::SerializeStruct,
2972    ) -> Result<(), S::Error> {
2973        use serde::ser::SerializeStruct;
2974        s.serialize_field("url", &self.url)?;
2975        s.serialize_field("name", &self.name)?;
2976        s.serialize_field("link_permissions", &self.link_permissions)?;
2977        s.serialize_field("client_modified", &self.client_modified)?;
2978        s.serialize_field("server_modified", &self.server_modified)?;
2979        s.serialize_field("rev", &self.rev)?;
2980        s.serialize_field("size", &self.size)?;
2981        if let Some(val) = &self.id {
2982            s.serialize_field("id", val)?;
2983        }
2984        if let Some(val) = &self.expires {
2985            s.serialize_field("expires", val)?;
2986        }
2987        if let Some(val) = &self.path_lower {
2988            s.serialize_field("path_lower", val)?;
2989        }
2990        if let Some(val) = &self.team_member_info {
2991            s.serialize_field("team_member_info", val)?;
2992        }
2993        if let Some(val) = &self.content_owner_team_info {
2994            s.serialize_field("content_owner_team_info", val)?;
2995        }
2996        Ok(())
2997    }
2998}
2999
3000impl<'de> ::serde::de::Deserialize<'de> for FileLinkMetadata {
3001    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3002        // struct deserializer
3003        use serde::de::{MapAccess, Visitor};
3004        struct StructVisitor;
3005        impl<'de> Visitor<'de> for StructVisitor {
3006            type Value = FileLinkMetadata;
3007            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
3008                f.write_str("a FileLinkMetadata struct")
3009            }
3010            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
3011                FileLinkMetadata::internal_deserialize(map)
3012            }
3013        }
3014        deserializer.deserialize_struct("FileLinkMetadata", FILE_LINK_METADATA_FIELDS, StructVisitor)
3015    }
3016}
3017
3018impl ::serde::ser::Serialize for FileLinkMetadata {
3019    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3020        // struct serializer
3021        use serde::ser::SerializeStruct;
3022        let mut s = serializer.serialize_struct("FileLinkMetadata", 12)?;
3023        self.internal_serialize::<S>(&mut s)?;
3024        s.end()
3025    }
3026}
3027
3028// struct extends polymorphic struct SharedLinkMetadata
3029impl From<FileLinkMetadata> for SharedLinkMetadata {
3030    fn from(subtype: FileLinkMetadata) -> Self {
3031        SharedLinkMetadata::File(subtype)
3032    }
3033}
3034#[derive(Debug, Clone, PartialEq, Eq)]
3035#[non_exhaustive] // variants may be added in the future
3036pub enum FileMemberActionError {
3037    /// Specified member was not found.
3038    InvalidMember,
3039    /// User does not have permission to perform this action on this member.
3040    NoPermission,
3041    /// Specified file was invalid or user does not have access.
3042    AccessError(SharingFileAccessError),
3043    /// The action cannot be completed because the target member does not have explicit access to
3044    /// the file. The return value is the access that the member has to the file from a parent
3045    /// folder.
3046    NoExplicitAccess(MemberAccessLevelResult),
3047    /// Catch-all used for unrecognized values returned from the server. Encountering this value
3048    /// typically indicates that this SDK version is out of date.
3049    Other,
3050}
3051
3052impl<'de> ::serde::de::Deserialize<'de> for FileMemberActionError {
3053    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3054        // union deserializer
3055        use serde::de::{self, MapAccess, Visitor};
3056        struct EnumVisitor;
3057        impl<'de> Visitor<'de> for EnumVisitor {
3058            type Value = FileMemberActionError;
3059            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
3060                f.write_str("a FileMemberActionError structure")
3061            }
3062            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
3063                let tag: &str = match map.next_key()? {
3064                    Some(".tag") => map.next_value()?,
3065                    _ => return Err(de::Error::missing_field(".tag"))
3066                };
3067                let value = match tag {
3068                    "invalid_member" => FileMemberActionError::InvalidMember,
3069                    "no_permission" => FileMemberActionError::NoPermission,
3070                    "access_error" => {
3071                        match map.next_key()? {
3072                            Some("access_error") => FileMemberActionError::AccessError(map.next_value()?),
3073                            None => return Err(de::Error::missing_field("access_error")),
3074                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
3075                        }
3076                    }
3077                    "no_explicit_access" => FileMemberActionError::NoExplicitAccess(MemberAccessLevelResult::internal_deserialize(&mut map)?),
3078                    _ => FileMemberActionError::Other,
3079                };
3080                crate::eat_json_fields(&mut map)?;
3081                Ok(value)
3082            }
3083        }
3084        const VARIANTS: &[&str] = &["invalid_member",
3085                                    "no_permission",
3086                                    "access_error",
3087                                    "no_explicit_access",
3088                                    "other"];
3089        deserializer.deserialize_struct("FileMemberActionError", VARIANTS, EnumVisitor)
3090    }
3091}
3092
3093impl ::serde::ser::Serialize for FileMemberActionError {
3094    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3095        // union serializer
3096        use serde::ser::SerializeStruct;
3097        match self {
3098            FileMemberActionError::InvalidMember => {
3099                // unit
3100                let mut s = serializer.serialize_struct("FileMemberActionError", 1)?;
3101                s.serialize_field(".tag", "invalid_member")?;
3102                s.end()
3103            }
3104            FileMemberActionError::NoPermission => {
3105                // unit
3106                let mut s = serializer.serialize_struct("FileMemberActionError", 1)?;
3107                s.serialize_field(".tag", "no_permission")?;
3108                s.end()
3109            }
3110            FileMemberActionError::AccessError(x) => {
3111                // union or polymporphic struct
3112                let mut s = serializer.serialize_struct("FileMemberActionError", 2)?;
3113                s.serialize_field(".tag", "access_error")?;
3114                s.serialize_field("access_error", x)?;
3115                s.end()
3116            }
3117            FileMemberActionError::NoExplicitAccess(x) => {
3118                // struct
3119                let mut s = serializer.serialize_struct("FileMemberActionError", 4)?;
3120                s.serialize_field(".tag", "no_explicit_access")?;
3121                x.internal_serialize::<S>(&mut s)?;
3122                s.end()
3123            }
3124            FileMemberActionError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
3125        }
3126    }
3127}
3128
3129impl ::std::error::Error for FileMemberActionError {
3130    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
3131        match self {
3132            FileMemberActionError::AccessError(inner) => Some(inner),
3133            _ => None,
3134        }
3135    }
3136}
3137
3138impl ::std::fmt::Display for FileMemberActionError {
3139    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
3140        match self {
3141            FileMemberActionError::InvalidMember => f.write_str("Specified member was not found."),
3142            FileMemberActionError::NoPermission => f.write_str("User does not have permission to perform this action on this member."),
3143            FileMemberActionError::AccessError(inner) => write!(f, "Specified file was invalid or user does not have access: {}", inner),
3144            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),
3145            _ => write!(f, "{:?}", *self),
3146        }
3147    }
3148}
3149
3150#[derive(Debug, Clone, PartialEq, Eq)]
3151pub enum FileMemberActionIndividualResult {
3152    /// Part of the response for both add_file_member and remove_file_member_v1 (deprecated). For
3153    /// add_file_member, indicates giving access was successful and at what AccessLevel. For
3154    /// remove_file_member_v1, indicates member was successfully removed from the file. If
3155    /// AccessLevel is given, the member still has access via a parent shared folder.
3156    Success(Option<AccessLevel>),
3157    /// User was not able to perform this action.
3158    MemberError(FileMemberActionError),
3159}
3160
3161impl<'de> ::serde::de::Deserialize<'de> for FileMemberActionIndividualResult {
3162    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3163        // union deserializer
3164        use serde::de::{self, MapAccess, Visitor};
3165        struct EnumVisitor;
3166        impl<'de> Visitor<'de> for EnumVisitor {
3167            type Value = FileMemberActionIndividualResult;
3168            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
3169                f.write_str("a FileMemberActionIndividualResult structure")
3170            }
3171            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
3172                let tag: &str = match map.next_key()? {
3173                    Some(".tag") => map.next_value()?,
3174                    _ => return Err(de::Error::missing_field(".tag"))
3175                };
3176                let value = match tag {
3177                    "success" => {
3178                        match map.next_key()? {
3179                            Some("success") => FileMemberActionIndividualResult::Success(map.next_value()?),
3180                            None => FileMemberActionIndividualResult::Success(None),
3181                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
3182                        }
3183                    }
3184                    "member_error" => {
3185                        match map.next_key()? {
3186                            Some("member_error") => FileMemberActionIndividualResult::MemberError(map.next_value()?),
3187                            None => return Err(de::Error::missing_field("member_error")),
3188                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
3189                        }
3190                    }
3191                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
3192                };
3193                crate::eat_json_fields(&mut map)?;
3194                Ok(value)
3195            }
3196        }
3197        const VARIANTS: &[&str] = &["success",
3198                                    "member_error"];
3199        deserializer.deserialize_struct("FileMemberActionIndividualResult", VARIANTS, EnumVisitor)
3200    }
3201}
3202
3203impl ::serde::ser::Serialize for FileMemberActionIndividualResult {
3204    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3205        // union serializer
3206        use serde::ser::SerializeStruct;
3207        match self {
3208            FileMemberActionIndividualResult::Success(x) => {
3209                // union or polymporphic struct
3210                let mut s = serializer.serialize_struct("FileMemberActionIndividualResult", 2)?;
3211                s.serialize_field(".tag", "success")?;
3212                s.serialize_field("success", x)?;
3213                s.end()
3214            }
3215            FileMemberActionIndividualResult::MemberError(x) => {
3216                // union or polymporphic struct
3217                let mut s = serializer.serialize_struct("FileMemberActionIndividualResult", 2)?;
3218                s.serialize_field(".tag", "member_error")?;
3219                s.serialize_field("member_error", x)?;
3220                s.end()
3221            }
3222        }
3223    }
3224}
3225
3226/// Per-member result for [`add_file_member()`](crate::sharing::add_file_member).
3227#[derive(Debug, Clone, PartialEq, Eq)]
3228#[non_exhaustive] // structs may have more fields added in the future.
3229pub struct FileMemberActionResult {
3230    /// One of specified input members.
3231    pub member: MemberSelector,
3232    /// The outcome of the action on this member.
3233    pub result: FileMemberActionIndividualResult,
3234    /// The SHA-1 encrypted shared content key.
3235    pub sckey_sha1: Option<String>,
3236    /// The sharing sender-recipient invitation signatures for the input member_id. A member_id can
3237    /// be a group and thus have multiple users and multiple invitation signatures.
3238    pub invitation_signature: Option<Vec<String>>,
3239}
3240
3241impl FileMemberActionResult {
3242    pub fn new(member: MemberSelector, result: FileMemberActionIndividualResult) -> Self {
3243        FileMemberActionResult {
3244            member,
3245            result,
3246            sckey_sha1: None,
3247            invitation_signature: None,
3248        }
3249    }
3250
3251    pub fn with_sckey_sha1(mut self, value: String) -> Self {
3252        self.sckey_sha1 = Some(value);
3253        self
3254    }
3255
3256    pub fn with_invitation_signature(mut self, value: Vec<String>) -> Self {
3257        self.invitation_signature = Some(value);
3258        self
3259    }
3260}
3261
3262const FILE_MEMBER_ACTION_RESULT_FIELDS: &[&str] = &["member",
3263                                                    "result",
3264                                                    "sckey_sha1",
3265                                                    "invitation_signature"];
3266impl FileMemberActionResult {
3267    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
3268        map: V,
3269    ) -> Result<FileMemberActionResult, V::Error> {
3270        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
3271    }
3272
3273    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
3274        mut map: V,
3275        optional: bool,
3276    ) -> Result<Option<FileMemberActionResult>, V::Error> {
3277        let mut field_member = None;
3278        let mut field_result = None;
3279        let mut field_sckey_sha1 = None;
3280        let mut field_invitation_signature = None;
3281        let mut nothing = true;
3282        while let Some(key) = map.next_key::<&str>()? {
3283            nothing = false;
3284            match key {
3285                "member" => {
3286                    if field_member.is_some() {
3287                        return Err(::serde::de::Error::duplicate_field("member"));
3288                    }
3289                    field_member = Some(map.next_value()?);
3290                }
3291                "result" => {
3292                    if field_result.is_some() {
3293                        return Err(::serde::de::Error::duplicate_field("result"));
3294                    }
3295                    field_result = Some(map.next_value()?);
3296                }
3297                "sckey_sha1" => {
3298                    if field_sckey_sha1.is_some() {
3299                        return Err(::serde::de::Error::duplicate_field("sckey_sha1"));
3300                    }
3301                    field_sckey_sha1 = Some(map.next_value()?);
3302                }
3303                "invitation_signature" => {
3304                    if field_invitation_signature.is_some() {
3305                        return Err(::serde::de::Error::duplicate_field("invitation_signature"));
3306                    }
3307                    field_invitation_signature = Some(map.next_value()?);
3308                }
3309                _ => {
3310                    // unknown field allowed and ignored
3311                    map.next_value::<::serde_json::Value>()?;
3312                }
3313            }
3314        }
3315        if optional && nothing {
3316            return Ok(None);
3317        }
3318        let result = FileMemberActionResult {
3319            member: field_member.ok_or_else(|| ::serde::de::Error::missing_field("member"))?,
3320            result: field_result.ok_or_else(|| ::serde::de::Error::missing_field("result"))?,
3321            sckey_sha1: field_sckey_sha1.and_then(Option::flatten),
3322            invitation_signature: field_invitation_signature.and_then(Option::flatten),
3323        };
3324        Ok(Some(result))
3325    }
3326
3327    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
3328        &self,
3329        s: &mut S::SerializeStruct,
3330    ) -> Result<(), S::Error> {
3331        use serde::ser::SerializeStruct;
3332        s.serialize_field("member", &self.member)?;
3333        s.serialize_field("result", &self.result)?;
3334        if let Some(val) = &self.sckey_sha1 {
3335            s.serialize_field("sckey_sha1", val)?;
3336        }
3337        if let Some(val) = &self.invitation_signature {
3338            s.serialize_field("invitation_signature", val)?;
3339        }
3340        Ok(())
3341    }
3342}
3343
3344impl<'de> ::serde::de::Deserialize<'de> for FileMemberActionResult {
3345    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3346        // struct deserializer
3347        use serde::de::{MapAccess, Visitor};
3348        struct StructVisitor;
3349        impl<'de> Visitor<'de> for StructVisitor {
3350            type Value = FileMemberActionResult;
3351            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
3352                f.write_str("a FileMemberActionResult struct")
3353            }
3354            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
3355                FileMemberActionResult::internal_deserialize(map)
3356            }
3357        }
3358        deserializer.deserialize_struct("FileMemberActionResult", FILE_MEMBER_ACTION_RESULT_FIELDS, StructVisitor)
3359    }
3360}
3361
3362impl ::serde::ser::Serialize for FileMemberActionResult {
3363    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3364        // struct serializer
3365        use serde::ser::SerializeStruct;
3366        let mut s = serializer.serialize_struct("FileMemberActionResult", 4)?;
3367        self.internal_serialize::<S>(&mut s)?;
3368        s.end()
3369    }
3370}
3371
3372#[derive(Debug, Clone, PartialEq, Eq)]
3373#[non_exhaustive] // variants may be added in the future
3374pub enum FileMemberRemoveActionResult {
3375    /// Member was successfully removed from this file.
3376    Success(MemberAccessLevelResult),
3377    /// User was not able to remove this member.
3378    MemberError(FileMemberActionError),
3379    /// Catch-all used for unrecognized values returned from the server. Encountering this value
3380    /// typically indicates that this SDK version is out of date.
3381    Other,
3382}
3383
3384impl<'de> ::serde::de::Deserialize<'de> for FileMemberRemoveActionResult {
3385    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3386        // union deserializer
3387        use serde::de::{self, MapAccess, Visitor};
3388        struct EnumVisitor;
3389        impl<'de> Visitor<'de> for EnumVisitor {
3390            type Value = FileMemberRemoveActionResult;
3391            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
3392                f.write_str("a FileMemberRemoveActionResult structure")
3393            }
3394            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
3395                let tag: &str = match map.next_key()? {
3396                    Some(".tag") => map.next_value()?,
3397                    _ => return Err(de::Error::missing_field(".tag"))
3398                };
3399                let value = match tag {
3400                    "success" => FileMemberRemoveActionResult::Success(MemberAccessLevelResult::internal_deserialize(&mut map)?),
3401                    "member_error" => {
3402                        match map.next_key()? {
3403                            Some("member_error") => FileMemberRemoveActionResult::MemberError(map.next_value()?),
3404                            None => return Err(de::Error::missing_field("member_error")),
3405                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
3406                        }
3407                    }
3408                    _ => FileMemberRemoveActionResult::Other,
3409                };
3410                crate::eat_json_fields(&mut map)?;
3411                Ok(value)
3412            }
3413        }
3414        const VARIANTS: &[&str] = &["success",
3415                                    "member_error",
3416                                    "other"];
3417        deserializer.deserialize_struct("FileMemberRemoveActionResult", VARIANTS, EnumVisitor)
3418    }
3419}
3420
3421impl ::serde::ser::Serialize for FileMemberRemoveActionResult {
3422    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3423        // union serializer
3424        use serde::ser::SerializeStruct;
3425        match self {
3426            FileMemberRemoveActionResult::Success(x) => {
3427                // struct
3428                let mut s = serializer.serialize_struct("FileMemberRemoveActionResult", 4)?;
3429                s.serialize_field(".tag", "success")?;
3430                x.internal_serialize::<S>(&mut s)?;
3431                s.end()
3432            }
3433            FileMemberRemoveActionResult::MemberError(x) => {
3434                // union or polymporphic struct
3435                let mut s = serializer.serialize_struct("FileMemberRemoveActionResult", 2)?;
3436                s.serialize_field(".tag", "member_error")?;
3437                s.serialize_field("member_error", x)?;
3438                s.end()
3439            }
3440            FileMemberRemoveActionResult::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
3441        }
3442    }
3443}
3444
3445/// Whether the user is allowed to take the sharing action on the file.
3446#[derive(Debug, Clone, PartialEq, Eq)]
3447#[non_exhaustive] // structs may have more fields added in the future.
3448pub struct FilePermission {
3449    /// The action that the user may wish to take on the file.
3450    pub action: FileAction,
3451    /// True if the user is allowed to take the action.
3452    pub allow: bool,
3453    /// The reason why the user is denied the permission. Not present if the action is allowed.
3454    pub reason: Option<PermissionDeniedReason>,
3455}
3456
3457impl FilePermission {
3458    pub fn new(action: FileAction, allow: bool) -> Self {
3459        FilePermission {
3460            action,
3461            allow,
3462            reason: None,
3463        }
3464    }
3465
3466    pub fn with_reason(mut self, value: PermissionDeniedReason) -> Self {
3467        self.reason = Some(value);
3468        self
3469    }
3470}
3471
3472const FILE_PERMISSION_FIELDS: &[&str] = &["action",
3473                                          "allow",
3474                                          "reason"];
3475impl FilePermission {
3476    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
3477        map: V,
3478    ) -> Result<FilePermission, V::Error> {
3479        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
3480    }
3481
3482    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
3483        mut map: V,
3484        optional: bool,
3485    ) -> Result<Option<FilePermission>, V::Error> {
3486        let mut field_action = None;
3487        let mut field_allow = None;
3488        let mut field_reason = None;
3489        let mut nothing = true;
3490        while let Some(key) = map.next_key::<&str>()? {
3491            nothing = false;
3492            match key {
3493                "action" => {
3494                    if field_action.is_some() {
3495                        return Err(::serde::de::Error::duplicate_field("action"));
3496                    }
3497                    field_action = Some(map.next_value()?);
3498                }
3499                "allow" => {
3500                    if field_allow.is_some() {
3501                        return Err(::serde::de::Error::duplicate_field("allow"));
3502                    }
3503                    field_allow = Some(map.next_value()?);
3504                }
3505                "reason" => {
3506                    if field_reason.is_some() {
3507                        return Err(::serde::de::Error::duplicate_field("reason"));
3508                    }
3509                    field_reason = Some(map.next_value()?);
3510                }
3511                _ => {
3512                    // unknown field allowed and ignored
3513                    map.next_value::<::serde_json::Value>()?;
3514                }
3515            }
3516        }
3517        if optional && nothing {
3518            return Ok(None);
3519        }
3520        let result = FilePermission {
3521            action: field_action.ok_or_else(|| ::serde::de::Error::missing_field("action"))?,
3522            allow: field_allow.ok_or_else(|| ::serde::de::Error::missing_field("allow"))?,
3523            reason: field_reason.and_then(Option::flatten),
3524        };
3525        Ok(Some(result))
3526    }
3527
3528    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
3529        &self,
3530        s: &mut S::SerializeStruct,
3531    ) -> Result<(), S::Error> {
3532        use serde::ser::SerializeStruct;
3533        s.serialize_field("action", &self.action)?;
3534        s.serialize_field("allow", &self.allow)?;
3535        if let Some(val) = &self.reason {
3536            s.serialize_field("reason", val)?;
3537        }
3538        Ok(())
3539    }
3540}
3541
3542impl<'de> ::serde::de::Deserialize<'de> for FilePermission {
3543    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3544        // struct deserializer
3545        use serde::de::{MapAccess, Visitor};
3546        struct StructVisitor;
3547        impl<'de> Visitor<'de> for StructVisitor {
3548            type Value = FilePermission;
3549            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
3550                f.write_str("a FilePermission struct")
3551            }
3552            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
3553                FilePermission::internal_deserialize(map)
3554            }
3555        }
3556        deserializer.deserialize_struct("FilePermission", FILE_PERMISSION_FIELDS, StructVisitor)
3557    }
3558}
3559
3560impl ::serde::ser::Serialize for FilePermission {
3561    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3562        // struct serializer
3563        use serde::ser::SerializeStruct;
3564        let mut s = serializer.serialize_struct("FilePermission", 3)?;
3565        self.internal_serialize::<S>(&mut s)?;
3566        s.end()
3567    }
3568}
3569
3570/// Actions that may be taken on shared folders.
3571#[derive(Debug, Clone, PartialEq, Eq)]
3572#[non_exhaustive] // variants may be added in the future
3573pub enum FolderAction {
3574    /// Change folder options, such as who can be invited to join the folder.
3575    ChangeOptions,
3576    /// Disable viewer information for this folder.
3577    DisableViewerInfo,
3578    /// Change or edit contents of the folder.
3579    EditContents,
3580    /// Enable viewer information on the folder.
3581    EnableViewerInfo,
3582    /// Invite a user or group to join the folder with read and write permission.
3583    InviteEditor,
3584    /// Invite a user or group to join the folder with read permission.
3585    InviteViewer,
3586    /// Invite a user or group to join the folder with read permission but no comment permissions.
3587    InviteViewerNoComment,
3588    /// Relinquish one's own membership in the folder.
3589    RelinquishMembership,
3590    /// Unmount the folder.
3591    Unmount,
3592    /// Stop sharing this folder.
3593    Unshare,
3594    /// Keep a copy of the contents upon leaving or being kicked from the folder.
3595    LeaveACopy,
3596    /// Use create_link instead.
3597    ShareLink,
3598    /// Create a shared link for folder.
3599    CreateLink,
3600    /// Set whether the folder inherits permissions from its parent.
3601    SetAccessInheritance,
3602    /// Catch-all used for unrecognized values returned from the server. Encountering this value
3603    /// typically indicates that this SDK version is out of date.
3604    Other,
3605}
3606
3607impl<'de> ::serde::de::Deserialize<'de> for FolderAction {
3608    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3609        // union deserializer
3610        use serde::de::{self, MapAccess, Visitor};
3611        struct EnumVisitor;
3612        impl<'de> Visitor<'de> for EnumVisitor {
3613            type Value = FolderAction;
3614            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
3615                f.write_str("a FolderAction structure")
3616            }
3617            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
3618                let tag: &str = match map.next_key()? {
3619                    Some(".tag") => map.next_value()?,
3620                    _ => return Err(de::Error::missing_field(".tag"))
3621                };
3622                let value = match tag {
3623                    "change_options" => FolderAction::ChangeOptions,
3624                    "disable_viewer_info" => FolderAction::DisableViewerInfo,
3625                    "edit_contents" => FolderAction::EditContents,
3626                    "enable_viewer_info" => FolderAction::EnableViewerInfo,
3627                    "invite_editor" => FolderAction::InviteEditor,
3628                    "invite_viewer" => FolderAction::InviteViewer,
3629                    "invite_viewer_no_comment" => FolderAction::InviteViewerNoComment,
3630                    "relinquish_membership" => FolderAction::RelinquishMembership,
3631                    "unmount" => FolderAction::Unmount,
3632                    "unshare" => FolderAction::Unshare,
3633                    "leave_a_copy" => FolderAction::LeaveACopy,
3634                    "share_link" => FolderAction::ShareLink,
3635                    "create_link" => FolderAction::CreateLink,
3636                    "set_access_inheritance" => FolderAction::SetAccessInheritance,
3637                    _ => FolderAction::Other,
3638                };
3639                crate::eat_json_fields(&mut map)?;
3640                Ok(value)
3641            }
3642        }
3643        const VARIANTS: &[&str] = &["change_options",
3644                                    "disable_viewer_info",
3645                                    "edit_contents",
3646                                    "enable_viewer_info",
3647                                    "invite_editor",
3648                                    "invite_viewer",
3649                                    "invite_viewer_no_comment",
3650                                    "relinquish_membership",
3651                                    "unmount",
3652                                    "unshare",
3653                                    "leave_a_copy",
3654                                    "share_link",
3655                                    "create_link",
3656                                    "set_access_inheritance",
3657                                    "other"];
3658        deserializer.deserialize_struct("FolderAction", VARIANTS, EnumVisitor)
3659    }
3660}
3661
3662impl ::serde::ser::Serialize for FolderAction {
3663    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3664        // union serializer
3665        use serde::ser::SerializeStruct;
3666        match self {
3667            FolderAction::ChangeOptions => {
3668                // unit
3669                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3670                s.serialize_field(".tag", "change_options")?;
3671                s.end()
3672            }
3673            FolderAction::DisableViewerInfo => {
3674                // unit
3675                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3676                s.serialize_field(".tag", "disable_viewer_info")?;
3677                s.end()
3678            }
3679            FolderAction::EditContents => {
3680                // unit
3681                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3682                s.serialize_field(".tag", "edit_contents")?;
3683                s.end()
3684            }
3685            FolderAction::EnableViewerInfo => {
3686                // unit
3687                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3688                s.serialize_field(".tag", "enable_viewer_info")?;
3689                s.end()
3690            }
3691            FolderAction::InviteEditor => {
3692                // unit
3693                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3694                s.serialize_field(".tag", "invite_editor")?;
3695                s.end()
3696            }
3697            FolderAction::InviteViewer => {
3698                // unit
3699                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3700                s.serialize_field(".tag", "invite_viewer")?;
3701                s.end()
3702            }
3703            FolderAction::InviteViewerNoComment => {
3704                // unit
3705                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3706                s.serialize_field(".tag", "invite_viewer_no_comment")?;
3707                s.end()
3708            }
3709            FolderAction::RelinquishMembership => {
3710                // unit
3711                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3712                s.serialize_field(".tag", "relinquish_membership")?;
3713                s.end()
3714            }
3715            FolderAction::Unmount => {
3716                // unit
3717                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3718                s.serialize_field(".tag", "unmount")?;
3719                s.end()
3720            }
3721            FolderAction::Unshare => {
3722                // unit
3723                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3724                s.serialize_field(".tag", "unshare")?;
3725                s.end()
3726            }
3727            FolderAction::LeaveACopy => {
3728                // unit
3729                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3730                s.serialize_field(".tag", "leave_a_copy")?;
3731                s.end()
3732            }
3733            FolderAction::ShareLink => {
3734                // unit
3735                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3736                s.serialize_field(".tag", "share_link")?;
3737                s.end()
3738            }
3739            FolderAction::CreateLink => {
3740                // unit
3741                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3742                s.serialize_field(".tag", "create_link")?;
3743                s.end()
3744            }
3745            FolderAction::SetAccessInheritance => {
3746                // unit
3747                let mut s = serializer.serialize_struct("FolderAction", 1)?;
3748                s.serialize_field(".tag", "set_access_inheritance")?;
3749                s.end()
3750            }
3751            FolderAction::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
3752        }
3753    }
3754}
3755
3756/// The metadata of a folder shared link.
3757#[derive(Debug, Clone, PartialEq, Eq)]
3758#[non_exhaustive] // structs may have more fields added in the future.
3759pub struct FolderLinkMetadata {
3760    /// URL of the shared link.
3761    pub url: String,
3762    /// The linked file name (including extension). This never contains a slash.
3763    pub name: String,
3764    /// The link's access permissions.
3765    pub link_permissions: LinkPermissions,
3766    /// A unique identifier for the linked file.
3767    pub id: Option<Id>,
3768    /// Expiration time, if set. By default the link won't expire.
3769    pub expires: Option<crate::types::common::DropboxTimestamp>,
3770    /// The lowercased full path in the user's Dropbox. This always starts with a slash. This field
3771    /// will only be present only if the linked file is in the authenticated user's  dropbox.
3772    pub path_lower: Option<String>,
3773    /// The team membership information of the link's owner.  This field will only be present  if
3774    /// the link's owner is a team member.
3775    pub team_member_info: Option<TeamMemberInfo>,
3776    /// The team information of the content's owner. This field will only be present if the
3777    /// content's owner is a team member and the content's owner team is different from the link's
3778    /// owner team.
3779    pub content_owner_team_info: Option<TeamInfo>,
3780}
3781
3782impl FolderLinkMetadata {
3783    pub fn new(url: String, name: String, link_permissions: LinkPermissions) -> Self {
3784        FolderLinkMetadata {
3785            url,
3786            name,
3787            link_permissions,
3788            id: None,
3789            expires: None,
3790            path_lower: None,
3791            team_member_info: None,
3792            content_owner_team_info: None,
3793        }
3794    }
3795
3796    pub fn with_id(mut self, value: Id) -> Self {
3797        self.id = Some(value);
3798        self
3799    }
3800
3801    pub fn with_expires(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
3802        self.expires = Some(value);
3803        self
3804    }
3805
3806    pub fn with_path_lower(mut self, value: String) -> Self {
3807        self.path_lower = Some(value);
3808        self
3809    }
3810
3811    pub fn with_team_member_info(mut self, value: TeamMemberInfo) -> Self {
3812        self.team_member_info = Some(value);
3813        self
3814    }
3815
3816    pub fn with_content_owner_team_info(mut self, value: TeamInfo) -> Self {
3817        self.content_owner_team_info = Some(value);
3818        self
3819    }
3820}
3821
3822const FOLDER_LINK_METADATA_FIELDS: &[&str] = &["url",
3823                                               "name",
3824                                               "link_permissions",
3825                                               "id",
3826                                               "expires",
3827                                               "path_lower",
3828                                               "team_member_info",
3829                                               "content_owner_team_info"];
3830impl FolderLinkMetadata {
3831    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
3832        map: V,
3833    ) -> Result<FolderLinkMetadata, V::Error> {
3834        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
3835    }
3836
3837    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
3838        mut map: V,
3839        optional: bool,
3840    ) -> Result<Option<FolderLinkMetadata>, V::Error> {
3841        let mut field_url = None;
3842        let mut field_name = None;
3843        let mut field_link_permissions = None;
3844        let mut field_id = None;
3845        let mut field_expires = None;
3846        let mut field_path_lower = None;
3847        let mut field_team_member_info = None;
3848        let mut field_content_owner_team_info = None;
3849        let mut nothing = true;
3850        while let Some(key) = map.next_key::<&str>()? {
3851            nothing = false;
3852            match key {
3853                "url" => {
3854                    if field_url.is_some() {
3855                        return Err(::serde::de::Error::duplicate_field("url"));
3856                    }
3857                    field_url = Some(map.next_value()?);
3858                }
3859                "name" => {
3860                    if field_name.is_some() {
3861                        return Err(::serde::de::Error::duplicate_field("name"));
3862                    }
3863                    field_name = Some(map.next_value()?);
3864                }
3865                "link_permissions" => {
3866                    if field_link_permissions.is_some() {
3867                        return Err(::serde::de::Error::duplicate_field("link_permissions"));
3868                    }
3869                    field_link_permissions = Some(map.next_value()?);
3870                }
3871                "id" => {
3872                    if field_id.is_some() {
3873                        return Err(::serde::de::Error::duplicate_field("id"));
3874                    }
3875                    field_id = Some(map.next_value()?);
3876                }
3877                "expires" => {
3878                    if field_expires.is_some() {
3879                        return Err(::serde::de::Error::duplicate_field("expires"));
3880                    }
3881                    field_expires = Some(map.next_value()?);
3882                }
3883                "path_lower" => {
3884                    if field_path_lower.is_some() {
3885                        return Err(::serde::de::Error::duplicate_field("path_lower"));
3886                    }
3887                    field_path_lower = Some(map.next_value()?);
3888                }
3889                "team_member_info" => {
3890                    if field_team_member_info.is_some() {
3891                        return Err(::serde::de::Error::duplicate_field("team_member_info"));
3892                    }
3893                    field_team_member_info = Some(map.next_value()?);
3894                }
3895                "content_owner_team_info" => {
3896                    if field_content_owner_team_info.is_some() {
3897                        return Err(::serde::de::Error::duplicate_field("content_owner_team_info"));
3898                    }
3899                    field_content_owner_team_info = Some(map.next_value()?);
3900                }
3901                _ => {
3902                    // unknown field allowed and ignored
3903                    map.next_value::<::serde_json::Value>()?;
3904                }
3905            }
3906        }
3907        if optional && nothing {
3908            return Ok(None);
3909        }
3910        let result = FolderLinkMetadata {
3911            url: field_url.ok_or_else(|| ::serde::de::Error::missing_field("url"))?,
3912            name: field_name.ok_or_else(|| ::serde::de::Error::missing_field("name"))?,
3913            link_permissions: field_link_permissions.ok_or_else(|| ::serde::de::Error::missing_field("link_permissions"))?,
3914            id: field_id.and_then(Option::flatten),
3915            expires: field_expires.and_then(Option::flatten),
3916            path_lower: field_path_lower.and_then(Option::flatten),
3917            team_member_info: field_team_member_info.and_then(Option::flatten),
3918            content_owner_team_info: field_content_owner_team_info.and_then(Option::flatten),
3919        };
3920        Ok(Some(result))
3921    }
3922
3923    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
3924        &self,
3925        s: &mut S::SerializeStruct,
3926    ) -> Result<(), S::Error> {
3927        use serde::ser::SerializeStruct;
3928        s.serialize_field("url", &self.url)?;
3929        s.serialize_field("name", &self.name)?;
3930        s.serialize_field("link_permissions", &self.link_permissions)?;
3931        if let Some(val) = &self.id {
3932            s.serialize_field("id", val)?;
3933        }
3934        if let Some(val) = &self.expires {
3935            s.serialize_field("expires", val)?;
3936        }
3937        if let Some(val) = &self.path_lower {
3938            s.serialize_field("path_lower", val)?;
3939        }
3940        if let Some(val) = &self.team_member_info {
3941            s.serialize_field("team_member_info", val)?;
3942        }
3943        if let Some(val) = &self.content_owner_team_info {
3944            s.serialize_field("content_owner_team_info", val)?;
3945        }
3946        Ok(())
3947    }
3948}
3949
3950impl<'de> ::serde::de::Deserialize<'de> for FolderLinkMetadata {
3951    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3952        // struct deserializer
3953        use serde::de::{MapAccess, Visitor};
3954        struct StructVisitor;
3955        impl<'de> Visitor<'de> for StructVisitor {
3956            type Value = FolderLinkMetadata;
3957            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
3958                f.write_str("a FolderLinkMetadata struct")
3959            }
3960            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
3961                FolderLinkMetadata::internal_deserialize(map)
3962            }
3963        }
3964        deserializer.deserialize_struct("FolderLinkMetadata", FOLDER_LINK_METADATA_FIELDS, StructVisitor)
3965    }
3966}
3967
3968impl ::serde::ser::Serialize for FolderLinkMetadata {
3969    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3970        // struct serializer
3971        use serde::ser::SerializeStruct;
3972        let mut s = serializer.serialize_struct("FolderLinkMetadata", 8)?;
3973        self.internal_serialize::<S>(&mut s)?;
3974        s.end()
3975    }
3976}
3977
3978// struct extends polymorphic struct SharedLinkMetadata
3979impl From<FolderLinkMetadata> for SharedLinkMetadata {
3980    fn from(subtype: FolderLinkMetadata) -> Self {
3981        SharedLinkMetadata::Folder(subtype)
3982    }
3983}
3984/// Whether the user is allowed to take the action on the shared folder.
3985#[derive(Debug, Clone, PartialEq, Eq)]
3986#[non_exhaustive] // structs may have more fields added in the future.
3987pub struct FolderPermission {
3988    /// The action that the user may wish to take on the folder.
3989    pub action: FolderAction,
3990    /// True if the user is allowed to take the action.
3991    pub allow: bool,
3992    /// The reason why the user is denied the permission. Not present if the action is allowed, or
3993    /// if no reason is available.
3994    pub reason: Option<PermissionDeniedReason>,
3995}
3996
3997impl FolderPermission {
3998    pub fn new(action: FolderAction, allow: bool) -> Self {
3999        FolderPermission {
4000            action,
4001            allow,
4002            reason: None,
4003        }
4004    }
4005
4006    pub fn with_reason(mut self, value: PermissionDeniedReason) -> Self {
4007        self.reason = Some(value);
4008        self
4009    }
4010}
4011
4012const FOLDER_PERMISSION_FIELDS: &[&str] = &["action",
4013                                            "allow",
4014                                            "reason"];
4015impl FolderPermission {
4016    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
4017        map: V,
4018    ) -> Result<FolderPermission, V::Error> {
4019        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
4020    }
4021
4022    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
4023        mut map: V,
4024        optional: bool,
4025    ) -> Result<Option<FolderPermission>, V::Error> {
4026        let mut field_action = None;
4027        let mut field_allow = None;
4028        let mut field_reason = None;
4029        let mut nothing = true;
4030        while let Some(key) = map.next_key::<&str>()? {
4031            nothing = false;
4032            match key {
4033                "action" => {
4034                    if field_action.is_some() {
4035                        return Err(::serde::de::Error::duplicate_field("action"));
4036                    }
4037                    field_action = Some(map.next_value()?);
4038                }
4039                "allow" => {
4040                    if field_allow.is_some() {
4041                        return Err(::serde::de::Error::duplicate_field("allow"));
4042                    }
4043                    field_allow = Some(map.next_value()?);
4044                }
4045                "reason" => {
4046                    if field_reason.is_some() {
4047                        return Err(::serde::de::Error::duplicate_field("reason"));
4048                    }
4049                    field_reason = Some(map.next_value()?);
4050                }
4051                _ => {
4052                    // unknown field allowed and ignored
4053                    map.next_value::<::serde_json::Value>()?;
4054                }
4055            }
4056        }
4057        if optional && nothing {
4058            return Ok(None);
4059        }
4060        let result = FolderPermission {
4061            action: field_action.ok_or_else(|| ::serde::de::Error::missing_field("action"))?,
4062            allow: field_allow.ok_or_else(|| ::serde::de::Error::missing_field("allow"))?,
4063            reason: field_reason.and_then(Option::flatten),
4064        };
4065        Ok(Some(result))
4066    }
4067
4068    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
4069        &self,
4070        s: &mut S::SerializeStruct,
4071    ) -> Result<(), S::Error> {
4072        use serde::ser::SerializeStruct;
4073        s.serialize_field("action", &self.action)?;
4074        s.serialize_field("allow", &self.allow)?;
4075        if let Some(val) = &self.reason {
4076            s.serialize_field("reason", val)?;
4077        }
4078        Ok(())
4079    }
4080}
4081
4082impl<'de> ::serde::de::Deserialize<'de> for FolderPermission {
4083    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4084        // struct deserializer
4085        use serde::de::{MapAccess, Visitor};
4086        struct StructVisitor;
4087        impl<'de> Visitor<'de> for StructVisitor {
4088            type Value = FolderPermission;
4089            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4090                f.write_str("a FolderPermission struct")
4091            }
4092            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
4093                FolderPermission::internal_deserialize(map)
4094            }
4095        }
4096        deserializer.deserialize_struct("FolderPermission", FOLDER_PERMISSION_FIELDS, StructVisitor)
4097    }
4098}
4099
4100impl ::serde::ser::Serialize for FolderPermission {
4101    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4102        // struct serializer
4103        use serde::ser::SerializeStruct;
4104        let mut s = serializer.serialize_struct("FolderPermission", 3)?;
4105        self.internal_serialize::<S>(&mut s)?;
4106        s.end()
4107    }
4108}
4109
4110/// A set of policies governing membership and privileges for a shared folder.
4111#[derive(Debug, Clone, PartialEq, Eq)]
4112#[non_exhaustive] // structs may have more fields added in the future.
4113pub struct FolderPolicy {
4114    /// Who can add and remove members from this shared folder.
4115    pub acl_update_policy: AclUpdatePolicy,
4116    /// Who links can be shared with.
4117    pub shared_link_policy: SharedLinkPolicy,
4118    /// Who can be a member of this shared folder, as set on the folder itself. The effective policy
4119    /// may differ from this value if the team-wide policy is more restrictive. Present only if the
4120    /// folder is owned by a team.
4121    pub member_policy: Option<MemberPolicy>,
4122    /// Who can be a member of this shared folder, taking into account both the folder and the
4123    /// team-wide policy. This value may differ from that of member_policy if the team-wide policy
4124    /// is more restrictive than the folder policy. Present only if the folder is owned by a team.
4125    pub resolved_member_policy: Option<MemberPolicy>,
4126    /// Who can enable/disable viewer info for this shared folder.
4127    pub viewer_info_policy: Option<ViewerInfoPolicy>,
4128}
4129
4130impl FolderPolicy {
4131    pub fn new(acl_update_policy: AclUpdatePolicy, shared_link_policy: SharedLinkPolicy) -> Self {
4132        FolderPolicy {
4133            acl_update_policy,
4134            shared_link_policy,
4135            member_policy: None,
4136            resolved_member_policy: None,
4137            viewer_info_policy: None,
4138        }
4139    }
4140
4141    pub fn with_member_policy(mut self, value: MemberPolicy) -> Self {
4142        self.member_policy = Some(value);
4143        self
4144    }
4145
4146    pub fn with_resolved_member_policy(mut self, value: MemberPolicy) -> Self {
4147        self.resolved_member_policy = Some(value);
4148        self
4149    }
4150
4151    pub fn with_viewer_info_policy(mut self, value: ViewerInfoPolicy) -> Self {
4152        self.viewer_info_policy = Some(value);
4153        self
4154    }
4155}
4156
4157const FOLDER_POLICY_FIELDS: &[&str] = &["acl_update_policy",
4158                                        "shared_link_policy",
4159                                        "member_policy",
4160                                        "resolved_member_policy",
4161                                        "viewer_info_policy"];
4162impl FolderPolicy {
4163    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
4164        map: V,
4165    ) -> Result<FolderPolicy, V::Error> {
4166        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
4167    }
4168
4169    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
4170        mut map: V,
4171        optional: bool,
4172    ) -> Result<Option<FolderPolicy>, V::Error> {
4173        let mut field_acl_update_policy = None;
4174        let mut field_shared_link_policy = None;
4175        let mut field_member_policy = None;
4176        let mut field_resolved_member_policy = None;
4177        let mut field_viewer_info_policy = None;
4178        let mut nothing = true;
4179        while let Some(key) = map.next_key::<&str>()? {
4180            nothing = false;
4181            match key {
4182                "acl_update_policy" => {
4183                    if field_acl_update_policy.is_some() {
4184                        return Err(::serde::de::Error::duplicate_field("acl_update_policy"));
4185                    }
4186                    field_acl_update_policy = Some(map.next_value()?);
4187                }
4188                "shared_link_policy" => {
4189                    if field_shared_link_policy.is_some() {
4190                        return Err(::serde::de::Error::duplicate_field("shared_link_policy"));
4191                    }
4192                    field_shared_link_policy = Some(map.next_value()?);
4193                }
4194                "member_policy" => {
4195                    if field_member_policy.is_some() {
4196                        return Err(::serde::de::Error::duplicate_field("member_policy"));
4197                    }
4198                    field_member_policy = Some(map.next_value()?);
4199                }
4200                "resolved_member_policy" => {
4201                    if field_resolved_member_policy.is_some() {
4202                        return Err(::serde::de::Error::duplicate_field("resolved_member_policy"));
4203                    }
4204                    field_resolved_member_policy = Some(map.next_value()?);
4205                }
4206                "viewer_info_policy" => {
4207                    if field_viewer_info_policy.is_some() {
4208                        return Err(::serde::de::Error::duplicate_field("viewer_info_policy"));
4209                    }
4210                    field_viewer_info_policy = Some(map.next_value()?);
4211                }
4212                _ => {
4213                    // unknown field allowed and ignored
4214                    map.next_value::<::serde_json::Value>()?;
4215                }
4216            }
4217        }
4218        if optional && nothing {
4219            return Ok(None);
4220        }
4221        let result = FolderPolicy {
4222            acl_update_policy: field_acl_update_policy.ok_or_else(|| ::serde::de::Error::missing_field("acl_update_policy"))?,
4223            shared_link_policy: field_shared_link_policy.ok_or_else(|| ::serde::de::Error::missing_field("shared_link_policy"))?,
4224            member_policy: field_member_policy.and_then(Option::flatten),
4225            resolved_member_policy: field_resolved_member_policy.and_then(Option::flatten),
4226            viewer_info_policy: field_viewer_info_policy.and_then(Option::flatten),
4227        };
4228        Ok(Some(result))
4229    }
4230
4231    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
4232        &self,
4233        s: &mut S::SerializeStruct,
4234    ) -> Result<(), S::Error> {
4235        use serde::ser::SerializeStruct;
4236        s.serialize_field("acl_update_policy", &self.acl_update_policy)?;
4237        s.serialize_field("shared_link_policy", &self.shared_link_policy)?;
4238        if let Some(val) = &self.member_policy {
4239            s.serialize_field("member_policy", val)?;
4240        }
4241        if let Some(val) = &self.resolved_member_policy {
4242            s.serialize_field("resolved_member_policy", val)?;
4243        }
4244        if let Some(val) = &self.viewer_info_policy {
4245            s.serialize_field("viewer_info_policy", val)?;
4246        }
4247        Ok(())
4248    }
4249}
4250
4251impl<'de> ::serde::de::Deserialize<'de> for FolderPolicy {
4252    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4253        // struct deserializer
4254        use serde::de::{MapAccess, Visitor};
4255        struct StructVisitor;
4256        impl<'de> Visitor<'de> for StructVisitor {
4257            type Value = FolderPolicy;
4258            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4259                f.write_str("a FolderPolicy struct")
4260            }
4261            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
4262                FolderPolicy::internal_deserialize(map)
4263            }
4264        }
4265        deserializer.deserialize_struct("FolderPolicy", FOLDER_POLICY_FIELDS, StructVisitor)
4266    }
4267}
4268
4269impl ::serde::ser::Serialize for FolderPolicy {
4270    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4271        // struct serializer
4272        use serde::ser::SerializeStruct;
4273        let mut s = serializer.serialize_struct("FolderPolicy", 5)?;
4274        self.internal_serialize::<S>(&mut s)?;
4275        s.end()
4276    }
4277}
4278
4279/// Arguments of [`get_file_metadata()`](crate::sharing::get_file_metadata).
4280#[derive(Debug, Clone, PartialEq, Eq)]
4281#[non_exhaustive] // structs may have more fields added in the future.
4282pub struct GetFileMetadataArg {
4283    /// The file to query.
4284    pub file: PathOrId,
4285    /// A list of `FileAction`s corresponding to `FilePermission`s that should appear in the
4286    /// response's [`SharedFileMetadata::permissions`](SharedFileMetadata) field describing the
4287    /// actions the  authenticated user can perform on the file.
4288    pub actions: Option<Vec<FileAction>>,
4289}
4290
4291impl GetFileMetadataArg {
4292    pub fn new(file: PathOrId) -> Self {
4293        GetFileMetadataArg {
4294            file,
4295            actions: None,
4296        }
4297    }
4298
4299    pub fn with_actions(mut self, value: Vec<FileAction>) -> Self {
4300        self.actions = Some(value);
4301        self
4302    }
4303}
4304
4305const GET_FILE_METADATA_ARG_FIELDS: &[&str] = &["file",
4306                                                "actions"];
4307impl GetFileMetadataArg {
4308    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
4309        map: V,
4310    ) -> Result<GetFileMetadataArg, V::Error> {
4311        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
4312    }
4313
4314    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
4315        mut map: V,
4316        optional: bool,
4317    ) -> Result<Option<GetFileMetadataArg>, V::Error> {
4318        let mut field_file = None;
4319        let mut field_actions = None;
4320        let mut nothing = true;
4321        while let Some(key) = map.next_key::<&str>()? {
4322            nothing = false;
4323            match key {
4324                "file" => {
4325                    if field_file.is_some() {
4326                        return Err(::serde::de::Error::duplicate_field("file"));
4327                    }
4328                    field_file = Some(map.next_value()?);
4329                }
4330                "actions" => {
4331                    if field_actions.is_some() {
4332                        return Err(::serde::de::Error::duplicate_field("actions"));
4333                    }
4334                    field_actions = Some(map.next_value()?);
4335                }
4336                _ => {
4337                    // unknown field allowed and ignored
4338                    map.next_value::<::serde_json::Value>()?;
4339                }
4340            }
4341        }
4342        if optional && nothing {
4343            return Ok(None);
4344        }
4345        let result = GetFileMetadataArg {
4346            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
4347            actions: field_actions.and_then(Option::flatten),
4348        };
4349        Ok(Some(result))
4350    }
4351
4352    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
4353        &self,
4354        s: &mut S::SerializeStruct,
4355    ) -> Result<(), S::Error> {
4356        use serde::ser::SerializeStruct;
4357        s.serialize_field("file", &self.file)?;
4358        if let Some(val) = &self.actions {
4359            s.serialize_field("actions", val)?;
4360        }
4361        Ok(())
4362    }
4363}
4364
4365impl<'de> ::serde::de::Deserialize<'de> for GetFileMetadataArg {
4366    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4367        // struct deserializer
4368        use serde::de::{MapAccess, Visitor};
4369        struct StructVisitor;
4370        impl<'de> Visitor<'de> for StructVisitor {
4371            type Value = GetFileMetadataArg;
4372            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4373                f.write_str("a GetFileMetadataArg struct")
4374            }
4375            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
4376                GetFileMetadataArg::internal_deserialize(map)
4377            }
4378        }
4379        deserializer.deserialize_struct("GetFileMetadataArg", GET_FILE_METADATA_ARG_FIELDS, StructVisitor)
4380    }
4381}
4382
4383impl ::serde::ser::Serialize for GetFileMetadataArg {
4384    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4385        // struct serializer
4386        use serde::ser::SerializeStruct;
4387        let mut s = serializer.serialize_struct("GetFileMetadataArg", 2)?;
4388        self.internal_serialize::<S>(&mut s)?;
4389        s.end()
4390    }
4391}
4392
4393/// Arguments of [`get_file_metadata_batch()`](crate::sharing::get_file_metadata_batch).
4394#[derive(Debug, Clone, PartialEq, Eq)]
4395#[non_exhaustive] // structs may have more fields added in the future.
4396pub struct GetFileMetadataBatchArg {
4397    /// The files to query.
4398    pub files: Vec<PathOrId>,
4399    /// A list of `FileAction`s corresponding to `FilePermission`s that should appear in the
4400    /// response's [`SharedFileMetadata::permissions`](SharedFileMetadata) field describing the
4401    /// actions the  authenticated user can perform on the file.
4402    pub actions: Option<Vec<FileAction>>,
4403}
4404
4405impl GetFileMetadataBatchArg {
4406    pub fn new(files: Vec<PathOrId>) -> Self {
4407        GetFileMetadataBatchArg {
4408            files,
4409            actions: None,
4410        }
4411    }
4412
4413    pub fn with_actions(mut self, value: Vec<FileAction>) -> Self {
4414        self.actions = Some(value);
4415        self
4416    }
4417}
4418
4419const GET_FILE_METADATA_BATCH_ARG_FIELDS: &[&str] = &["files",
4420                                                      "actions"];
4421impl GetFileMetadataBatchArg {
4422    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
4423        map: V,
4424    ) -> Result<GetFileMetadataBatchArg, V::Error> {
4425        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
4426    }
4427
4428    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
4429        mut map: V,
4430        optional: bool,
4431    ) -> Result<Option<GetFileMetadataBatchArg>, V::Error> {
4432        let mut field_files = None;
4433        let mut field_actions = None;
4434        let mut nothing = true;
4435        while let Some(key) = map.next_key::<&str>()? {
4436            nothing = false;
4437            match key {
4438                "files" => {
4439                    if field_files.is_some() {
4440                        return Err(::serde::de::Error::duplicate_field("files"));
4441                    }
4442                    field_files = Some(map.next_value()?);
4443                }
4444                "actions" => {
4445                    if field_actions.is_some() {
4446                        return Err(::serde::de::Error::duplicate_field("actions"));
4447                    }
4448                    field_actions = Some(map.next_value()?);
4449                }
4450                _ => {
4451                    // unknown field allowed and ignored
4452                    map.next_value::<::serde_json::Value>()?;
4453                }
4454            }
4455        }
4456        if optional && nothing {
4457            return Ok(None);
4458        }
4459        let result = GetFileMetadataBatchArg {
4460            files: field_files.ok_or_else(|| ::serde::de::Error::missing_field("files"))?,
4461            actions: field_actions.and_then(Option::flatten),
4462        };
4463        Ok(Some(result))
4464    }
4465
4466    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
4467        &self,
4468        s: &mut S::SerializeStruct,
4469    ) -> Result<(), S::Error> {
4470        use serde::ser::SerializeStruct;
4471        s.serialize_field("files", &self.files)?;
4472        if let Some(val) = &self.actions {
4473            s.serialize_field("actions", val)?;
4474        }
4475        Ok(())
4476    }
4477}
4478
4479impl<'de> ::serde::de::Deserialize<'de> for GetFileMetadataBatchArg {
4480    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4481        // struct deserializer
4482        use serde::de::{MapAccess, Visitor};
4483        struct StructVisitor;
4484        impl<'de> Visitor<'de> for StructVisitor {
4485            type Value = GetFileMetadataBatchArg;
4486            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4487                f.write_str("a GetFileMetadataBatchArg struct")
4488            }
4489            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
4490                GetFileMetadataBatchArg::internal_deserialize(map)
4491            }
4492        }
4493        deserializer.deserialize_struct("GetFileMetadataBatchArg", GET_FILE_METADATA_BATCH_ARG_FIELDS, StructVisitor)
4494    }
4495}
4496
4497impl ::serde::ser::Serialize for GetFileMetadataBatchArg {
4498    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4499        // struct serializer
4500        use serde::ser::SerializeStruct;
4501        let mut s = serializer.serialize_struct("GetFileMetadataBatchArg", 2)?;
4502        self.internal_serialize::<S>(&mut s)?;
4503        s.end()
4504    }
4505}
4506
4507/// Per file results of [`get_file_metadata_batch()`](crate::sharing::get_file_metadata_batch).
4508#[derive(Debug, Clone, PartialEq, Eq)]
4509#[non_exhaustive] // structs may have more fields added in the future.
4510pub struct GetFileMetadataBatchResult {
4511    /// This is the input file identifier corresponding to one of
4512    /// [`GetFileMetadataBatchArg::files`](GetFileMetadataBatchArg).
4513    pub file: PathOrId,
4514    /// The result for this particular file.
4515    pub result: GetFileMetadataIndividualResult,
4516}
4517
4518impl GetFileMetadataBatchResult {
4519    pub fn new(file: PathOrId, result: GetFileMetadataIndividualResult) -> Self {
4520        GetFileMetadataBatchResult {
4521            file,
4522            result,
4523        }
4524    }
4525}
4526
4527const GET_FILE_METADATA_BATCH_RESULT_FIELDS: &[&str] = &["file",
4528                                                         "result"];
4529impl GetFileMetadataBatchResult {
4530    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
4531        map: V,
4532    ) -> Result<GetFileMetadataBatchResult, V::Error> {
4533        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
4534    }
4535
4536    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
4537        mut map: V,
4538        optional: bool,
4539    ) -> Result<Option<GetFileMetadataBatchResult>, V::Error> {
4540        let mut field_file = None;
4541        let mut field_result = None;
4542        let mut nothing = true;
4543        while let Some(key) = map.next_key::<&str>()? {
4544            nothing = false;
4545            match key {
4546                "file" => {
4547                    if field_file.is_some() {
4548                        return Err(::serde::de::Error::duplicate_field("file"));
4549                    }
4550                    field_file = Some(map.next_value()?);
4551                }
4552                "result" => {
4553                    if field_result.is_some() {
4554                        return Err(::serde::de::Error::duplicate_field("result"));
4555                    }
4556                    field_result = Some(map.next_value()?);
4557                }
4558                _ => {
4559                    // unknown field allowed and ignored
4560                    map.next_value::<::serde_json::Value>()?;
4561                }
4562            }
4563        }
4564        if optional && nothing {
4565            return Ok(None);
4566        }
4567        let result = GetFileMetadataBatchResult {
4568            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
4569            result: field_result.ok_or_else(|| ::serde::de::Error::missing_field("result"))?,
4570        };
4571        Ok(Some(result))
4572    }
4573
4574    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
4575        &self,
4576        s: &mut S::SerializeStruct,
4577    ) -> Result<(), S::Error> {
4578        use serde::ser::SerializeStruct;
4579        s.serialize_field("file", &self.file)?;
4580        s.serialize_field("result", &self.result)?;
4581        Ok(())
4582    }
4583}
4584
4585impl<'de> ::serde::de::Deserialize<'de> for GetFileMetadataBatchResult {
4586    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4587        // struct deserializer
4588        use serde::de::{MapAccess, Visitor};
4589        struct StructVisitor;
4590        impl<'de> Visitor<'de> for StructVisitor {
4591            type Value = GetFileMetadataBatchResult;
4592            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4593                f.write_str("a GetFileMetadataBatchResult struct")
4594            }
4595            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
4596                GetFileMetadataBatchResult::internal_deserialize(map)
4597            }
4598        }
4599        deserializer.deserialize_struct("GetFileMetadataBatchResult", GET_FILE_METADATA_BATCH_RESULT_FIELDS, StructVisitor)
4600    }
4601}
4602
4603impl ::serde::ser::Serialize for GetFileMetadataBatchResult {
4604    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4605        // struct serializer
4606        use serde::ser::SerializeStruct;
4607        let mut s = serializer.serialize_struct("GetFileMetadataBatchResult", 2)?;
4608        self.internal_serialize::<S>(&mut s)?;
4609        s.end()
4610    }
4611}
4612
4613/// Error result for [`get_file_metadata()`](crate::sharing::get_file_metadata).
4614#[derive(Debug, Clone, PartialEq, Eq)]
4615#[non_exhaustive] // variants may be added in the future
4616pub enum GetFileMetadataError {
4617    UserError(SharingUserError),
4618    AccessError(SharingFileAccessError),
4619    /// Catch-all used for unrecognized values returned from the server. Encountering this value
4620    /// typically indicates that this SDK version is out of date.
4621    Other,
4622}
4623
4624impl<'de> ::serde::de::Deserialize<'de> for GetFileMetadataError {
4625    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4626        // union deserializer
4627        use serde::de::{self, MapAccess, Visitor};
4628        struct EnumVisitor;
4629        impl<'de> Visitor<'de> for EnumVisitor {
4630            type Value = GetFileMetadataError;
4631            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4632                f.write_str("a GetFileMetadataError structure")
4633            }
4634            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
4635                let tag: &str = match map.next_key()? {
4636                    Some(".tag") => map.next_value()?,
4637                    _ => return Err(de::Error::missing_field(".tag"))
4638                };
4639                let value = match tag {
4640                    "user_error" => {
4641                        match map.next_key()? {
4642                            Some("user_error") => GetFileMetadataError::UserError(map.next_value()?),
4643                            None => return Err(de::Error::missing_field("user_error")),
4644                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
4645                        }
4646                    }
4647                    "access_error" => {
4648                        match map.next_key()? {
4649                            Some("access_error") => GetFileMetadataError::AccessError(map.next_value()?),
4650                            None => return Err(de::Error::missing_field("access_error")),
4651                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
4652                        }
4653                    }
4654                    _ => GetFileMetadataError::Other,
4655                };
4656                crate::eat_json_fields(&mut map)?;
4657                Ok(value)
4658            }
4659        }
4660        const VARIANTS: &[&str] = &["user_error",
4661                                    "access_error",
4662                                    "other"];
4663        deserializer.deserialize_struct("GetFileMetadataError", VARIANTS, EnumVisitor)
4664    }
4665}
4666
4667impl ::serde::ser::Serialize for GetFileMetadataError {
4668    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4669        // union serializer
4670        use serde::ser::SerializeStruct;
4671        match self {
4672            GetFileMetadataError::UserError(x) => {
4673                // union or polymporphic struct
4674                let mut s = serializer.serialize_struct("GetFileMetadataError", 2)?;
4675                s.serialize_field(".tag", "user_error")?;
4676                s.serialize_field("user_error", x)?;
4677                s.end()
4678            }
4679            GetFileMetadataError::AccessError(x) => {
4680                // union or polymporphic struct
4681                let mut s = serializer.serialize_struct("GetFileMetadataError", 2)?;
4682                s.serialize_field(".tag", "access_error")?;
4683                s.serialize_field("access_error", x)?;
4684                s.end()
4685            }
4686            GetFileMetadataError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
4687        }
4688    }
4689}
4690
4691impl ::std::error::Error for GetFileMetadataError {
4692    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
4693        match self {
4694            GetFileMetadataError::UserError(inner) => Some(inner),
4695            GetFileMetadataError::AccessError(inner) => Some(inner),
4696            _ => None,
4697        }
4698    }
4699}
4700
4701impl ::std::fmt::Display for GetFileMetadataError {
4702    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4703        match self {
4704            GetFileMetadataError::UserError(inner) => write!(f, "GetFileMetadataError: {}", inner),
4705            GetFileMetadataError::AccessError(inner) => write!(f, "GetFileMetadataError: {}", inner),
4706            _ => write!(f, "{:?}", *self),
4707        }
4708    }
4709}
4710
4711#[derive(Debug, Clone, PartialEq, Eq)]
4712#[non_exhaustive] // variants may be added in the future
4713pub enum GetFileMetadataIndividualResult {
4714    /// The result for this file if it was successful.
4715    Metadata(SharedFileMetadata),
4716    /// The result for this file if it was an error.
4717    AccessError(SharingFileAccessError),
4718    /// Catch-all used for unrecognized values returned from the server. Encountering this value
4719    /// typically indicates that this SDK version is out of date.
4720    Other,
4721}
4722
4723impl<'de> ::serde::de::Deserialize<'de> for GetFileMetadataIndividualResult {
4724    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4725        // union deserializer
4726        use serde::de::{self, MapAccess, Visitor};
4727        struct EnumVisitor;
4728        impl<'de> Visitor<'de> for EnumVisitor {
4729            type Value = GetFileMetadataIndividualResult;
4730            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4731                f.write_str("a GetFileMetadataIndividualResult structure")
4732            }
4733            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
4734                let tag: &str = match map.next_key()? {
4735                    Some(".tag") => map.next_value()?,
4736                    _ => return Err(de::Error::missing_field(".tag"))
4737                };
4738                let value = match tag {
4739                    "metadata" => GetFileMetadataIndividualResult::Metadata(SharedFileMetadata::internal_deserialize(&mut map)?),
4740                    "access_error" => {
4741                        match map.next_key()? {
4742                            Some("access_error") => GetFileMetadataIndividualResult::AccessError(map.next_value()?),
4743                            None => return Err(de::Error::missing_field("access_error")),
4744                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
4745                        }
4746                    }
4747                    _ => GetFileMetadataIndividualResult::Other,
4748                };
4749                crate::eat_json_fields(&mut map)?;
4750                Ok(value)
4751            }
4752        }
4753        const VARIANTS: &[&str] = &["metadata",
4754                                    "access_error",
4755                                    "other"];
4756        deserializer.deserialize_struct("GetFileMetadataIndividualResult", VARIANTS, EnumVisitor)
4757    }
4758}
4759
4760impl ::serde::ser::Serialize for GetFileMetadataIndividualResult {
4761    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4762        // union serializer
4763        use serde::ser::SerializeStruct;
4764        match self {
4765            GetFileMetadataIndividualResult::Metadata(x) => {
4766                // struct
4767                let mut s = serializer.serialize_struct("GetFileMetadataIndividualResult", 15)?;
4768                s.serialize_field(".tag", "metadata")?;
4769                x.internal_serialize::<S>(&mut s)?;
4770                s.end()
4771            }
4772            GetFileMetadataIndividualResult::AccessError(x) => {
4773                // union or polymporphic struct
4774                let mut s = serializer.serialize_struct("GetFileMetadataIndividualResult", 2)?;
4775                s.serialize_field(".tag", "access_error")?;
4776                s.serialize_field("access_error", x)?;
4777                s.end()
4778            }
4779            GetFileMetadataIndividualResult::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
4780        }
4781    }
4782}
4783
4784#[derive(Debug, Clone, PartialEq, Eq)]
4785#[non_exhaustive] // structs may have more fields added in the future.
4786pub struct GetMetadataArgs {
4787    /// The ID for the shared folder.
4788    pub shared_folder_id: crate::types::common::SharedFolderId,
4789    /// A list of `FolderAction`s corresponding to `FolderPermission`s that should appear in the
4790    /// response's [`SharedFolderMetadata::permissions`](SharedFolderMetadata) field describing the
4791    /// actions the  authenticated user can perform on the folder.
4792    pub actions: Option<Vec<FolderAction>>,
4793}
4794
4795impl GetMetadataArgs {
4796    pub fn new(shared_folder_id: crate::types::common::SharedFolderId) -> Self {
4797        GetMetadataArgs {
4798            shared_folder_id,
4799            actions: None,
4800        }
4801    }
4802
4803    pub fn with_actions(mut self, value: Vec<FolderAction>) -> Self {
4804        self.actions = Some(value);
4805        self
4806    }
4807}
4808
4809const GET_METADATA_ARGS_FIELDS: &[&str] = &["shared_folder_id",
4810                                            "actions"];
4811impl GetMetadataArgs {
4812    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
4813        map: V,
4814    ) -> Result<GetMetadataArgs, V::Error> {
4815        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
4816    }
4817
4818    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
4819        mut map: V,
4820        optional: bool,
4821    ) -> Result<Option<GetMetadataArgs>, V::Error> {
4822        let mut field_shared_folder_id = None;
4823        let mut field_actions = None;
4824        let mut nothing = true;
4825        while let Some(key) = map.next_key::<&str>()? {
4826            nothing = false;
4827            match key {
4828                "shared_folder_id" => {
4829                    if field_shared_folder_id.is_some() {
4830                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
4831                    }
4832                    field_shared_folder_id = Some(map.next_value()?);
4833                }
4834                "actions" => {
4835                    if field_actions.is_some() {
4836                        return Err(::serde::de::Error::duplicate_field("actions"));
4837                    }
4838                    field_actions = Some(map.next_value()?);
4839                }
4840                _ => {
4841                    // unknown field allowed and ignored
4842                    map.next_value::<::serde_json::Value>()?;
4843                }
4844            }
4845        }
4846        if optional && nothing {
4847            return Ok(None);
4848        }
4849        let result = GetMetadataArgs {
4850            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
4851            actions: field_actions.and_then(Option::flatten),
4852        };
4853        Ok(Some(result))
4854    }
4855
4856    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
4857        &self,
4858        s: &mut S::SerializeStruct,
4859    ) -> Result<(), S::Error> {
4860        use serde::ser::SerializeStruct;
4861        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
4862        if let Some(val) = &self.actions {
4863            s.serialize_field("actions", val)?;
4864        }
4865        Ok(())
4866    }
4867}
4868
4869impl<'de> ::serde::de::Deserialize<'de> for GetMetadataArgs {
4870    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4871        // struct deserializer
4872        use serde::de::{MapAccess, Visitor};
4873        struct StructVisitor;
4874        impl<'de> Visitor<'de> for StructVisitor {
4875            type Value = GetMetadataArgs;
4876            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4877                f.write_str("a GetMetadataArgs struct")
4878            }
4879            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
4880                GetMetadataArgs::internal_deserialize(map)
4881            }
4882        }
4883        deserializer.deserialize_struct("GetMetadataArgs", GET_METADATA_ARGS_FIELDS, StructVisitor)
4884    }
4885}
4886
4887impl ::serde::ser::Serialize for GetMetadataArgs {
4888    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4889        // struct serializer
4890        use serde::ser::SerializeStruct;
4891        let mut s = serializer.serialize_struct("GetMetadataArgs", 2)?;
4892        self.internal_serialize::<S>(&mut s)?;
4893        s.end()
4894    }
4895}
4896
4897#[derive(Debug, Clone, PartialEq, Eq)]
4898#[non_exhaustive] // variants may be added in the future
4899pub enum GetSharedLinkFileError {
4900    /// The shared link wasn't found.
4901    SharedLinkNotFound,
4902    /// The caller is not allowed to access this shared link.
4903    SharedLinkAccessDenied,
4904    /// This type of link is not supported; use [`files::export()`](crate::files::export) instead.
4905    UnsupportedLinkType,
4906    /// Directories cannot be retrieved by this endpoint.
4907    SharedLinkIsDirectory,
4908    /// Catch-all used for unrecognized values returned from the server. Encountering this value
4909    /// typically indicates that this SDK version is out of date.
4910    Other,
4911}
4912
4913impl<'de> ::serde::de::Deserialize<'de> for GetSharedLinkFileError {
4914    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4915        // union deserializer
4916        use serde::de::{self, MapAccess, Visitor};
4917        struct EnumVisitor;
4918        impl<'de> Visitor<'de> for EnumVisitor {
4919            type Value = GetSharedLinkFileError;
4920            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4921                f.write_str("a GetSharedLinkFileError structure")
4922            }
4923            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
4924                let tag: &str = match map.next_key()? {
4925                    Some(".tag") => map.next_value()?,
4926                    _ => return Err(de::Error::missing_field(".tag"))
4927                };
4928                let value = match tag {
4929                    "shared_link_not_found" => GetSharedLinkFileError::SharedLinkNotFound,
4930                    "shared_link_access_denied" => GetSharedLinkFileError::SharedLinkAccessDenied,
4931                    "unsupported_link_type" => GetSharedLinkFileError::UnsupportedLinkType,
4932                    "shared_link_is_directory" => GetSharedLinkFileError::SharedLinkIsDirectory,
4933                    _ => GetSharedLinkFileError::Other,
4934                };
4935                crate::eat_json_fields(&mut map)?;
4936                Ok(value)
4937            }
4938        }
4939        const VARIANTS: &[&str] = &["shared_link_not_found",
4940                                    "shared_link_access_denied",
4941                                    "unsupported_link_type",
4942                                    "other",
4943                                    "shared_link_is_directory"];
4944        deserializer.deserialize_struct("GetSharedLinkFileError", VARIANTS, EnumVisitor)
4945    }
4946}
4947
4948impl ::serde::ser::Serialize for GetSharedLinkFileError {
4949    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4950        // union serializer
4951        use serde::ser::SerializeStruct;
4952        match self {
4953            GetSharedLinkFileError::SharedLinkNotFound => {
4954                // unit
4955                let mut s = serializer.serialize_struct("GetSharedLinkFileError", 1)?;
4956                s.serialize_field(".tag", "shared_link_not_found")?;
4957                s.end()
4958            }
4959            GetSharedLinkFileError::SharedLinkAccessDenied => {
4960                // unit
4961                let mut s = serializer.serialize_struct("GetSharedLinkFileError", 1)?;
4962                s.serialize_field(".tag", "shared_link_access_denied")?;
4963                s.end()
4964            }
4965            GetSharedLinkFileError::UnsupportedLinkType => {
4966                // unit
4967                let mut s = serializer.serialize_struct("GetSharedLinkFileError", 1)?;
4968                s.serialize_field(".tag", "unsupported_link_type")?;
4969                s.end()
4970            }
4971            GetSharedLinkFileError::SharedLinkIsDirectory => {
4972                // unit
4973                let mut s = serializer.serialize_struct("GetSharedLinkFileError", 1)?;
4974                s.serialize_field(".tag", "shared_link_is_directory")?;
4975                s.end()
4976            }
4977            GetSharedLinkFileError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
4978        }
4979    }
4980}
4981
4982impl ::std::error::Error for GetSharedLinkFileError {
4983}
4984
4985impl ::std::fmt::Display for GetSharedLinkFileError {
4986    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
4987        match self {
4988            GetSharedLinkFileError::SharedLinkNotFound => f.write_str("The shared link wasn't found."),
4989            GetSharedLinkFileError::SharedLinkAccessDenied => f.write_str("The caller is not allowed to access this shared link."),
4990            GetSharedLinkFileError::SharedLinkIsDirectory => f.write_str("Directories cannot be retrieved by this endpoint."),
4991            _ => write!(f, "{:?}", *self),
4992        }
4993    }
4994}
4995
4996// union extends SharedLinkError
4997impl From<SharedLinkError> for GetSharedLinkFileError {
4998    fn from(parent: SharedLinkError) -> Self {
4999        match parent {
5000            SharedLinkError::SharedLinkNotFound => GetSharedLinkFileError::SharedLinkNotFound,
5001            SharedLinkError::SharedLinkAccessDenied => GetSharedLinkFileError::SharedLinkAccessDenied,
5002            SharedLinkError::UnsupportedLinkType => GetSharedLinkFileError::UnsupportedLinkType,
5003            SharedLinkError::Other => GetSharedLinkFileError::Other,
5004        }
5005    }
5006}
5007#[derive(Debug, Clone, PartialEq, Eq)]
5008#[non_exhaustive] // structs may have more fields added in the future.
5009pub struct GetSharedLinkMetadataArg {
5010    /// URL of the shared link.
5011    pub url: String,
5012    /// If the shared link is to a folder, this parameter can be used to retrieve the metadata for a
5013    /// specific file or sub-folder in this folder. A relative path should be used.
5014    pub path: Option<Path>,
5015    /// If the shared link has a password, this parameter can be used.
5016    pub link_password: Option<String>,
5017}
5018
5019impl GetSharedLinkMetadataArg {
5020    pub fn new(url: String) -> Self {
5021        GetSharedLinkMetadataArg {
5022            url,
5023            path: None,
5024            link_password: None,
5025        }
5026    }
5027
5028    pub fn with_path(mut self, value: Path) -> Self {
5029        self.path = Some(value);
5030        self
5031    }
5032
5033    pub fn with_link_password(mut self, value: String) -> Self {
5034        self.link_password = Some(value);
5035        self
5036    }
5037}
5038
5039const GET_SHARED_LINK_METADATA_ARG_FIELDS: &[&str] = &["url",
5040                                                       "path",
5041                                                       "link_password"];
5042impl GetSharedLinkMetadataArg {
5043    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
5044        map: V,
5045    ) -> Result<GetSharedLinkMetadataArg, V::Error> {
5046        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
5047    }
5048
5049    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
5050        mut map: V,
5051        optional: bool,
5052    ) -> Result<Option<GetSharedLinkMetadataArg>, V::Error> {
5053        let mut field_url = None;
5054        let mut field_path = None;
5055        let mut field_link_password = None;
5056        let mut nothing = true;
5057        while let Some(key) = map.next_key::<&str>()? {
5058            nothing = false;
5059            match key {
5060                "url" => {
5061                    if field_url.is_some() {
5062                        return Err(::serde::de::Error::duplicate_field("url"));
5063                    }
5064                    field_url = Some(map.next_value()?);
5065                }
5066                "path" => {
5067                    if field_path.is_some() {
5068                        return Err(::serde::de::Error::duplicate_field("path"));
5069                    }
5070                    field_path = Some(map.next_value()?);
5071                }
5072                "link_password" => {
5073                    if field_link_password.is_some() {
5074                        return Err(::serde::de::Error::duplicate_field("link_password"));
5075                    }
5076                    field_link_password = Some(map.next_value()?);
5077                }
5078                _ => {
5079                    // unknown field allowed and ignored
5080                    map.next_value::<::serde_json::Value>()?;
5081                }
5082            }
5083        }
5084        if optional && nothing {
5085            return Ok(None);
5086        }
5087        let result = GetSharedLinkMetadataArg {
5088            url: field_url.ok_or_else(|| ::serde::de::Error::missing_field("url"))?,
5089            path: field_path.and_then(Option::flatten),
5090            link_password: field_link_password.and_then(Option::flatten),
5091        };
5092        Ok(Some(result))
5093    }
5094
5095    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
5096        &self,
5097        s: &mut S::SerializeStruct,
5098    ) -> Result<(), S::Error> {
5099        use serde::ser::SerializeStruct;
5100        s.serialize_field("url", &self.url)?;
5101        if let Some(val) = &self.path {
5102            s.serialize_field("path", val)?;
5103        }
5104        if let Some(val) = &self.link_password {
5105            s.serialize_field("link_password", val)?;
5106        }
5107        Ok(())
5108    }
5109}
5110
5111impl<'de> ::serde::de::Deserialize<'de> for GetSharedLinkMetadataArg {
5112    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5113        // struct deserializer
5114        use serde::de::{MapAccess, Visitor};
5115        struct StructVisitor;
5116        impl<'de> Visitor<'de> for StructVisitor {
5117            type Value = GetSharedLinkMetadataArg;
5118            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5119                f.write_str("a GetSharedLinkMetadataArg struct")
5120            }
5121            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
5122                GetSharedLinkMetadataArg::internal_deserialize(map)
5123            }
5124        }
5125        deserializer.deserialize_struct("GetSharedLinkMetadataArg", GET_SHARED_LINK_METADATA_ARG_FIELDS, StructVisitor)
5126    }
5127}
5128
5129impl ::serde::ser::Serialize for GetSharedLinkMetadataArg {
5130    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5131        // struct serializer
5132        use serde::ser::SerializeStruct;
5133        let mut s = serializer.serialize_struct("GetSharedLinkMetadataArg", 3)?;
5134        self.internal_serialize::<S>(&mut s)?;
5135        s.end()
5136    }
5137}
5138
5139#[derive(Debug, Clone, PartialEq, Eq, Default)]
5140#[non_exhaustive] // structs may have more fields added in the future.
5141pub struct GetSharedLinksArg {
5142    /// See [`get_shared_links()`](crate::sharing::get_shared_links) description.
5143    pub path: Option<String>,
5144}
5145
5146impl GetSharedLinksArg {
5147    pub fn with_path(mut self, value: String) -> Self {
5148        self.path = Some(value);
5149        self
5150    }
5151}
5152
5153const GET_SHARED_LINKS_ARG_FIELDS: &[&str] = &["path"];
5154impl GetSharedLinksArg {
5155    // no _opt deserializer
5156    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
5157        mut map: V,
5158    ) -> Result<GetSharedLinksArg, V::Error> {
5159        let mut field_path = None;
5160        while let Some(key) = map.next_key::<&str>()? {
5161            match key {
5162                "path" => {
5163                    if field_path.is_some() {
5164                        return Err(::serde::de::Error::duplicate_field("path"));
5165                    }
5166                    field_path = Some(map.next_value()?);
5167                }
5168                _ => {
5169                    // unknown field allowed and ignored
5170                    map.next_value::<::serde_json::Value>()?;
5171                }
5172            }
5173        }
5174        let result = GetSharedLinksArg {
5175            path: field_path.and_then(Option::flatten),
5176        };
5177        Ok(result)
5178    }
5179
5180    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
5181        &self,
5182        s: &mut S::SerializeStruct,
5183    ) -> Result<(), S::Error> {
5184        use serde::ser::SerializeStruct;
5185        if let Some(val) = &self.path {
5186            s.serialize_field("path", val)?;
5187        }
5188        Ok(())
5189    }
5190}
5191
5192impl<'de> ::serde::de::Deserialize<'de> for GetSharedLinksArg {
5193    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5194        // struct deserializer
5195        use serde::de::{MapAccess, Visitor};
5196        struct StructVisitor;
5197        impl<'de> Visitor<'de> for StructVisitor {
5198            type Value = GetSharedLinksArg;
5199            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5200                f.write_str("a GetSharedLinksArg struct")
5201            }
5202            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
5203                GetSharedLinksArg::internal_deserialize(map)
5204            }
5205        }
5206        deserializer.deserialize_struct("GetSharedLinksArg", GET_SHARED_LINKS_ARG_FIELDS, StructVisitor)
5207    }
5208}
5209
5210impl ::serde::ser::Serialize for GetSharedLinksArg {
5211    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5212        // struct serializer
5213        use serde::ser::SerializeStruct;
5214        let mut s = serializer.serialize_struct("GetSharedLinksArg", 1)?;
5215        self.internal_serialize::<S>(&mut s)?;
5216        s.end()
5217    }
5218}
5219
5220#[derive(Debug, Clone, PartialEq, Eq)]
5221#[non_exhaustive] // variants may be added in the future
5222pub enum GetSharedLinksError {
5223    Path(crate::types::files::MalformedPathError),
5224    /// Catch-all used for unrecognized values returned from the server. Encountering this value
5225    /// typically indicates that this SDK version is out of date.
5226    Other,
5227}
5228
5229impl<'de> ::serde::de::Deserialize<'de> for GetSharedLinksError {
5230    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5231        // union deserializer
5232        use serde::de::{self, MapAccess, Visitor};
5233        struct EnumVisitor;
5234        impl<'de> Visitor<'de> for EnumVisitor {
5235            type Value = GetSharedLinksError;
5236            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5237                f.write_str("a GetSharedLinksError structure")
5238            }
5239            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
5240                let tag: &str = match map.next_key()? {
5241                    Some(".tag") => map.next_value()?,
5242                    _ => return Err(de::Error::missing_field(".tag"))
5243                };
5244                let value = match tag {
5245                    "path" => {
5246                        match map.next_key()? {
5247                            Some("path") => GetSharedLinksError::Path(map.next_value()?),
5248                            None => GetSharedLinksError::Path(None),
5249                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
5250                        }
5251                    }
5252                    _ => GetSharedLinksError::Other,
5253                };
5254                crate::eat_json_fields(&mut map)?;
5255                Ok(value)
5256            }
5257        }
5258        const VARIANTS: &[&str] = &["path",
5259                                    "other"];
5260        deserializer.deserialize_struct("GetSharedLinksError", VARIANTS, EnumVisitor)
5261    }
5262}
5263
5264impl ::serde::ser::Serialize for GetSharedLinksError {
5265    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5266        // union serializer
5267        use serde::ser::SerializeStruct;
5268        match self {
5269            GetSharedLinksError::Path(x) => {
5270                // nullable (struct or primitive)
5271                let n = if x.is_some() { 2 } else { 1 };
5272                let mut s = serializer.serialize_struct("GetSharedLinksError", n)?;
5273                s.serialize_field(".tag", "path")?;
5274                if let Some(x) = x {
5275                    s.serialize_field("path", &x)?;
5276                }
5277                s.end()
5278            }
5279            GetSharedLinksError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
5280        }
5281    }
5282}
5283
5284impl ::std::error::Error for GetSharedLinksError {
5285}
5286
5287impl ::std::fmt::Display for GetSharedLinksError {
5288    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5289        match self {
5290            GetSharedLinksError::Path(inner) => write!(f, "path: {:?}", inner),
5291            _ => write!(f, "{:?}", *self),
5292        }
5293    }
5294}
5295
5296#[derive(Debug, Clone, PartialEq, Eq)]
5297#[non_exhaustive] // structs may have more fields added in the future.
5298pub struct GetSharedLinksResult {
5299    /// Shared links applicable to the path argument.
5300    pub links: Vec<LinkMetadata>,
5301}
5302
5303impl GetSharedLinksResult {
5304    pub fn new(links: Vec<LinkMetadata>) -> Self {
5305        GetSharedLinksResult {
5306            links,
5307        }
5308    }
5309}
5310
5311const GET_SHARED_LINKS_RESULT_FIELDS: &[&str] = &["links"];
5312impl GetSharedLinksResult {
5313    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
5314        map: V,
5315    ) -> Result<GetSharedLinksResult, V::Error> {
5316        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
5317    }
5318
5319    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
5320        mut map: V,
5321        optional: bool,
5322    ) -> Result<Option<GetSharedLinksResult>, V::Error> {
5323        let mut field_links = None;
5324        let mut nothing = true;
5325        while let Some(key) = map.next_key::<&str>()? {
5326            nothing = false;
5327            match key {
5328                "links" => {
5329                    if field_links.is_some() {
5330                        return Err(::serde::de::Error::duplicate_field("links"));
5331                    }
5332                    field_links = Some(map.next_value()?);
5333                }
5334                _ => {
5335                    // unknown field allowed and ignored
5336                    map.next_value::<::serde_json::Value>()?;
5337                }
5338            }
5339        }
5340        if optional && nothing {
5341            return Ok(None);
5342        }
5343        let result = GetSharedLinksResult {
5344            links: field_links.ok_or_else(|| ::serde::de::Error::missing_field("links"))?,
5345        };
5346        Ok(Some(result))
5347    }
5348
5349    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
5350        &self,
5351        s: &mut S::SerializeStruct,
5352    ) -> Result<(), S::Error> {
5353        use serde::ser::SerializeStruct;
5354        s.serialize_field("links", &self.links)?;
5355        Ok(())
5356    }
5357}
5358
5359impl<'de> ::serde::de::Deserialize<'de> for GetSharedLinksResult {
5360    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5361        // struct deserializer
5362        use serde::de::{MapAccess, Visitor};
5363        struct StructVisitor;
5364        impl<'de> Visitor<'de> for StructVisitor {
5365            type Value = GetSharedLinksResult;
5366            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5367                f.write_str("a GetSharedLinksResult struct")
5368            }
5369            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
5370                GetSharedLinksResult::internal_deserialize(map)
5371            }
5372        }
5373        deserializer.deserialize_struct("GetSharedLinksResult", GET_SHARED_LINKS_RESULT_FIELDS, StructVisitor)
5374    }
5375}
5376
5377impl ::serde::ser::Serialize for GetSharedLinksResult {
5378    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5379        // struct serializer
5380        use serde::ser::SerializeStruct;
5381        let mut s = serializer.serialize_struct("GetSharedLinksResult", 1)?;
5382        self.internal_serialize::<S>(&mut s)?;
5383        s.end()
5384    }
5385}
5386
5387/// The information about a group. Groups is a way to manage a list of users  who need same access
5388/// permission to the shared folder.
5389#[derive(Debug, Clone, PartialEq, Eq)]
5390#[non_exhaustive] // structs may have more fields added in the future.
5391pub struct GroupInfo {
5392    pub group_name: String,
5393    pub group_id: crate::types::team_common::GroupId,
5394    /// Who is allowed to manage the group.
5395    pub group_management_type: crate::types::team_common::GroupManagementType,
5396    /// The type of group.
5397    pub group_type: crate::types::team_common::GroupType,
5398    /// If the current user is a member of the group.
5399    pub is_member: bool,
5400    /// If the current user is an owner of the group.
5401    pub is_owner: bool,
5402    /// If the group is owned by the current user's team.
5403    pub same_team: bool,
5404    /// External ID of group. This is an arbitrary ID that an admin can attach to a group.
5405    pub group_external_id: Option<crate::types::team_common::GroupExternalId>,
5406    /// The number of members in the group.
5407    pub member_count: Option<u32>,
5408}
5409
5410impl GroupInfo {
5411    pub fn new(
5412        group_name: String,
5413        group_id: crate::types::team_common::GroupId,
5414        group_management_type: crate::types::team_common::GroupManagementType,
5415        group_type: crate::types::team_common::GroupType,
5416        is_member: bool,
5417        is_owner: bool,
5418        same_team: bool,
5419    ) -> Self {
5420        GroupInfo {
5421            group_name,
5422            group_id,
5423            group_management_type,
5424            group_type,
5425            is_member,
5426            is_owner,
5427            same_team,
5428            group_external_id: None,
5429            member_count: None,
5430        }
5431    }
5432
5433    pub fn with_group_external_id(
5434        mut self,
5435        value: crate::types::team_common::GroupExternalId,
5436    ) -> Self {
5437        self.group_external_id = Some(value);
5438        self
5439    }
5440
5441    pub fn with_member_count(mut self, value: u32) -> Self {
5442        self.member_count = Some(value);
5443        self
5444    }
5445}
5446
5447const GROUP_INFO_FIELDS: &[&str] = &["group_name",
5448                                     "group_id",
5449                                     "group_management_type",
5450                                     "group_type",
5451                                     "is_member",
5452                                     "is_owner",
5453                                     "same_team",
5454                                     "group_external_id",
5455                                     "member_count"];
5456impl GroupInfo {
5457    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
5458        map: V,
5459    ) -> Result<GroupInfo, V::Error> {
5460        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
5461    }
5462
5463    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
5464        mut map: V,
5465        optional: bool,
5466    ) -> Result<Option<GroupInfo>, V::Error> {
5467        let mut field_group_name = None;
5468        let mut field_group_id = None;
5469        let mut field_group_management_type = None;
5470        let mut field_group_type = None;
5471        let mut field_is_member = None;
5472        let mut field_is_owner = None;
5473        let mut field_same_team = None;
5474        let mut field_group_external_id = None;
5475        let mut field_member_count = None;
5476        let mut nothing = true;
5477        while let Some(key) = map.next_key::<&str>()? {
5478            nothing = false;
5479            match key {
5480                "group_name" => {
5481                    if field_group_name.is_some() {
5482                        return Err(::serde::de::Error::duplicate_field("group_name"));
5483                    }
5484                    field_group_name = Some(map.next_value()?);
5485                }
5486                "group_id" => {
5487                    if field_group_id.is_some() {
5488                        return Err(::serde::de::Error::duplicate_field("group_id"));
5489                    }
5490                    field_group_id = Some(map.next_value()?);
5491                }
5492                "group_management_type" => {
5493                    if field_group_management_type.is_some() {
5494                        return Err(::serde::de::Error::duplicate_field("group_management_type"));
5495                    }
5496                    field_group_management_type = Some(map.next_value()?);
5497                }
5498                "group_type" => {
5499                    if field_group_type.is_some() {
5500                        return Err(::serde::de::Error::duplicate_field("group_type"));
5501                    }
5502                    field_group_type = Some(map.next_value()?);
5503                }
5504                "is_member" => {
5505                    if field_is_member.is_some() {
5506                        return Err(::serde::de::Error::duplicate_field("is_member"));
5507                    }
5508                    field_is_member = Some(map.next_value()?);
5509                }
5510                "is_owner" => {
5511                    if field_is_owner.is_some() {
5512                        return Err(::serde::de::Error::duplicate_field("is_owner"));
5513                    }
5514                    field_is_owner = Some(map.next_value()?);
5515                }
5516                "same_team" => {
5517                    if field_same_team.is_some() {
5518                        return Err(::serde::de::Error::duplicate_field("same_team"));
5519                    }
5520                    field_same_team = Some(map.next_value()?);
5521                }
5522                "group_external_id" => {
5523                    if field_group_external_id.is_some() {
5524                        return Err(::serde::de::Error::duplicate_field("group_external_id"));
5525                    }
5526                    field_group_external_id = Some(map.next_value()?);
5527                }
5528                "member_count" => {
5529                    if field_member_count.is_some() {
5530                        return Err(::serde::de::Error::duplicate_field("member_count"));
5531                    }
5532                    field_member_count = Some(map.next_value()?);
5533                }
5534                _ => {
5535                    // unknown field allowed and ignored
5536                    map.next_value::<::serde_json::Value>()?;
5537                }
5538            }
5539        }
5540        if optional && nothing {
5541            return Ok(None);
5542        }
5543        let result = GroupInfo {
5544            group_name: field_group_name.ok_or_else(|| ::serde::de::Error::missing_field("group_name"))?,
5545            group_id: field_group_id.ok_or_else(|| ::serde::de::Error::missing_field("group_id"))?,
5546            group_management_type: field_group_management_type.ok_or_else(|| ::serde::de::Error::missing_field("group_management_type"))?,
5547            group_type: field_group_type.ok_or_else(|| ::serde::de::Error::missing_field("group_type"))?,
5548            is_member: field_is_member.ok_or_else(|| ::serde::de::Error::missing_field("is_member"))?,
5549            is_owner: field_is_owner.ok_or_else(|| ::serde::de::Error::missing_field("is_owner"))?,
5550            same_team: field_same_team.ok_or_else(|| ::serde::de::Error::missing_field("same_team"))?,
5551            group_external_id: field_group_external_id.and_then(Option::flatten),
5552            member_count: field_member_count.and_then(Option::flatten),
5553        };
5554        Ok(Some(result))
5555    }
5556
5557    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
5558        &self,
5559        s: &mut S::SerializeStruct,
5560    ) -> Result<(), S::Error> {
5561        use serde::ser::SerializeStruct;
5562        s.serialize_field("group_name", &self.group_name)?;
5563        s.serialize_field("group_id", &self.group_id)?;
5564        s.serialize_field("group_management_type", &self.group_management_type)?;
5565        s.serialize_field("group_type", &self.group_type)?;
5566        s.serialize_field("is_member", &self.is_member)?;
5567        s.serialize_field("is_owner", &self.is_owner)?;
5568        s.serialize_field("same_team", &self.same_team)?;
5569        if let Some(val) = &self.group_external_id {
5570            s.serialize_field("group_external_id", val)?;
5571        }
5572        if let Some(val) = &self.member_count {
5573            s.serialize_field("member_count", val)?;
5574        }
5575        Ok(())
5576    }
5577}
5578
5579impl<'de> ::serde::de::Deserialize<'de> for GroupInfo {
5580    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5581        // struct deserializer
5582        use serde::de::{MapAccess, Visitor};
5583        struct StructVisitor;
5584        impl<'de> Visitor<'de> for StructVisitor {
5585            type Value = GroupInfo;
5586            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5587                f.write_str("a GroupInfo struct")
5588            }
5589            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
5590                GroupInfo::internal_deserialize(map)
5591            }
5592        }
5593        deserializer.deserialize_struct("GroupInfo", GROUP_INFO_FIELDS, StructVisitor)
5594    }
5595}
5596
5597impl ::serde::ser::Serialize for GroupInfo {
5598    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5599        // struct serializer
5600        use serde::ser::SerializeStruct;
5601        let mut s = serializer.serialize_struct("GroupInfo", 9)?;
5602        self.internal_serialize::<S>(&mut s)?;
5603        s.end()
5604    }
5605}
5606
5607// struct extends crate::types::team_common::GroupSummary
5608impl From<GroupInfo> for crate::types::team_common::GroupSummary {
5609    fn from(subtype: GroupInfo) -> Self {
5610        Self {
5611            group_name: subtype.group_name,
5612            group_id: subtype.group_id,
5613            group_management_type: subtype.group_management_type,
5614            group_external_id: subtype.group_external_id,
5615            member_count: subtype.member_count,
5616        }
5617    }
5618}
5619/// The information about a group member of the shared content.
5620#[derive(Debug, Clone, PartialEq, Eq)]
5621#[non_exhaustive] // structs may have more fields added in the future.
5622pub struct GroupMembershipInfo {
5623    /// The access type for this member. It contains inherited access type from parent folder, and
5624    /// acquired access type from this folder.
5625    pub access_type: AccessLevel,
5626    /// The information about the membership group.
5627    pub group: GroupInfo,
5628    /// The permissions that requesting user has on this member. The set of permissions corresponds
5629    /// to the MemberActions in the request.
5630    pub permissions: Option<Vec<MemberPermission>>,
5631    /// Never set.
5632    pub initials: Option<String>,
5633    /// True if the member has access from a parent folder.
5634    pub is_inherited: bool,
5635}
5636
5637impl GroupMembershipInfo {
5638    pub fn new(access_type: AccessLevel, group: GroupInfo) -> Self {
5639        GroupMembershipInfo {
5640            access_type,
5641            group,
5642            permissions: None,
5643            initials: None,
5644            is_inherited: false,
5645        }
5646    }
5647
5648    pub fn with_permissions(mut self, value: Vec<MemberPermission>) -> Self {
5649        self.permissions = Some(value);
5650        self
5651    }
5652
5653    pub fn with_initials(mut self, value: String) -> Self {
5654        self.initials = Some(value);
5655        self
5656    }
5657
5658    pub fn with_is_inherited(mut self, value: bool) -> Self {
5659        self.is_inherited = value;
5660        self
5661    }
5662}
5663
5664const GROUP_MEMBERSHIP_INFO_FIELDS: &[&str] = &["access_type",
5665                                                "group",
5666                                                "permissions",
5667                                                "initials",
5668                                                "is_inherited"];
5669impl GroupMembershipInfo {
5670    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
5671        map: V,
5672    ) -> Result<GroupMembershipInfo, V::Error> {
5673        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
5674    }
5675
5676    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
5677        mut map: V,
5678        optional: bool,
5679    ) -> Result<Option<GroupMembershipInfo>, V::Error> {
5680        let mut field_access_type = None;
5681        let mut field_group = None;
5682        let mut field_permissions = None;
5683        let mut field_initials = None;
5684        let mut field_is_inherited = None;
5685        let mut nothing = true;
5686        while let Some(key) = map.next_key::<&str>()? {
5687            nothing = false;
5688            match key {
5689                "access_type" => {
5690                    if field_access_type.is_some() {
5691                        return Err(::serde::de::Error::duplicate_field("access_type"));
5692                    }
5693                    field_access_type = Some(map.next_value()?);
5694                }
5695                "group" => {
5696                    if field_group.is_some() {
5697                        return Err(::serde::de::Error::duplicate_field("group"));
5698                    }
5699                    field_group = Some(map.next_value()?);
5700                }
5701                "permissions" => {
5702                    if field_permissions.is_some() {
5703                        return Err(::serde::de::Error::duplicate_field("permissions"));
5704                    }
5705                    field_permissions = Some(map.next_value()?);
5706                }
5707                "initials" => {
5708                    if field_initials.is_some() {
5709                        return Err(::serde::de::Error::duplicate_field("initials"));
5710                    }
5711                    field_initials = Some(map.next_value()?);
5712                }
5713                "is_inherited" => {
5714                    if field_is_inherited.is_some() {
5715                        return Err(::serde::de::Error::duplicate_field("is_inherited"));
5716                    }
5717                    field_is_inherited = Some(map.next_value()?);
5718                }
5719                _ => {
5720                    // unknown field allowed and ignored
5721                    map.next_value::<::serde_json::Value>()?;
5722                }
5723            }
5724        }
5725        if optional && nothing {
5726            return Ok(None);
5727        }
5728        let result = GroupMembershipInfo {
5729            access_type: field_access_type.ok_or_else(|| ::serde::de::Error::missing_field("access_type"))?,
5730            group: field_group.ok_or_else(|| ::serde::de::Error::missing_field("group"))?,
5731            permissions: field_permissions.and_then(Option::flatten),
5732            initials: field_initials.and_then(Option::flatten),
5733            is_inherited: field_is_inherited.unwrap_or(false),
5734        };
5735        Ok(Some(result))
5736    }
5737
5738    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
5739        &self,
5740        s: &mut S::SerializeStruct,
5741    ) -> Result<(), S::Error> {
5742        use serde::ser::SerializeStruct;
5743        s.serialize_field("access_type", &self.access_type)?;
5744        s.serialize_field("group", &self.group)?;
5745        if let Some(val) = &self.permissions {
5746            s.serialize_field("permissions", val)?;
5747        }
5748        if let Some(val) = &self.initials {
5749            s.serialize_field("initials", val)?;
5750        }
5751        if self.is_inherited {
5752            s.serialize_field("is_inherited", &self.is_inherited)?;
5753        }
5754        Ok(())
5755    }
5756}
5757
5758impl<'de> ::serde::de::Deserialize<'de> for GroupMembershipInfo {
5759    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5760        // struct deserializer
5761        use serde::de::{MapAccess, Visitor};
5762        struct StructVisitor;
5763        impl<'de> Visitor<'de> for StructVisitor {
5764            type Value = GroupMembershipInfo;
5765            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5766                f.write_str("a GroupMembershipInfo struct")
5767            }
5768            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
5769                GroupMembershipInfo::internal_deserialize(map)
5770            }
5771        }
5772        deserializer.deserialize_struct("GroupMembershipInfo", GROUP_MEMBERSHIP_INFO_FIELDS, StructVisitor)
5773    }
5774}
5775
5776impl ::serde::ser::Serialize for GroupMembershipInfo {
5777    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5778        // struct serializer
5779        use serde::ser::SerializeStruct;
5780        let mut s = serializer.serialize_struct("GroupMembershipInfo", 5)?;
5781        self.internal_serialize::<S>(&mut s)?;
5782        s.end()
5783    }
5784}
5785
5786// struct extends MembershipInfo
5787impl From<GroupMembershipInfo> for MembershipInfo {
5788    fn from(subtype: GroupMembershipInfo) -> Self {
5789        Self {
5790            access_type: subtype.access_type,
5791            permissions: subtype.permissions,
5792            initials: subtype.initials,
5793            is_inherited: subtype.is_inherited,
5794        }
5795    }
5796}
5797#[derive(Debug, Clone, PartialEq, Eq)]
5798#[non_exhaustive] // structs may have more fields added in the future.
5799pub struct InsufficientPlan {
5800    /// A message to tell the user to upgrade in order to support expected action.
5801    pub message: String,
5802    /// A URL to send the user to in order to obtain the account type they need, e.g. upgrading.
5803    /// Absent if there is no action the user can take to upgrade.
5804    pub upsell_url: Option<String>,
5805}
5806
5807impl InsufficientPlan {
5808    pub fn new(message: String) -> Self {
5809        InsufficientPlan {
5810            message,
5811            upsell_url: None,
5812        }
5813    }
5814
5815    pub fn with_upsell_url(mut self, value: String) -> Self {
5816        self.upsell_url = Some(value);
5817        self
5818    }
5819}
5820
5821const INSUFFICIENT_PLAN_FIELDS: &[&str] = &["message",
5822                                            "upsell_url"];
5823impl InsufficientPlan {
5824    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
5825        map: V,
5826    ) -> Result<InsufficientPlan, V::Error> {
5827        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
5828    }
5829
5830    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
5831        mut map: V,
5832        optional: bool,
5833    ) -> Result<Option<InsufficientPlan>, V::Error> {
5834        let mut field_message = None;
5835        let mut field_upsell_url = None;
5836        let mut nothing = true;
5837        while let Some(key) = map.next_key::<&str>()? {
5838            nothing = false;
5839            match key {
5840                "message" => {
5841                    if field_message.is_some() {
5842                        return Err(::serde::de::Error::duplicate_field("message"));
5843                    }
5844                    field_message = Some(map.next_value()?);
5845                }
5846                "upsell_url" => {
5847                    if field_upsell_url.is_some() {
5848                        return Err(::serde::de::Error::duplicate_field("upsell_url"));
5849                    }
5850                    field_upsell_url = Some(map.next_value()?);
5851                }
5852                _ => {
5853                    // unknown field allowed and ignored
5854                    map.next_value::<::serde_json::Value>()?;
5855                }
5856            }
5857        }
5858        if optional && nothing {
5859            return Ok(None);
5860        }
5861        let result = InsufficientPlan {
5862            message: field_message.ok_or_else(|| ::serde::de::Error::missing_field("message"))?,
5863            upsell_url: field_upsell_url.and_then(Option::flatten),
5864        };
5865        Ok(Some(result))
5866    }
5867
5868    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
5869        &self,
5870        s: &mut S::SerializeStruct,
5871    ) -> Result<(), S::Error> {
5872        use serde::ser::SerializeStruct;
5873        s.serialize_field("message", &self.message)?;
5874        if let Some(val) = &self.upsell_url {
5875            s.serialize_field("upsell_url", val)?;
5876        }
5877        Ok(())
5878    }
5879}
5880
5881impl<'de> ::serde::de::Deserialize<'de> for InsufficientPlan {
5882    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5883        // struct deserializer
5884        use serde::de::{MapAccess, Visitor};
5885        struct StructVisitor;
5886        impl<'de> Visitor<'de> for StructVisitor {
5887            type Value = InsufficientPlan;
5888            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
5889                f.write_str("a InsufficientPlan struct")
5890            }
5891            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
5892                InsufficientPlan::internal_deserialize(map)
5893            }
5894        }
5895        deserializer.deserialize_struct("InsufficientPlan", INSUFFICIENT_PLAN_FIELDS, StructVisitor)
5896    }
5897}
5898
5899impl ::serde::ser::Serialize for InsufficientPlan {
5900    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5901        // struct serializer
5902        use serde::ser::SerializeStruct;
5903        let mut s = serializer.serialize_struct("InsufficientPlan", 2)?;
5904        self.internal_serialize::<S>(&mut s)?;
5905        s.end()
5906    }
5907}
5908
5909#[derive(Debug, Clone, PartialEq, Eq)]
5910#[non_exhaustive] // structs may have more fields added in the future.
5911pub struct InsufficientQuotaAmounts {
5912    /// The amount of space needed to add the item (the size of the item).
5913    pub space_needed: u64,
5914    /// The amount of extra space needed to add the item.
5915    pub space_shortage: u64,
5916    /// The amount of space left in the user's Dropbox, less than space_needed.
5917    pub space_left: u64,
5918}
5919
5920impl InsufficientQuotaAmounts {
5921    pub fn new(space_needed: u64, space_shortage: u64, space_left: u64) -> Self {
5922        InsufficientQuotaAmounts {
5923            space_needed,
5924            space_shortage,
5925            space_left,
5926        }
5927    }
5928}
5929
5930const INSUFFICIENT_QUOTA_AMOUNTS_FIELDS: &[&str] = &["space_needed",
5931                                                     "space_shortage",
5932                                                     "space_left"];
5933impl InsufficientQuotaAmounts {
5934    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
5935        map: V,
5936    ) -> Result<InsufficientQuotaAmounts, V::Error> {
5937        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
5938    }
5939
5940    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
5941        mut map: V,
5942        optional: bool,
5943    ) -> Result<Option<InsufficientQuotaAmounts>, V::Error> {
5944        let mut field_space_needed = None;
5945        let mut field_space_shortage = None;
5946        let mut field_space_left = None;
5947        let mut nothing = true;
5948        while let Some(key) = map.next_key::<&str>()? {
5949            nothing = false;
5950            match key {
5951                "space_needed" => {
5952                    if field_space_needed.is_some() {
5953                        return Err(::serde::de::Error::duplicate_field("space_needed"));
5954                    }
5955                    field_space_needed = Some(map.next_value()?);
5956                }
5957                "space_shortage" => {
5958                    if field_space_shortage.is_some() {
5959                        return Err(::serde::de::Error::duplicate_field("space_shortage"));
5960                    }
5961                    field_space_shortage = Some(map.next_value()?);
5962                }
5963                "space_left" => {
5964                    if field_space_left.is_some() {
5965                        return Err(::serde::de::Error::duplicate_field("space_left"));
5966                    }
5967                    field_space_left = Some(map.next_value()?);
5968                }
5969                _ => {
5970                    // unknown field allowed and ignored
5971                    map.next_value::<::serde_json::Value>()?;
5972                }
5973            }
5974        }
5975        if optional && nothing {
5976            return Ok(None);
5977        }
5978        let result = InsufficientQuotaAmounts {
5979            space_needed: field_space_needed.ok_or_else(|| ::serde::de::Error::missing_field("space_needed"))?,
5980            space_shortage: field_space_shortage.ok_or_else(|| ::serde::de::Error::missing_field("space_shortage"))?,
5981            space_left: field_space_left.ok_or_else(|| ::serde::de::Error::missing_field("space_left"))?,
5982        };
5983        Ok(Some(result))
5984    }
5985
5986    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
5987        &self,
5988        s: &mut S::SerializeStruct,
5989    ) -> Result<(), S::Error> {
5990        use serde::ser::SerializeStruct;
5991        s.serialize_field("space_needed", &self.space_needed)?;
5992        s.serialize_field("space_shortage", &self.space_shortage)?;
5993        s.serialize_field("space_left", &self.space_left)?;
5994        Ok(())
5995    }
5996}
5997
5998impl<'de> ::serde::de::Deserialize<'de> for InsufficientQuotaAmounts {
5999    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6000        // struct deserializer
6001        use serde::de::{MapAccess, Visitor};
6002        struct StructVisitor;
6003        impl<'de> Visitor<'de> for StructVisitor {
6004            type Value = InsufficientQuotaAmounts;
6005            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6006                f.write_str("a InsufficientQuotaAmounts struct")
6007            }
6008            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
6009                InsufficientQuotaAmounts::internal_deserialize(map)
6010            }
6011        }
6012        deserializer.deserialize_struct("InsufficientQuotaAmounts", INSUFFICIENT_QUOTA_AMOUNTS_FIELDS, StructVisitor)
6013    }
6014}
6015
6016impl ::serde::ser::Serialize for InsufficientQuotaAmounts {
6017    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6018        // struct serializer
6019        use serde::ser::SerializeStruct;
6020        let mut s = serializer.serialize_struct("InsufficientQuotaAmounts", 3)?;
6021        self.internal_serialize::<S>(&mut s)?;
6022        s.end()
6023    }
6024}
6025
6026/// Information about the recipient of a shared content invitation.
6027#[derive(Debug, Clone, PartialEq, Eq)]
6028#[non_exhaustive] // variants may be added in the future
6029pub enum InviteeInfo {
6030    /// Email address of invited user.
6031    Email(crate::types::common::EmailAddress),
6032    /// Catch-all used for unrecognized values returned from the server. Encountering this value
6033    /// typically indicates that this SDK version is out of date.
6034    Other,
6035}
6036
6037impl<'de> ::serde::de::Deserialize<'de> for InviteeInfo {
6038    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6039        // union deserializer
6040        use serde::de::{self, MapAccess, Visitor};
6041        struct EnumVisitor;
6042        impl<'de> Visitor<'de> for EnumVisitor {
6043            type Value = InviteeInfo;
6044            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6045                f.write_str("a InviteeInfo structure")
6046            }
6047            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
6048                let tag: &str = match map.next_key()? {
6049                    Some(".tag") => map.next_value()?,
6050                    _ => return Err(de::Error::missing_field(".tag"))
6051                };
6052                let value = match tag {
6053                    "email" => {
6054                        match map.next_key()? {
6055                            Some("email") => InviteeInfo::Email(map.next_value()?),
6056                            None => return Err(de::Error::missing_field("email")),
6057                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
6058                        }
6059                    }
6060                    _ => InviteeInfo::Other,
6061                };
6062                crate::eat_json_fields(&mut map)?;
6063                Ok(value)
6064            }
6065        }
6066        const VARIANTS: &[&str] = &["email",
6067                                    "other"];
6068        deserializer.deserialize_struct("InviteeInfo", VARIANTS, EnumVisitor)
6069    }
6070}
6071
6072impl ::serde::ser::Serialize for InviteeInfo {
6073    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6074        // union serializer
6075        use serde::ser::SerializeStruct;
6076        match self {
6077            InviteeInfo::Email(x) => {
6078                // primitive
6079                let mut s = serializer.serialize_struct("InviteeInfo", 2)?;
6080                s.serialize_field(".tag", "email")?;
6081                s.serialize_field("email", x)?;
6082                s.end()
6083            }
6084            InviteeInfo::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
6085        }
6086    }
6087}
6088
6089/// Information about an invited member of a shared content.
6090#[derive(Debug, Clone, PartialEq, Eq)]
6091#[non_exhaustive] // structs may have more fields added in the future.
6092pub struct InviteeMembershipInfo {
6093    /// The access type for this member. It contains inherited access type from parent folder, and
6094    /// acquired access type from this folder.
6095    pub access_type: AccessLevel,
6096    /// Recipient of the invitation.
6097    pub invitee: InviteeInfo,
6098    /// The permissions that requesting user has on this member. The set of permissions corresponds
6099    /// to the MemberActions in the request.
6100    pub permissions: Option<Vec<MemberPermission>>,
6101    /// Never set.
6102    pub initials: Option<String>,
6103    /// True if the member has access from a parent folder.
6104    pub is_inherited: bool,
6105    /// The user this invitation is tied to, if available.
6106    pub user: Option<UserInfo>,
6107}
6108
6109impl InviteeMembershipInfo {
6110    pub fn new(access_type: AccessLevel, invitee: InviteeInfo) -> Self {
6111        InviteeMembershipInfo {
6112            access_type,
6113            invitee,
6114            permissions: None,
6115            initials: None,
6116            is_inherited: false,
6117            user: None,
6118        }
6119    }
6120
6121    pub fn with_permissions(mut self, value: Vec<MemberPermission>) -> Self {
6122        self.permissions = Some(value);
6123        self
6124    }
6125
6126    pub fn with_initials(mut self, value: String) -> Self {
6127        self.initials = Some(value);
6128        self
6129    }
6130
6131    pub fn with_is_inherited(mut self, value: bool) -> Self {
6132        self.is_inherited = value;
6133        self
6134    }
6135
6136    pub fn with_user(mut self, value: UserInfo) -> Self {
6137        self.user = Some(value);
6138        self
6139    }
6140}
6141
6142const INVITEE_MEMBERSHIP_INFO_FIELDS: &[&str] = &["access_type",
6143                                                  "invitee",
6144                                                  "permissions",
6145                                                  "initials",
6146                                                  "is_inherited",
6147                                                  "user"];
6148impl InviteeMembershipInfo {
6149    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
6150        map: V,
6151    ) -> Result<InviteeMembershipInfo, V::Error> {
6152        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
6153    }
6154
6155    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
6156        mut map: V,
6157        optional: bool,
6158    ) -> Result<Option<InviteeMembershipInfo>, V::Error> {
6159        let mut field_access_type = None;
6160        let mut field_invitee = None;
6161        let mut field_permissions = None;
6162        let mut field_initials = None;
6163        let mut field_is_inherited = None;
6164        let mut field_user = None;
6165        let mut nothing = true;
6166        while let Some(key) = map.next_key::<&str>()? {
6167            nothing = false;
6168            match key {
6169                "access_type" => {
6170                    if field_access_type.is_some() {
6171                        return Err(::serde::de::Error::duplicate_field("access_type"));
6172                    }
6173                    field_access_type = Some(map.next_value()?);
6174                }
6175                "invitee" => {
6176                    if field_invitee.is_some() {
6177                        return Err(::serde::de::Error::duplicate_field("invitee"));
6178                    }
6179                    field_invitee = Some(map.next_value()?);
6180                }
6181                "permissions" => {
6182                    if field_permissions.is_some() {
6183                        return Err(::serde::de::Error::duplicate_field("permissions"));
6184                    }
6185                    field_permissions = Some(map.next_value()?);
6186                }
6187                "initials" => {
6188                    if field_initials.is_some() {
6189                        return Err(::serde::de::Error::duplicate_field("initials"));
6190                    }
6191                    field_initials = Some(map.next_value()?);
6192                }
6193                "is_inherited" => {
6194                    if field_is_inherited.is_some() {
6195                        return Err(::serde::de::Error::duplicate_field("is_inherited"));
6196                    }
6197                    field_is_inherited = Some(map.next_value()?);
6198                }
6199                "user" => {
6200                    if field_user.is_some() {
6201                        return Err(::serde::de::Error::duplicate_field("user"));
6202                    }
6203                    field_user = Some(map.next_value()?);
6204                }
6205                _ => {
6206                    // unknown field allowed and ignored
6207                    map.next_value::<::serde_json::Value>()?;
6208                }
6209            }
6210        }
6211        if optional && nothing {
6212            return Ok(None);
6213        }
6214        let result = InviteeMembershipInfo {
6215            access_type: field_access_type.ok_or_else(|| ::serde::de::Error::missing_field("access_type"))?,
6216            invitee: field_invitee.ok_or_else(|| ::serde::de::Error::missing_field("invitee"))?,
6217            permissions: field_permissions.and_then(Option::flatten),
6218            initials: field_initials.and_then(Option::flatten),
6219            is_inherited: field_is_inherited.unwrap_or(false),
6220            user: field_user.and_then(Option::flatten),
6221        };
6222        Ok(Some(result))
6223    }
6224
6225    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
6226        &self,
6227        s: &mut S::SerializeStruct,
6228    ) -> Result<(), S::Error> {
6229        use serde::ser::SerializeStruct;
6230        s.serialize_field("access_type", &self.access_type)?;
6231        s.serialize_field("invitee", &self.invitee)?;
6232        if let Some(val) = &self.permissions {
6233            s.serialize_field("permissions", val)?;
6234        }
6235        if let Some(val) = &self.initials {
6236            s.serialize_field("initials", val)?;
6237        }
6238        if self.is_inherited {
6239            s.serialize_field("is_inherited", &self.is_inherited)?;
6240        }
6241        if let Some(val) = &self.user {
6242            s.serialize_field("user", val)?;
6243        }
6244        Ok(())
6245    }
6246}
6247
6248impl<'de> ::serde::de::Deserialize<'de> for InviteeMembershipInfo {
6249    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6250        // struct deserializer
6251        use serde::de::{MapAccess, Visitor};
6252        struct StructVisitor;
6253        impl<'de> Visitor<'de> for StructVisitor {
6254            type Value = InviteeMembershipInfo;
6255            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6256                f.write_str("a InviteeMembershipInfo struct")
6257            }
6258            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
6259                InviteeMembershipInfo::internal_deserialize(map)
6260            }
6261        }
6262        deserializer.deserialize_struct("InviteeMembershipInfo", INVITEE_MEMBERSHIP_INFO_FIELDS, StructVisitor)
6263    }
6264}
6265
6266impl ::serde::ser::Serialize for InviteeMembershipInfo {
6267    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6268        // struct serializer
6269        use serde::ser::SerializeStruct;
6270        let mut s = serializer.serialize_struct("InviteeMembershipInfo", 6)?;
6271        self.internal_serialize::<S>(&mut s)?;
6272        s.end()
6273    }
6274}
6275
6276// struct extends MembershipInfo
6277impl From<InviteeMembershipInfo> for MembershipInfo {
6278    fn from(subtype: InviteeMembershipInfo) -> Self {
6279        Self {
6280            access_type: subtype.access_type,
6281            permissions: subtype.permissions,
6282            initials: subtype.initials,
6283            is_inherited: subtype.is_inherited,
6284        }
6285    }
6286}
6287/// Error occurred while performing an asynchronous job from
6288/// [`unshare_folder()`](crate::sharing::unshare_folder) or
6289/// [`remove_folder_member()`](crate::sharing::remove_folder_member).
6290#[derive(Debug, Clone, PartialEq, Eq)]
6291#[non_exhaustive] // variants may be added in the future
6292pub enum JobError {
6293    /// Error occurred while performing [`unshare_folder()`](crate::sharing::unshare_folder) action.
6294    UnshareFolderError(UnshareFolderError),
6295    /// Error occurred while performing
6296    /// [`remove_folder_member()`](crate::sharing::remove_folder_member) action.
6297    RemoveFolderMemberError(RemoveFolderMemberError),
6298    /// Error occurred while performing
6299    /// [`relinquish_folder_membership()`](crate::sharing::relinquish_folder_membership) action.
6300    RelinquishFolderMembershipError(RelinquishFolderMembershipError),
6301    /// Catch-all used for unrecognized values returned from the server. Encountering this value
6302    /// typically indicates that this SDK version is out of date.
6303    Other,
6304}
6305
6306impl<'de> ::serde::de::Deserialize<'de> for JobError {
6307    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6308        // union deserializer
6309        use serde::de::{self, MapAccess, Visitor};
6310        struct EnumVisitor;
6311        impl<'de> Visitor<'de> for EnumVisitor {
6312            type Value = JobError;
6313            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6314                f.write_str("a JobError structure")
6315            }
6316            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
6317                let tag: &str = match map.next_key()? {
6318                    Some(".tag") => map.next_value()?,
6319                    _ => return Err(de::Error::missing_field(".tag"))
6320                };
6321                let value = match tag {
6322                    "unshare_folder_error" => {
6323                        match map.next_key()? {
6324                            Some("unshare_folder_error") => JobError::UnshareFolderError(map.next_value()?),
6325                            None => return Err(de::Error::missing_field("unshare_folder_error")),
6326                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
6327                        }
6328                    }
6329                    "remove_folder_member_error" => {
6330                        match map.next_key()? {
6331                            Some("remove_folder_member_error") => JobError::RemoveFolderMemberError(map.next_value()?),
6332                            None => return Err(de::Error::missing_field("remove_folder_member_error")),
6333                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
6334                        }
6335                    }
6336                    "relinquish_folder_membership_error" => {
6337                        match map.next_key()? {
6338                            Some("relinquish_folder_membership_error") => JobError::RelinquishFolderMembershipError(map.next_value()?),
6339                            None => return Err(de::Error::missing_field("relinquish_folder_membership_error")),
6340                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
6341                        }
6342                    }
6343                    _ => JobError::Other,
6344                };
6345                crate::eat_json_fields(&mut map)?;
6346                Ok(value)
6347            }
6348        }
6349        const VARIANTS: &[&str] = &["unshare_folder_error",
6350                                    "remove_folder_member_error",
6351                                    "relinquish_folder_membership_error",
6352                                    "other"];
6353        deserializer.deserialize_struct("JobError", VARIANTS, EnumVisitor)
6354    }
6355}
6356
6357impl ::serde::ser::Serialize for JobError {
6358    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6359        // union serializer
6360        use serde::ser::SerializeStruct;
6361        match self {
6362            JobError::UnshareFolderError(x) => {
6363                // union or polymporphic struct
6364                let mut s = serializer.serialize_struct("JobError", 2)?;
6365                s.serialize_field(".tag", "unshare_folder_error")?;
6366                s.serialize_field("unshare_folder_error", x)?;
6367                s.end()
6368            }
6369            JobError::RemoveFolderMemberError(x) => {
6370                // union or polymporphic struct
6371                let mut s = serializer.serialize_struct("JobError", 2)?;
6372                s.serialize_field(".tag", "remove_folder_member_error")?;
6373                s.serialize_field("remove_folder_member_error", x)?;
6374                s.end()
6375            }
6376            JobError::RelinquishFolderMembershipError(x) => {
6377                // union or polymporphic struct
6378                let mut s = serializer.serialize_struct("JobError", 2)?;
6379                s.serialize_field(".tag", "relinquish_folder_membership_error")?;
6380                s.serialize_field("relinquish_folder_membership_error", x)?;
6381                s.end()
6382            }
6383            JobError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
6384        }
6385    }
6386}
6387
6388impl ::std::error::Error for JobError {
6389    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
6390        match self {
6391            JobError::UnshareFolderError(inner) => Some(inner),
6392            JobError::RemoveFolderMemberError(inner) => Some(inner),
6393            JobError::RelinquishFolderMembershipError(inner) => Some(inner),
6394            _ => None,
6395        }
6396    }
6397}
6398
6399impl ::std::fmt::Display for JobError {
6400    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6401        match self {
6402            JobError::UnshareFolderError(inner) => write!(f, "JobError: {}", inner),
6403            JobError::RemoveFolderMemberError(inner) => write!(f, "JobError: {}", inner),
6404            JobError::RelinquishFolderMembershipError(inner) => write!(f, "JobError: {}", inner),
6405            _ => write!(f, "{:?}", *self),
6406        }
6407    }
6408}
6409
6410#[derive(Debug, Clone, PartialEq, Eq)]
6411pub enum JobStatus {
6412    /// The asynchronous job is still in progress.
6413    InProgress,
6414    /// The asynchronous job has finished.
6415    Complete,
6416    /// The asynchronous job returned an error.
6417    Failed(JobError),
6418}
6419
6420impl<'de> ::serde::de::Deserialize<'de> for JobStatus {
6421    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6422        // union deserializer
6423        use serde::de::{self, MapAccess, Visitor};
6424        struct EnumVisitor;
6425        impl<'de> Visitor<'de> for EnumVisitor {
6426            type Value = JobStatus;
6427            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6428                f.write_str("a JobStatus structure")
6429            }
6430            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
6431                let tag: &str = match map.next_key()? {
6432                    Some(".tag") => map.next_value()?,
6433                    _ => return Err(de::Error::missing_field(".tag"))
6434                };
6435                let value = match tag {
6436                    "in_progress" => JobStatus::InProgress,
6437                    "complete" => JobStatus::Complete,
6438                    "failed" => {
6439                        match map.next_key()? {
6440                            Some("failed") => JobStatus::Failed(map.next_value()?),
6441                            None => return Err(de::Error::missing_field("failed")),
6442                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
6443                        }
6444                    }
6445                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
6446                };
6447                crate::eat_json_fields(&mut map)?;
6448                Ok(value)
6449            }
6450        }
6451        const VARIANTS: &[&str] = &["in_progress",
6452                                    "complete",
6453                                    "failed"];
6454        deserializer.deserialize_struct("JobStatus", VARIANTS, EnumVisitor)
6455    }
6456}
6457
6458impl ::serde::ser::Serialize for JobStatus {
6459    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6460        // union serializer
6461        use serde::ser::SerializeStruct;
6462        match self {
6463            JobStatus::InProgress => {
6464                // unit
6465                let mut s = serializer.serialize_struct("JobStatus", 1)?;
6466                s.serialize_field(".tag", "in_progress")?;
6467                s.end()
6468            }
6469            JobStatus::Complete => {
6470                // unit
6471                let mut s = serializer.serialize_struct("JobStatus", 1)?;
6472                s.serialize_field(".tag", "complete")?;
6473                s.end()
6474            }
6475            JobStatus::Failed(x) => {
6476                // union or polymporphic struct
6477                let mut s = serializer.serialize_struct("JobStatus", 2)?;
6478                s.serialize_field(".tag", "failed")?;
6479                s.serialize_field("failed", x)?;
6480                s.end()
6481            }
6482        }
6483    }
6484}
6485
6486// union extends crate::types::dbx_async::PollResultBase
6487impl From<crate::types::dbx_async::PollResultBase> for JobStatus {
6488    fn from(parent: crate::types::dbx_async::PollResultBase) -> Self {
6489        match parent {
6490            crate::types::dbx_async::PollResultBase::InProgress => JobStatus::InProgress,
6491        }
6492    }
6493}
6494#[derive(Debug, Clone, PartialEq, Eq)]
6495#[non_exhaustive] // variants may be added in the future
6496pub enum LinkAccessLevel {
6497    /// Users who use the link can view and comment on the content.
6498    Viewer,
6499    /// Users who use the link can edit, view and comment on the content.
6500    Editor,
6501    /// Catch-all used for unrecognized values returned from the server. Encountering this value
6502    /// typically indicates that this SDK version is out of date.
6503    Other,
6504}
6505
6506impl<'de> ::serde::de::Deserialize<'de> for LinkAccessLevel {
6507    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6508        // union deserializer
6509        use serde::de::{self, MapAccess, Visitor};
6510        struct EnumVisitor;
6511        impl<'de> Visitor<'de> for EnumVisitor {
6512            type Value = LinkAccessLevel;
6513            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6514                f.write_str("a LinkAccessLevel structure")
6515            }
6516            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
6517                let tag: &str = match map.next_key()? {
6518                    Some(".tag") => map.next_value()?,
6519                    _ => return Err(de::Error::missing_field(".tag"))
6520                };
6521                let value = match tag {
6522                    "viewer" => LinkAccessLevel::Viewer,
6523                    "editor" => LinkAccessLevel::Editor,
6524                    _ => LinkAccessLevel::Other,
6525                };
6526                crate::eat_json_fields(&mut map)?;
6527                Ok(value)
6528            }
6529        }
6530        const VARIANTS: &[&str] = &["viewer",
6531                                    "editor",
6532                                    "other"];
6533        deserializer.deserialize_struct("LinkAccessLevel", VARIANTS, EnumVisitor)
6534    }
6535}
6536
6537impl ::serde::ser::Serialize for LinkAccessLevel {
6538    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6539        // union serializer
6540        use serde::ser::SerializeStruct;
6541        match self {
6542            LinkAccessLevel::Viewer => {
6543                // unit
6544                let mut s = serializer.serialize_struct("LinkAccessLevel", 1)?;
6545                s.serialize_field(".tag", "viewer")?;
6546                s.end()
6547            }
6548            LinkAccessLevel::Editor => {
6549                // unit
6550                let mut s = serializer.serialize_struct("LinkAccessLevel", 1)?;
6551                s.serialize_field(".tag", "editor")?;
6552                s.end()
6553            }
6554            LinkAccessLevel::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
6555        }
6556    }
6557}
6558
6559/// Actions that can be performed on a link.
6560#[derive(Debug, Clone, PartialEq, Eq)]
6561#[non_exhaustive] // variants may be added in the future
6562pub enum LinkAction {
6563    /// Change the access level of the link.
6564    ChangeAccessLevel,
6565    /// Change the audience of the link.
6566    ChangeAudience,
6567    /// Remove the expiry date of the link.
6568    RemoveExpiry,
6569    /// Remove the password of the link.
6570    RemovePassword,
6571    /// Create or modify the expiry date of the link.
6572    SetExpiry,
6573    /// Create or modify the password of the link.
6574    SetPassword,
6575    /// Catch-all used for unrecognized values returned from the server. Encountering this value
6576    /// typically indicates that this SDK version is out of date.
6577    Other,
6578}
6579
6580impl<'de> ::serde::de::Deserialize<'de> for LinkAction {
6581    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6582        // union deserializer
6583        use serde::de::{self, MapAccess, Visitor};
6584        struct EnumVisitor;
6585        impl<'de> Visitor<'de> for EnumVisitor {
6586            type Value = LinkAction;
6587            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6588                f.write_str("a LinkAction structure")
6589            }
6590            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
6591                let tag: &str = match map.next_key()? {
6592                    Some(".tag") => map.next_value()?,
6593                    _ => return Err(de::Error::missing_field(".tag"))
6594                };
6595                let value = match tag {
6596                    "change_access_level" => LinkAction::ChangeAccessLevel,
6597                    "change_audience" => LinkAction::ChangeAudience,
6598                    "remove_expiry" => LinkAction::RemoveExpiry,
6599                    "remove_password" => LinkAction::RemovePassword,
6600                    "set_expiry" => LinkAction::SetExpiry,
6601                    "set_password" => LinkAction::SetPassword,
6602                    _ => LinkAction::Other,
6603                };
6604                crate::eat_json_fields(&mut map)?;
6605                Ok(value)
6606            }
6607        }
6608        const VARIANTS: &[&str] = &["change_access_level",
6609                                    "change_audience",
6610                                    "remove_expiry",
6611                                    "remove_password",
6612                                    "set_expiry",
6613                                    "set_password",
6614                                    "other"];
6615        deserializer.deserialize_struct("LinkAction", VARIANTS, EnumVisitor)
6616    }
6617}
6618
6619impl ::serde::ser::Serialize for LinkAction {
6620    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6621        // union serializer
6622        use serde::ser::SerializeStruct;
6623        match self {
6624            LinkAction::ChangeAccessLevel => {
6625                // unit
6626                let mut s = serializer.serialize_struct("LinkAction", 1)?;
6627                s.serialize_field(".tag", "change_access_level")?;
6628                s.end()
6629            }
6630            LinkAction::ChangeAudience => {
6631                // unit
6632                let mut s = serializer.serialize_struct("LinkAction", 1)?;
6633                s.serialize_field(".tag", "change_audience")?;
6634                s.end()
6635            }
6636            LinkAction::RemoveExpiry => {
6637                // unit
6638                let mut s = serializer.serialize_struct("LinkAction", 1)?;
6639                s.serialize_field(".tag", "remove_expiry")?;
6640                s.end()
6641            }
6642            LinkAction::RemovePassword => {
6643                // unit
6644                let mut s = serializer.serialize_struct("LinkAction", 1)?;
6645                s.serialize_field(".tag", "remove_password")?;
6646                s.end()
6647            }
6648            LinkAction::SetExpiry => {
6649                // unit
6650                let mut s = serializer.serialize_struct("LinkAction", 1)?;
6651                s.serialize_field(".tag", "set_expiry")?;
6652                s.end()
6653            }
6654            LinkAction::SetPassword => {
6655                // unit
6656                let mut s = serializer.serialize_struct("LinkAction", 1)?;
6657                s.serialize_field(".tag", "set_password")?;
6658                s.end()
6659            }
6660            LinkAction::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
6661        }
6662    }
6663}
6664
6665#[derive(Debug, Clone, PartialEq, Eq)]
6666#[non_exhaustive] // variants may be added in the future
6667pub enum LinkAudience {
6668    /// Link is accessible by anyone.
6669    Public,
6670    /// Link is accessible only by team members.
6671    Team,
6672    /// The link can be used by no one. The link merely points the user to the content, and does not
6673    /// grant additional rights to the user. Members of the content who use this link can only
6674    /// access the content with their pre-existing access rights.
6675    NoOne,
6676    /// Use `require_password` instead. A link-specific password is required to access the link.
6677    /// Login is not required.
6678    Password,
6679    /// Link is accessible only by members of the content.
6680    Members,
6681    /// Catch-all used for unrecognized values returned from the server. Encountering this value
6682    /// typically indicates that this SDK version is out of date.
6683    Other,
6684}
6685
6686impl<'de> ::serde::de::Deserialize<'de> for LinkAudience {
6687    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6688        // union deserializer
6689        use serde::de::{self, MapAccess, Visitor};
6690        struct EnumVisitor;
6691        impl<'de> Visitor<'de> for EnumVisitor {
6692            type Value = LinkAudience;
6693            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6694                f.write_str("a LinkAudience structure")
6695            }
6696            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
6697                let tag: &str = match map.next_key()? {
6698                    Some(".tag") => map.next_value()?,
6699                    _ => return Err(de::Error::missing_field(".tag"))
6700                };
6701                let value = match tag {
6702                    "public" => LinkAudience::Public,
6703                    "team" => LinkAudience::Team,
6704                    "no_one" => LinkAudience::NoOne,
6705                    "password" => LinkAudience::Password,
6706                    "members" => LinkAudience::Members,
6707                    _ => LinkAudience::Other,
6708                };
6709                crate::eat_json_fields(&mut map)?;
6710                Ok(value)
6711            }
6712        }
6713        const VARIANTS: &[&str] = &["public",
6714                                    "team",
6715                                    "no_one",
6716                                    "password",
6717                                    "members",
6718                                    "other"];
6719        deserializer.deserialize_struct("LinkAudience", VARIANTS, EnumVisitor)
6720    }
6721}
6722
6723impl ::serde::ser::Serialize for LinkAudience {
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            LinkAudience::Public => {
6729                // unit
6730                let mut s = serializer.serialize_struct("LinkAudience", 1)?;
6731                s.serialize_field(".tag", "public")?;
6732                s.end()
6733            }
6734            LinkAudience::Team => {
6735                // unit
6736                let mut s = serializer.serialize_struct("LinkAudience", 1)?;
6737                s.serialize_field(".tag", "team")?;
6738                s.end()
6739            }
6740            LinkAudience::NoOne => {
6741                // unit
6742                let mut s = serializer.serialize_struct("LinkAudience", 1)?;
6743                s.serialize_field(".tag", "no_one")?;
6744                s.end()
6745            }
6746            LinkAudience::Password => {
6747                // unit
6748                let mut s = serializer.serialize_struct("LinkAudience", 1)?;
6749                s.serialize_field(".tag", "password")?;
6750                s.end()
6751            }
6752            LinkAudience::Members => {
6753                // unit
6754                let mut s = serializer.serialize_struct("LinkAudience", 1)?;
6755                s.serialize_field(".tag", "members")?;
6756                s.end()
6757            }
6758            LinkAudience::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
6759        }
6760    }
6761}
6762
6763/// check documentation for VisibilityPolicyDisallowedReason.
6764#[derive(Debug, Clone, PartialEq, Eq)]
6765#[non_exhaustive] // variants may be added in the future
6766pub enum LinkAudienceDisallowedReason {
6767    /// The user needs to delete and recreate the link to change the visibility policy.
6768    DeleteAndRecreate,
6769    /// The parent shared folder restricts sharing of links outside the shared folder. To change the
6770    /// visibility policy, remove the restriction from the parent shared folder.
6771    RestrictedBySharedFolder,
6772    /// The team policy prevents links being shared outside the team.
6773    RestrictedByTeam,
6774    /// The user needs to be on a team to set this policy.
6775    UserNotOnTeam,
6776    /// The user is a basic user or is on a limited team.
6777    UserAccountType,
6778    /// The user does not have permission.
6779    PermissionDenied,
6780    /// Catch-all used for unrecognized values returned from the server. Encountering this value
6781    /// typically indicates that this SDK version is out of date.
6782    Other,
6783}
6784
6785impl<'de> ::serde::de::Deserialize<'de> for LinkAudienceDisallowedReason {
6786    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6787        // union deserializer
6788        use serde::de::{self, MapAccess, Visitor};
6789        struct EnumVisitor;
6790        impl<'de> Visitor<'de> for EnumVisitor {
6791            type Value = LinkAudienceDisallowedReason;
6792            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6793                f.write_str("a LinkAudienceDisallowedReason structure")
6794            }
6795            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
6796                let tag: &str = match map.next_key()? {
6797                    Some(".tag") => map.next_value()?,
6798                    _ => return Err(de::Error::missing_field(".tag"))
6799                };
6800                let value = match tag {
6801                    "delete_and_recreate" => LinkAudienceDisallowedReason::DeleteAndRecreate,
6802                    "restricted_by_shared_folder" => LinkAudienceDisallowedReason::RestrictedBySharedFolder,
6803                    "restricted_by_team" => LinkAudienceDisallowedReason::RestrictedByTeam,
6804                    "user_not_on_team" => LinkAudienceDisallowedReason::UserNotOnTeam,
6805                    "user_account_type" => LinkAudienceDisallowedReason::UserAccountType,
6806                    "permission_denied" => LinkAudienceDisallowedReason::PermissionDenied,
6807                    _ => LinkAudienceDisallowedReason::Other,
6808                };
6809                crate::eat_json_fields(&mut map)?;
6810                Ok(value)
6811            }
6812        }
6813        const VARIANTS: &[&str] = &["delete_and_recreate",
6814                                    "restricted_by_shared_folder",
6815                                    "restricted_by_team",
6816                                    "user_not_on_team",
6817                                    "user_account_type",
6818                                    "permission_denied",
6819                                    "other"];
6820        deserializer.deserialize_struct("LinkAudienceDisallowedReason", VARIANTS, EnumVisitor)
6821    }
6822}
6823
6824impl ::serde::ser::Serialize for LinkAudienceDisallowedReason {
6825    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6826        // union serializer
6827        use serde::ser::SerializeStruct;
6828        match self {
6829            LinkAudienceDisallowedReason::DeleteAndRecreate => {
6830                // unit
6831                let mut s = serializer.serialize_struct("LinkAudienceDisallowedReason", 1)?;
6832                s.serialize_field(".tag", "delete_and_recreate")?;
6833                s.end()
6834            }
6835            LinkAudienceDisallowedReason::RestrictedBySharedFolder => {
6836                // unit
6837                let mut s = serializer.serialize_struct("LinkAudienceDisallowedReason", 1)?;
6838                s.serialize_field(".tag", "restricted_by_shared_folder")?;
6839                s.end()
6840            }
6841            LinkAudienceDisallowedReason::RestrictedByTeam => {
6842                // unit
6843                let mut s = serializer.serialize_struct("LinkAudienceDisallowedReason", 1)?;
6844                s.serialize_field(".tag", "restricted_by_team")?;
6845                s.end()
6846            }
6847            LinkAudienceDisallowedReason::UserNotOnTeam => {
6848                // unit
6849                let mut s = serializer.serialize_struct("LinkAudienceDisallowedReason", 1)?;
6850                s.serialize_field(".tag", "user_not_on_team")?;
6851                s.end()
6852            }
6853            LinkAudienceDisallowedReason::UserAccountType => {
6854                // unit
6855                let mut s = serializer.serialize_struct("LinkAudienceDisallowedReason", 1)?;
6856                s.serialize_field(".tag", "user_account_type")?;
6857                s.end()
6858            }
6859            LinkAudienceDisallowedReason::PermissionDenied => {
6860                // unit
6861                let mut s = serializer.serialize_struct("LinkAudienceDisallowedReason", 1)?;
6862                s.serialize_field(".tag", "permission_denied")?;
6863                s.end()
6864            }
6865            LinkAudienceDisallowedReason::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
6866        }
6867    }
6868}
6869
6870// union extends VisibilityPolicyDisallowedReason
6871impl From<VisibilityPolicyDisallowedReason> for LinkAudienceDisallowedReason {
6872    fn from(parent: VisibilityPolicyDisallowedReason) -> Self {
6873        match parent {
6874            VisibilityPolicyDisallowedReason::DeleteAndRecreate => LinkAudienceDisallowedReason::DeleteAndRecreate,
6875            VisibilityPolicyDisallowedReason::RestrictedBySharedFolder => LinkAudienceDisallowedReason::RestrictedBySharedFolder,
6876            VisibilityPolicyDisallowedReason::RestrictedByTeam => LinkAudienceDisallowedReason::RestrictedByTeam,
6877            VisibilityPolicyDisallowedReason::UserNotOnTeam => LinkAudienceDisallowedReason::UserNotOnTeam,
6878            VisibilityPolicyDisallowedReason::UserAccountType => LinkAudienceDisallowedReason::UserAccountType,
6879            VisibilityPolicyDisallowedReason::PermissionDenied => LinkAudienceDisallowedReason::PermissionDenied,
6880            VisibilityPolicyDisallowedReason::Other => LinkAudienceDisallowedReason::Other,
6881        }
6882    }
6883}
6884#[derive(Debug, Clone, PartialEq, Eq)]
6885#[non_exhaustive] // structs may have more fields added in the future.
6886pub struct LinkAudienceOption {
6887    /// Specifies who can access the link.
6888    pub audience: LinkAudience,
6889    /// Whether the user calling this API can select this audience option.
6890    pub allowed: bool,
6891    /// If `allowed` is `false`, this will provide the reason that the user is not permitted to set
6892    /// the visibility to this policy.
6893    pub disallowed_reason: Option<LinkAudienceDisallowedReason>,
6894}
6895
6896impl LinkAudienceOption {
6897    pub fn new(audience: LinkAudience, allowed: bool) -> Self {
6898        LinkAudienceOption {
6899            audience,
6900            allowed,
6901            disallowed_reason: None,
6902        }
6903    }
6904
6905    pub fn with_disallowed_reason(mut self, value: LinkAudienceDisallowedReason) -> Self {
6906        self.disallowed_reason = Some(value);
6907        self
6908    }
6909}
6910
6911const LINK_AUDIENCE_OPTION_FIELDS: &[&str] = &["audience",
6912                                               "allowed",
6913                                               "disallowed_reason"];
6914impl LinkAudienceOption {
6915    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
6916        map: V,
6917    ) -> Result<LinkAudienceOption, V::Error> {
6918        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
6919    }
6920
6921    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
6922        mut map: V,
6923        optional: bool,
6924    ) -> Result<Option<LinkAudienceOption>, V::Error> {
6925        let mut field_audience = None;
6926        let mut field_allowed = None;
6927        let mut field_disallowed_reason = None;
6928        let mut nothing = true;
6929        while let Some(key) = map.next_key::<&str>()? {
6930            nothing = false;
6931            match key {
6932                "audience" => {
6933                    if field_audience.is_some() {
6934                        return Err(::serde::de::Error::duplicate_field("audience"));
6935                    }
6936                    field_audience = Some(map.next_value()?);
6937                }
6938                "allowed" => {
6939                    if field_allowed.is_some() {
6940                        return Err(::serde::de::Error::duplicate_field("allowed"));
6941                    }
6942                    field_allowed = Some(map.next_value()?);
6943                }
6944                "disallowed_reason" => {
6945                    if field_disallowed_reason.is_some() {
6946                        return Err(::serde::de::Error::duplicate_field("disallowed_reason"));
6947                    }
6948                    field_disallowed_reason = Some(map.next_value()?);
6949                }
6950                _ => {
6951                    // unknown field allowed and ignored
6952                    map.next_value::<::serde_json::Value>()?;
6953                }
6954            }
6955        }
6956        if optional && nothing {
6957            return Ok(None);
6958        }
6959        let result = LinkAudienceOption {
6960            audience: field_audience.ok_or_else(|| ::serde::de::Error::missing_field("audience"))?,
6961            allowed: field_allowed.ok_or_else(|| ::serde::de::Error::missing_field("allowed"))?,
6962            disallowed_reason: field_disallowed_reason.and_then(Option::flatten),
6963        };
6964        Ok(Some(result))
6965    }
6966
6967    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
6968        &self,
6969        s: &mut S::SerializeStruct,
6970    ) -> Result<(), S::Error> {
6971        use serde::ser::SerializeStruct;
6972        s.serialize_field("audience", &self.audience)?;
6973        s.serialize_field("allowed", &self.allowed)?;
6974        if let Some(val) = &self.disallowed_reason {
6975            s.serialize_field("disallowed_reason", val)?;
6976        }
6977        Ok(())
6978    }
6979}
6980
6981impl<'de> ::serde::de::Deserialize<'de> for LinkAudienceOption {
6982    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6983        // struct deserializer
6984        use serde::de::{MapAccess, Visitor};
6985        struct StructVisitor;
6986        impl<'de> Visitor<'de> for StructVisitor {
6987            type Value = LinkAudienceOption;
6988            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6989                f.write_str("a LinkAudienceOption struct")
6990            }
6991            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
6992                LinkAudienceOption::internal_deserialize(map)
6993            }
6994        }
6995        deserializer.deserialize_struct("LinkAudienceOption", LINK_AUDIENCE_OPTION_FIELDS, StructVisitor)
6996    }
6997}
6998
6999impl ::serde::ser::Serialize for LinkAudienceOption {
7000    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7001        // struct serializer
7002        use serde::ser::SerializeStruct;
7003        let mut s = serializer.serialize_struct("LinkAudienceOption", 3)?;
7004        self.internal_serialize::<S>(&mut s)?;
7005        s.end()
7006    }
7007}
7008
7009#[derive(Debug, Clone, PartialEq, Eq)]
7010#[non_exhaustive] // variants may be added in the future
7011pub enum LinkExpiry {
7012    /// Remove the currently set expiry for the link.
7013    RemoveExpiry,
7014    /// Set a new expiry or change an existing expiry.
7015    SetExpiry(crate::types::common::DropboxTimestamp),
7016    /// Catch-all used for unrecognized values returned from the server. Encountering this value
7017    /// typically indicates that this SDK version is out of date.
7018    Other,
7019}
7020
7021impl<'de> ::serde::de::Deserialize<'de> for LinkExpiry {
7022    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
7023        // union deserializer
7024        use serde::de::{self, MapAccess, Visitor};
7025        struct EnumVisitor;
7026        impl<'de> Visitor<'de> for EnumVisitor {
7027            type Value = LinkExpiry;
7028            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
7029                f.write_str("a LinkExpiry structure")
7030            }
7031            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
7032                let tag: &str = match map.next_key()? {
7033                    Some(".tag") => map.next_value()?,
7034                    _ => return Err(de::Error::missing_field(".tag"))
7035                };
7036                let value = match tag {
7037                    "remove_expiry" => LinkExpiry::RemoveExpiry,
7038                    "set_expiry" => {
7039                        match map.next_key()? {
7040                            Some("set_expiry") => LinkExpiry::SetExpiry(map.next_value()?),
7041                            None => return Err(de::Error::missing_field("set_expiry")),
7042                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
7043                        }
7044                    }
7045                    _ => LinkExpiry::Other,
7046                };
7047                crate::eat_json_fields(&mut map)?;
7048                Ok(value)
7049            }
7050        }
7051        const VARIANTS: &[&str] = &["remove_expiry",
7052                                    "set_expiry",
7053                                    "other"];
7054        deserializer.deserialize_struct("LinkExpiry", VARIANTS, EnumVisitor)
7055    }
7056}
7057
7058impl ::serde::ser::Serialize for LinkExpiry {
7059    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7060        // union serializer
7061        use serde::ser::SerializeStruct;
7062        match self {
7063            LinkExpiry::RemoveExpiry => {
7064                // unit
7065                let mut s = serializer.serialize_struct("LinkExpiry", 1)?;
7066                s.serialize_field(".tag", "remove_expiry")?;
7067                s.end()
7068            }
7069            LinkExpiry::SetExpiry(x) => {
7070                // primitive
7071                let mut s = serializer.serialize_struct("LinkExpiry", 2)?;
7072                s.serialize_field(".tag", "set_expiry")?;
7073                s.serialize_field("set_expiry", x)?;
7074                s.end()
7075            }
7076            LinkExpiry::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
7077        }
7078    }
7079}
7080
7081/// Metadata for a shared link. This can be either a [`PathLinkMetadata`] or
7082/// [`CollectionLinkMetadata`].
7083#[derive(Debug, Clone, PartialEq, Eq)]
7084#[non_exhaustive] // variants may be added in the future
7085pub enum LinkMetadata {
7086    Path(PathLinkMetadata),
7087    Collection(CollectionLinkMetadata),
7088    /// Catch-all used for unrecognized values returned from the server. Encountering this value
7089    /// typically indicates that this SDK version is out of date.
7090    Other,
7091}
7092
7093impl<'de> ::serde::de::Deserialize<'de> for LinkMetadata {
7094    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
7095        // polymorphic struct deserializer
7096        use serde::de::{self, MapAccess, Visitor};
7097        struct EnumVisitor;
7098        impl<'de> Visitor<'de> for EnumVisitor {
7099            type Value = LinkMetadata;
7100            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
7101                f.write_str("a LinkMetadata structure")
7102            }
7103            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
7104                let tag = match map.next_key()? {
7105                    Some(".tag") => map.next_value()?,
7106                    _ => return Err(de::Error::missing_field(".tag"))
7107                };
7108                match tag {
7109                    "path" => Ok(LinkMetadata::Path(PathLinkMetadata::internal_deserialize(map)?)),
7110                    "collection" => Ok(LinkMetadata::Collection(CollectionLinkMetadata::internal_deserialize(map)?)),
7111                    _ => {
7112                        crate::eat_json_fields(&mut map)?;
7113                        Ok(LinkMetadata::Other)
7114                    }
7115                }
7116            }
7117        }
7118        const VARIANTS: &[&str] = &["path",
7119                                    "collection"];
7120        deserializer.deserialize_struct("LinkMetadata", VARIANTS, EnumVisitor)
7121    }
7122}
7123
7124impl ::serde::ser::Serialize for LinkMetadata {
7125    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7126        // polymorphic struct serializer
7127        use serde::ser::SerializeStruct;
7128        match self {
7129            LinkMetadata::Path(x) => {
7130                let mut s = serializer.serialize_struct("LinkMetadata", 5)?;
7131                s.serialize_field(".tag", "path")?;
7132                x.internal_serialize::<S>(&mut s)?;
7133                s.end()
7134            }
7135            LinkMetadata::Collection(x) => {
7136                let mut s = serializer.serialize_struct("LinkMetadata", 4)?;
7137                s.serialize_field(".tag", "collection")?;
7138                x.internal_serialize::<S>(&mut s)?;
7139                s.end()
7140            }
7141            LinkMetadata::Other => Err(::serde::ser::Error::custom("cannot serialize unknown variant"))
7142        }
7143    }
7144}
7145
7146#[derive(Debug, Clone, PartialEq, Eq)]
7147#[non_exhaustive] // variants may be added in the future
7148pub enum LinkPassword {
7149    /// Remove the currently set password for the link.
7150    RemovePassword,
7151    /// Set a new password or change an existing password.
7152    SetPassword(String),
7153    /// Catch-all used for unrecognized values returned from the server. Encountering this value
7154    /// typically indicates that this SDK version is out of date.
7155    Other,
7156}
7157
7158impl<'de> ::serde::de::Deserialize<'de> for LinkPassword {
7159    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
7160        // union deserializer
7161        use serde::de::{self, MapAccess, Visitor};
7162        struct EnumVisitor;
7163        impl<'de> Visitor<'de> for EnumVisitor {
7164            type Value = LinkPassword;
7165            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
7166                f.write_str("a LinkPassword structure")
7167            }
7168            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
7169                let tag: &str = match map.next_key()? {
7170                    Some(".tag") => map.next_value()?,
7171                    _ => return Err(de::Error::missing_field(".tag"))
7172                };
7173                let value = match tag {
7174                    "remove_password" => LinkPassword::RemovePassword,
7175                    "set_password" => {
7176                        match map.next_key()? {
7177                            Some("set_password") => LinkPassword::SetPassword(map.next_value()?),
7178                            None => return Err(de::Error::missing_field("set_password")),
7179                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
7180                        }
7181                    }
7182                    _ => LinkPassword::Other,
7183                };
7184                crate::eat_json_fields(&mut map)?;
7185                Ok(value)
7186            }
7187        }
7188        const VARIANTS: &[&str] = &["remove_password",
7189                                    "set_password",
7190                                    "other"];
7191        deserializer.deserialize_struct("LinkPassword", VARIANTS, EnumVisitor)
7192    }
7193}
7194
7195impl ::serde::ser::Serialize for LinkPassword {
7196    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7197        // union serializer
7198        use serde::ser::SerializeStruct;
7199        match self {
7200            LinkPassword::RemovePassword => {
7201                // unit
7202                let mut s = serializer.serialize_struct("LinkPassword", 1)?;
7203                s.serialize_field(".tag", "remove_password")?;
7204                s.end()
7205            }
7206            LinkPassword::SetPassword(x) => {
7207                // primitive
7208                let mut s = serializer.serialize_struct("LinkPassword", 2)?;
7209                s.serialize_field(".tag", "set_password")?;
7210                s.serialize_field("set_password", x)?;
7211                s.end()
7212            }
7213            LinkPassword::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
7214        }
7215    }
7216}
7217
7218/// Permissions for actions that can be performed on a link.
7219#[derive(Debug, Clone, PartialEq, Eq)]
7220#[non_exhaustive] // structs may have more fields added in the future.
7221pub struct LinkPermission {
7222    pub action: LinkAction,
7223    pub allow: bool,
7224    pub reason: Option<PermissionDeniedReason>,
7225}
7226
7227impl LinkPermission {
7228    pub fn new(action: LinkAction, allow: bool) -> Self {
7229        LinkPermission {
7230            action,
7231            allow,
7232            reason: None,
7233        }
7234    }
7235
7236    pub fn with_reason(mut self, value: PermissionDeniedReason) -> Self {
7237        self.reason = Some(value);
7238        self
7239    }
7240}
7241
7242const LINK_PERMISSION_FIELDS: &[&str] = &["action",
7243                                          "allow",
7244                                          "reason"];
7245impl LinkPermission {
7246    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
7247        map: V,
7248    ) -> Result<LinkPermission, V::Error> {
7249        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
7250    }
7251
7252    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
7253        mut map: V,
7254        optional: bool,
7255    ) -> Result<Option<LinkPermission>, V::Error> {
7256        let mut field_action = None;
7257        let mut field_allow = None;
7258        let mut field_reason = None;
7259        let mut nothing = true;
7260        while let Some(key) = map.next_key::<&str>()? {
7261            nothing = false;
7262            match key {
7263                "action" => {
7264                    if field_action.is_some() {
7265                        return Err(::serde::de::Error::duplicate_field("action"));
7266                    }
7267                    field_action = Some(map.next_value()?);
7268                }
7269                "allow" => {
7270                    if field_allow.is_some() {
7271                        return Err(::serde::de::Error::duplicate_field("allow"));
7272                    }
7273                    field_allow = Some(map.next_value()?);
7274                }
7275                "reason" => {
7276                    if field_reason.is_some() {
7277                        return Err(::serde::de::Error::duplicate_field("reason"));
7278                    }
7279                    field_reason = Some(map.next_value()?);
7280                }
7281                _ => {
7282                    // unknown field allowed and ignored
7283                    map.next_value::<::serde_json::Value>()?;
7284                }
7285            }
7286        }
7287        if optional && nothing {
7288            return Ok(None);
7289        }
7290        let result = LinkPermission {
7291            action: field_action.ok_or_else(|| ::serde::de::Error::missing_field("action"))?,
7292            allow: field_allow.ok_or_else(|| ::serde::de::Error::missing_field("allow"))?,
7293            reason: field_reason.and_then(Option::flatten),
7294        };
7295        Ok(Some(result))
7296    }
7297
7298    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
7299        &self,
7300        s: &mut S::SerializeStruct,
7301    ) -> Result<(), S::Error> {
7302        use serde::ser::SerializeStruct;
7303        s.serialize_field("action", &self.action)?;
7304        s.serialize_field("allow", &self.allow)?;
7305        if let Some(val) = &self.reason {
7306            s.serialize_field("reason", val)?;
7307        }
7308        Ok(())
7309    }
7310}
7311
7312impl<'de> ::serde::de::Deserialize<'de> for LinkPermission {
7313    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
7314        // struct deserializer
7315        use serde::de::{MapAccess, Visitor};
7316        struct StructVisitor;
7317        impl<'de> Visitor<'de> for StructVisitor {
7318            type Value = LinkPermission;
7319            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
7320                f.write_str("a LinkPermission struct")
7321            }
7322            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
7323                LinkPermission::internal_deserialize(map)
7324            }
7325        }
7326        deserializer.deserialize_struct("LinkPermission", LINK_PERMISSION_FIELDS, StructVisitor)
7327    }
7328}
7329
7330impl ::serde::ser::Serialize for LinkPermission {
7331    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7332        // struct serializer
7333        use serde::ser::SerializeStruct;
7334        let mut s = serializer.serialize_struct("LinkPermission", 3)?;
7335        self.internal_serialize::<S>(&mut s)?;
7336        s.end()
7337    }
7338}
7339
7340#[derive(Debug, Clone, PartialEq, Eq)]
7341#[non_exhaustive] // structs may have more fields added in the future.
7342pub struct LinkPermissions {
7343    /// Whether the caller can revoke the shared link.
7344    pub can_revoke: bool,
7345    /// A list of policies that the user might be able to set for the visibility.
7346    pub visibility_policies: Vec<VisibilityPolicy>,
7347    /// Whether the user can set the expiry settings of the link. This refers to the ability to
7348    /// create a new expiry and modify an existing expiry.
7349    pub can_set_expiry: bool,
7350    /// Whether the user can remove the expiry of the link.
7351    pub can_remove_expiry: bool,
7352    /// Whether the link can be downloaded or not.
7353    pub allow_download: bool,
7354    /// Whether the user can allow downloads via the link. This refers to the ability to remove a
7355    /// no-download restriction on the link.
7356    pub can_allow_download: bool,
7357    /// Whether the user can disallow downloads via the link. This refers to the ability to impose a
7358    /// no-download restriction on the link.
7359    pub can_disallow_download: bool,
7360    /// Whether comments are enabled for the linked file. This takes the team commenting policy into
7361    /// account.
7362    pub allow_comments: bool,
7363    /// Whether the team has disabled commenting globally.
7364    pub team_restricts_comments: bool,
7365    /// The current visibility of the link after considering the shared links policies of the the
7366    /// team (in case the link's owner is part of a team) and the shared folder (in case the linked
7367    /// file is part of a shared folder). This field is shown only if the caller has access to this
7368    /// info (the link's owner always has access to this data). For some links, an
7369    /// effective_audience value is returned instead.
7370    pub resolved_visibility: Option<ResolvedVisibility>,
7371    /// The shared link's requested visibility. This can be overridden by the team and shared folder
7372    /// policies. The final visibility, after considering these policies, can be found in
7373    /// `resolved_visibility`. This is shown only if the caller is the link's owner and
7374    /// resolved_visibility is returned instead of effective_audience.
7375    pub requested_visibility: Option<RequestedVisibility>,
7376    /// The failure reason for revoking the link. This field will only be present if the
7377    /// `can_revoke` is `false`.
7378    pub revoke_failure_reason: Option<SharedLinkAccessFailureReason>,
7379    /// The type of audience who can benefit from the access level specified by the
7380    /// `link_access_level` field.
7381    pub effective_audience: Option<LinkAudience>,
7382    /// The access level that the link will grant to its users. A link can grant additional rights
7383    /// to a user beyond their current access level. For example, if a user was invited as a viewer
7384    /// to a file, and then opens a link with `link_access_level` set to `editor`, then they will
7385    /// gain editor privileges. The `link_access_level` is a property of the link, and does not
7386    /// depend on who is calling this API. In particular, `link_access_level` does not take into
7387    /// account the API caller's current permissions to the content.
7388    pub link_access_level: Option<LinkAccessLevel>,
7389    /// A list of link audience options the user might be able to set as the new audience.
7390    pub audience_options: Option<Vec<LinkAudienceOption>>,
7391    /// Whether the user can set a password for the link.
7392    pub can_set_password: Option<bool>,
7393    /// Whether the user can remove the password of the link.
7394    pub can_remove_password: Option<bool>,
7395    /// Whether the user is required to provide a password to view the link.
7396    pub require_password: Option<bool>,
7397    /// Whether the user can use extended sharing controls, based on their account type.
7398    pub can_use_extended_sharing_controls: Option<bool>,
7399}
7400
7401impl LinkPermissions {
7402    pub fn new(
7403        can_revoke: bool,
7404        visibility_policies: Vec<VisibilityPolicy>,
7405        can_set_expiry: bool,
7406        can_remove_expiry: bool,
7407        allow_download: bool,
7408        can_allow_download: bool,
7409        can_disallow_download: bool,
7410        allow_comments: bool,
7411        team_restricts_comments: bool,
7412    ) -> Self {
7413        LinkPermissions {
7414            can_revoke,
7415            visibility_policies,
7416            can_set_expiry,
7417            can_remove_expiry,
7418            allow_download,
7419            can_allow_download,
7420            can_disallow_download,
7421            allow_comments,
7422            team_restricts_comments,
7423            resolved_visibility: None,
7424            requested_visibility: None,
7425            revoke_failure_reason: None,
7426            effective_audience: None,
7427            link_access_level: None,
7428            audience_options: None,
7429            can_set_password: None,
7430            can_remove_password: None,
7431            require_password: None,
7432            can_use_extended_sharing_controls: None,
7433        }
7434    }
7435
7436    pub fn with_resolved_visibility(mut self, value: ResolvedVisibility) -> Self {
7437        self.resolved_visibility = Some(value);
7438        self
7439    }
7440
7441    pub fn with_requested_visibility(mut self, value: RequestedVisibility) -> Self {
7442        self.requested_visibility = Some(value);
7443        self
7444    }
7445
7446    pub fn with_revoke_failure_reason(mut self, value: SharedLinkAccessFailureReason) -> Self {
7447        self.revoke_failure_reason = Some(value);
7448        self
7449    }
7450
7451    pub fn with_effective_audience(mut self, value: LinkAudience) -> Self {
7452        self.effective_audience = Some(value);
7453        self
7454    }
7455
7456    pub fn with_link_access_level(mut self, value: LinkAccessLevel) -> Self {
7457        self.link_access_level = Some(value);
7458        self
7459    }
7460
7461    pub fn with_audience_options(mut self, value: Vec<LinkAudienceOption>) -> Self {
7462        self.audience_options = Some(value);
7463        self
7464    }
7465
7466    pub fn with_can_set_password(mut self, value: bool) -> Self {
7467        self.can_set_password = Some(value);
7468        self
7469    }
7470
7471    pub fn with_can_remove_password(mut self, value: bool) -> Self {
7472        self.can_remove_password = Some(value);
7473        self
7474    }
7475
7476    pub fn with_require_password(mut self, value: bool) -> Self {
7477        self.require_password = Some(value);
7478        self
7479    }
7480
7481    pub fn with_can_use_extended_sharing_controls(mut self, value: bool) -> Self {
7482        self.can_use_extended_sharing_controls = Some(value);
7483        self
7484    }
7485}
7486
7487const LINK_PERMISSIONS_FIELDS: &[&str] = &["can_revoke",
7488                                           "visibility_policies",
7489                                           "can_set_expiry",
7490                                           "can_remove_expiry",
7491                                           "allow_download",
7492                                           "can_allow_download",
7493                                           "can_disallow_download",
7494                                           "allow_comments",
7495                                           "team_restricts_comments",
7496                                           "resolved_visibility",
7497                                           "requested_visibility",
7498                                           "revoke_failure_reason",
7499                                           "effective_audience",
7500                                           "link_access_level",
7501                                           "audience_options",
7502                                           "can_set_password",
7503                                           "can_remove_password",
7504                                           "require_password",
7505                                           "can_use_extended_sharing_controls"];
7506impl LinkPermissions {
7507    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
7508        map: V,
7509    ) -> Result<LinkPermissions, V::Error> {
7510        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
7511    }
7512
7513    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
7514        mut map: V,
7515        optional: bool,
7516    ) -> Result<Option<LinkPermissions>, V::Error> {
7517        let mut field_can_revoke = None;
7518        let mut field_visibility_policies = None;
7519        let mut field_can_set_expiry = None;
7520        let mut field_can_remove_expiry = None;
7521        let mut field_allow_download = None;
7522        let mut field_can_allow_download = None;
7523        let mut field_can_disallow_download = None;
7524        let mut field_allow_comments = None;
7525        let mut field_team_restricts_comments = None;
7526        let mut field_resolved_visibility = None;
7527        let mut field_requested_visibility = None;
7528        let mut field_revoke_failure_reason = None;
7529        let mut field_effective_audience = None;
7530        let mut field_link_access_level = None;
7531        let mut field_audience_options = None;
7532        let mut field_can_set_password = None;
7533        let mut field_can_remove_password = None;
7534        let mut field_require_password = None;
7535        let mut field_can_use_extended_sharing_controls = None;
7536        let mut nothing = true;
7537        while let Some(key) = map.next_key::<&str>()? {
7538            nothing = false;
7539            match key {
7540                "can_revoke" => {
7541                    if field_can_revoke.is_some() {
7542                        return Err(::serde::de::Error::duplicate_field("can_revoke"));
7543                    }
7544                    field_can_revoke = Some(map.next_value()?);
7545                }
7546                "visibility_policies" => {
7547                    if field_visibility_policies.is_some() {
7548                        return Err(::serde::de::Error::duplicate_field("visibility_policies"));
7549                    }
7550                    field_visibility_policies = Some(map.next_value()?);
7551                }
7552                "can_set_expiry" => {
7553                    if field_can_set_expiry.is_some() {
7554                        return Err(::serde::de::Error::duplicate_field("can_set_expiry"));
7555                    }
7556                    field_can_set_expiry = Some(map.next_value()?);
7557                }
7558                "can_remove_expiry" => {
7559                    if field_can_remove_expiry.is_some() {
7560                        return Err(::serde::de::Error::duplicate_field("can_remove_expiry"));
7561                    }
7562                    field_can_remove_expiry = Some(map.next_value()?);
7563                }
7564                "allow_download" => {
7565                    if field_allow_download.is_some() {
7566                        return Err(::serde::de::Error::duplicate_field("allow_download"));
7567                    }
7568                    field_allow_download = Some(map.next_value()?);
7569                }
7570                "can_allow_download" => {
7571                    if field_can_allow_download.is_some() {
7572                        return Err(::serde::de::Error::duplicate_field("can_allow_download"));
7573                    }
7574                    field_can_allow_download = Some(map.next_value()?);
7575                }
7576                "can_disallow_download" => {
7577                    if field_can_disallow_download.is_some() {
7578                        return Err(::serde::de::Error::duplicate_field("can_disallow_download"));
7579                    }
7580                    field_can_disallow_download = Some(map.next_value()?);
7581                }
7582                "allow_comments" => {
7583                    if field_allow_comments.is_some() {
7584                        return Err(::serde::de::Error::duplicate_field("allow_comments"));
7585                    }
7586                    field_allow_comments = Some(map.next_value()?);
7587                }
7588                "team_restricts_comments" => {
7589                    if field_team_restricts_comments.is_some() {
7590                        return Err(::serde::de::Error::duplicate_field("team_restricts_comments"));
7591                    }
7592                    field_team_restricts_comments = Some(map.next_value()?);
7593                }
7594                "resolved_visibility" => {
7595                    if field_resolved_visibility.is_some() {
7596                        return Err(::serde::de::Error::duplicate_field("resolved_visibility"));
7597                    }
7598                    field_resolved_visibility = Some(map.next_value()?);
7599                }
7600                "requested_visibility" => {
7601                    if field_requested_visibility.is_some() {
7602                        return Err(::serde::de::Error::duplicate_field("requested_visibility"));
7603                    }
7604                    field_requested_visibility = Some(map.next_value()?);
7605                }
7606                "revoke_failure_reason" => {
7607                    if field_revoke_failure_reason.is_some() {
7608                        return Err(::serde::de::Error::duplicate_field("revoke_failure_reason"));
7609                    }
7610                    field_revoke_failure_reason = Some(map.next_value()?);
7611                }
7612                "effective_audience" => {
7613                    if field_effective_audience.is_some() {
7614                        return Err(::serde::de::Error::duplicate_field("effective_audience"));
7615                    }
7616                    field_effective_audience = Some(map.next_value()?);
7617                }
7618                "link_access_level" => {
7619                    if field_link_access_level.is_some() {
7620                        return Err(::serde::de::Error::duplicate_field("link_access_level"));
7621                    }
7622                    field_link_access_level = Some(map.next_value()?);
7623                }
7624                "audience_options" => {
7625                    if field_audience_options.is_some() {
7626                        return Err(::serde::de::Error::duplicate_field("audience_options"));
7627                    }
7628                    field_audience_options = Some(map.next_value()?);
7629                }
7630                "can_set_password" => {
7631                    if field_can_set_password.is_some() {
7632                        return Err(::serde::de::Error::duplicate_field("can_set_password"));
7633                    }
7634                    field_can_set_password = Some(map.next_value()?);
7635                }
7636                "can_remove_password" => {
7637                    if field_can_remove_password.is_some() {
7638                        return Err(::serde::de::Error::duplicate_field("can_remove_password"));
7639                    }
7640                    field_can_remove_password = Some(map.next_value()?);
7641                }
7642                "require_password" => {
7643                    if field_require_password.is_some() {
7644                        return Err(::serde::de::Error::duplicate_field("require_password"));
7645                    }
7646                    field_require_password = Some(map.next_value()?);
7647                }
7648                "can_use_extended_sharing_controls" => {
7649                    if field_can_use_extended_sharing_controls.is_some() {
7650                        return Err(::serde::de::Error::duplicate_field("can_use_extended_sharing_controls"));
7651                    }
7652                    field_can_use_extended_sharing_controls = Some(map.next_value()?);
7653                }
7654                _ => {
7655                    // unknown field allowed and ignored
7656                    map.next_value::<::serde_json::Value>()?;
7657                }
7658            }
7659        }
7660        if optional && nothing {
7661            return Ok(None);
7662        }
7663        let result = LinkPermissions {
7664            can_revoke: field_can_revoke.ok_or_else(|| ::serde::de::Error::missing_field("can_revoke"))?,
7665            visibility_policies: field_visibility_policies.ok_or_else(|| ::serde::de::Error::missing_field("visibility_policies"))?,
7666            can_set_expiry: field_can_set_expiry.ok_or_else(|| ::serde::de::Error::missing_field("can_set_expiry"))?,
7667            can_remove_expiry: field_can_remove_expiry.ok_or_else(|| ::serde::de::Error::missing_field("can_remove_expiry"))?,
7668            allow_download: field_allow_download.ok_or_else(|| ::serde::de::Error::missing_field("allow_download"))?,
7669            can_allow_download: field_can_allow_download.ok_or_else(|| ::serde::de::Error::missing_field("can_allow_download"))?,
7670            can_disallow_download: field_can_disallow_download.ok_or_else(|| ::serde::de::Error::missing_field("can_disallow_download"))?,
7671            allow_comments: field_allow_comments.ok_or_else(|| ::serde::de::Error::missing_field("allow_comments"))?,
7672            team_restricts_comments: field_team_restricts_comments.ok_or_else(|| ::serde::de::Error::missing_field("team_restricts_comments"))?,
7673            resolved_visibility: field_resolved_visibility.and_then(Option::flatten),
7674            requested_visibility: field_requested_visibility.and_then(Option::flatten),
7675            revoke_failure_reason: field_revoke_failure_reason.and_then(Option::flatten),
7676            effective_audience: field_effective_audience.and_then(Option::flatten),
7677            link_access_level: field_link_access_level.and_then(Option::flatten),
7678            audience_options: field_audience_options.and_then(Option::flatten),
7679            can_set_password: field_can_set_password.and_then(Option::flatten),
7680            can_remove_password: field_can_remove_password.and_then(Option::flatten),
7681            require_password: field_require_password.and_then(Option::flatten),
7682            can_use_extended_sharing_controls: field_can_use_extended_sharing_controls.and_then(Option::flatten),
7683        };
7684        Ok(Some(result))
7685    }
7686
7687    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
7688        &self,
7689        s: &mut S::SerializeStruct,
7690    ) -> Result<(), S::Error> {
7691        use serde::ser::SerializeStruct;
7692        s.serialize_field("can_revoke", &self.can_revoke)?;
7693        s.serialize_field("visibility_policies", &self.visibility_policies)?;
7694        s.serialize_field("can_set_expiry", &self.can_set_expiry)?;
7695        s.serialize_field("can_remove_expiry", &self.can_remove_expiry)?;
7696        s.serialize_field("allow_download", &self.allow_download)?;
7697        s.serialize_field("can_allow_download", &self.can_allow_download)?;
7698        s.serialize_field("can_disallow_download", &self.can_disallow_download)?;
7699        s.serialize_field("allow_comments", &self.allow_comments)?;
7700        s.serialize_field("team_restricts_comments", &self.team_restricts_comments)?;
7701        if let Some(val) = &self.resolved_visibility {
7702            s.serialize_field("resolved_visibility", val)?;
7703        }
7704        if let Some(val) = &self.requested_visibility {
7705            s.serialize_field("requested_visibility", val)?;
7706        }
7707        if let Some(val) = &self.revoke_failure_reason {
7708            s.serialize_field("revoke_failure_reason", val)?;
7709        }
7710        if let Some(val) = &self.effective_audience {
7711            s.serialize_field("effective_audience", val)?;
7712        }
7713        if let Some(val) = &self.link_access_level {
7714            s.serialize_field("link_access_level", val)?;
7715        }
7716        if let Some(val) = &self.audience_options {
7717            s.serialize_field("audience_options", val)?;
7718        }
7719        if let Some(val) = &self.can_set_password {
7720            s.serialize_field("can_set_password", val)?;
7721        }
7722        if let Some(val) = &self.can_remove_password {
7723            s.serialize_field("can_remove_password", val)?;
7724        }
7725        if let Some(val) = &self.require_password {
7726            s.serialize_field("require_password", val)?;
7727        }
7728        if let Some(val) = &self.can_use_extended_sharing_controls {
7729            s.serialize_field("can_use_extended_sharing_controls", val)?;
7730        }
7731        Ok(())
7732    }
7733}
7734
7735impl<'de> ::serde::de::Deserialize<'de> for LinkPermissions {
7736    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
7737        // struct deserializer
7738        use serde::de::{MapAccess, Visitor};
7739        struct StructVisitor;
7740        impl<'de> Visitor<'de> for StructVisitor {
7741            type Value = LinkPermissions;
7742            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
7743                f.write_str("a LinkPermissions struct")
7744            }
7745            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
7746                LinkPermissions::internal_deserialize(map)
7747            }
7748        }
7749        deserializer.deserialize_struct("LinkPermissions", LINK_PERMISSIONS_FIELDS, StructVisitor)
7750    }
7751}
7752
7753impl ::serde::ser::Serialize for LinkPermissions {
7754    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7755        // struct serializer
7756        use serde::ser::SerializeStruct;
7757        let mut s = serializer.serialize_struct("LinkPermissions", 19)?;
7758        self.internal_serialize::<S>(&mut s)?;
7759        s.end()
7760    }
7761}
7762
7763/// Settings that apply to a link.
7764#[derive(Debug, Clone, PartialEq, Eq, Default)]
7765#[non_exhaustive] // structs may have more fields added in the future.
7766pub struct LinkSettings {
7767    /// The access level on the link for this file. Currently, it only accepts 'viewer' and
7768    /// 'viewer_no_comment'.
7769    pub access_level: Option<AccessLevel>,
7770    /// The type of audience on the link for this file.
7771    pub audience: Option<LinkAudience>,
7772    /// An expiry timestamp to set on a link.
7773    pub expiry: Option<LinkExpiry>,
7774    /// The password for the link.
7775    pub password: Option<LinkPassword>,
7776}
7777
7778impl LinkSettings {
7779    pub fn with_access_level(mut self, value: AccessLevel) -> Self {
7780        self.access_level = Some(value);
7781        self
7782    }
7783
7784    pub fn with_audience(mut self, value: LinkAudience) -> Self {
7785        self.audience = Some(value);
7786        self
7787    }
7788
7789    pub fn with_expiry(mut self, value: LinkExpiry) -> Self {
7790        self.expiry = Some(value);
7791        self
7792    }
7793
7794    pub fn with_password(mut self, value: LinkPassword) -> Self {
7795        self.password = Some(value);
7796        self
7797    }
7798}
7799
7800const LINK_SETTINGS_FIELDS: &[&str] = &["access_level",
7801                                        "audience",
7802                                        "expiry",
7803                                        "password"];
7804impl LinkSettings {
7805    // no _opt deserializer
7806    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
7807        mut map: V,
7808    ) -> Result<LinkSettings, V::Error> {
7809        let mut field_access_level = None;
7810        let mut field_audience = None;
7811        let mut field_expiry = None;
7812        let mut field_password = None;
7813        while let Some(key) = map.next_key::<&str>()? {
7814            match key {
7815                "access_level" => {
7816                    if field_access_level.is_some() {
7817                        return Err(::serde::de::Error::duplicate_field("access_level"));
7818                    }
7819                    field_access_level = Some(map.next_value()?);
7820                }
7821                "audience" => {
7822                    if field_audience.is_some() {
7823                        return Err(::serde::de::Error::duplicate_field("audience"));
7824                    }
7825                    field_audience = Some(map.next_value()?);
7826                }
7827                "expiry" => {
7828                    if field_expiry.is_some() {
7829                        return Err(::serde::de::Error::duplicate_field("expiry"));
7830                    }
7831                    field_expiry = Some(map.next_value()?);
7832                }
7833                "password" => {
7834                    if field_password.is_some() {
7835                        return Err(::serde::de::Error::duplicate_field("password"));
7836                    }
7837                    field_password = Some(map.next_value()?);
7838                }
7839                _ => {
7840                    // unknown field allowed and ignored
7841                    map.next_value::<::serde_json::Value>()?;
7842                }
7843            }
7844        }
7845        let result = LinkSettings {
7846            access_level: field_access_level.and_then(Option::flatten),
7847            audience: field_audience.and_then(Option::flatten),
7848            expiry: field_expiry.and_then(Option::flatten),
7849            password: field_password.and_then(Option::flatten),
7850        };
7851        Ok(result)
7852    }
7853
7854    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
7855        &self,
7856        s: &mut S::SerializeStruct,
7857    ) -> Result<(), S::Error> {
7858        use serde::ser::SerializeStruct;
7859        if let Some(val) = &self.access_level {
7860            s.serialize_field("access_level", val)?;
7861        }
7862        if let Some(val) = &self.audience {
7863            s.serialize_field("audience", val)?;
7864        }
7865        if let Some(val) = &self.expiry {
7866            s.serialize_field("expiry", val)?;
7867        }
7868        if let Some(val) = &self.password {
7869            s.serialize_field("password", val)?;
7870        }
7871        Ok(())
7872    }
7873}
7874
7875impl<'de> ::serde::de::Deserialize<'de> for LinkSettings {
7876    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
7877        // struct deserializer
7878        use serde::de::{MapAccess, Visitor};
7879        struct StructVisitor;
7880        impl<'de> Visitor<'de> for StructVisitor {
7881            type Value = LinkSettings;
7882            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
7883                f.write_str("a LinkSettings struct")
7884            }
7885            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
7886                LinkSettings::internal_deserialize(map)
7887            }
7888        }
7889        deserializer.deserialize_struct("LinkSettings", LINK_SETTINGS_FIELDS, StructVisitor)
7890    }
7891}
7892
7893impl ::serde::ser::Serialize for LinkSettings {
7894    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7895        // struct serializer
7896        use serde::ser::SerializeStruct;
7897        let mut s = serializer.serialize_struct("LinkSettings", 4)?;
7898        self.internal_serialize::<S>(&mut s)?;
7899        s.end()
7900    }
7901}
7902
7903/// Arguments for [`list_file_members()`](crate::sharing::list_file_members).
7904#[derive(Debug, Clone, PartialEq, Eq)]
7905#[non_exhaustive] // structs may have more fields added in the future.
7906pub struct ListFileMembersArg {
7907    /// The file for which you want to see members.
7908    pub file: PathOrId,
7909    /// The actions for which to return permissions on a member.
7910    pub actions: Option<Vec<MemberAction>>,
7911    /// Whether to include members who only have access from a parent shared folder.
7912    pub include_inherited: bool,
7913    /// Number of members to return max per query. Defaults to 100 if no limit is specified.
7914    pub limit: u32,
7915}
7916
7917impl ListFileMembersArg {
7918    pub fn new(file: PathOrId) -> Self {
7919        ListFileMembersArg {
7920            file,
7921            actions: None,
7922            include_inherited: true,
7923            limit: 100,
7924        }
7925    }
7926
7927    pub fn with_actions(mut self, value: Vec<MemberAction>) -> Self {
7928        self.actions = Some(value);
7929        self
7930    }
7931
7932    pub fn with_include_inherited(mut self, value: bool) -> Self {
7933        self.include_inherited = value;
7934        self
7935    }
7936
7937    pub fn with_limit(mut self, value: u32) -> Self {
7938        self.limit = value;
7939        self
7940    }
7941}
7942
7943const LIST_FILE_MEMBERS_ARG_FIELDS: &[&str] = &["file",
7944                                                "actions",
7945                                                "include_inherited",
7946                                                "limit"];
7947impl ListFileMembersArg {
7948    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
7949        map: V,
7950    ) -> Result<ListFileMembersArg, V::Error> {
7951        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
7952    }
7953
7954    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
7955        mut map: V,
7956        optional: bool,
7957    ) -> Result<Option<ListFileMembersArg>, V::Error> {
7958        let mut field_file = None;
7959        let mut field_actions = None;
7960        let mut field_include_inherited = None;
7961        let mut field_limit = None;
7962        let mut nothing = true;
7963        while let Some(key) = map.next_key::<&str>()? {
7964            nothing = false;
7965            match key {
7966                "file" => {
7967                    if field_file.is_some() {
7968                        return Err(::serde::de::Error::duplicate_field("file"));
7969                    }
7970                    field_file = Some(map.next_value()?);
7971                }
7972                "actions" => {
7973                    if field_actions.is_some() {
7974                        return Err(::serde::de::Error::duplicate_field("actions"));
7975                    }
7976                    field_actions = Some(map.next_value()?);
7977                }
7978                "include_inherited" => {
7979                    if field_include_inherited.is_some() {
7980                        return Err(::serde::de::Error::duplicate_field("include_inherited"));
7981                    }
7982                    field_include_inherited = Some(map.next_value()?);
7983                }
7984                "limit" => {
7985                    if field_limit.is_some() {
7986                        return Err(::serde::de::Error::duplicate_field("limit"));
7987                    }
7988                    field_limit = Some(map.next_value()?);
7989                }
7990                _ => {
7991                    // unknown field allowed and ignored
7992                    map.next_value::<::serde_json::Value>()?;
7993                }
7994            }
7995        }
7996        if optional && nothing {
7997            return Ok(None);
7998        }
7999        let result = ListFileMembersArg {
8000            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
8001            actions: field_actions.and_then(Option::flatten),
8002            include_inherited: field_include_inherited.unwrap_or(true),
8003            limit: field_limit.unwrap_or(100),
8004        };
8005        Ok(Some(result))
8006    }
8007
8008    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
8009        &self,
8010        s: &mut S::SerializeStruct,
8011    ) -> Result<(), S::Error> {
8012        use serde::ser::SerializeStruct;
8013        s.serialize_field("file", &self.file)?;
8014        if let Some(val) = &self.actions {
8015            s.serialize_field("actions", val)?;
8016        }
8017        if !self.include_inherited {
8018            s.serialize_field("include_inherited", &self.include_inherited)?;
8019        }
8020        if self.limit != 100 {
8021            s.serialize_field("limit", &self.limit)?;
8022        }
8023        Ok(())
8024    }
8025}
8026
8027impl<'de> ::serde::de::Deserialize<'de> for ListFileMembersArg {
8028    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8029        // struct deserializer
8030        use serde::de::{MapAccess, Visitor};
8031        struct StructVisitor;
8032        impl<'de> Visitor<'de> for StructVisitor {
8033            type Value = ListFileMembersArg;
8034            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8035                f.write_str("a ListFileMembersArg struct")
8036            }
8037            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
8038                ListFileMembersArg::internal_deserialize(map)
8039            }
8040        }
8041        deserializer.deserialize_struct("ListFileMembersArg", LIST_FILE_MEMBERS_ARG_FIELDS, StructVisitor)
8042    }
8043}
8044
8045impl ::serde::ser::Serialize for ListFileMembersArg {
8046    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8047        // struct serializer
8048        use serde::ser::SerializeStruct;
8049        let mut s = serializer.serialize_struct("ListFileMembersArg", 4)?;
8050        self.internal_serialize::<S>(&mut s)?;
8051        s.end()
8052    }
8053}
8054
8055/// Arguments for [`list_file_members_batch()`](crate::sharing::list_file_members_batch).
8056#[derive(Debug, Clone, PartialEq, Eq)]
8057#[non_exhaustive] // structs may have more fields added in the future.
8058pub struct ListFileMembersBatchArg {
8059    /// Files for which to return members.
8060    pub files: Vec<PathOrId>,
8061    /// Number of members to return max per query. Defaults to 10 if no limit is specified.
8062    pub limit: u32,
8063}
8064
8065impl ListFileMembersBatchArg {
8066    pub fn new(files: Vec<PathOrId>) -> Self {
8067        ListFileMembersBatchArg {
8068            files,
8069            limit: 10,
8070        }
8071    }
8072
8073    pub fn with_limit(mut self, value: u32) -> Self {
8074        self.limit = value;
8075        self
8076    }
8077}
8078
8079const LIST_FILE_MEMBERS_BATCH_ARG_FIELDS: &[&str] = &["files",
8080                                                      "limit"];
8081impl ListFileMembersBatchArg {
8082    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
8083        map: V,
8084    ) -> Result<ListFileMembersBatchArg, V::Error> {
8085        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
8086    }
8087
8088    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
8089        mut map: V,
8090        optional: bool,
8091    ) -> Result<Option<ListFileMembersBatchArg>, V::Error> {
8092        let mut field_files = None;
8093        let mut field_limit = None;
8094        let mut nothing = true;
8095        while let Some(key) = map.next_key::<&str>()? {
8096            nothing = false;
8097            match key {
8098                "files" => {
8099                    if field_files.is_some() {
8100                        return Err(::serde::de::Error::duplicate_field("files"));
8101                    }
8102                    field_files = Some(map.next_value()?);
8103                }
8104                "limit" => {
8105                    if field_limit.is_some() {
8106                        return Err(::serde::de::Error::duplicate_field("limit"));
8107                    }
8108                    field_limit = Some(map.next_value()?);
8109                }
8110                _ => {
8111                    // unknown field allowed and ignored
8112                    map.next_value::<::serde_json::Value>()?;
8113                }
8114            }
8115        }
8116        if optional && nothing {
8117            return Ok(None);
8118        }
8119        let result = ListFileMembersBatchArg {
8120            files: field_files.ok_or_else(|| ::serde::de::Error::missing_field("files"))?,
8121            limit: field_limit.unwrap_or(10),
8122        };
8123        Ok(Some(result))
8124    }
8125
8126    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
8127        &self,
8128        s: &mut S::SerializeStruct,
8129    ) -> Result<(), S::Error> {
8130        use serde::ser::SerializeStruct;
8131        s.serialize_field("files", &self.files)?;
8132        if self.limit != 10 {
8133            s.serialize_field("limit", &self.limit)?;
8134        }
8135        Ok(())
8136    }
8137}
8138
8139impl<'de> ::serde::de::Deserialize<'de> for ListFileMembersBatchArg {
8140    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8141        // struct deserializer
8142        use serde::de::{MapAccess, Visitor};
8143        struct StructVisitor;
8144        impl<'de> Visitor<'de> for StructVisitor {
8145            type Value = ListFileMembersBatchArg;
8146            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8147                f.write_str("a ListFileMembersBatchArg struct")
8148            }
8149            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
8150                ListFileMembersBatchArg::internal_deserialize(map)
8151            }
8152        }
8153        deserializer.deserialize_struct("ListFileMembersBatchArg", LIST_FILE_MEMBERS_BATCH_ARG_FIELDS, StructVisitor)
8154    }
8155}
8156
8157impl ::serde::ser::Serialize for ListFileMembersBatchArg {
8158    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8159        // struct serializer
8160        use serde::ser::SerializeStruct;
8161        let mut s = serializer.serialize_struct("ListFileMembersBatchArg", 2)?;
8162        self.internal_serialize::<S>(&mut s)?;
8163        s.end()
8164    }
8165}
8166
8167/// Per-file result for [`list_file_members_batch()`](crate::sharing::list_file_members_batch).
8168#[derive(Debug, Clone, PartialEq, Eq)]
8169#[non_exhaustive] // structs may have more fields added in the future.
8170pub struct ListFileMembersBatchResult {
8171    /// This is the input file identifier, whether an ID or a path.
8172    pub file: PathOrId,
8173    /// The result for this particular file.
8174    pub result: ListFileMembersIndividualResult,
8175}
8176
8177impl ListFileMembersBatchResult {
8178    pub fn new(file: PathOrId, result: ListFileMembersIndividualResult) -> Self {
8179        ListFileMembersBatchResult {
8180            file,
8181            result,
8182        }
8183    }
8184}
8185
8186const LIST_FILE_MEMBERS_BATCH_RESULT_FIELDS: &[&str] = &["file",
8187                                                         "result"];
8188impl ListFileMembersBatchResult {
8189    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
8190        map: V,
8191    ) -> Result<ListFileMembersBatchResult, V::Error> {
8192        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
8193    }
8194
8195    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
8196        mut map: V,
8197        optional: bool,
8198    ) -> Result<Option<ListFileMembersBatchResult>, V::Error> {
8199        let mut field_file = None;
8200        let mut field_result = None;
8201        let mut nothing = true;
8202        while let Some(key) = map.next_key::<&str>()? {
8203            nothing = false;
8204            match key {
8205                "file" => {
8206                    if field_file.is_some() {
8207                        return Err(::serde::de::Error::duplicate_field("file"));
8208                    }
8209                    field_file = Some(map.next_value()?);
8210                }
8211                "result" => {
8212                    if field_result.is_some() {
8213                        return Err(::serde::de::Error::duplicate_field("result"));
8214                    }
8215                    field_result = Some(map.next_value()?);
8216                }
8217                _ => {
8218                    // unknown field allowed and ignored
8219                    map.next_value::<::serde_json::Value>()?;
8220                }
8221            }
8222        }
8223        if optional && nothing {
8224            return Ok(None);
8225        }
8226        let result = ListFileMembersBatchResult {
8227            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
8228            result: field_result.ok_or_else(|| ::serde::de::Error::missing_field("result"))?,
8229        };
8230        Ok(Some(result))
8231    }
8232
8233    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
8234        &self,
8235        s: &mut S::SerializeStruct,
8236    ) -> Result<(), S::Error> {
8237        use serde::ser::SerializeStruct;
8238        s.serialize_field("file", &self.file)?;
8239        s.serialize_field("result", &self.result)?;
8240        Ok(())
8241    }
8242}
8243
8244impl<'de> ::serde::de::Deserialize<'de> for ListFileMembersBatchResult {
8245    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8246        // struct deserializer
8247        use serde::de::{MapAccess, Visitor};
8248        struct StructVisitor;
8249        impl<'de> Visitor<'de> for StructVisitor {
8250            type Value = ListFileMembersBatchResult;
8251            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8252                f.write_str("a ListFileMembersBatchResult struct")
8253            }
8254            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
8255                ListFileMembersBatchResult::internal_deserialize(map)
8256            }
8257        }
8258        deserializer.deserialize_struct("ListFileMembersBatchResult", LIST_FILE_MEMBERS_BATCH_RESULT_FIELDS, StructVisitor)
8259    }
8260}
8261
8262impl ::serde::ser::Serialize for ListFileMembersBatchResult {
8263    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8264        // struct serializer
8265        use serde::ser::SerializeStruct;
8266        let mut s = serializer.serialize_struct("ListFileMembersBatchResult", 2)?;
8267        self.internal_serialize::<S>(&mut s)?;
8268        s.end()
8269    }
8270}
8271
8272/// Arguments for [`list_file_members_continue()`](crate::sharing::list_file_members_continue).
8273#[derive(Debug, Clone, PartialEq, Eq)]
8274#[non_exhaustive] // structs may have more fields added in the future.
8275pub struct ListFileMembersContinueArg {
8276    /// The cursor returned by your last call to
8277    /// [`list_file_members()`](crate::sharing::list_file_members),
8278    /// [`list_file_members_continue()`](crate::sharing::list_file_members_continue), or
8279    /// [`list_file_members_batch()`](crate::sharing::list_file_members_batch).
8280    pub cursor: String,
8281}
8282
8283impl ListFileMembersContinueArg {
8284    pub fn new(cursor: String) -> Self {
8285        ListFileMembersContinueArg {
8286            cursor,
8287        }
8288    }
8289}
8290
8291const LIST_FILE_MEMBERS_CONTINUE_ARG_FIELDS: &[&str] = &["cursor"];
8292impl ListFileMembersContinueArg {
8293    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
8294        map: V,
8295    ) -> Result<ListFileMembersContinueArg, V::Error> {
8296        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
8297    }
8298
8299    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
8300        mut map: V,
8301        optional: bool,
8302    ) -> Result<Option<ListFileMembersContinueArg>, V::Error> {
8303        let mut field_cursor = None;
8304        let mut nothing = true;
8305        while let Some(key) = map.next_key::<&str>()? {
8306            nothing = false;
8307            match key {
8308                "cursor" => {
8309                    if field_cursor.is_some() {
8310                        return Err(::serde::de::Error::duplicate_field("cursor"));
8311                    }
8312                    field_cursor = Some(map.next_value()?);
8313                }
8314                _ => {
8315                    // unknown field allowed and ignored
8316                    map.next_value::<::serde_json::Value>()?;
8317                }
8318            }
8319        }
8320        if optional && nothing {
8321            return Ok(None);
8322        }
8323        let result = ListFileMembersContinueArg {
8324            cursor: field_cursor.ok_or_else(|| ::serde::de::Error::missing_field("cursor"))?,
8325        };
8326        Ok(Some(result))
8327    }
8328
8329    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
8330        &self,
8331        s: &mut S::SerializeStruct,
8332    ) -> Result<(), S::Error> {
8333        use serde::ser::SerializeStruct;
8334        s.serialize_field("cursor", &self.cursor)?;
8335        Ok(())
8336    }
8337}
8338
8339impl<'de> ::serde::de::Deserialize<'de> for ListFileMembersContinueArg {
8340    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8341        // struct deserializer
8342        use serde::de::{MapAccess, Visitor};
8343        struct StructVisitor;
8344        impl<'de> Visitor<'de> for StructVisitor {
8345            type Value = ListFileMembersContinueArg;
8346            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8347                f.write_str("a ListFileMembersContinueArg struct")
8348            }
8349            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
8350                ListFileMembersContinueArg::internal_deserialize(map)
8351            }
8352        }
8353        deserializer.deserialize_struct("ListFileMembersContinueArg", LIST_FILE_MEMBERS_CONTINUE_ARG_FIELDS, StructVisitor)
8354    }
8355}
8356
8357impl ::serde::ser::Serialize for ListFileMembersContinueArg {
8358    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8359        // struct serializer
8360        use serde::ser::SerializeStruct;
8361        let mut s = serializer.serialize_struct("ListFileMembersContinueArg", 1)?;
8362        self.internal_serialize::<S>(&mut s)?;
8363        s.end()
8364    }
8365}
8366
8367/// Error for [`list_file_members_continue()`](crate::sharing::list_file_members_continue).
8368#[derive(Debug, Clone, PartialEq, Eq)]
8369#[non_exhaustive] // variants may be added in the future
8370pub enum ListFileMembersContinueError {
8371    UserError(SharingUserError),
8372    AccessError(SharingFileAccessError),
8373    /// [`ListFileMembersContinueArg::cursor`](ListFileMembersContinueArg) is invalid.
8374    InvalidCursor,
8375    /// Catch-all used for unrecognized values returned from the server. Encountering this value
8376    /// typically indicates that this SDK version is out of date.
8377    Other,
8378}
8379
8380impl<'de> ::serde::de::Deserialize<'de> for ListFileMembersContinueError {
8381    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8382        // union deserializer
8383        use serde::de::{self, MapAccess, Visitor};
8384        struct EnumVisitor;
8385        impl<'de> Visitor<'de> for EnumVisitor {
8386            type Value = ListFileMembersContinueError;
8387            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8388                f.write_str("a ListFileMembersContinueError structure")
8389            }
8390            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
8391                let tag: &str = match map.next_key()? {
8392                    Some(".tag") => map.next_value()?,
8393                    _ => return Err(de::Error::missing_field(".tag"))
8394                };
8395                let value = match tag {
8396                    "user_error" => {
8397                        match map.next_key()? {
8398                            Some("user_error") => ListFileMembersContinueError::UserError(map.next_value()?),
8399                            None => return Err(de::Error::missing_field("user_error")),
8400                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
8401                        }
8402                    }
8403                    "access_error" => {
8404                        match map.next_key()? {
8405                            Some("access_error") => ListFileMembersContinueError::AccessError(map.next_value()?),
8406                            None => return Err(de::Error::missing_field("access_error")),
8407                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
8408                        }
8409                    }
8410                    "invalid_cursor" => ListFileMembersContinueError::InvalidCursor,
8411                    _ => ListFileMembersContinueError::Other,
8412                };
8413                crate::eat_json_fields(&mut map)?;
8414                Ok(value)
8415            }
8416        }
8417        const VARIANTS: &[&str] = &["user_error",
8418                                    "access_error",
8419                                    "invalid_cursor",
8420                                    "other"];
8421        deserializer.deserialize_struct("ListFileMembersContinueError", VARIANTS, EnumVisitor)
8422    }
8423}
8424
8425impl ::serde::ser::Serialize for ListFileMembersContinueError {
8426    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8427        // union serializer
8428        use serde::ser::SerializeStruct;
8429        match self {
8430            ListFileMembersContinueError::UserError(x) => {
8431                // union or polymporphic struct
8432                let mut s = serializer.serialize_struct("ListFileMembersContinueError", 2)?;
8433                s.serialize_field(".tag", "user_error")?;
8434                s.serialize_field("user_error", x)?;
8435                s.end()
8436            }
8437            ListFileMembersContinueError::AccessError(x) => {
8438                // union or polymporphic struct
8439                let mut s = serializer.serialize_struct("ListFileMembersContinueError", 2)?;
8440                s.serialize_field(".tag", "access_error")?;
8441                s.serialize_field("access_error", x)?;
8442                s.end()
8443            }
8444            ListFileMembersContinueError::InvalidCursor => {
8445                // unit
8446                let mut s = serializer.serialize_struct("ListFileMembersContinueError", 1)?;
8447                s.serialize_field(".tag", "invalid_cursor")?;
8448                s.end()
8449            }
8450            ListFileMembersContinueError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
8451        }
8452    }
8453}
8454
8455impl ::std::error::Error for ListFileMembersContinueError {
8456    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
8457        match self {
8458            ListFileMembersContinueError::UserError(inner) => Some(inner),
8459            ListFileMembersContinueError::AccessError(inner) => Some(inner),
8460            _ => None,
8461        }
8462    }
8463}
8464
8465impl ::std::fmt::Display for ListFileMembersContinueError {
8466    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8467        match self {
8468            ListFileMembersContinueError::UserError(inner) => write!(f, "ListFileMembersContinueError: {}", inner),
8469            ListFileMembersContinueError::AccessError(inner) => write!(f, "ListFileMembersContinueError: {}", inner),
8470            _ => write!(f, "{:?}", *self),
8471        }
8472    }
8473}
8474
8475#[derive(Debug, Clone, PartialEq, Eq)]
8476#[non_exhaustive] // structs may have more fields added in the future.
8477pub struct ListFileMembersCountResult {
8478    /// A list of members on this file.
8479    pub members: SharedFileMembers,
8480    /// The number of members on this file. This does not include inherited members.
8481    pub member_count: u32,
8482}
8483
8484impl ListFileMembersCountResult {
8485    pub fn new(members: SharedFileMembers, member_count: u32) -> Self {
8486        ListFileMembersCountResult {
8487            members,
8488            member_count,
8489        }
8490    }
8491}
8492
8493const LIST_FILE_MEMBERS_COUNT_RESULT_FIELDS: &[&str] = &["members",
8494                                                         "member_count"];
8495impl ListFileMembersCountResult {
8496    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
8497        map: V,
8498    ) -> Result<ListFileMembersCountResult, V::Error> {
8499        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
8500    }
8501
8502    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
8503        mut map: V,
8504        optional: bool,
8505    ) -> Result<Option<ListFileMembersCountResult>, V::Error> {
8506        let mut field_members = None;
8507        let mut field_member_count = None;
8508        let mut nothing = true;
8509        while let Some(key) = map.next_key::<&str>()? {
8510            nothing = false;
8511            match key {
8512                "members" => {
8513                    if field_members.is_some() {
8514                        return Err(::serde::de::Error::duplicate_field("members"));
8515                    }
8516                    field_members = Some(map.next_value()?);
8517                }
8518                "member_count" => {
8519                    if field_member_count.is_some() {
8520                        return Err(::serde::de::Error::duplicate_field("member_count"));
8521                    }
8522                    field_member_count = Some(map.next_value()?);
8523                }
8524                _ => {
8525                    // unknown field allowed and ignored
8526                    map.next_value::<::serde_json::Value>()?;
8527                }
8528            }
8529        }
8530        if optional && nothing {
8531            return Ok(None);
8532        }
8533        let result = ListFileMembersCountResult {
8534            members: field_members.ok_or_else(|| ::serde::de::Error::missing_field("members"))?,
8535            member_count: field_member_count.ok_or_else(|| ::serde::de::Error::missing_field("member_count"))?,
8536        };
8537        Ok(Some(result))
8538    }
8539
8540    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
8541        &self,
8542        s: &mut S::SerializeStruct,
8543    ) -> Result<(), S::Error> {
8544        use serde::ser::SerializeStruct;
8545        s.serialize_field("members", &self.members)?;
8546        s.serialize_field("member_count", &self.member_count)?;
8547        Ok(())
8548    }
8549}
8550
8551impl<'de> ::serde::de::Deserialize<'de> for ListFileMembersCountResult {
8552    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8553        // struct deserializer
8554        use serde::de::{MapAccess, Visitor};
8555        struct StructVisitor;
8556        impl<'de> Visitor<'de> for StructVisitor {
8557            type Value = ListFileMembersCountResult;
8558            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8559                f.write_str("a ListFileMembersCountResult struct")
8560            }
8561            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
8562                ListFileMembersCountResult::internal_deserialize(map)
8563            }
8564        }
8565        deserializer.deserialize_struct("ListFileMembersCountResult", LIST_FILE_MEMBERS_COUNT_RESULT_FIELDS, StructVisitor)
8566    }
8567}
8568
8569impl ::serde::ser::Serialize for ListFileMembersCountResult {
8570    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8571        // struct serializer
8572        use serde::ser::SerializeStruct;
8573        let mut s = serializer.serialize_struct("ListFileMembersCountResult", 2)?;
8574        self.internal_serialize::<S>(&mut s)?;
8575        s.end()
8576    }
8577}
8578
8579/// Error for [`list_file_members()`](crate::sharing::list_file_members).
8580#[derive(Debug, Clone, PartialEq, Eq)]
8581#[non_exhaustive] // variants may be added in the future
8582pub enum ListFileMembersError {
8583    UserError(SharingUserError),
8584    AccessError(SharingFileAccessError),
8585    /// Catch-all used for unrecognized values returned from the server. Encountering this value
8586    /// typically indicates that this SDK version is out of date.
8587    Other,
8588}
8589
8590impl<'de> ::serde::de::Deserialize<'de> for ListFileMembersError {
8591    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8592        // union deserializer
8593        use serde::de::{self, MapAccess, Visitor};
8594        struct EnumVisitor;
8595        impl<'de> Visitor<'de> for EnumVisitor {
8596            type Value = ListFileMembersError;
8597            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8598                f.write_str("a ListFileMembersError structure")
8599            }
8600            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
8601                let tag: &str = match map.next_key()? {
8602                    Some(".tag") => map.next_value()?,
8603                    _ => return Err(de::Error::missing_field(".tag"))
8604                };
8605                let value = match tag {
8606                    "user_error" => {
8607                        match map.next_key()? {
8608                            Some("user_error") => ListFileMembersError::UserError(map.next_value()?),
8609                            None => return Err(de::Error::missing_field("user_error")),
8610                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
8611                        }
8612                    }
8613                    "access_error" => {
8614                        match map.next_key()? {
8615                            Some("access_error") => ListFileMembersError::AccessError(map.next_value()?),
8616                            None => return Err(de::Error::missing_field("access_error")),
8617                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
8618                        }
8619                    }
8620                    _ => ListFileMembersError::Other,
8621                };
8622                crate::eat_json_fields(&mut map)?;
8623                Ok(value)
8624            }
8625        }
8626        const VARIANTS: &[&str] = &["user_error",
8627                                    "access_error",
8628                                    "other"];
8629        deserializer.deserialize_struct("ListFileMembersError", VARIANTS, EnumVisitor)
8630    }
8631}
8632
8633impl ::serde::ser::Serialize for ListFileMembersError {
8634    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8635        // union serializer
8636        use serde::ser::SerializeStruct;
8637        match self {
8638            ListFileMembersError::UserError(x) => {
8639                // union or polymporphic struct
8640                let mut s = serializer.serialize_struct("ListFileMembersError", 2)?;
8641                s.serialize_field(".tag", "user_error")?;
8642                s.serialize_field("user_error", x)?;
8643                s.end()
8644            }
8645            ListFileMembersError::AccessError(x) => {
8646                // union or polymporphic struct
8647                let mut s = serializer.serialize_struct("ListFileMembersError", 2)?;
8648                s.serialize_field(".tag", "access_error")?;
8649                s.serialize_field("access_error", x)?;
8650                s.end()
8651            }
8652            ListFileMembersError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
8653        }
8654    }
8655}
8656
8657impl ::std::error::Error for ListFileMembersError {
8658    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
8659        match self {
8660            ListFileMembersError::UserError(inner) => Some(inner),
8661            ListFileMembersError::AccessError(inner) => Some(inner),
8662            _ => None,
8663        }
8664    }
8665}
8666
8667impl ::std::fmt::Display for ListFileMembersError {
8668    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8669        match self {
8670            ListFileMembersError::UserError(inner) => write!(f, "ListFileMembersError: {}", inner),
8671            ListFileMembersError::AccessError(inner) => write!(f, "ListFileMembersError: {}", inner),
8672            _ => write!(f, "{:?}", *self),
8673        }
8674    }
8675}
8676
8677#[derive(Debug, Clone, PartialEq, Eq)]
8678#[non_exhaustive] // variants may be added in the future
8679pub enum ListFileMembersIndividualResult {
8680    /// The results of the query for this file if it was successful.
8681    Result(ListFileMembersCountResult),
8682    /// The result of the query for this file if it was an error.
8683    AccessError(SharingFileAccessError),
8684    /// Catch-all used for unrecognized values returned from the server. Encountering this value
8685    /// typically indicates that this SDK version is out of date.
8686    Other,
8687}
8688
8689impl<'de> ::serde::de::Deserialize<'de> for ListFileMembersIndividualResult {
8690    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8691        // union deserializer
8692        use serde::de::{self, MapAccess, Visitor};
8693        struct EnumVisitor;
8694        impl<'de> Visitor<'de> for EnumVisitor {
8695            type Value = ListFileMembersIndividualResult;
8696            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8697                f.write_str("a ListFileMembersIndividualResult structure")
8698            }
8699            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
8700                let tag: &str = match map.next_key()? {
8701                    Some(".tag") => map.next_value()?,
8702                    _ => return Err(de::Error::missing_field(".tag"))
8703                };
8704                let value = match tag {
8705                    "result" => ListFileMembersIndividualResult::Result(ListFileMembersCountResult::internal_deserialize(&mut map)?),
8706                    "access_error" => {
8707                        match map.next_key()? {
8708                            Some("access_error") => ListFileMembersIndividualResult::AccessError(map.next_value()?),
8709                            None => return Err(de::Error::missing_field("access_error")),
8710                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
8711                        }
8712                    }
8713                    _ => ListFileMembersIndividualResult::Other,
8714                };
8715                crate::eat_json_fields(&mut map)?;
8716                Ok(value)
8717            }
8718        }
8719        const VARIANTS: &[&str] = &["result",
8720                                    "access_error",
8721                                    "other"];
8722        deserializer.deserialize_struct("ListFileMembersIndividualResult", VARIANTS, EnumVisitor)
8723    }
8724}
8725
8726impl ::serde::ser::Serialize for ListFileMembersIndividualResult {
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            ListFileMembersIndividualResult::Result(x) => {
8732                // struct
8733                let mut s = serializer.serialize_struct("ListFileMembersIndividualResult", 3)?;
8734                s.serialize_field(".tag", "result")?;
8735                x.internal_serialize::<S>(&mut s)?;
8736                s.end()
8737            }
8738            ListFileMembersIndividualResult::AccessError(x) => {
8739                // union or polymporphic struct
8740                let mut s = serializer.serialize_struct("ListFileMembersIndividualResult", 2)?;
8741                s.serialize_field(".tag", "access_error")?;
8742                s.serialize_field("access_error", x)?;
8743                s.end()
8744            }
8745            ListFileMembersIndividualResult::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
8746        }
8747    }
8748}
8749
8750/// Arguments for [`list_received_files()`](crate::sharing::list_received_files).
8751#[derive(Debug, Clone, PartialEq, Eq)]
8752#[non_exhaustive] // structs may have more fields added in the future.
8753pub struct ListFilesArg {
8754    /// Number of files to return max per query. Defaults to 100 if no limit is specified.
8755    pub limit: u32,
8756    /// A list of `FileAction`s corresponding to `FilePermission`s that should appear in the
8757    /// response's [`SharedFileMetadata::permissions`](SharedFileMetadata) field describing the
8758    /// actions the  authenticated user can perform on the file.
8759    pub actions: Option<Vec<FileAction>>,
8760}
8761
8762impl Default for ListFilesArg {
8763    fn default() -> Self {
8764        ListFilesArg {
8765            limit: 100,
8766            actions: None,
8767        }
8768    }
8769}
8770
8771impl ListFilesArg {
8772    pub fn with_limit(mut self, value: u32) -> Self {
8773        self.limit = value;
8774        self
8775    }
8776
8777    pub fn with_actions(mut self, value: Vec<FileAction>) -> Self {
8778        self.actions = Some(value);
8779        self
8780    }
8781}
8782
8783const LIST_FILES_ARG_FIELDS: &[&str] = &["limit",
8784                                         "actions"];
8785impl ListFilesArg {
8786    // no _opt deserializer
8787    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
8788        mut map: V,
8789    ) -> Result<ListFilesArg, V::Error> {
8790        let mut field_limit = None;
8791        let mut field_actions = None;
8792        while let Some(key) = map.next_key::<&str>()? {
8793            match key {
8794                "limit" => {
8795                    if field_limit.is_some() {
8796                        return Err(::serde::de::Error::duplicate_field("limit"));
8797                    }
8798                    field_limit = Some(map.next_value()?);
8799                }
8800                "actions" => {
8801                    if field_actions.is_some() {
8802                        return Err(::serde::de::Error::duplicate_field("actions"));
8803                    }
8804                    field_actions = Some(map.next_value()?);
8805                }
8806                _ => {
8807                    // unknown field allowed and ignored
8808                    map.next_value::<::serde_json::Value>()?;
8809                }
8810            }
8811        }
8812        let result = ListFilesArg {
8813            limit: field_limit.unwrap_or(100),
8814            actions: field_actions.and_then(Option::flatten),
8815        };
8816        Ok(result)
8817    }
8818
8819    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
8820        &self,
8821        s: &mut S::SerializeStruct,
8822    ) -> Result<(), S::Error> {
8823        use serde::ser::SerializeStruct;
8824        if self.limit != 100 {
8825            s.serialize_field("limit", &self.limit)?;
8826        }
8827        if let Some(val) = &self.actions {
8828            s.serialize_field("actions", val)?;
8829        }
8830        Ok(())
8831    }
8832}
8833
8834impl<'de> ::serde::de::Deserialize<'de> for ListFilesArg {
8835    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8836        // struct deserializer
8837        use serde::de::{MapAccess, Visitor};
8838        struct StructVisitor;
8839        impl<'de> Visitor<'de> for StructVisitor {
8840            type Value = ListFilesArg;
8841            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8842                f.write_str("a ListFilesArg struct")
8843            }
8844            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
8845                ListFilesArg::internal_deserialize(map)
8846            }
8847        }
8848        deserializer.deserialize_struct("ListFilesArg", LIST_FILES_ARG_FIELDS, StructVisitor)
8849    }
8850}
8851
8852impl ::serde::ser::Serialize for ListFilesArg {
8853    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8854        // struct serializer
8855        use serde::ser::SerializeStruct;
8856        let mut s = serializer.serialize_struct("ListFilesArg", 2)?;
8857        self.internal_serialize::<S>(&mut s)?;
8858        s.end()
8859    }
8860}
8861
8862/// Arguments for [`list_received_files_continue()`](crate::sharing::list_received_files_continue).
8863#[derive(Debug, Clone, PartialEq, Eq)]
8864#[non_exhaustive] // structs may have more fields added in the future.
8865pub struct ListFilesContinueArg {
8866    /// Cursor in [`ListFilesResult::cursor`](ListFilesResult).
8867    pub cursor: String,
8868}
8869
8870impl ListFilesContinueArg {
8871    pub fn new(cursor: String) -> Self {
8872        ListFilesContinueArg {
8873            cursor,
8874        }
8875    }
8876}
8877
8878const LIST_FILES_CONTINUE_ARG_FIELDS: &[&str] = &["cursor"];
8879impl ListFilesContinueArg {
8880    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
8881        map: V,
8882    ) -> Result<ListFilesContinueArg, V::Error> {
8883        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
8884    }
8885
8886    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
8887        mut map: V,
8888        optional: bool,
8889    ) -> Result<Option<ListFilesContinueArg>, V::Error> {
8890        let mut field_cursor = None;
8891        let mut nothing = true;
8892        while let Some(key) = map.next_key::<&str>()? {
8893            nothing = false;
8894            match key {
8895                "cursor" => {
8896                    if field_cursor.is_some() {
8897                        return Err(::serde::de::Error::duplicate_field("cursor"));
8898                    }
8899                    field_cursor = Some(map.next_value()?);
8900                }
8901                _ => {
8902                    // unknown field allowed and ignored
8903                    map.next_value::<::serde_json::Value>()?;
8904                }
8905            }
8906        }
8907        if optional && nothing {
8908            return Ok(None);
8909        }
8910        let result = ListFilesContinueArg {
8911            cursor: field_cursor.ok_or_else(|| ::serde::de::Error::missing_field("cursor"))?,
8912        };
8913        Ok(Some(result))
8914    }
8915
8916    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
8917        &self,
8918        s: &mut S::SerializeStruct,
8919    ) -> Result<(), S::Error> {
8920        use serde::ser::SerializeStruct;
8921        s.serialize_field("cursor", &self.cursor)?;
8922        Ok(())
8923    }
8924}
8925
8926impl<'de> ::serde::de::Deserialize<'de> for ListFilesContinueArg {
8927    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8928        // struct deserializer
8929        use serde::de::{MapAccess, Visitor};
8930        struct StructVisitor;
8931        impl<'de> Visitor<'de> for StructVisitor {
8932            type Value = ListFilesContinueArg;
8933            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8934                f.write_str("a ListFilesContinueArg struct")
8935            }
8936            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
8937                ListFilesContinueArg::internal_deserialize(map)
8938            }
8939        }
8940        deserializer.deserialize_struct("ListFilesContinueArg", LIST_FILES_CONTINUE_ARG_FIELDS, StructVisitor)
8941    }
8942}
8943
8944impl ::serde::ser::Serialize for ListFilesContinueArg {
8945    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8946        // struct serializer
8947        use serde::ser::SerializeStruct;
8948        let mut s = serializer.serialize_struct("ListFilesContinueArg", 1)?;
8949        self.internal_serialize::<S>(&mut s)?;
8950        s.end()
8951    }
8952}
8953
8954/// Error results for
8955/// [`list_received_files_continue()`](crate::sharing::list_received_files_continue).
8956#[derive(Debug, Clone, PartialEq, Eq)]
8957#[non_exhaustive] // variants may be added in the future
8958pub enum ListFilesContinueError {
8959    /// User account had a problem.
8960    UserError(SharingUserError),
8961    /// [`ListFilesContinueArg::cursor`](ListFilesContinueArg) is invalid.
8962    InvalidCursor,
8963    /// Catch-all used for unrecognized values returned from the server. Encountering this value
8964    /// typically indicates that this SDK version is out of date.
8965    Other,
8966}
8967
8968impl<'de> ::serde::de::Deserialize<'de> for ListFilesContinueError {
8969    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8970        // union deserializer
8971        use serde::de::{self, MapAccess, Visitor};
8972        struct EnumVisitor;
8973        impl<'de> Visitor<'de> for EnumVisitor {
8974            type Value = ListFilesContinueError;
8975            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8976                f.write_str("a ListFilesContinueError structure")
8977            }
8978            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
8979                let tag: &str = match map.next_key()? {
8980                    Some(".tag") => map.next_value()?,
8981                    _ => return Err(de::Error::missing_field(".tag"))
8982                };
8983                let value = match tag {
8984                    "user_error" => {
8985                        match map.next_key()? {
8986                            Some("user_error") => ListFilesContinueError::UserError(map.next_value()?),
8987                            None => return Err(de::Error::missing_field("user_error")),
8988                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
8989                        }
8990                    }
8991                    "invalid_cursor" => ListFilesContinueError::InvalidCursor,
8992                    _ => ListFilesContinueError::Other,
8993                };
8994                crate::eat_json_fields(&mut map)?;
8995                Ok(value)
8996            }
8997        }
8998        const VARIANTS: &[&str] = &["user_error",
8999                                    "invalid_cursor",
9000                                    "other"];
9001        deserializer.deserialize_struct("ListFilesContinueError", VARIANTS, EnumVisitor)
9002    }
9003}
9004
9005impl ::serde::ser::Serialize for ListFilesContinueError {
9006    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9007        // union serializer
9008        use serde::ser::SerializeStruct;
9009        match self {
9010            ListFilesContinueError::UserError(x) => {
9011                // union or polymporphic struct
9012                let mut s = serializer.serialize_struct("ListFilesContinueError", 2)?;
9013                s.serialize_field(".tag", "user_error")?;
9014                s.serialize_field("user_error", x)?;
9015                s.end()
9016            }
9017            ListFilesContinueError::InvalidCursor => {
9018                // unit
9019                let mut s = serializer.serialize_struct("ListFilesContinueError", 1)?;
9020                s.serialize_field(".tag", "invalid_cursor")?;
9021                s.end()
9022            }
9023            ListFilesContinueError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
9024        }
9025    }
9026}
9027
9028impl ::std::error::Error for ListFilesContinueError {
9029    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
9030        match self {
9031            ListFilesContinueError::UserError(inner) => Some(inner),
9032            _ => None,
9033        }
9034    }
9035}
9036
9037impl ::std::fmt::Display for ListFilesContinueError {
9038    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9039        match self {
9040            ListFilesContinueError::UserError(inner) => write!(f, "User account had a problem: {}", inner),
9041            _ => write!(f, "{:?}", *self),
9042        }
9043    }
9044}
9045
9046/// Success results for [`list_received_files()`](crate::sharing::list_received_files).
9047#[derive(Debug, Clone, PartialEq, Eq)]
9048#[non_exhaustive] // structs may have more fields added in the future.
9049pub struct ListFilesResult {
9050    /// Information about the files shared with current user.
9051    pub entries: Vec<SharedFileMetadata>,
9052    /// Cursor used to obtain additional shared files.
9053    pub cursor: Option<String>,
9054}
9055
9056impl ListFilesResult {
9057    pub fn new(entries: Vec<SharedFileMetadata>) -> Self {
9058        ListFilesResult {
9059            entries,
9060            cursor: None,
9061        }
9062    }
9063
9064    pub fn with_cursor(mut self, value: String) -> Self {
9065        self.cursor = Some(value);
9066        self
9067    }
9068}
9069
9070const LIST_FILES_RESULT_FIELDS: &[&str] = &["entries",
9071                                            "cursor"];
9072impl ListFilesResult {
9073    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
9074        map: V,
9075    ) -> Result<ListFilesResult, V::Error> {
9076        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
9077    }
9078
9079    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
9080        mut map: V,
9081        optional: bool,
9082    ) -> Result<Option<ListFilesResult>, V::Error> {
9083        let mut field_entries = None;
9084        let mut field_cursor = None;
9085        let mut nothing = true;
9086        while let Some(key) = map.next_key::<&str>()? {
9087            nothing = false;
9088            match key {
9089                "entries" => {
9090                    if field_entries.is_some() {
9091                        return Err(::serde::de::Error::duplicate_field("entries"));
9092                    }
9093                    field_entries = Some(map.next_value()?);
9094                }
9095                "cursor" => {
9096                    if field_cursor.is_some() {
9097                        return Err(::serde::de::Error::duplicate_field("cursor"));
9098                    }
9099                    field_cursor = Some(map.next_value()?);
9100                }
9101                _ => {
9102                    // unknown field allowed and ignored
9103                    map.next_value::<::serde_json::Value>()?;
9104                }
9105            }
9106        }
9107        if optional && nothing {
9108            return Ok(None);
9109        }
9110        let result = ListFilesResult {
9111            entries: field_entries.ok_or_else(|| ::serde::de::Error::missing_field("entries"))?,
9112            cursor: field_cursor.and_then(Option::flatten),
9113        };
9114        Ok(Some(result))
9115    }
9116
9117    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
9118        &self,
9119        s: &mut S::SerializeStruct,
9120    ) -> Result<(), S::Error> {
9121        use serde::ser::SerializeStruct;
9122        s.serialize_field("entries", &self.entries)?;
9123        if let Some(val) = &self.cursor {
9124            s.serialize_field("cursor", val)?;
9125        }
9126        Ok(())
9127    }
9128}
9129
9130impl<'de> ::serde::de::Deserialize<'de> for ListFilesResult {
9131    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9132        // struct deserializer
9133        use serde::de::{MapAccess, Visitor};
9134        struct StructVisitor;
9135        impl<'de> Visitor<'de> for StructVisitor {
9136            type Value = ListFilesResult;
9137            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9138                f.write_str("a ListFilesResult struct")
9139            }
9140            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
9141                ListFilesResult::internal_deserialize(map)
9142            }
9143        }
9144        deserializer.deserialize_struct("ListFilesResult", LIST_FILES_RESULT_FIELDS, StructVisitor)
9145    }
9146}
9147
9148impl ::serde::ser::Serialize for ListFilesResult {
9149    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9150        // struct serializer
9151        use serde::ser::SerializeStruct;
9152        let mut s = serializer.serialize_struct("ListFilesResult", 2)?;
9153        self.internal_serialize::<S>(&mut s)?;
9154        s.end()
9155    }
9156}
9157
9158#[derive(Debug, Clone, PartialEq, Eq)]
9159#[non_exhaustive] // structs may have more fields added in the future.
9160pub struct ListFolderMembersArgs {
9161    /// The ID for the shared folder.
9162    pub shared_folder_id: crate::types::common::SharedFolderId,
9163    /// This is a list indicating whether each returned member will include a boolean value
9164    /// [`MemberPermission::allow`](MemberPermission) that describes whether the current user can
9165    /// perform the MemberAction on the member.
9166    pub actions: Option<Vec<MemberAction>>,
9167    /// The maximum number of results that include members, groups and invitees to return per
9168    /// request.
9169    pub limit: u32,
9170}
9171
9172impl ListFolderMembersArgs {
9173    pub fn new(shared_folder_id: crate::types::common::SharedFolderId) -> Self {
9174        ListFolderMembersArgs {
9175            shared_folder_id,
9176            actions: None,
9177            limit: 1000,
9178        }
9179    }
9180
9181    pub fn with_actions(mut self, value: Vec<MemberAction>) -> Self {
9182        self.actions = Some(value);
9183        self
9184    }
9185
9186    pub fn with_limit(mut self, value: u32) -> Self {
9187        self.limit = value;
9188        self
9189    }
9190}
9191
9192const LIST_FOLDER_MEMBERS_ARGS_FIELDS: &[&str] = &["shared_folder_id",
9193                                                   "actions",
9194                                                   "limit"];
9195impl ListFolderMembersArgs {
9196    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
9197        map: V,
9198    ) -> Result<ListFolderMembersArgs, V::Error> {
9199        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
9200    }
9201
9202    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
9203        mut map: V,
9204        optional: bool,
9205    ) -> Result<Option<ListFolderMembersArgs>, V::Error> {
9206        let mut field_shared_folder_id = None;
9207        let mut field_actions = None;
9208        let mut field_limit = None;
9209        let mut nothing = true;
9210        while let Some(key) = map.next_key::<&str>()? {
9211            nothing = false;
9212            match key {
9213                "shared_folder_id" => {
9214                    if field_shared_folder_id.is_some() {
9215                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
9216                    }
9217                    field_shared_folder_id = Some(map.next_value()?);
9218                }
9219                "actions" => {
9220                    if field_actions.is_some() {
9221                        return Err(::serde::de::Error::duplicate_field("actions"));
9222                    }
9223                    field_actions = Some(map.next_value()?);
9224                }
9225                "limit" => {
9226                    if field_limit.is_some() {
9227                        return Err(::serde::de::Error::duplicate_field("limit"));
9228                    }
9229                    field_limit = Some(map.next_value()?);
9230                }
9231                _ => {
9232                    // unknown field allowed and ignored
9233                    map.next_value::<::serde_json::Value>()?;
9234                }
9235            }
9236        }
9237        if optional && nothing {
9238            return Ok(None);
9239        }
9240        let result = ListFolderMembersArgs {
9241            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
9242            actions: field_actions.and_then(Option::flatten),
9243            limit: field_limit.unwrap_or(1000),
9244        };
9245        Ok(Some(result))
9246    }
9247
9248    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
9249        &self,
9250        s: &mut S::SerializeStruct,
9251    ) -> Result<(), S::Error> {
9252        use serde::ser::SerializeStruct;
9253        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
9254        if let Some(val) = &self.actions {
9255            s.serialize_field("actions", val)?;
9256        }
9257        if self.limit != 1000 {
9258            s.serialize_field("limit", &self.limit)?;
9259        }
9260        Ok(())
9261    }
9262}
9263
9264impl<'de> ::serde::de::Deserialize<'de> for ListFolderMembersArgs {
9265    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9266        // struct deserializer
9267        use serde::de::{MapAccess, Visitor};
9268        struct StructVisitor;
9269        impl<'de> Visitor<'de> for StructVisitor {
9270            type Value = ListFolderMembersArgs;
9271            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9272                f.write_str("a ListFolderMembersArgs struct")
9273            }
9274            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
9275                ListFolderMembersArgs::internal_deserialize(map)
9276            }
9277        }
9278        deserializer.deserialize_struct("ListFolderMembersArgs", LIST_FOLDER_MEMBERS_ARGS_FIELDS, StructVisitor)
9279    }
9280}
9281
9282impl ::serde::ser::Serialize for ListFolderMembersArgs {
9283    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9284        // struct serializer
9285        use serde::ser::SerializeStruct;
9286        let mut s = serializer.serialize_struct("ListFolderMembersArgs", 3)?;
9287        self.internal_serialize::<S>(&mut s)?;
9288        s.end()
9289    }
9290}
9291
9292// struct extends ListFolderMembersCursorArg
9293impl From<ListFolderMembersArgs> for ListFolderMembersCursorArg {
9294    fn from(subtype: ListFolderMembersArgs) -> Self {
9295        Self {
9296            actions: subtype.actions,
9297            limit: subtype.limit,
9298        }
9299    }
9300}
9301#[derive(Debug, Clone, PartialEq, Eq)]
9302#[non_exhaustive] // structs may have more fields added in the future.
9303pub struct ListFolderMembersContinueArg {
9304    /// The cursor returned by your last call to
9305    /// [`list_folder_members()`](crate::sharing::list_folder_members) or
9306    /// [`list_folder_members_continue()`](crate::sharing::list_folder_members_continue).
9307    pub cursor: String,
9308}
9309
9310impl ListFolderMembersContinueArg {
9311    pub fn new(cursor: String) -> Self {
9312        ListFolderMembersContinueArg {
9313            cursor,
9314        }
9315    }
9316}
9317
9318const LIST_FOLDER_MEMBERS_CONTINUE_ARG_FIELDS: &[&str] = &["cursor"];
9319impl ListFolderMembersContinueArg {
9320    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
9321        map: V,
9322    ) -> Result<ListFolderMembersContinueArg, V::Error> {
9323        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
9324    }
9325
9326    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
9327        mut map: V,
9328        optional: bool,
9329    ) -> Result<Option<ListFolderMembersContinueArg>, V::Error> {
9330        let mut field_cursor = None;
9331        let mut nothing = true;
9332        while let Some(key) = map.next_key::<&str>()? {
9333            nothing = false;
9334            match key {
9335                "cursor" => {
9336                    if field_cursor.is_some() {
9337                        return Err(::serde::de::Error::duplicate_field("cursor"));
9338                    }
9339                    field_cursor = Some(map.next_value()?);
9340                }
9341                _ => {
9342                    // unknown field allowed and ignored
9343                    map.next_value::<::serde_json::Value>()?;
9344                }
9345            }
9346        }
9347        if optional && nothing {
9348            return Ok(None);
9349        }
9350        let result = ListFolderMembersContinueArg {
9351            cursor: field_cursor.ok_or_else(|| ::serde::de::Error::missing_field("cursor"))?,
9352        };
9353        Ok(Some(result))
9354    }
9355
9356    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
9357        &self,
9358        s: &mut S::SerializeStruct,
9359    ) -> Result<(), S::Error> {
9360        use serde::ser::SerializeStruct;
9361        s.serialize_field("cursor", &self.cursor)?;
9362        Ok(())
9363    }
9364}
9365
9366impl<'de> ::serde::de::Deserialize<'de> for ListFolderMembersContinueArg {
9367    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9368        // struct deserializer
9369        use serde::de::{MapAccess, Visitor};
9370        struct StructVisitor;
9371        impl<'de> Visitor<'de> for StructVisitor {
9372            type Value = ListFolderMembersContinueArg;
9373            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9374                f.write_str("a ListFolderMembersContinueArg struct")
9375            }
9376            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
9377                ListFolderMembersContinueArg::internal_deserialize(map)
9378            }
9379        }
9380        deserializer.deserialize_struct("ListFolderMembersContinueArg", LIST_FOLDER_MEMBERS_CONTINUE_ARG_FIELDS, StructVisitor)
9381    }
9382}
9383
9384impl ::serde::ser::Serialize for ListFolderMembersContinueArg {
9385    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9386        // struct serializer
9387        use serde::ser::SerializeStruct;
9388        let mut s = serializer.serialize_struct("ListFolderMembersContinueArg", 1)?;
9389        self.internal_serialize::<S>(&mut s)?;
9390        s.end()
9391    }
9392}
9393
9394#[derive(Debug, Clone, PartialEq, Eq)]
9395#[non_exhaustive] // variants may be added in the future
9396pub enum ListFolderMembersContinueError {
9397    AccessError(SharedFolderAccessError),
9398    /// [`ListFolderMembersContinueArg::cursor`](ListFolderMembersContinueArg) is invalid.
9399    InvalidCursor,
9400    /// Catch-all used for unrecognized values returned from the server. Encountering this value
9401    /// typically indicates that this SDK version is out of date.
9402    Other,
9403}
9404
9405impl<'de> ::serde::de::Deserialize<'de> for ListFolderMembersContinueError {
9406    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9407        // union deserializer
9408        use serde::de::{self, MapAccess, Visitor};
9409        struct EnumVisitor;
9410        impl<'de> Visitor<'de> for EnumVisitor {
9411            type Value = ListFolderMembersContinueError;
9412            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9413                f.write_str("a ListFolderMembersContinueError structure")
9414            }
9415            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
9416                let tag: &str = match map.next_key()? {
9417                    Some(".tag") => map.next_value()?,
9418                    _ => return Err(de::Error::missing_field(".tag"))
9419                };
9420                let value = match tag {
9421                    "access_error" => {
9422                        match map.next_key()? {
9423                            Some("access_error") => ListFolderMembersContinueError::AccessError(map.next_value()?),
9424                            None => return Err(de::Error::missing_field("access_error")),
9425                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
9426                        }
9427                    }
9428                    "invalid_cursor" => ListFolderMembersContinueError::InvalidCursor,
9429                    _ => ListFolderMembersContinueError::Other,
9430                };
9431                crate::eat_json_fields(&mut map)?;
9432                Ok(value)
9433            }
9434        }
9435        const VARIANTS: &[&str] = &["access_error",
9436                                    "invalid_cursor",
9437                                    "other"];
9438        deserializer.deserialize_struct("ListFolderMembersContinueError", VARIANTS, EnumVisitor)
9439    }
9440}
9441
9442impl ::serde::ser::Serialize for ListFolderMembersContinueError {
9443    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9444        // union serializer
9445        use serde::ser::SerializeStruct;
9446        match self {
9447            ListFolderMembersContinueError::AccessError(x) => {
9448                // union or polymporphic struct
9449                let mut s = serializer.serialize_struct("ListFolderMembersContinueError", 2)?;
9450                s.serialize_field(".tag", "access_error")?;
9451                s.serialize_field("access_error", x)?;
9452                s.end()
9453            }
9454            ListFolderMembersContinueError::InvalidCursor => {
9455                // unit
9456                let mut s = serializer.serialize_struct("ListFolderMembersContinueError", 1)?;
9457                s.serialize_field(".tag", "invalid_cursor")?;
9458                s.end()
9459            }
9460            ListFolderMembersContinueError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
9461        }
9462    }
9463}
9464
9465impl ::std::error::Error for ListFolderMembersContinueError {
9466    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
9467        match self {
9468            ListFolderMembersContinueError::AccessError(inner) => Some(inner),
9469            _ => None,
9470        }
9471    }
9472}
9473
9474impl ::std::fmt::Display for ListFolderMembersContinueError {
9475    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9476        match self {
9477            ListFolderMembersContinueError::AccessError(inner) => write!(f, "ListFolderMembersContinueError: {}", inner),
9478            _ => write!(f, "{:?}", *self),
9479        }
9480    }
9481}
9482
9483#[derive(Debug, Clone, PartialEq, Eq)]
9484#[non_exhaustive] // structs may have more fields added in the future.
9485pub struct ListFolderMembersCursorArg {
9486    /// This is a list indicating whether each returned member will include a boolean value
9487    /// [`MemberPermission::allow`](MemberPermission) that describes whether the current user can
9488    /// perform the MemberAction on the member.
9489    pub actions: Option<Vec<MemberAction>>,
9490    /// The maximum number of results that include members, groups and invitees to return per
9491    /// request.
9492    pub limit: u32,
9493}
9494
9495impl Default for ListFolderMembersCursorArg {
9496    fn default() -> Self {
9497        ListFolderMembersCursorArg {
9498            actions: None,
9499            limit: 1000,
9500        }
9501    }
9502}
9503
9504impl ListFolderMembersCursorArg {
9505    pub fn with_actions(mut self, value: Vec<MemberAction>) -> Self {
9506        self.actions = Some(value);
9507        self
9508    }
9509
9510    pub fn with_limit(mut self, value: u32) -> Self {
9511        self.limit = value;
9512        self
9513    }
9514}
9515
9516const LIST_FOLDER_MEMBERS_CURSOR_ARG_FIELDS: &[&str] = &["actions",
9517                                                         "limit"];
9518impl ListFolderMembersCursorArg {
9519    // no _opt deserializer
9520    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
9521        mut map: V,
9522    ) -> Result<ListFolderMembersCursorArg, V::Error> {
9523        let mut field_actions = None;
9524        let mut field_limit = None;
9525        while let Some(key) = map.next_key::<&str>()? {
9526            match key {
9527                "actions" => {
9528                    if field_actions.is_some() {
9529                        return Err(::serde::de::Error::duplicate_field("actions"));
9530                    }
9531                    field_actions = Some(map.next_value()?);
9532                }
9533                "limit" => {
9534                    if field_limit.is_some() {
9535                        return Err(::serde::de::Error::duplicate_field("limit"));
9536                    }
9537                    field_limit = Some(map.next_value()?);
9538                }
9539                _ => {
9540                    // unknown field allowed and ignored
9541                    map.next_value::<::serde_json::Value>()?;
9542                }
9543            }
9544        }
9545        let result = ListFolderMembersCursorArg {
9546            actions: field_actions.and_then(Option::flatten),
9547            limit: field_limit.unwrap_or(1000),
9548        };
9549        Ok(result)
9550    }
9551
9552    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
9553        &self,
9554        s: &mut S::SerializeStruct,
9555    ) -> Result<(), S::Error> {
9556        use serde::ser::SerializeStruct;
9557        if let Some(val) = &self.actions {
9558            s.serialize_field("actions", val)?;
9559        }
9560        if self.limit != 1000 {
9561            s.serialize_field("limit", &self.limit)?;
9562        }
9563        Ok(())
9564    }
9565}
9566
9567impl<'de> ::serde::de::Deserialize<'de> for ListFolderMembersCursorArg {
9568    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9569        // struct deserializer
9570        use serde::de::{MapAccess, Visitor};
9571        struct StructVisitor;
9572        impl<'de> Visitor<'de> for StructVisitor {
9573            type Value = ListFolderMembersCursorArg;
9574            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9575                f.write_str("a ListFolderMembersCursorArg struct")
9576            }
9577            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
9578                ListFolderMembersCursorArg::internal_deserialize(map)
9579            }
9580        }
9581        deserializer.deserialize_struct("ListFolderMembersCursorArg", LIST_FOLDER_MEMBERS_CURSOR_ARG_FIELDS, StructVisitor)
9582    }
9583}
9584
9585impl ::serde::ser::Serialize for ListFolderMembersCursorArg {
9586    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9587        // struct serializer
9588        use serde::ser::SerializeStruct;
9589        let mut s = serializer.serialize_struct("ListFolderMembersCursorArg", 2)?;
9590        self.internal_serialize::<S>(&mut s)?;
9591        s.end()
9592    }
9593}
9594
9595#[derive(Debug, Clone, PartialEq, Eq)]
9596#[non_exhaustive] // structs may have more fields added in the future.
9597pub struct ListFoldersArgs {
9598    /// The maximum number of results to return per request.
9599    pub limit: u32,
9600    /// A list of `FolderAction`s corresponding to `FolderPermission`s that should appear in the
9601    /// response's [`SharedFolderMetadata::permissions`](SharedFolderMetadata) field describing the
9602    /// actions the  authenticated user can perform on the folder.
9603    pub actions: Option<Vec<FolderAction>>,
9604}
9605
9606impl Default for ListFoldersArgs {
9607    fn default() -> Self {
9608        ListFoldersArgs {
9609            limit: 1000,
9610            actions: None,
9611        }
9612    }
9613}
9614
9615impl ListFoldersArgs {
9616    pub fn with_limit(mut self, value: u32) -> Self {
9617        self.limit = value;
9618        self
9619    }
9620
9621    pub fn with_actions(mut self, value: Vec<FolderAction>) -> Self {
9622        self.actions = Some(value);
9623        self
9624    }
9625}
9626
9627const LIST_FOLDERS_ARGS_FIELDS: &[&str] = &["limit",
9628                                            "actions"];
9629impl ListFoldersArgs {
9630    // no _opt deserializer
9631    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
9632        mut map: V,
9633    ) -> Result<ListFoldersArgs, V::Error> {
9634        let mut field_limit = None;
9635        let mut field_actions = None;
9636        while let Some(key) = map.next_key::<&str>()? {
9637            match key {
9638                "limit" => {
9639                    if field_limit.is_some() {
9640                        return Err(::serde::de::Error::duplicate_field("limit"));
9641                    }
9642                    field_limit = Some(map.next_value()?);
9643                }
9644                "actions" => {
9645                    if field_actions.is_some() {
9646                        return Err(::serde::de::Error::duplicate_field("actions"));
9647                    }
9648                    field_actions = Some(map.next_value()?);
9649                }
9650                _ => {
9651                    // unknown field allowed and ignored
9652                    map.next_value::<::serde_json::Value>()?;
9653                }
9654            }
9655        }
9656        let result = ListFoldersArgs {
9657            limit: field_limit.unwrap_or(1000),
9658            actions: field_actions.and_then(Option::flatten),
9659        };
9660        Ok(result)
9661    }
9662
9663    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
9664        &self,
9665        s: &mut S::SerializeStruct,
9666    ) -> Result<(), S::Error> {
9667        use serde::ser::SerializeStruct;
9668        if self.limit != 1000 {
9669            s.serialize_field("limit", &self.limit)?;
9670        }
9671        if let Some(val) = &self.actions {
9672            s.serialize_field("actions", val)?;
9673        }
9674        Ok(())
9675    }
9676}
9677
9678impl<'de> ::serde::de::Deserialize<'de> for ListFoldersArgs {
9679    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9680        // struct deserializer
9681        use serde::de::{MapAccess, Visitor};
9682        struct StructVisitor;
9683        impl<'de> Visitor<'de> for StructVisitor {
9684            type Value = ListFoldersArgs;
9685            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9686                f.write_str("a ListFoldersArgs struct")
9687            }
9688            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
9689                ListFoldersArgs::internal_deserialize(map)
9690            }
9691        }
9692        deserializer.deserialize_struct("ListFoldersArgs", LIST_FOLDERS_ARGS_FIELDS, StructVisitor)
9693    }
9694}
9695
9696impl ::serde::ser::Serialize for ListFoldersArgs {
9697    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9698        // struct serializer
9699        use serde::ser::SerializeStruct;
9700        let mut s = serializer.serialize_struct("ListFoldersArgs", 2)?;
9701        self.internal_serialize::<S>(&mut s)?;
9702        s.end()
9703    }
9704}
9705
9706#[derive(Debug, Clone, PartialEq, Eq)]
9707#[non_exhaustive] // structs may have more fields added in the future.
9708pub struct ListFoldersContinueArg {
9709    /// The cursor returned by the previous API call specified in the endpoint description.
9710    pub cursor: String,
9711}
9712
9713impl ListFoldersContinueArg {
9714    pub fn new(cursor: String) -> Self {
9715        ListFoldersContinueArg {
9716            cursor,
9717        }
9718    }
9719}
9720
9721const LIST_FOLDERS_CONTINUE_ARG_FIELDS: &[&str] = &["cursor"];
9722impl ListFoldersContinueArg {
9723    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
9724        map: V,
9725    ) -> Result<ListFoldersContinueArg, V::Error> {
9726        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
9727    }
9728
9729    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
9730        mut map: V,
9731        optional: bool,
9732    ) -> Result<Option<ListFoldersContinueArg>, V::Error> {
9733        let mut field_cursor = None;
9734        let mut nothing = true;
9735        while let Some(key) = map.next_key::<&str>()? {
9736            nothing = false;
9737            match key {
9738                "cursor" => {
9739                    if field_cursor.is_some() {
9740                        return Err(::serde::de::Error::duplicate_field("cursor"));
9741                    }
9742                    field_cursor = Some(map.next_value()?);
9743                }
9744                _ => {
9745                    // unknown field allowed and ignored
9746                    map.next_value::<::serde_json::Value>()?;
9747                }
9748            }
9749        }
9750        if optional && nothing {
9751            return Ok(None);
9752        }
9753        let result = ListFoldersContinueArg {
9754            cursor: field_cursor.ok_or_else(|| ::serde::de::Error::missing_field("cursor"))?,
9755        };
9756        Ok(Some(result))
9757    }
9758
9759    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
9760        &self,
9761        s: &mut S::SerializeStruct,
9762    ) -> Result<(), S::Error> {
9763        use serde::ser::SerializeStruct;
9764        s.serialize_field("cursor", &self.cursor)?;
9765        Ok(())
9766    }
9767}
9768
9769impl<'de> ::serde::de::Deserialize<'de> for ListFoldersContinueArg {
9770    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9771        // struct deserializer
9772        use serde::de::{MapAccess, Visitor};
9773        struct StructVisitor;
9774        impl<'de> Visitor<'de> for StructVisitor {
9775            type Value = ListFoldersContinueArg;
9776            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9777                f.write_str("a ListFoldersContinueArg struct")
9778            }
9779            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
9780                ListFoldersContinueArg::internal_deserialize(map)
9781            }
9782        }
9783        deserializer.deserialize_struct("ListFoldersContinueArg", LIST_FOLDERS_CONTINUE_ARG_FIELDS, StructVisitor)
9784    }
9785}
9786
9787impl ::serde::ser::Serialize for ListFoldersContinueArg {
9788    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9789        // struct serializer
9790        use serde::ser::SerializeStruct;
9791        let mut s = serializer.serialize_struct("ListFoldersContinueArg", 1)?;
9792        self.internal_serialize::<S>(&mut s)?;
9793        s.end()
9794    }
9795}
9796
9797#[derive(Debug, Clone, PartialEq, Eq)]
9798#[non_exhaustive] // variants may be added in the future
9799pub enum ListFoldersContinueError {
9800    /// [`ListFoldersContinueArg::cursor`](ListFoldersContinueArg) is invalid.
9801    InvalidCursor,
9802    /// Catch-all used for unrecognized values returned from the server. Encountering this value
9803    /// typically indicates that this SDK version is out of date.
9804    Other,
9805}
9806
9807impl<'de> ::serde::de::Deserialize<'de> for ListFoldersContinueError {
9808    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9809        // union deserializer
9810        use serde::de::{self, MapAccess, Visitor};
9811        struct EnumVisitor;
9812        impl<'de> Visitor<'de> for EnumVisitor {
9813            type Value = ListFoldersContinueError;
9814            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9815                f.write_str("a ListFoldersContinueError structure")
9816            }
9817            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
9818                let tag: &str = match map.next_key()? {
9819                    Some(".tag") => map.next_value()?,
9820                    _ => return Err(de::Error::missing_field(".tag"))
9821                };
9822                let value = match tag {
9823                    "invalid_cursor" => ListFoldersContinueError::InvalidCursor,
9824                    _ => ListFoldersContinueError::Other,
9825                };
9826                crate::eat_json_fields(&mut map)?;
9827                Ok(value)
9828            }
9829        }
9830        const VARIANTS: &[&str] = &["invalid_cursor",
9831                                    "other"];
9832        deserializer.deserialize_struct("ListFoldersContinueError", VARIANTS, EnumVisitor)
9833    }
9834}
9835
9836impl ::serde::ser::Serialize for ListFoldersContinueError {
9837    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9838        // union serializer
9839        use serde::ser::SerializeStruct;
9840        match self {
9841            ListFoldersContinueError::InvalidCursor => {
9842                // unit
9843                let mut s = serializer.serialize_struct("ListFoldersContinueError", 1)?;
9844                s.serialize_field(".tag", "invalid_cursor")?;
9845                s.end()
9846            }
9847            ListFoldersContinueError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
9848        }
9849    }
9850}
9851
9852impl ::std::error::Error for ListFoldersContinueError {
9853}
9854
9855impl ::std::fmt::Display for ListFoldersContinueError {
9856    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9857        write!(f, "{:?}", *self)
9858    }
9859}
9860
9861/// Result for [`list_folders()`](crate::sharing::list_folders) or
9862/// [`list_mountable_folders()`](crate::sharing::list_mountable_folders), depending on which
9863/// endpoint was requested. Unmounted shared folders can be identified by the absence of
9864/// [`SharedFolderMetadata::path_lower`](SharedFolderMetadata).
9865#[derive(Debug, Clone, PartialEq, Eq)]
9866#[non_exhaustive] // structs may have more fields added in the future.
9867pub struct ListFoldersResult {
9868    /// List of all shared folders the authenticated user has access to.
9869    pub entries: Vec<SharedFolderMetadata>,
9870    /// Present if there are additional shared folders that have not been returned yet. Pass the
9871    /// cursor into the corresponding continue endpoint (either
9872    /// [`list_folders_continue()`](crate::sharing::list_folders_continue) or
9873    /// [`list_mountable_folders_continue()`](crate::sharing::list_mountable_folders_continue)) to
9874    /// list additional folders.
9875    pub cursor: Option<String>,
9876}
9877
9878impl ListFoldersResult {
9879    pub fn new(entries: Vec<SharedFolderMetadata>) -> Self {
9880        ListFoldersResult {
9881            entries,
9882            cursor: None,
9883        }
9884    }
9885
9886    pub fn with_cursor(mut self, value: String) -> Self {
9887        self.cursor = Some(value);
9888        self
9889    }
9890}
9891
9892const LIST_FOLDERS_RESULT_FIELDS: &[&str] = &["entries",
9893                                              "cursor"];
9894impl ListFoldersResult {
9895    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
9896        map: V,
9897    ) -> Result<ListFoldersResult, V::Error> {
9898        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
9899    }
9900
9901    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
9902        mut map: V,
9903        optional: bool,
9904    ) -> Result<Option<ListFoldersResult>, V::Error> {
9905        let mut field_entries = None;
9906        let mut field_cursor = None;
9907        let mut nothing = true;
9908        while let Some(key) = map.next_key::<&str>()? {
9909            nothing = false;
9910            match key {
9911                "entries" => {
9912                    if field_entries.is_some() {
9913                        return Err(::serde::de::Error::duplicate_field("entries"));
9914                    }
9915                    field_entries = Some(map.next_value()?);
9916                }
9917                "cursor" => {
9918                    if field_cursor.is_some() {
9919                        return Err(::serde::de::Error::duplicate_field("cursor"));
9920                    }
9921                    field_cursor = Some(map.next_value()?);
9922                }
9923                _ => {
9924                    // unknown field allowed and ignored
9925                    map.next_value::<::serde_json::Value>()?;
9926                }
9927            }
9928        }
9929        if optional && nothing {
9930            return Ok(None);
9931        }
9932        let result = ListFoldersResult {
9933            entries: field_entries.ok_or_else(|| ::serde::de::Error::missing_field("entries"))?,
9934            cursor: field_cursor.and_then(Option::flatten),
9935        };
9936        Ok(Some(result))
9937    }
9938
9939    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
9940        &self,
9941        s: &mut S::SerializeStruct,
9942    ) -> Result<(), S::Error> {
9943        use serde::ser::SerializeStruct;
9944        s.serialize_field("entries", &self.entries)?;
9945        if let Some(val) = &self.cursor {
9946            s.serialize_field("cursor", val)?;
9947        }
9948        Ok(())
9949    }
9950}
9951
9952impl<'de> ::serde::de::Deserialize<'de> for ListFoldersResult {
9953    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9954        // struct deserializer
9955        use serde::de::{MapAccess, Visitor};
9956        struct StructVisitor;
9957        impl<'de> Visitor<'de> for StructVisitor {
9958            type Value = ListFoldersResult;
9959            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
9960                f.write_str("a ListFoldersResult struct")
9961            }
9962            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
9963                ListFoldersResult::internal_deserialize(map)
9964            }
9965        }
9966        deserializer.deserialize_struct("ListFoldersResult", LIST_FOLDERS_RESULT_FIELDS, StructVisitor)
9967    }
9968}
9969
9970impl ::serde::ser::Serialize for ListFoldersResult {
9971    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9972        // struct serializer
9973        use serde::ser::SerializeStruct;
9974        let mut s = serializer.serialize_struct("ListFoldersResult", 2)?;
9975        self.internal_serialize::<S>(&mut s)?;
9976        s.end()
9977    }
9978}
9979
9980#[derive(Debug, Clone, PartialEq, Eq, Default)]
9981#[non_exhaustive] // structs may have more fields added in the future.
9982pub struct ListSharedLinksArg {
9983    /// See [`list_shared_links()`](crate::sharing::list_shared_links) description.
9984    pub path: Option<ReadPath>,
9985    /// The cursor returned by your last call to
9986    /// [`list_shared_links()`](crate::sharing::list_shared_links).
9987    pub cursor: Option<String>,
9988    /// See [`list_shared_links()`](crate::sharing::list_shared_links) description.
9989    pub direct_only: Option<bool>,
9990}
9991
9992impl ListSharedLinksArg {
9993    pub fn with_path(mut self, value: ReadPath) -> Self {
9994        self.path = Some(value);
9995        self
9996    }
9997
9998    pub fn with_cursor(mut self, value: String) -> Self {
9999        self.cursor = Some(value);
10000        self
10001    }
10002
10003    pub fn with_direct_only(mut self, value: bool) -> Self {
10004        self.direct_only = Some(value);
10005        self
10006    }
10007}
10008
10009const LIST_SHARED_LINKS_ARG_FIELDS: &[&str] = &["path",
10010                                                "cursor",
10011                                                "direct_only"];
10012impl ListSharedLinksArg {
10013    // no _opt deserializer
10014    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
10015        mut map: V,
10016    ) -> Result<ListSharedLinksArg, V::Error> {
10017        let mut field_path = None;
10018        let mut field_cursor = None;
10019        let mut field_direct_only = None;
10020        while let Some(key) = map.next_key::<&str>()? {
10021            match key {
10022                "path" => {
10023                    if field_path.is_some() {
10024                        return Err(::serde::de::Error::duplicate_field("path"));
10025                    }
10026                    field_path = Some(map.next_value()?);
10027                }
10028                "cursor" => {
10029                    if field_cursor.is_some() {
10030                        return Err(::serde::de::Error::duplicate_field("cursor"));
10031                    }
10032                    field_cursor = Some(map.next_value()?);
10033                }
10034                "direct_only" => {
10035                    if field_direct_only.is_some() {
10036                        return Err(::serde::de::Error::duplicate_field("direct_only"));
10037                    }
10038                    field_direct_only = Some(map.next_value()?);
10039                }
10040                _ => {
10041                    // unknown field allowed and ignored
10042                    map.next_value::<::serde_json::Value>()?;
10043                }
10044            }
10045        }
10046        let result = ListSharedLinksArg {
10047            path: field_path.and_then(Option::flatten),
10048            cursor: field_cursor.and_then(Option::flatten),
10049            direct_only: field_direct_only.and_then(Option::flatten),
10050        };
10051        Ok(result)
10052    }
10053
10054    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
10055        &self,
10056        s: &mut S::SerializeStruct,
10057    ) -> Result<(), S::Error> {
10058        use serde::ser::SerializeStruct;
10059        if let Some(val) = &self.path {
10060            s.serialize_field("path", val)?;
10061        }
10062        if let Some(val) = &self.cursor {
10063            s.serialize_field("cursor", val)?;
10064        }
10065        if let Some(val) = &self.direct_only {
10066            s.serialize_field("direct_only", val)?;
10067        }
10068        Ok(())
10069    }
10070}
10071
10072impl<'de> ::serde::de::Deserialize<'de> for ListSharedLinksArg {
10073    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10074        // struct deserializer
10075        use serde::de::{MapAccess, Visitor};
10076        struct StructVisitor;
10077        impl<'de> Visitor<'de> for StructVisitor {
10078            type Value = ListSharedLinksArg;
10079            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10080                f.write_str("a ListSharedLinksArg struct")
10081            }
10082            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
10083                ListSharedLinksArg::internal_deserialize(map)
10084            }
10085        }
10086        deserializer.deserialize_struct("ListSharedLinksArg", LIST_SHARED_LINKS_ARG_FIELDS, StructVisitor)
10087    }
10088}
10089
10090impl ::serde::ser::Serialize for ListSharedLinksArg {
10091    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10092        // struct serializer
10093        use serde::ser::SerializeStruct;
10094        let mut s = serializer.serialize_struct("ListSharedLinksArg", 3)?;
10095        self.internal_serialize::<S>(&mut s)?;
10096        s.end()
10097    }
10098}
10099
10100#[derive(Debug, Clone, PartialEq, Eq)]
10101#[non_exhaustive] // variants may be added in the future
10102pub enum ListSharedLinksError {
10103    Path(crate::types::files::LookupError),
10104    /// Indicates that the cursor has been invalidated. Call
10105    /// [`list_shared_links()`](crate::sharing::list_shared_links) to obtain a new cursor.
10106    Reset,
10107    /// Catch-all used for unrecognized values returned from the server. Encountering this value
10108    /// typically indicates that this SDK version is out of date.
10109    Other,
10110}
10111
10112impl<'de> ::serde::de::Deserialize<'de> for ListSharedLinksError {
10113    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10114        // union deserializer
10115        use serde::de::{self, MapAccess, Visitor};
10116        struct EnumVisitor;
10117        impl<'de> Visitor<'de> for EnumVisitor {
10118            type Value = ListSharedLinksError;
10119            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10120                f.write_str("a ListSharedLinksError structure")
10121            }
10122            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
10123                let tag: &str = match map.next_key()? {
10124                    Some(".tag") => map.next_value()?,
10125                    _ => return Err(de::Error::missing_field(".tag"))
10126                };
10127                let value = match tag {
10128                    "path" => {
10129                        match map.next_key()? {
10130                            Some("path") => ListSharedLinksError::Path(map.next_value()?),
10131                            None => return Err(de::Error::missing_field("path")),
10132                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
10133                        }
10134                    }
10135                    "reset" => ListSharedLinksError::Reset,
10136                    _ => ListSharedLinksError::Other,
10137                };
10138                crate::eat_json_fields(&mut map)?;
10139                Ok(value)
10140            }
10141        }
10142        const VARIANTS: &[&str] = &["path",
10143                                    "reset",
10144                                    "other"];
10145        deserializer.deserialize_struct("ListSharedLinksError", VARIANTS, EnumVisitor)
10146    }
10147}
10148
10149impl ::serde::ser::Serialize for ListSharedLinksError {
10150    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10151        // union serializer
10152        use serde::ser::SerializeStruct;
10153        match self {
10154            ListSharedLinksError::Path(x) => {
10155                // union or polymporphic struct
10156                let mut s = serializer.serialize_struct("ListSharedLinksError", 2)?;
10157                s.serialize_field(".tag", "path")?;
10158                s.serialize_field("path", x)?;
10159                s.end()
10160            }
10161            ListSharedLinksError::Reset => {
10162                // unit
10163                let mut s = serializer.serialize_struct("ListSharedLinksError", 1)?;
10164                s.serialize_field(".tag", "reset")?;
10165                s.end()
10166            }
10167            ListSharedLinksError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
10168        }
10169    }
10170}
10171
10172impl ::std::error::Error for ListSharedLinksError {
10173    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
10174        match self {
10175            ListSharedLinksError::Path(inner) => Some(inner),
10176            _ => None,
10177        }
10178    }
10179}
10180
10181impl ::std::fmt::Display for ListSharedLinksError {
10182    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10183        match self {
10184            ListSharedLinksError::Path(inner) => write!(f, "ListSharedLinksError: {}", inner),
10185            _ => write!(f, "{:?}", *self),
10186        }
10187    }
10188}
10189
10190#[derive(Debug, Clone, PartialEq, Eq)]
10191#[non_exhaustive] // structs may have more fields added in the future.
10192pub struct ListSharedLinksResult {
10193    /// Shared links applicable to the path argument.
10194    pub links: Vec<SharedLinkMetadata>,
10195    /// Is true if there are additional shared links that have not been returned yet. Pass the
10196    /// cursor into [`list_shared_links()`](crate::sharing::list_shared_links) to retrieve them.
10197    pub has_more: bool,
10198    /// Pass the cursor into [`list_shared_links()`](crate::sharing::list_shared_links) to obtain
10199    /// the additional links. Cursor is returned only if no path is given.
10200    pub cursor: Option<String>,
10201}
10202
10203impl ListSharedLinksResult {
10204    pub fn new(links: Vec<SharedLinkMetadata>, has_more: bool) -> Self {
10205        ListSharedLinksResult {
10206            links,
10207            has_more,
10208            cursor: None,
10209        }
10210    }
10211
10212    pub fn with_cursor(mut self, value: String) -> Self {
10213        self.cursor = Some(value);
10214        self
10215    }
10216}
10217
10218const LIST_SHARED_LINKS_RESULT_FIELDS: &[&str] = &["links",
10219                                                   "has_more",
10220                                                   "cursor"];
10221impl ListSharedLinksResult {
10222    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
10223        map: V,
10224    ) -> Result<ListSharedLinksResult, V::Error> {
10225        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
10226    }
10227
10228    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
10229        mut map: V,
10230        optional: bool,
10231    ) -> Result<Option<ListSharedLinksResult>, V::Error> {
10232        let mut field_links = None;
10233        let mut field_has_more = None;
10234        let mut field_cursor = None;
10235        let mut nothing = true;
10236        while let Some(key) = map.next_key::<&str>()? {
10237            nothing = false;
10238            match key {
10239                "links" => {
10240                    if field_links.is_some() {
10241                        return Err(::serde::de::Error::duplicate_field("links"));
10242                    }
10243                    field_links = Some(map.next_value()?);
10244                }
10245                "has_more" => {
10246                    if field_has_more.is_some() {
10247                        return Err(::serde::de::Error::duplicate_field("has_more"));
10248                    }
10249                    field_has_more = Some(map.next_value()?);
10250                }
10251                "cursor" => {
10252                    if field_cursor.is_some() {
10253                        return Err(::serde::de::Error::duplicate_field("cursor"));
10254                    }
10255                    field_cursor = Some(map.next_value()?);
10256                }
10257                _ => {
10258                    // unknown field allowed and ignored
10259                    map.next_value::<::serde_json::Value>()?;
10260                }
10261            }
10262        }
10263        if optional && nothing {
10264            return Ok(None);
10265        }
10266        let result = ListSharedLinksResult {
10267            links: field_links.ok_or_else(|| ::serde::de::Error::missing_field("links"))?,
10268            has_more: field_has_more.ok_or_else(|| ::serde::de::Error::missing_field("has_more"))?,
10269            cursor: field_cursor.and_then(Option::flatten),
10270        };
10271        Ok(Some(result))
10272    }
10273
10274    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
10275        &self,
10276        s: &mut S::SerializeStruct,
10277    ) -> Result<(), S::Error> {
10278        use serde::ser::SerializeStruct;
10279        s.serialize_field("links", &self.links)?;
10280        s.serialize_field("has_more", &self.has_more)?;
10281        if let Some(val) = &self.cursor {
10282            s.serialize_field("cursor", val)?;
10283        }
10284        Ok(())
10285    }
10286}
10287
10288impl<'de> ::serde::de::Deserialize<'de> for ListSharedLinksResult {
10289    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10290        // struct deserializer
10291        use serde::de::{MapAccess, Visitor};
10292        struct StructVisitor;
10293        impl<'de> Visitor<'de> for StructVisitor {
10294            type Value = ListSharedLinksResult;
10295            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10296                f.write_str("a ListSharedLinksResult struct")
10297            }
10298            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
10299                ListSharedLinksResult::internal_deserialize(map)
10300            }
10301        }
10302        deserializer.deserialize_struct("ListSharedLinksResult", LIST_SHARED_LINKS_RESULT_FIELDS, StructVisitor)
10303    }
10304}
10305
10306impl ::serde::ser::Serialize for ListSharedLinksResult {
10307    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10308        // struct serializer
10309        use serde::ser::SerializeStruct;
10310        let mut s = serializer.serialize_struct("ListSharedLinksResult", 3)?;
10311        self.internal_serialize::<S>(&mut s)?;
10312        s.end()
10313    }
10314}
10315
10316/// Contains information about a member's access level to content after an operation.
10317#[derive(Debug, Clone, PartialEq, Eq, Default)]
10318#[non_exhaustive] // structs may have more fields added in the future.
10319pub struct MemberAccessLevelResult {
10320    /// The member still has this level of access to the content through a parent folder.
10321    pub access_level: Option<AccessLevel>,
10322    /// A localized string with additional information about why the user has this access level to
10323    /// the content.
10324    pub warning: Option<String>,
10325    /// The parent folders that a member has access to. The field is present if the user has access
10326    /// to the first parent folder where the member gains access.
10327    pub access_details: Option<Vec<ParentFolderAccessInfo>>,
10328}
10329
10330impl MemberAccessLevelResult {
10331    pub fn with_access_level(mut self, value: AccessLevel) -> Self {
10332        self.access_level = Some(value);
10333        self
10334    }
10335
10336    pub fn with_warning(mut self, value: String) -> Self {
10337        self.warning = Some(value);
10338        self
10339    }
10340
10341    pub fn with_access_details(mut self, value: Vec<ParentFolderAccessInfo>) -> Self {
10342        self.access_details = Some(value);
10343        self
10344    }
10345}
10346
10347const MEMBER_ACCESS_LEVEL_RESULT_FIELDS: &[&str] = &["access_level",
10348                                                     "warning",
10349                                                     "access_details"];
10350impl MemberAccessLevelResult {
10351    // no _opt deserializer
10352    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
10353        mut map: V,
10354    ) -> Result<MemberAccessLevelResult, V::Error> {
10355        let mut field_access_level = None;
10356        let mut field_warning = None;
10357        let mut field_access_details = None;
10358        while let Some(key) = map.next_key::<&str>()? {
10359            match key {
10360                "access_level" => {
10361                    if field_access_level.is_some() {
10362                        return Err(::serde::de::Error::duplicate_field("access_level"));
10363                    }
10364                    field_access_level = Some(map.next_value()?);
10365                }
10366                "warning" => {
10367                    if field_warning.is_some() {
10368                        return Err(::serde::de::Error::duplicate_field("warning"));
10369                    }
10370                    field_warning = Some(map.next_value()?);
10371                }
10372                "access_details" => {
10373                    if field_access_details.is_some() {
10374                        return Err(::serde::de::Error::duplicate_field("access_details"));
10375                    }
10376                    field_access_details = Some(map.next_value()?);
10377                }
10378                _ => {
10379                    // unknown field allowed and ignored
10380                    map.next_value::<::serde_json::Value>()?;
10381                }
10382            }
10383        }
10384        let result = MemberAccessLevelResult {
10385            access_level: field_access_level.and_then(Option::flatten),
10386            warning: field_warning.and_then(Option::flatten),
10387            access_details: field_access_details.and_then(Option::flatten),
10388        };
10389        Ok(result)
10390    }
10391
10392    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
10393        &self,
10394        s: &mut S::SerializeStruct,
10395    ) -> Result<(), S::Error> {
10396        use serde::ser::SerializeStruct;
10397        if let Some(val) = &self.access_level {
10398            s.serialize_field("access_level", val)?;
10399        }
10400        if let Some(val) = &self.warning {
10401            s.serialize_field("warning", val)?;
10402        }
10403        if let Some(val) = &self.access_details {
10404            s.serialize_field("access_details", val)?;
10405        }
10406        Ok(())
10407    }
10408}
10409
10410impl<'de> ::serde::de::Deserialize<'de> for MemberAccessLevelResult {
10411    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10412        // struct deserializer
10413        use serde::de::{MapAccess, Visitor};
10414        struct StructVisitor;
10415        impl<'de> Visitor<'de> for StructVisitor {
10416            type Value = MemberAccessLevelResult;
10417            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10418                f.write_str("a MemberAccessLevelResult struct")
10419            }
10420            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
10421                MemberAccessLevelResult::internal_deserialize(map)
10422            }
10423        }
10424        deserializer.deserialize_struct("MemberAccessLevelResult", MEMBER_ACCESS_LEVEL_RESULT_FIELDS, StructVisitor)
10425    }
10426}
10427
10428impl ::serde::ser::Serialize for MemberAccessLevelResult {
10429    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10430        // struct serializer
10431        use serde::ser::SerializeStruct;
10432        let mut s = serializer.serialize_struct("MemberAccessLevelResult", 3)?;
10433        self.internal_serialize::<S>(&mut s)?;
10434        s.end()
10435    }
10436}
10437
10438/// Actions that may be taken on members of a shared folder.
10439#[derive(Debug, Clone, PartialEq, Eq)]
10440#[non_exhaustive] // variants may be added in the future
10441pub enum MemberAction {
10442    /// Allow the member to keep a copy of the folder when removing.
10443    LeaveACopy,
10444    /// Make the member an editor of the folder.
10445    MakeEditor,
10446    /// Make the member an owner of the folder.
10447    MakeOwner,
10448    /// Make the member a viewer of the folder.
10449    MakeViewer,
10450    /// Make the member a viewer of the folder without commenting permissions.
10451    MakeViewerNoComment,
10452    /// Remove the member from the folder.
10453    Remove,
10454    /// Catch-all used for unrecognized values returned from the server. Encountering this value
10455    /// typically indicates that this SDK version is out of date.
10456    Other,
10457}
10458
10459impl<'de> ::serde::de::Deserialize<'de> for MemberAction {
10460    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10461        // union deserializer
10462        use serde::de::{self, MapAccess, Visitor};
10463        struct EnumVisitor;
10464        impl<'de> Visitor<'de> for EnumVisitor {
10465            type Value = MemberAction;
10466            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10467                f.write_str("a MemberAction structure")
10468            }
10469            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
10470                let tag: &str = match map.next_key()? {
10471                    Some(".tag") => map.next_value()?,
10472                    _ => return Err(de::Error::missing_field(".tag"))
10473                };
10474                let value = match tag {
10475                    "leave_a_copy" => MemberAction::LeaveACopy,
10476                    "make_editor" => MemberAction::MakeEditor,
10477                    "make_owner" => MemberAction::MakeOwner,
10478                    "make_viewer" => MemberAction::MakeViewer,
10479                    "make_viewer_no_comment" => MemberAction::MakeViewerNoComment,
10480                    "remove" => MemberAction::Remove,
10481                    _ => MemberAction::Other,
10482                };
10483                crate::eat_json_fields(&mut map)?;
10484                Ok(value)
10485            }
10486        }
10487        const VARIANTS: &[&str] = &["leave_a_copy",
10488                                    "make_editor",
10489                                    "make_owner",
10490                                    "make_viewer",
10491                                    "make_viewer_no_comment",
10492                                    "remove",
10493                                    "other"];
10494        deserializer.deserialize_struct("MemberAction", VARIANTS, EnumVisitor)
10495    }
10496}
10497
10498impl ::serde::ser::Serialize for MemberAction {
10499    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10500        // union serializer
10501        use serde::ser::SerializeStruct;
10502        match self {
10503            MemberAction::LeaveACopy => {
10504                // unit
10505                let mut s = serializer.serialize_struct("MemberAction", 1)?;
10506                s.serialize_field(".tag", "leave_a_copy")?;
10507                s.end()
10508            }
10509            MemberAction::MakeEditor => {
10510                // unit
10511                let mut s = serializer.serialize_struct("MemberAction", 1)?;
10512                s.serialize_field(".tag", "make_editor")?;
10513                s.end()
10514            }
10515            MemberAction::MakeOwner => {
10516                // unit
10517                let mut s = serializer.serialize_struct("MemberAction", 1)?;
10518                s.serialize_field(".tag", "make_owner")?;
10519                s.end()
10520            }
10521            MemberAction::MakeViewer => {
10522                // unit
10523                let mut s = serializer.serialize_struct("MemberAction", 1)?;
10524                s.serialize_field(".tag", "make_viewer")?;
10525                s.end()
10526            }
10527            MemberAction::MakeViewerNoComment => {
10528                // unit
10529                let mut s = serializer.serialize_struct("MemberAction", 1)?;
10530                s.serialize_field(".tag", "make_viewer_no_comment")?;
10531                s.end()
10532            }
10533            MemberAction::Remove => {
10534                // unit
10535                let mut s = serializer.serialize_struct("MemberAction", 1)?;
10536                s.serialize_field(".tag", "remove")?;
10537                s.end()
10538            }
10539            MemberAction::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
10540        }
10541    }
10542}
10543
10544/// Whether the user is allowed to take the action on the associated member.
10545#[derive(Debug, Clone, PartialEq, Eq)]
10546#[non_exhaustive] // structs may have more fields added in the future.
10547pub struct MemberPermission {
10548    /// The action that the user may wish to take on the member.
10549    pub action: MemberAction,
10550    /// True if the user is allowed to take the action.
10551    pub allow: bool,
10552    /// The reason why the user is denied the permission. Not present if the action is allowed.
10553    pub reason: Option<PermissionDeniedReason>,
10554}
10555
10556impl MemberPermission {
10557    pub fn new(action: MemberAction, allow: bool) -> Self {
10558        MemberPermission {
10559            action,
10560            allow,
10561            reason: None,
10562        }
10563    }
10564
10565    pub fn with_reason(mut self, value: PermissionDeniedReason) -> Self {
10566        self.reason = Some(value);
10567        self
10568    }
10569}
10570
10571const MEMBER_PERMISSION_FIELDS: &[&str] = &["action",
10572                                            "allow",
10573                                            "reason"];
10574impl MemberPermission {
10575    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
10576        map: V,
10577    ) -> Result<MemberPermission, V::Error> {
10578        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
10579    }
10580
10581    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
10582        mut map: V,
10583        optional: bool,
10584    ) -> Result<Option<MemberPermission>, V::Error> {
10585        let mut field_action = None;
10586        let mut field_allow = None;
10587        let mut field_reason = None;
10588        let mut nothing = true;
10589        while let Some(key) = map.next_key::<&str>()? {
10590            nothing = false;
10591            match key {
10592                "action" => {
10593                    if field_action.is_some() {
10594                        return Err(::serde::de::Error::duplicate_field("action"));
10595                    }
10596                    field_action = Some(map.next_value()?);
10597                }
10598                "allow" => {
10599                    if field_allow.is_some() {
10600                        return Err(::serde::de::Error::duplicate_field("allow"));
10601                    }
10602                    field_allow = Some(map.next_value()?);
10603                }
10604                "reason" => {
10605                    if field_reason.is_some() {
10606                        return Err(::serde::de::Error::duplicate_field("reason"));
10607                    }
10608                    field_reason = Some(map.next_value()?);
10609                }
10610                _ => {
10611                    // unknown field allowed and ignored
10612                    map.next_value::<::serde_json::Value>()?;
10613                }
10614            }
10615        }
10616        if optional && nothing {
10617            return Ok(None);
10618        }
10619        let result = MemberPermission {
10620            action: field_action.ok_or_else(|| ::serde::de::Error::missing_field("action"))?,
10621            allow: field_allow.ok_or_else(|| ::serde::de::Error::missing_field("allow"))?,
10622            reason: field_reason.and_then(Option::flatten),
10623        };
10624        Ok(Some(result))
10625    }
10626
10627    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
10628        &self,
10629        s: &mut S::SerializeStruct,
10630    ) -> Result<(), S::Error> {
10631        use serde::ser::SerializeStruct;
10632        s.serialize_field("action", &self.action)?;
10633        s.serialize_field("allow", &self.allow)?;
10634        if let Some(val) = &self.reason {
10635            s.serialize_field("reason", val)?;
10636        }
10637        Ok(())
10638    }
10639}
10640
10641impl<'de> ::serde::de::Deserialize<'de> for MemberPermission {
10642    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10643        // struct deserializer
10644        use serde::de::{MapAccess, Visitor};
10645        struct StructVisitor;
10646        impl<'de> Visitor<'de> for StructVisitor {
10647            type Value = MemberPermission;
10648            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10649                f.write_str("a MemberPermission struct")
10650            }
10651            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
10652                MemberPermission::internal_deserialize(map)
10653            }
10654        }
10655        deserializer.deserialize_struct("MemberPermission", MEMBER_PERMISSION_FIELDS, StructVisitor)
10656    }
10657}
10658
10659impl ::serde::ser::Serialize for MemberPermission {
10660    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10661        // struct serializer
10662        use serde::ser::SerializeStruct;
10663        let mut s = serializer.serialize_struct("MemberPermission", 3)?;
10664        self.internal_serialize::<S>(&mut s)?;
10665        s.end()
10666    }
10667}
10668
10669/// Policy governing who can be a member of a shared folder. Only applicable to folders owned by a
10670/// user on a team.
10671#[derive(Debug, Clone, PartialEq, Eq)]
10672#[non_exhaustive] // variants may be added in the future
10673pub enum MemberPolicy {
10674    /// Only a teammate can become a member.
10675    Team,
10676    /// Anyone can become a member.
10677    Anyone,
10678    /// Catch-all used for unrecognized values returned from the server. Encountering this value
10679    /// typically indicates that this SDK version is out of date.
10680    Other,
10681}
10682
10683impl<'de> ::serde::de::Deserialize<'de> for MemberPolicy {
10684    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10685        // union deserializer
10686        use serde::de::{self, MapAccess, Visitor};
10687        struct EnumVisitor;
10688        impl<'de> Visitor<'de> for EnumVisitor {
10689            type Value = MemberPolicy;
10690            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10691                f.write_str("a MemberPolicy structure")
10692            }
10693            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
10694                let tag: &str = match map.next_key()? {
10695                    Some(".tag") => map.next_value()?,
10696                    _ => return Err(de::Error::missing_field(".tag"))
10697                };
10698                let value = match tag {
10699                    "team" => MemberPolicy::Team,
10700                    "anyone" => MemberPolicy::Anyone,
10701                    _ => MemberPolicy::Other,
10702                };
10703                crate::eat_json_fields(&mut map)?;
10704                Ok(value)
10705            }
10706        }
10707        const VARIANTS: &[&str] = &["team",
10708                                    "anyone",
10709                                    "other"];
10710        deserializer.deserialize_struct("MemberPolicy", VARIANTS, EnumVisitor)
10711    }
10712}
10713
10714impl ::serde::ser::Serialize for MemberPolicy {
10715    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10716        // union serializer
10717        use serde::ser::SerializeStruct;
10718        match self {
10719            MemberPolicy::Team => {
10720                // unit
10721                let mut s = serializer.serialize_struct("MemberPolicy", 1)?;
10722                s.serialize_field(".tag", "team")?;
10723                s.end()
10724            }
10725            MemberPolicy::Anyone => {
10726                // unit
10727                let mut s = serializer.serialize_struct("MemberPolicy", 1)?;
10728                s.serialize_field(".tag", "anyone")?;
10729                s.end()
10730            }
10731            MemberPolicy::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
10732        }
10733    }
10734}
10735
10736/// Includes different ways to identify a member of a shared folder.
10737#[derive(Debug, Clone, PartialEq, Eq)]
10738#[non_exhaustive] // variants may be added in the future
10739pub enum MemberSelector {
10740    /// Dropbox account, team member, or group ID of member.
10741    DropboxId(DropboxId),
10742    /// Email address of member.
10743    Email(crate::types::common::EmailAddress),
10744    /// Catch-all used for unrecognized values returned from the server. Encountering this value
10745    /// typically indicates that this SDK version is out of date.
10746    Other,
10747}
10748
10749impl<'de> ::serde::de::Deserialize<'de> for MemberSelector {
10750    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10751        // union deserializer
10752        use serde::de::{self, MapAccess, Visitor};
10753        struct EnumVisitor;
10754        impl<'de> Visitor<'de> for EnumVisitor {
10755            type Value = MemberSelector;
10756            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10757                f.write_str("a MemberSelector structure")
10758            }
10759            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
10760                let tag: &str = match map.next_key()? {
10761                    Some(".tag") => map.next_value()?,
10762                    _ => return Err(de::Error::missing_field(".tag"))
10763                };
10764                let value = match tag {
10765                    "dropbox_id" => {
10766                        match map.next_key()? {
10767                            Some("dropbox_id") => MemberSelector::DropboxId(map.next_value()?),
10768                            None => return Err(de::Error::missing_field("dropbox_id")),
10769                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
10770                        }
10771                    }
10772                    "email" => {
10773                        match map.next_key()? {
10774                            Some("email") => MemberSelector::Email(map.next_value()?),
10775                            None => return Err(de::Error::missing_field("email")),
10776                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
10777                        }
10778                    }
10779                    _ => MemberSelector::Other,
10780                };
10781                crate::eat_json_fields(&mut map)?;
10782                Ok(value)
10783            }
10784        }
10785        const VARIANTS: &[&str] = &["dropbox_id",
10786                                    "email",
10787                                    "other"];
10788        deserializer.deserialize_struct("MemberSelector", VARIANTS, EnumVisitor)
10789    }
10790}
10791
10792impl ::serde::ser::Serialize for MemberSelector {
10793    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10794        // union serializer
10795        use serde::ser::SerializeStruct;
10796        match self {
10797            MemberSelector::DropboxId(x) => {
10798                // primitive
10799                let mut s = serializer.serialize_struct("MemberSelector", 2)?;
10800                s.serialize_field(".tag", "dropbox_id")?;
10801                s.serialize_field("dropbox_id", x)?;
10802                s.end()
10803            }
10804            MemberSelector::Email(x) => {
10805                // primitive
10806                let mut s = serializer.serialize_struct("MemberSelector", 2)?;
10807                s.serialize_field(".tag", "email")?;
10808                s.serialize_field("email", x)?;
10809                s.end()
10810            }
10811            MemberSelector::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
10812        }
10813    }
10814}
10815
10816/// The information about a member of the shared content.
10817#[derive(Debug, Clone, PartialEq, Eq)]
10818#[non_exhaustive] // structs may have more fields added in the future.
10819pub struct MembershipInfo {
10820    /// The access type for this member. It contains inherited access type from parent folder, and
10821    /// acquired access type from this folder.
10822    pub access_type: AccessLevel,
10823    /// The permissions that requesting user has on this member. The set of permissions corresponds
10824    /// to the MemberActions in the request.
10825    pub permissions: Option<Vec<MemberPermission>>,
10826    /// Never set.
10827    pub initials: Option<String>,
10828    /// True if the member has access from a parent folder.
10829    pub is_inherited: bool,
10830}
10831
10832impl MembershipInfo {
10833    pub fn new(access_type: AccessLevel) -> Self {
10834        MembershipInfo {
10835            access_type,
10836            permissions: None,
10837            initials: None,
10838            is_inherited: false,
10839        }
10840    }
10841
10842    pub fn with_permissions(mut self, value: Vec<MemberPermission>) -> Self {
10843        self.permissions = Some(value);
10844        self
10845    }
10846
10847    pub fn with_initials(mut self, value: String) -> Self {
10848        self.initials = Some(value);
10849        self
10850    }
10851
10852    pub fn with_is_inherited(mut self, value: bool) -> Self {
10853        self.is_inherited = value;
10854        self
10855    }
10856}
10857
10858const MEMBERSHIP_INFO_FIELDS: &[&str] = &["access_type",
10859                                          "permissions",
10860                                          "initials",
10861                                          "is_inherited"];
10862impl MembershipInfo {
10863    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
10864        map: V,
10865    ) -> Result<MembershipInfo, V::Error> {
10866        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
10867    }
10868
10869    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
10870        mut map: V,
10871        optional: bool,
10872    ) -> Result<Option<MembershipInfo>, V::Error> {
10873        let mut field_access_type = None;
10874        let mut field_permissions = None;
10875        let mut field_initials = None;
10876        let mut field_is_inherited = None;
10877        let mut nothing = true;
10878        while let Some(key) = map.next_key::<&str>()? {
10879            nothing = false;
10880            match key {
10881                "access_type" => {
10882                    if field_access_type.is_some() {
10883                        return Err(::serde::de::Error::duplicate_field("access_type"));
10884                    }
10885                    field_access_type = Some(map.next_value()?);
10886                }
10887                "permissions" => {
10888                    if field_permissions.is_some() {
10889                        return Err(::serde::de::Error::duplicate_field("permissions"));
10890                    }
10891                    field_permissions = Some(map.next_value()?);
10892                }
10893                "initials" => {
10894                    if field_initials.is_some() {
10895                        return Err(::serde::de::Error::duplicate_field("initials"));
10896                    }
10897                    field_initials = Some(map.next_value()?);
10898                }
10899                "is_inherited" => {
10900                    if field_is_inherited.is_some() {
10901                        return Err(::serde::de::Error::duplicate_field("is_inherited"));
10902                    }
10903                    field_is_inherited = Some(map.next_value()?);
10904                }
10905                _ => {
10906                    // unknown field allowed and ignored
10907                    map.next_value::<::serde_json::Value>()?;
10908                }
10909            }
10910        }
10911        if optional && nothing {
10912            return Ok(None);
10913        }
10914        let result = MembershipInfo {
10915            access_type: field_access_type.ok_or_else(|| ::serde::de::Error::missing_field("access_type"))?,
10916            permissions: field_permissions.and_then(Option::flatten),
10917            initials: field_initials.and_then(Option::flatten),
10918            is_inherited: field_is_inherited.unwrap_or(false),
10919        };
10920        Ok(Some(result))
10921    }
10922
10923    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
10924        &self,
10925        s: &mut S::SerializeStruct,
10926    ) -> Result<(), S::Error> {
10927        use serde::ser::SerializeStruct;
10928        s.serialize_field("access_type", &self.access_type)?;
10929        if let Some(val) = &self.permissions {
10930            s.serialize_field("permissions", val)?;
10931        }
10932        if let Some(val) = &self.initials {
10933            s.serialize_field("initials", val)?;
10934        }
10935        if self.is_inherited {
10936            s.serialize_field("is_inherited", &self.is_inherited)?;
10937        }
10938        Ok(())
10939    }
10940}
10941
10942impl<'de> ::serde::de::Deserialize<'de> for MembershipInfo {
10943    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
10944        // struct deserializer
10945        use serde::de::{MapAccess, Visitor};
10946        struct StructVisitor;
10947        impl<'de> Visitor<'de> for StructVisitor {
10948            type Value = MembershipInfo;
10949            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
10950                f.write_str("a MembershipInfo struct")
10951            }
10952            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
10953                MembershipInfo::internal_deserialize(map)
10954            }
10955        }
10956        deserializer.deserialize_struct("MembershipInfo", MEMBERSHIP_INFO_FIELDS, StructVisitor)
10957    }
10958}
10959
10960impl ::serde::ser::Serialize for MembershipInfo {
10961    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10962        // struct serializer
10963        use serde::ser::SerializeStruct;
10964        let mut s = serializer.serialize_struct("MembershipInfo", 4)?;
10965        self.internal_serialize::<S>(&mut s)?;
10966        s.end()
10967    }
10968}
10969
10970#[derive(Debug, Clone, PartialEq, Eq)]
10971#[non_exhaustive] // structs may have more fields added in the future.
10972pub struct ModifySharedLinkSettingsArgs {
10973    /// URL of the shared link to change its settings.
10974    pub url: String,
10975    /// Set of settings for the shared link.
10976    pub settings: SharedLinkSettings,
10977    /// If set to true, removes the expiration of the shared link.
10978    pub remove_expiration: bool,
10979}
10980
10981impl ModifySharedLinkSettingsArgs {
10982    pub fn new(url: String, settings: SharedLinkSettings) -> Self {
10983        ModifySharedLinkSettingsArgs {
10984            url,
10985            settings,
10986            remove_expiration: false,
10987        }
10988    }
10989
10990    pub fn with_remove_expiration(mut self, value: bool) -> Self {
10991        self.remove_expiration = value;
10992        self
10993    }
10994}
10995
10996const MODIFY_SHARED_LINK_SETTINGS_ARGS_FIELDS: &[&str] = &["url",
10997                                                           "settings",
10998                                                           "remove_expiration"];
10999impl ModifySharedLinkSettingsArgs {
11000    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
11001        map: V,
11002    ) -> Result<ModifySharedLinkSettingsArgs, V::Error> {
11003        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
11004    }
11005
11006    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
11007        mut map: V,
11008        optional: bool,
11009    ) -> Result<Option<ModifySharedLinkSettingsArgs>, V::Error> {
11010        let mut field_url = None;
11011        let mut field_settings = None;
11012        let mut field_remove_expiration = None;
11013        let mut nothing = true;
11014        while let Some(key) = map.next_key::<&str>()? {
11015            nothing = false;
11016            match key {
11017                "url" => {
11018                    if field_url.is_some() {
11019                        return Err(::serde::de::Error::duplicate_field("url"));
11020                    }
11021                    field_url = Some(map.next_value()?);
11022                }
11023                "settings" => {
11024                    if field_settings.is_some() {
11025                        return Err(::serde::de::Error::duplicate_field("settings"));
11026                    }
11027                    field_settings = Some(map.next_value()?);
11028                }
11029                "remove_expiration" => {
11030                    if field_remove_expiration.is_some() {
11031                        return Err(::serde::de::Error::duplicate_field("remove_expiration"));
11032                    }
11033                    field_remove_expiration = Some(map.next_value()?);
11034                }
11035                _ => {
11036                    // unknown field allowed and ignored
11037                    map.next_value::<::serde_json::Value>()?;
11038                }
11039            }
11040        }
11041        if optional && nothing {
11042            return Ok(None);
11043        }
11044        let result = ModifySharedLinkSettingsArgs {
11045            url: field_url.ok_or_else(|| ::serde::de::Error::missing_field("url"))?,
11046            settings: field_settings.ok_or_else(|| ::serde::de::Error::missing_field("settings"))?,
11047            remove_expiration: field_remove_expiration.unwrap_or(false),
11048        };
11049        Ok(Some(result))
11050    }
11051
11052    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
11053        &self,
11054        s: &mut S::SerializeStruct,
11055    ) -> Result<(), S::Error> {
11056        use serde::ser::SerializeStruct;
11057        s.serialize_field("url", &self.url)?;
11058        s.serialize_field("settings", &self.settings)?;
11059        if self.remove_expiration {
11060            s.serialize_field("remove_expiration", &self.remove_expiration)?;
11061        }
11062        Ok(())
11063    }
11064}
11065
11066impl<'de> ::serde::de::Deserialize<'de> for ModifySharedLinkSettingsArgs {
11067    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
11068        // struct deserializer
11069        use serde::de::{MapAccess, Visitor};
11070        struct StructVisitor;
11071        impl<'de> Visitor<'de> for StructVisitor {
11072            type Value = ModifySharedLinkSettingsArgs;
11073            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11074                f.write_str("a ModifySharedLinkSettingsArgs struct")
11075            }
11076            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
11077                ModifySharedLinkSettingsArgs::internal_deserialize(map)
11078            }
11079        }
11080        deserializer.deserialize_struct("ModifySharedLinkSettingsArgs", MODIFY_SHARED_LINK_SETTINGS_ARGS_FIELDS, StructVisitor)
11081    }
11082}
11083
11084impl ::serde::ser::Serialize for ModifySharedLinkSettingsArgs {
11085    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
11086        // struct serializer
11087        use serde::ser::SerializeStruct;
11088        let mut s = serializer.serialize_struct("ModifySharedLinkSettingsArgs", 3)?;
11089        self.internal_serialize::<S>(&mut s)?;
11090        s.end()
11091    }
11092}
11093
11094#[derive(Debug, Clone, PartialEq, Eq)]
11095#[non_exhaustive] // variants may be added in the future
11096pub enum ModifySharedLinkSettingsError {
11097    /// The shared link wasn't found.
11098    SharedLinkNotFound,
11099    /// The caller is not allowed to access this shared link.
11100    SharedLinkAccessDenied,
11101    /// This type of link is not supported; use [`files::export()`](crate::files::export) instead.
11102    UnsupportedLinkType,
11103    /// There is an error with the given settings.
11104    SettingsError(SharedLinkSettingsError),
11105    /// This user's email address is not verified. This functionality is only available on accounts
11106    /// with a verified email address. Users can verify their email address
11107    /// [here](https://www.dropbox.com/help/317).
11108    EmailNotVerified,
11109    /// Catch-all used for unrecognized values returned from the server. Encountering this value
11110    /// typically indicates that this SDK version is out of date.
11111    Other,
11112}
11113
11114impl<'de> ::serde::de::Deserialize<'de> for ModifySharedLinkSettingsError {
11115    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
11116        // union deserializer
11117        use serde::de::{self, MapAccess, Visitor};
11118        struct EnumVisitor;
11119        impl<'de> Visitor<'de> for EnumVisitor {
11120            type Value = ModifySharedLinkSettingsError;
11121            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11122                f.write_str("a ModifySharedLinkSettingsError structure")
11123            }
11124            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
11125                let tag: &str = match map.next_key()? {
11126                    Some(".tag") => map.next_value()?,
11127                    _ => return Err(de::Error::missing_field(".tag"))
11128                };
11129                let value = match tag {
11130                    "shared_link_not_found" => ModifySharedLinkSettingsError::SharedLinkNotFound,
11131                    "shared_link_access_denied" => ModifySharedLinkSettingsError::SharedLinkAccessDenied,
11132                    "unsupported_link_type" => ModifySharedLinkSettingsError::UnsupportedLinkType,
11133                    "settings_error" => {
11134                        match map.next_key()? {
11135                            Some("settings_error") => ModifySharedLinkSettingsError::SettingsError(map.next_value()?),
11136                            None => return Err(de::Error::missing_field("settings_error")),
11137                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
11138                        }
11139                    }
11140                    "email_not_verified" => ModifySharedLinkSettingsError::EmailNotVerified,
11141                    _ => ModifySharedLinkSettingsError::Other,
11142                };
11143                crate::eat_json_fields(&mut map)?;
11144                Ok(value)
11145            }
11146        }
11147        const VARIANTS: &[&str] = &["shared_link_not_found",
11148                                    "shared_link_access_denied",
11149                                    "unsupported_link_type",
11150                                    "other",
11151                                    "settings_error",
11152                                    "email_not_verified"];
11153        deserializer.deserialize_struct("ModifySharedLinkSettingsError", VARIANTS, EnumVisitor)
11154    }
11155}
11156
11157impl ::serde::ser::Serialize for ModifySharedLinkSettingsError {
11158    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
11159        // union serializer
11160        use serde::ser::SerializeStruct;
11161        match self {
11162            ModifySharedLinkSettingsError::SharedLinkNotFound => {
11163                // unit
11164                let mut s = serializer.serialize_struct("ModifySharedLinkSettingsError", 1)?;
11165                s.serialize_field(".tag", "shared_link_not_found")?;
11166                s.end()
11167            }
11168            ModifySharedLinkSettingsError::SharedLinkAccessDenied => {
11169                // unit
11170                let mut s = serializer.serialize_struct("ModifySharedLinkSettingsError", 1)?;
11171                s.serialize_field(".tag", "shared_link_access_denied")?;
11172                s.end()
11173            }
11174            ModifySharedLinkSettingsError::UnsupportedLinkType => {
11175                // unit
11176                let mut s = serializer.serialize_struct("ModifySharedLinkSettingsError", 1)?;
11177                s.serialize_field(".tag", "unsupported_link_type")?;
11178                s.end()
11179            }
11180            ModifySharedLinkSettingsError::SettingsError(x) => {
11181                // union or polymporphic struct
11182                let mut s = serializer.serialize_struct("ModifySharedLinkSettingsError", 2)?;
11183                s.serialize_field(".tag", "settings_error")?;
11184                s.serialize_field("settings_error", x)?;
11185                s.end()
11186            }
11187            ModifySharedLinkSettingsError::EmailNotVerified => {
11188                // unit
11189                let mut s = serializer.serialize_struct("ModifySharedLinkSettingsError", 1)?;
11190                s.serialize_field(".tag", "email_not_verified")?;
11191                s.end()
11192            }
11193            ModifySharedLinkSettingsError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
11194        }
11195    }
11196}
11197
11198impl ::std::error::Error for ModifySharedLinkSettingsError {
11199    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
11200        match self {
11201            ModifySharedLinkSettingsError::SettingsError(inner) => Some(inner),
11202            _ => None,
11203        }
11204    }
11205}
11206
11207impl ::std::fmt::Display for ModifySharedLinkSettingsError {
11208    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11209        match self {
11210            ModifySharedLinkSettingsError::SharedLinkNotFound => f.write_str("The shared link wasn't found."),
11211            ModifySharedLinkSettingsError::SharedLinkAccessDenied => f.write_str("The caller is not allowed to access this shared link."),
11212            ModifySharedLinkSettingsError::SettingsError(inner) => write!(f, "There is an error with the given settings: {}", inner),
11213            _ => write!(f, "{:?}", *self),
11214        }
11215    }
11216}
11217
11218// union extends SharedLinkError
11219impl From<SharedLinkError> for ModifySharedLinkSettingsError {
11220    fn from(parent: SharedLinkError) -> Self {
11221        match parent {
11222            SharedLinkError::SharedLinkNotFound => ModifySharedLinkSettingsError::SharedLinkNotFound,
11223            SharedLinkError::SharedLinkAccessDenied => ModifySharedLinkSettingsError::SharedLinkAccessDenied,
11224            SharedLinkError::UnsupportedLinkType => ModifySharedLinkSettingsError::UnsupportedLinkType,
11225            SharedLinkError::Other => ModifySharedLinkSettingsError::Other,
11226        }
11227    }
11228}
11229#[derive(Debug, Clone, PartialEq, Eq)]
11230#[non_exhaustive] // structs may have more fields added in the future.
11231pub struct MountFolderArg {
11232    /// The ID of the shared folder to mount.
11233    pub shared_folder_id: crate::types::common::SharedFolderId,
11234}
11235
11236impl MountFolderArg {
11237    pub fn new(shared_folder_id: crate::types::common::SharedFolderId) -> Self {
11238        MountFolderArg {
11239            shared_folder_id,
11240        }
11241    }
11242}
11243
11244const MOUNT_FOLDER_ARG_FIELDS: &[&str] = &["shared_folder_id"];
11245impl MountFolderArg {
11246    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
11247        map: V,
11248    ) -> Result<MountFolderArg, V::Error> {
11249        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
11250    }
11251
11252    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
11253        mut map: V,
11254        optional: bool,
11255    ) -> Result<Option<MountFolderArg>, V::Error> {
11256        let mut field_shared_folder_id = None;
11257        let mut nothing = true;
11258        while let Some(key) = map.next_key::<&str>()? {
11259            nothing = false;
11260            match key {
11261                "shared_folder_id" => {
11262                    if field_shared_folder_id.is_some() {
11263                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
11264                    }
11265                    field_shared_folder_id = Some(map.next_value()?);
11266                }
11267                _ => {
11268                    // unknown field allowed and ignored
11269                    map.next_value::<::serde_json::Value>()?;
11270                }
11271            }
11272        }
11273        if optional && nothing {
11274            return Ok(None);
11275        }
11276        let result = MountFolderArg {
11277            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
11278        };
11279        Ok(Some(result))
11280    }
11281
11282    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
11283        &self,
11284        s: &mut S::SerializeStruct,
11285    ) -> Result<(), S::Error> {
11286        use serde::ser::SerializeStruct;
11287        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
11288        Ok(())
11289    }
11290}
11291
11292impl<'de> ::serde::de::Deserialize<'de> for MountFolderArg {
11293    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
11294        // struct deserializer
11295        use serde::de::{MapAccess, Visitor};
11296        struct StructVisitor;
11297        impl<'de> Visitor<'de> for StructVisitor {
11298            type Value = MountFolderArg;
11299            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11300                f.write_str("a MountFolderArg struct")
11301            }
11302            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
11303                MountFolderArg::internal_deserialize(map)
11304            }
11305        }
11306        deserializer.deserialize_struct("MountFolderArg", MOUNT_FOLDER_ARG_FIELDS, StructVisitor)
11307    }
11308}
11309
11310impl ::serde::ser::Serialize for MountFolderArg {
11311    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
11312        // struct serializer
11313        use serde::ser::SerializeStruct;
11314        let mut s = serializer.serialize_struct("MountFolderArg", 1)?;
11315        self.internal_serialize::<S>(&mut s)?;
11316        s.end()
11317    }
11318}
11319
11320#[derive(Debug, Clone, PartialEq, Eq)]
11321#[non_exhaustive] // variants may be added in the future
11322pub enum MountFolderError {
11323    AccessError(SharedFolderAccessError),
11324    /// Mounting would cause a shared folder to be inside another, which is disallowed.
11325    InsideSharedFolder,
11326    /// The current user does not have enough space to mount the shared folder.
11327    InsufficientQuota(InsufficientQuotaAmounts),
11328    /// The shared folder is already mounted.
11329    AlreadyMounted,
11330    /// The current user does not have permission to perform this action.
11331    NoPermission,
11332    /// The shared folder is not mountable. One example where this can occur is when the shared
11333    /// folder belongs within a team folder in the user's Dropbox.
11334    NotMountable,
11335    /// Catch-all used for unrecognized values returned from the server. Encountering this value
11336    /// typically indicates that this SDK version is out of date.
11337    Other,
11338}
11339
11340impl<'de> ::serde::de::Deserialize<'de> for MountFolderError {
11341    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
11342        // union deserializer
11343        use serde::de::{self, MapAccess, Visitor};
11344        struct EnumVisitor;
11345        impl<'de> Visitor<'de> for EnumVisitor {
11346            type Value = MountFolderError;
11347            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11348                f.write_str("a MountFolderError structure")
11349            }
11350            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
11351                let tag: &str = match map.next_key()? {
11352                    Some(".tag") => map.next_value()?,
11353                    _ => return Err(de::Error::missing_field(".tag"))
11354                };
11355                let value = match tag {
11356                    "access_error" => {
11357                        match map.next_key()? {
11358                            Some("access_error") => MountFolderError::AccessError(map.next_value()?),
11359                            None => return Err(de::Error::missing_field("access_error")),
11360                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
11361                        }
11362                    }
11363                    "inside_shared_folder" => MountFolderError::InsideSharedFolder,
11364                    "insufficient_quota" => MountFolderError::InsufficientQuota(InsufficientQuotaAmounts::internal_deserialize(&mut map)?),
11365                    "already_mounted" => MountFolderError::AlreadyMounted,
11366                    "no_permission" => MountFolderError::NoPermission,
11367                    "not_mountable" => MountFolderError::NotMountable,
11368                    _ => MountFolderError::Other,
11369                };
11370                crate::eat_json_fields(&mut map)?;
11371                Ok(value)
11372            }
11373        }
11374        const VARIANTS: &[&str] = &["access_error",
11375                                    "inside_shared_folder",
11376                                    "insufficient_quota",
11377                                    "already_mounted",
11378                                    "no_permission",
11379                                    "not_mountable",
11380                                    "other"];
11381        deserializer.deserialize_struct("MountFolderError", VARIANTS, EnumVisitor)
11382    }
11383}
11384
11385impl ::serde::ser::Serialize for MountFolderError {
11386    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
11387        // union serializer
11388        use serde::ser::SerializeStruct;
11389        match self {
11390            MountFolderError::AccessError(x) => {
11391                // union or polymporphic struct
11392                let mut s = serializer.serialize_struct("MountFolderError", 2)?;
11393                s.serialize_field(".tag", "access_error")?;
11394                s.serialize_field("access_error", x)?;
11395                s.end()
11396            }
11397            MountFolderError::InsideSharedFolder => {
11398                // unit
11399                let mut s = serializer.serialize_struct("MountFolderError", 1)?;
11400                s.serialize_field(".tag", "inside_shared_folder")?;
11401                s.end()
11402            }
11403            MountFolderError::InsufficientQuota(x) => {
11404                // struct
11405                let mut s = serializer.serialize_struct("MountFolderError", 4)?;
11406                s.serialize_field(".tag", "insufficient_quota")?;
11407                x.internal_serialize::<S>(&mut s)?;
11408                s.end()
11409            }
11410            MountFolderError::AlreadyMounted => {
11411                // unit
11412                let mut s = serializer.serialize_struct("MountFolderError", 1)?;
11413                s.serialize_field(".tag", "already_mounted")?;
11414                s.end()
11415            }
11416            MountFolderError::NoPermission => {
11417                // unit
11418                let mut s = serializer.serialize_struct("MountFolderError", 1)?;
11419                s.serialize_field(".tag", "no_permission")?;
11420                s.end()
11421            }
11422            MountFolderError::NotMountable => {
11423                // unit
11424                let mut s = serializer.serialize_struct("MountFolderError", 1)?;
11425                s.serialize_field(".tag", "not_mountable")?;
11426                s.end()
11427            }
11428            MountFolderError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
11429        }
11430    }
11431}
11432
11433impl ::std::error::Error for MountFolderError {
11434    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
11435        match self {
11436            MountFolderError::AccessError(inner) => Some(inner),
11437            _ => None,
11438        }
11439    }
11440}
11441
11442impl ::std::fmt::Display for MountFolderError {
11443    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11444        match self {
11445            MountFolderError::AccessError(inner) => write!(f, "MountFolderError: {}", inner),
11446            MountFolderError::InsideSharedFolder => f.write_str("Mounting would cause a shared folder to be inside another, which is disallowed."),
11447            MountFolderError::InsufficientQuota(inner) => write!(f, "The current user does not have enough space to mount the shared folder: {:?}", inner),
11448            MountFolderError::AlreadyMounted => f.write_str("The shared folder is already mounted."),
11449            MountFolderError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
11450            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."),
11451            _ => write!(f, "{:?}", *self),
11452        }
11453    }
11454}
11455
11456/// Contains information about a parent folder that a member has access to.
11457#[derive(Debug, Clone, PartialEq, Eq)]
11458#[non_exhaustive] // structs may have more fields added in the future.
11459pub struct ParentFolderAccessInfo {
11460    /// Display name for the folder.
11461    pub folder_name: String,
11462    /// The identifier of the parent shared folder.
11463    pub shared_folder_id: crate::types::common::SharedFolderId,
11464    /// The user's permissions for the parent shared folder.
11465    pub permissions: Vec<MemberPermission>,
11466    /// The full path to the parent shared folder relative to the acting user's root.
11467    pub path: String,
11468}
11469
11470impl ParentFolderAccessInfo {
11471    pub fn new(
11472        folder_name: String,
11473        shared_folder_id: crate::types::common::SharedFolderId,
11474        permissions: Vec<MemberPermission>,
11475        path: String,
11476    ) -> Self {
11477        ParentFolderAccessInfo {
11478            folder_name,
11479            shared_folder_id,
11480            permissions,
11481            path,
11482        }
11483    }
11484}
11485
11486const PARENT_FOLDER_ACCESS_INFO_FIELDS: &[&str] = &["folder_name",
11487                                                    "shared_folder_id",
11488                                                    "permissions",
11489                                                    "path"];
11490impl ParentFolderAccessInfo {
11491    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
11492        map: V,
11493    ) -> Result<ParentFolderAccessInfo, V::Error> {
11494        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
11495    }
11496
11497    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
11498        mut map: V,
11499        optional: bool,
11500    ) -> Result<Option<ParentFolderAccessInfo>, V::Error> {
11501        let mut field_folder_name = None;
11502        let mut field_shared_folder_id = None;
11503        let mut field_permissions = None;
11504        let mut field_path = None;
11505        let mut nothing = true;
11506        while let Some(key) = map.next_key::<&str>()? {
11507            nothing = false;
11508            match key {
11509                "folder_name" => {
11510                    if field_folder_name.is_some() {
11511                        return Err(::serde::de::Error::duplicate_field("folder_name"));
11512                    }
11513                    field_folder_name = Some(map.next_value()?);
11514                }
11515                "shared_folder_id" => {
11516                    if field_shared_folder_id.is_some() {
11517                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
11518                    }
11519                    field_shared_folder_id = Some(map.next_value()?);
11520                }
11521                "permissions" => {
11522                    if field_permissions.is_some() {
11523                        return Err(::serde::de::Error::duplicate_field("permissions"));
11524                    }
11525                    field_permissions = Some(map.next_value()?);
11526                }
11527                "path" => {
11528                    if field_path.is_some() {
11529                        return Err(::serde::de::Error::duplicate_field("path"));
11530                    }
11531                    field_path = Some(map.next_value()?);
11532                }
11533                _ => {
11534                    // unknown field allowed and ignored
11535                    map.next_value::<::serde_json::Value>()?;
11536                }
11537            }
11538        }
11539        if optional && nothing {
11540            return Ok(None);
11541        }
11542        let result = ParentFolderAccessInfo {
11543            folder_name: field_folder_name.ok_or_else(|| ::serde::de::Error::missing_field("folder_name"))?,
11544            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
11545            permissions: field_permissions.ok_or_else(|| ::serde::de::Error::missing_field("permissions"))?,
11546            path: field_path.ok_or_else(|| ::serde::de::Error::missing_field("path"))?,
11547        };
11548        Ok(Some(result))
11549    }
11550
11551    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
11552        &self,
11553        s: &mut S::SerializeStruct,
11554    ) -> Result<(), S::Error> {
11555        use serde::ser::SerializeStruct;
11556        s.serialize_field("folder_name", &self.folder_name)?;
11557        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
11558        s.serialize_field("permissions", &self.permissions)?;
11559        s.serialize_field("path", &self.path)?;
11560        Ok(())
11561    }
11562}
11563
11564impl<'de> ::serde::de::Deserialize<'de> for ParentFolderAccessInfo {
11565    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
11566        // struct deserializer
11567        use serde::de::{MapAccess, Visitor};
11568        struct StructVisitor;
11569        impl<'de> Visitor<'de> for StructVisitor {
11570            type Value = ParentFolderAccessInfo;
11571            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11572                f.write_str("a ParentFolderAccessInfo struct")
11573            }
11574            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
11575                ParentFolderAccessInfo::internal_deserialize(map)
11576            }
11577        }
11578        deserializer.deserialize_struct("ParentFolderAccessInfo", PARENT_FOLDER_ACCESS_INFO_FIELDS, StructVisitor)
11579    }
11580}
11581
11582impl ::serde::ser::Serialize for ParentFolderAccessInfo {
11583    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
11584        // struct serializer
11585        use serde::ser::SerializeStruct;
11586        let mut s = serializer.serialize_struct("ParentFolderAccessInfo", 4)?;
11587        self.internal_serialize::<S>(&mut s)?;
11588        s.end()
11589    }
11590}
11591
11592/// Metadata for a path-based shared link.
11593#[derive(Debug, Clone, PartialEq, Eq)]
11594#[non_exhaustive] // structs may have more fields added in the future.
11595pub struct PathLinkMetadata {
11596    /// URL of the shared link.
11597    pub url: String,
11598    /// Who can access the link.
11599    pub visibility: Visibility,
11600    /// Path in user's Dropbox.
11601    pub path: String,
11602    /// Expiration time, if set. By default the link won't expire.
11603    pub expires: Option<crate::types::common::DropboxTimestamp>,
11604}
11605
11606impl PathLinkMetadata {
11607    pub fn new(url: String, visibility: Visibility, path: String) -> Self {
11608        PathLinkMetadata {
11609            url,
11610            visibility,
11611            path,
11612            expires: None,
11613        }
11614    }
11615
11616    pub fn with_expires(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
11617        self.expires = Some(value);
11618        self
11619    }
11620}
11621
11622const PATH_LINK_METADATA_FIELDS: &[&str] = &["url",
11623                                             "visibility",
11624                                             "path",
11625                                             "expires"];
11626impl PathLinkMetadata {
11627    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
11628        map: V,
11629    ) -> Result<PathLinkMetadata, V::Error> {
11630        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
11631    }
11632
11633    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
11634        mut map: V,
11635        optional: bool,
11636    ) -> Result<Option<PathLinkMetadata>, V::Error> {
11637        let mut field_url = None;
11638        let mut field_visibility = None;
11639        let mut field_path = None;
11640        let mut field_expires = None;
11641        let mut nothing = true;
11642        while let Some(key) = map.next_key::<&str>()? {
11643            nothing = false;
11644            match key {
11645                "url" => {
11646                    if field_url.is_some() {
11647                        return Err(::serde::de::Error::duplicate_field("url"));
11648                    }
11649                    field_url = Some(map.next_value()?);
11650                }
11651                "visibility" => {
11652                    if field_visibility.is_some() {
11653                        return Err(::serde::de::Error::duplicate_field("visibility"));
11654                    }
11655                    field_visibility = Some(map.next_value()?);
11656                }
11657                "path" => {
11658                    if field_path.is_some() {
11659                        return Err(::serde::de::Error::duplicate_field("path"));
11660                    }
11661                    field_path = Some(map.next_value()?);
11662                }
11663                "expires" => {
11664                    if field_expires.is_some() {
11665                        return Err(::serde::de::Error::duplicate_field("expires"));
11666                    }
11667                    field_expires = Some(map.next_value()?);
11668                }
11669                _ => {
11670                    // unknown field allowed and ignored
11671                    map.next_value::<::serde_json::Value>()?;
11672                }
11673            }
11674        }
11675        if optional && nothing {
11676            return Ok(None);
11677        }
11678        let result = PathLinkMetadata {
11679            url: field_url.ok_or_else(|| ::serde::de::Error::missing_field("url"))?,
11680            visibility: field_visibility.ok_or_else(|| ::serde::de::Error::missing_field("visibility"))?,
11681            path: field_path.ok_or_else(|| ::serde::de::Error::missing_field("path"))?,
11682            expires: field_expires.and_then(Option::flatten),
11683        };
11684        Ok(Some(result))
11685    }
11686
11687    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
11688        &self,
11689        s: &mut S::SerializeStruct,
11690    ) -> Result<(), S::Error> {
11691        use serde::ser::SerializeStruct;
11692        s.serialize_field("url", &self.url)?;
11693        s.serialize_field("visibility", &self.visibility)?;
11694        s.serialize_field("path", &self.path)?;
11695        if let Some(val) = &self.expires {
11696            s.serialize_field("expires", val)?;
11697        }
11698        Ok(())
11699    }
11700}
11701
11702impl<'de> ::serde::de::Deserialize<'de> for PathLinkMetadata {
11703    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
11704        // struct deserializer
11705        use serde::de::{MapAccess, Visitor};
11706        struct StructVisitor;
11707        impl<'de> Visitor<'de> for StructVisitor {
11708            type Value = PathLinkMetadata;
11709            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11710                f.write_str("a PathLinkMetadata struct")
11711            }
11712            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
11713                PathLinkMetadata::internal_deserialize(map)
11714            }
11715        }
11716        deserializer.deserialize_struct("PathLinkMetadata", PATH_LINK_METADATA_FIELDS, StructVisitor)
11717    }
11718}
11719
11720impl ::serde::ser::Serialize for PathLinkMetadata {
11721    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
11722        // struct serializer
11723        use serde::ser::SerializeStruct;
11724        let mut s = serializer.serialize_struct("PathLinkMetadata", 4)?;
11725        self.internal_serialize::<S>(&mut s)?;
11726        s.end()
11727    }
11728}
11729
11730// struct extends polymorphic struct LinkMetadata
11731impl From<PathLinkMetadata> for LinkMetadata {
11732    fn from(subtype: PathLinkMetadata) -> Self {
11733        LinkMetadata::Path(subtype)
11734    }
11735}
11736/// Flag to indicate pending upload default (for linking to not-yet-existing paths).
11737#[derive(Debug, Clone, PartialEq, Eq)]
11738pub enum PendingUploadMode {
11739    /// Assume pending uploads are files.
11740    File,
11741    /// Assume pending uploads are folders.
11742    Folder,
11743}
11744
11745impl<'de> ::serde::de::Deserialize<'de> for PendingUploadMode {
11746    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
11747        // union deserializer
11748        use serde::de::{self, MapAccess, Visitor};
11749        struct EnumVisitor;
11750        impl<'de> Visitor<'de> for EnumVisitor {
11751            type Value = PendingUploadMode;
11752            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11753                f.write_str("a PendingUploadMode structure")
11754            }
11755            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
11756                let tag: &str = match map.next_key()? {
11757                    Some(".tag") => map.next_value()?,
11758                    _ => return Err(de::Error::missing_field(".tag"))
11759                };
11760                let value = match tag {
11761                    "file" => PendingUploadMode::File,
11762                    "folder" => PendingUploadMode::Folder,
11763                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
11764                };
11765                crate::eat_json_fields(&mut map)?;
11766                Ok(value)
11767            }
11768        }
11769        const VARIANTS: &[&str] = &["file",
11770                                    "folder"];
11771        deserializer.deserialize_struct("PendingUploadMode", VARIANTS, EnumVisitor)
11772    }
11773}
11774
11775impl ::serde::ser::Serialize for PendingUploadMode {
11776    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
11777        // union serializer
11778        use serde::ser::SerializeStruct;
11779        match self {
11780            PendingUploadMode::File => {
11781                // unit
11782                let mut s = serializer.serialize_struct("PendingUploadMode", 1)?;
11783                s.serialize_field(".tag", "file")?;
11784                s.end()
11785            }
11786            PendingUploadMode::Folder => {
11787                // unit
11788                let mut s = serializer.serialize_struct("PendingUploadMode", 1)?;
11789                s.serialize_field(".tag", "folder")?;
11790                s.end()
11791            }
11792        }
11793    }
11794}
11795
11796/// Possible reasons the user is denied a permission.
11797#[derive(Debug, Clone, PartialEq, Eq)]
11798#[non_exhaustive] // variants may be added in the future
11799pub enum PermissionDeniedReason {
11800    /// User is not on the same team as the folder owner.
11801    UserNotSameTeamAsOwner,
11802    /// User is prohibited by the owner from taking the action.
11803    UserNotAllowedByOwner,
11804    /// Target is indirectly a member of the folder, for example by being part of a group.
11805    TargetIsIndirectMember,
11806    /// Target is the owner of the folder.
11807    TargetIsOwner,
11808    /// Target is the user itself.
11809    TargetIsSelf,
11810    /// Target is not an active member of the team.
11811    TargetNotActive,
11812    /// Folder is team folder for a limited team.
11813    FolderIsLimitedTeamFolder,
11814    /// The content owner needs to be on a Dropbox team to perform this action.
11815    OwnerNotOnTeam,
11816    /// The user does not have permission to perform this action on the link.
11817    PermissionDenied,
11818    /// The user's team policy prevents performing this action on the link.
11819    RestrictedByTeam,
11820    /// The user's account type does not support this action.
11821    UserAccountType,
11822    /// The user needs to be on a Dropbox team to perform this action.
11823    UserNotOnTeam,
11824    /// Folder is inside of another shared folder.
11825    FolderIsInsideSharedFolder,
11826    /// Policy cannot be changed due to restrictions from parent folder.
11827    RestrictedByParentFolder,
11828    InsufficientPlan(InsufficientPlan),
11829    /// Catch-all used for unrecognized values returned from the server. Encountering this value
11830    /// typically indicates that this SDK version is out of date.
11831    Other,
11832}
11833
11834impl<'de> ::serde::de::Deserialize<'de> for PermissionDeniedReason {
11835    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
11836        // union deserializer
11837        use serde::de::{self, MapAccess, Visitor};
11838        struct EnumVisitor;
11839        impl<'de> Visitor<'de> for EnumVisitor {
11840            type Value = PermissionDeniedReason;
11841            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
11842                f.write_str("a PermissionDeniedReason structure")
11843            }
11844            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
11845                let tag: &str = match map.next_key()? {
11846                    Some(".tag") => map.next_value()?,
11847                    _ => return Err(de::Error::missing_field(".tag"))
11848                };
11849                let value = match tag {
11850                    "user_not_same_team_as_owner" => PermissionDeniedReason::UserNotSameTeamAsOwner,
11851                    "user_not_allowed_by_owner" => PermissionDeniedReason::UserNotAllowedByOwner,
11852                    "target_is_indirect_member" => PermissionDeniedReason::TargetIsIndirectMember,
11853                    "target_is_owner" => PermissionDeniedReason::TargetIsOwner,
11854                    "target_is_self" => PermissionDeniedReason::TargetIsSelf,
11855                    "target_not_active" => PermissionDeniedReason::TargetNotActive,
11856                    "folder_is_limited_team_folder" => PermissionDeniedReason::FolderIsLimitedTeamFolder,
11857                    "owner_not_on_team" => PermissionDeniedReason::OwnerNotOnTeam,
11858                    "permission_denied" => PermissionDeniedReason::PermissionDenied,
11859                    "restricted_by_team" => PermissionDeniedReason::RestrictedByTeam,
11860                    "user_account_type" => PermissionDeniedReason::UserAccountType,
11861                    "user_not_on_team" => PermissionDeniedReason::UserNotOnTeam,
11862                    "folder_is_inside_shared_folder" => PermissionDeniedReason::FolderIsInsideSharedFolder,
11863                    "restricted_by_parent_folder" => PermissionDeniedReason::RestrictedByParentFolder,
11864                    "insufficient_plan" => PermissionDeniedReason::InsufficientPlan(InsufficientPlan::internal_deserialize(&mut map)?),
11865                    _ => PermissionDeniedReason::Other,
11866                };
11867                crate::eat_json_fields(&mut map)?;
11868                Ok(value)
11869            }
11870        }
11871        const VARIANTS: &[&str] = &["user_not_same_team_as_owner",
11872                                    "user_not_allowed_by_owner",
11873                                    "target_is_indirect_member",
11874                                    "target_is_owner",
11875                                    "target_is_self",
11876                                    "target_not_active",
11877                                    "folder_is_limited_team_folder",
11878                                    "owner_not_on_team",
11879                                    "permission_denied",
11880                                    "restricted_by_team",
11881                                    "user_account_type",
11882                                    "user_not_on_team",
11883                                    "folder_is_inside_shared_folder",
11884                                    "restricted_by_parent_folder",
11885                                    "insufficient_plan",
11886                                    "other"];
11887        deserializer.deserialize_struct("PermissionDeniedReason", VARIANTS, EnumVisitor)
11888    }
11889}
11890
11891impl ::serde::ser::Serialize for PermissionDeniedReason {
11892    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
11893        // union serializer
11894        use serde::ser::SerializeStruct;
11895        match self {
11896            PermissionDeniedReason::UserNotSameTeamAsOwner => {
11897                // unit
11898                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
11899                s.serialize_field(".tag", "user_not_same_team_as_owner")?;
11900                s.end()
11901            }
11902            PermissionDeniedReason::UserNotAllowedByOwner => {
11903                // unit
11904                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
11905                s.serialize_field(".tag", "user_not_allowed_by_owner")?;
11906                s.end()
11907            }
11908            PermissionDeniedReason::TargetIsIndirectMember => {
11909                // unit
11910                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
11911                s.serialize_field(".tag", "target_is_indirect_member")?;
11912                s.end()
11913            }
11914            PermissionDeniedReason::TargetIsOwner => {
11915                // unit
11916                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
11917                s.serialize_field(".tag", "target_is_owner")?;
11918                s.end()
11919            }
11920            PermissionDeniedReason::TargetIsSelf => {
11921                // unit
11922                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
11923                s.serialize_field(".tag", "target_is_self")?;
11924                s.end()
11925            }
11926            PermissionDeniedReason::TargetNotActive => {
11927                // unit
11928                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
11929                s.serialize_field(".tag", "target_not_active")?;
11930                s.end()
11931            }
11932            PermissionDeniedReason::FolderIsLimitedTeamFolder => {
11933                // unit
11934                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
11935                s.serialize_field(".tag", "folder_is_limited_team_folder")?;
11936                s.end()
11937            }
11938            PermissionDeniedReason::OwnerNotOnTeam => {
11939                // unit
11940                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
11941                s.serialize_field(".tag", "owner_not_on_team")?;
11942                s.end()
11943            }
11944            PermissionDeniedReason::PermissionDenied => {
11945                // unit
11946                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
11947                s.serialize_field(".tag", "permission_denied")?;
11948                s.end()
11949            }
11950            PermissionDeniedReason::RestrictedByTeam => {
11951                // unit
11952                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
11953                s.serialize_field(".tag", "restricted_by_team")?;
11954                s.end()
11955            }
11956            PermissionDeniedReason::UserAccountType => {
11957                // unit
11958                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
11959                s.serialize_field(".tag", "user_account_type")?;
11960                s.end()
11961            }
11962            PermissionDeniedReason::UserNotOnTeam => {
11963                // unit
11964                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
11965                s.serialize_field(".tag", "user_not_on_team")?;
11966                s.end()
11967            }
11968            PermissionDeniedReason::FolderIsInsideSharedFolder => {
11969                // unit
11970                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
11971                s.serialize_field(".tag", "folder_is_inside_shared_folder")?;
11972                s.end()
11973            }
11974            PermissionDeniedReason::RestrictedByParentFolder => {
11975                // unit
11976                let mut s = serializer.serialize_struct("PermissionDeniedReason", 1)?;
11977                s.serialize_field(".tag", "restricted_by_parent_folder")?;
11978                s.end()
11979            }
11980            PermissionDeniedReason::InsufficientPlan(x) => {
11981                // struct
11982                let mut s = serializer.serialize_struct("PermissionDeniedReason", 3)?;
11983                s.serialize_field(".tag", "insufficient_plan")?;
11984                x.internal_serialize::<S>(&mut s)?;
11985                s.end()
11986            }
11987            PermissionDeniedReason::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
11988        }
11989    }
11990}
11991
11992#[derive(Debug, Clone, PartialEq, Eq)]
11993#[non_exhaustive] // structs may have more fields added in the future.
11994pub struct RelinquishFileMembershipArg {
11995    /// The path or id for the file.
11996    pub file: PathOrId,
11997}
11998
11999impl RelinquishFileMembershipArg {
12000    pub fn new(file: PathOrId) -> Self {
12001        RelinquishFileMembershipArg {
12002            file,
12003        }
12004    }
12005}
12006
12007const RELINQUISH_FILE_MEMBERSHIP_ARG_FIELDS: &[&str] = &["file"];
12008impl RelinquishFileMembershipArg {
12009    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
12010        map: V,
12011    ) -> Result<RelinquishFileMembershipArg, V::Error> {
12012        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
12013    }
12014
12015    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
12016        mut map: V,
12017        optional: bool,
12018    ) -> Result<Option<RelinquishFileMembershipArg>, V::Error> {
12019        let mut field_file = None;
12020        let mut nothing = true;
12021        while let Some(key) = map.next_key::<&str>()? {
12022            nothing = false;
12023            match key {
12024                "file" => {
12025                    if field_file.is_some() {
12026                        return Err(::serde::de::Error::duplicate_field("file"));
12027                    }
12028                    field_file = Some(map.next_value()?);
12029                }
12030                _ => {
12031                    // unknown field allowed and ignored
12032                    map.next_value::<::serde_json::Value>()?;
12033                }
12034            }
12035        }
12036        if optional && nothing {
12037            return Ok(None);
12038        }
12039        let result = RelinquishFileMembershipArg {
12040            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
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("file", &self.file)?;
12051        Ok(())
12052    }
12053}
12054
12055impl<'de> ::serde::de::Deserialize<'de> for RelinquishFileMembershipArg {
12056    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12057        // struct deserializer
12058        use serde::de::{MapAccess, Visitor};
12059        struct StructVisitor;
12060        impl<'de> Visitor<'de> for StructVisitor {
12061            type Value = RelinquishFileMembershipArg;
12062            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12063                f.write_str("a RelinquishFileMembershipArg struct")
12064            }
12065            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
12066                RelinquishFileMembershipArg::internal_deserialize(map)
12067            }
12068        }
12069        deserializer.deserialize_struct("RelinquishFileMembershipArg", RELINQUISH_FILE_MEMBERSHIP_ARG_FIELDS, StructVisitor)
12070    }
12071}
12072
12073impl ::serde::ser::Serialize for RelinquishFileMembershipArg {
12074    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12075        // struct serializer
12076        use serde::ser::SerializeStruct;
12077        let mut s = serializer.serialize_struct("RelinquishFileMembershipArg", 1)?;
12078        self.internal_serialize::<S>(&mut s)?;
12079        s.end()
12080    }
12081}
12082
12083#[derive(Debug, Clone, PartialEq, Eq)]
12084#[non_exhaustive] // variants may be added in the future
12085pub enum RelinquishFileMembershipError {
12086    AccessError(SharingFileAccessError),
12087    /// The current user has access to the shared file via a group.  You can't relinquish membership
12088    /// to a file shared via groups.
12089    GroupAccess,
12090    /// The current user does not have permission to perform this action.
12091    NoPermission,
12092    /// Catch-all used for unrecognized values returned from the server. Encountering this value
12093    /// typically indicates that this SDK version is out of date.
12094    Other,
12095}
12096
12097impl<'de> ::serde::de::Deserialize<'de> for RelinquishFileMembershipError {
12098    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12099        // union deserializer
12100        use serde::de::{self, MapAccess, Visitor};
12101        struct EnumVisitor;
12102        impl<'de> Visitor<'de> for EnumVisitor {
12103            type Value = RelinquishFileMembershipError;
12104            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12105                f.write_str("a RelinquishFileMembershipError structure")
12106            }
12107            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
12108                let tag: &str = match map.next_key()? {
12109                    Some(".tag") => map.next_value()?,
12110                    _ => return Err(de::Error::missing_field(".tag"))
12111                };
12112                let value = match tag {
12113                    "access_error" => {
12114                        match map.next_key()? {
12115                            Some("access_error") => RelinquishFileMembershipError::AccessError(map.next_value()?),
12116                            None => return Err(de::Error::missing_field("access_error")),
12117                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
12118                        }
12119                    }
12120                    "group_access" => RelinquishFileMembershipError::GroupAccess,
12121                    "no_permission" => RelinquishFileMembershipError::NoPermission,
12122                    _ => RelinquishFileMembershipError::Other,
12123                };
12124                crate::eat_json_fields(&mut map)?;
12125                Ok(value)
12126            }
12127        }
12128        const VARIANTS: &[&str] = &["access_error",
12129                                    "group_access",
12130                                    "no_permission",
12131                                    "other"];
12132        deserializer.deserialize_struct("RelinquishFileMembershipError", VARIANTS, EnumVisitor)
12133    }
12134}
12135
12136impl ::serde::ser::Serialize for RelinquishFileMembershipError {
12137    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12138        // union serializer
12139        use serde::ser::SerializeStruct;
12140        match self {
12141            RelinquishFileMembershipError::AccessError(x) => {
12142                // union or polymporphic struct
12143                let mut s = serializer.serialize_struct("RelinquishFileMembershipError", 2)?;
12144                s.serialize_field(".tag", "access_error")?;
12145                s.serialize_field("access_error", x)?;
12146                s.end()
12147            }
12148            RelinquishFileMembershipError::GroupAccess => {
12149                // unit
12150                let mut s = serializer.serialize_struct("RelinquishFileMembershipError", 1)?;
12151                s.serialize_field(".tag", "group_access")?;
12152                s.end()
12153            }
12154            RelinquishFileMembershipError::NoPermission => {
12155                // unit
12156                let mut s = serializer.serialize_struct("RelinquishFileMembershipError", 1)?;
12157                s.serialize_field(".tag", "no_permission")?;
12158                s.end()
12159            }
12160            RelinquishFileMembershipError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
12161        }
12162    }
12163}
12164
12165impl ::std::error::Error for RelinquishFileMembershipError {
12166    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
12167        match self {
12168            RelinquishFileMembershipError::AccessError(inner) => Some(inner),
12169            _ => None,
12170        }
12171    }
12172}
12173
12174impl ::std::fmt::Display for RelinquishFileMembershipError {
12175    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12176        match self {
12177            RelinquishFileMembershipError::AccessError(inner) => write!(f, "RelinquishFileMembershipError: {}", inner),
12178            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."),
12179            RelinquishFileMembershipError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
12180            _ => write!(f, "{:?}", *self),
12181        }
12182    }
12183}
12184
12185#[derive(Debug, Clone, PartialEq, Eq)]
12186#[non_exhaustive] // structs may have more fields added in the future.
12187pub struct RelinquishFolderMembershipArg {
12188    /// The ID for the shared folder.
12189    pub shared_folder_id: crate::types::common::SharedFolderId,
12190    /// Keep a copy of the folder's contents upon relinquishing membership. This must be set to
12191    /// false when the folder is within a team folder or another shared folder.
12192    pub leave_a_copy: bool,
12193}
12194
12195impl RelinquishFolderMembershipArg {
12196    pub fn new(shared_folder_id: crate::types::common::SharedFolderId) -> Self {
12197        RelinquishFolderMembershipArg {
12198            shared_folder_id,
12199            leave_a_copy: false,
12200        }
12201    }
12202
12203    pub fn with_leave_a_copy(mut self, value: bool) -> Self {
12204        self.leave_a_copy = value;
12205        self
12206    }
12207}
12208
12209const RELINQUISH_FOLDER_MEMBERSHIP_ARG_FIELDS: &[&str] = &["shared_folder_id",
12210                                                           "leave_a_copy"];
12211impl RelinquishFolderMembershipArg {
12212    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
12213        map: V,
12214    ) -> Result<RelinquishFolderMembershipArg, V::Error> {
12215        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
12216    }
12217
12218    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
12219        mut map: V,
12220        optional: bool,
12221    ) -> Result<Option<RelinquishFolderMembershipArg>, V::Error> {
12222        let mut field_shared_folder_id = None;
12223        let mut field_leave_a_copy = None;
12224        let mut nothing = true;
12225        while let Some(key) = map.next_key::<&str>()? {
12226            nothing = false;
12227            match key {
12228                "shared_folder_id" => {
12229                    if field_shared_folder_id.is_some() {
12230                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
12231                    }
12232                    field_shared_folder_id = Some(map.next_value()?);
12233                }
12234                "leave_a_copy" => {
12235                    if field_leave_a_copy.is_some() {
12236                        return Err(::serde::de::Error::duplicate_field("leave_a_copy"));
12237                    }
12238                    field_leave_a_copy = Some(map.next_value()?);
12239                }
12240                _ => {
12241                    // unknown field allowed and ignored
12242                    map.next_value::<::serde_json::Value>()?;
12243                }
12244            }
12245        }
12246        if optional && nothing {
12247            return Ok(None);
12248        }
12249        let result = RelinquishFolderMembershipArg {
12250            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
12251            leave_a_copy: field_leave_a_copy.unwrap_or(false),
12252        };
12253        Ok(Some(result))
12254    }
12255
12256    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
12257        &self,
12258        s: &mut S::SerializeStruct,
12259    ) -> Result<(), S::Error> {
12260        use serde::ser::SerializeStruct;
12261        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
12262        if self.leave_a_copy {
12263            s.serialize_field("leave_a_copy", &self.leave_a_copy)?;
12264        }
12265        Ok(())
12266    }
12267}
12268
12269impl<'de> ::serde::de::Deserialize<'de> for RelinquishFolderMembershipArg {
12270    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12271        // struct deserializer
12272        use serde::de::{MapAccess, Visitor};
12273        struct StructVisitor;
12274        impl<'de> Visitor<'de> for StructVisitor {
12275            type Value = RelinquishFolderMembershipArg;
12276            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12277                f.write_str("a RelinquishFolderMembershipArg struct")
12278            }
12279            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
12280                RelinquishFolderMembershipArg::internal_deserialize(map)
12281            }
12282        }
12283        deserializer.deserialize_struct("RelinquishFolderMembershipArg", RELINQUISH_FOLDER_MEMBERSHIP_ARG_FIELDS, StructVisitor)
12284    }
12285}
12286
12287impl ::serde::ser::Serialize for RelinquishFolderMembershipArg {
12288    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12289        // struct serializer
12290        use serde::ser::SerializeStruct;
12291        let mut s = serializer.serialize_struct("RelinquishFolderMembershipArg", 2)?;
12292        self.internal_serialize::<S>(&mut s)?;
12293        s.end()
12294    }
12295}
12296
12297#[derive(Debug, Clone, PartialEq, Eq)]
12298#[non_exhaustive] // variants may be added in the future
12299pub enum RelinquishFolderMembershipError {
12300    AccessError(SharedFolderAccessError),
12301    /// The current user is the owner of the shared folder. Owners cannot relinquish membership to
12302    /// their own folders. Try unsharing or transferring ownership first.
12303    FolderOwner,
12304    /// The shared folder is currently mounted.  Unmount the shared folder before relinquishing
12305    /// membership.
12306    Mounted,
12307    /// The current user has access to the shared folder via a group.  You can't relinquish
12308    /// membership to folders shared via groups.
12309    GroupAccess,
12310    /// This action cannot be performed on a team shared folder.
12311    TeamFolder,
12312    /// The current user does not have permission to perform this action.
12313    NoPermission,
12314    /// The current user only has inherited access to the shared folder.  You can't relinquish
12315    /// inherited membership to folders.
12316    NoExplicitAccess,
12317    /// Catch-all used for unrecognized values returned from the server. Encountering this value
12318    /// typically indicates that this SDK version is out of date.
12319    Other,
12320}
12321
12322impl<'de> ::serde::de::Deserialize<'de> for RelinquishFolderMembershipError {
12323    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12324        // union deserializer
12325        use serde::de::{self, MapAccess, Visitor};
12326        struct EnumVisitor;
12327        impl<'de> Visitor<'de> for EnumVisitor {
12328            type Value = RelinquishFolderMembershipError;
12329            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12330                f.write_str("a RelinquishFolderMembershipError structure")
12331            }
12332            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
12333                let tag: &str = match map.next_key()? {
12334                    Some(".tag") => map.next_value()?,
12335                    _ => return Err(de::Error::missing_field(".tag"))
12336                };
12337                let value = match tag {
12338                    "access_error" => {
12339                        match map.next_key()? {
12340                            Some("access_error") => RelinquishFolderMembershipError::AccessError(map.next_value()?),
12341                            None => return Err(de::Error::missing_field("access_error")),
12342                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
12343                        }
12344                    }
12345                    "folder_owner" => RelinquishFolderMembershipError::FolderOwner,
12346                    "mounted" => RelinquishFolderMembershipError::Mounted,
12347                    "group_access" => RelinquishFolderMembershipError::GroupAccess,
12348                    "team_folder" => RelinquishFolderMembershipError::TeamFolder,
12349                    "no_permission" => RelinquishFolderMembershipError::NoPermission,
12350                    "no_explicit_access" => RelinquishFolderMembershipError::NoExplicitAccess,
12351                    _ => RelinquishFolderMembershipError::Other,
12352                };
12353                crate::eat_json_fields(&mut map)?;
12354                Ok(value)
12355            }
12356        }
12357        const VARIANTS: &[&str] = &["access_error",
12358                                    "folder_owner",
12359                                    "mounted",
12360                                    "group_access",
12361                                    "team_folder",
12362                                    "no_permission",
12363                                    "no_explicit_access",
12364                                    "other"];
12365        deserializer.deserialize_struct("RelinquishFolderMembershipError", VARIANTS, EnumVisitor)
12366    }
12367}
12368
12369impl ::serde::ser::Serialize for RelinquishFolderMembershipError {
12370    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12371        // union serializer
12372        use serde::ser::SerializeStruct;
12373        match self {
12374            RelinquishFolderMembershipError::AccessError(x) => {
12375                // union or polymporphic struct
12376                let mut s = serializer.serialize_struct("RelinquishFolderMembershipError", 2)?;
12377                s.serialize_field(".tag", "access_error")?;
12378                s.serialize_field("access_error", x)?;
12379                s.end()
12380            }
12381            RelinquishFolderMembershipError::FolderOwner => {
12382                // unit
12383                let mut s = serializer.serialize_struct("RelinquishFolderMembershipError", 1)?;
12384                s.serialize_field(".tag", "folder_owner")?;
12385                s.end()
12386            }
12387            RelinquishFolderMembershipError::Mounted => {
12388                // unit
12389                let mut s = serializer.serialize_struct("RelinquishFolderMembershipError", 1)?;
12390                s.serialize_field(".tag", "mounted")?;
12391                s.end()
12392            }
12393            RelinquishFolderMembershipError::GroupAccess => {
12394                // unit
12395                let mut s = serializer.serialize_struct("RelinquishFolderMembershipError", 1)?;
12396                s.serialize_field(".tag", "group_access")?;
12397                s.end()
12398            }
12399            RelinquishFolderMembershipError::TeamFolder => {
12400                // unit
12401                let mut s = serializer.serialize_struct("RelinquishFolderMembershipError", 1)?;
12402                s.serialize_field(".tag", "team_folder")?;
12403                s.end()
12404            }
12405            RelinquishFolderMembershipError::NoPermission => {
12406                // unit
12407                let mut s = serializer.serialize_struct("RelinquishFolderMembershipError", 1)?;
12408                s.serialize_field(".tag", "no_permission")?;
12409                s.end()
12410            }
12411            RelinquishFolderMembershipError::NoExplicitAccess => {
12412                // unit
12413                let mut s = serializer.serialize_struct("RelinquishFolderMembershipError", 1)?;
12414                s.serialize_field(".tag", "no_explicit_access")?;
12415                s.end()
12416            }
12417            RelinquishFolderMembershipError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
12418        }
12419    }
12420}
12421
12422impl ::std::error::Error for RelinquishFolderMembershipError {
12423    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
12424        match self {
12425            RelinquishFolderMembershipError::AccessError(inner) => Some(inner),
12426            _ => None,
12427        }
12428    }
12429}
12430
12431impl ::std::fmt::Display for RelinquishFolderMembershipError {
12432    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12433        match self {
12434            RelinquishFolderMembershipError::AccessError(inner) => write!(f, "RelinquishFolderMembershipError: {}", inner),
12435            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."),
12436            RelinquishFolderMembershipError::Mounted => f.write_str("The shared folder is currently mounted.  Unmount the shared folder before relinquishing membership."),
12437            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."),
12438            RelinquishFolderMembershipError::TeamFolder => f.write_str("This action cannot be performed on a team shared folder."),
12439            RelinquishFolderMembershipError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
12440            RelinquishFolderMembershipError::NoExplicitAccess => f.write_str("The current user only has inherited access to the shared folder.  You can't relinquish inherited membership to folders."),
12441            _ => write!(f, "{:?}", *self),
12442        }
12443    }
12444}
12445
12446/// Arguments for [`remove_file_member_2()`](crate::sharing::remove_file_member_2).
12447#[derive(Debug, Clone, PartialEq, Eq)]
12448#[non_exhaustive] // structs may have more fields added in the future.
12449pub struct RemoveFileMemberArg {
12450    /// File from which to remove members.
12451    pub file: PathOrId,
12452    /// Member to remove from this file. Note that even if an email is specified, it may result in
12453    /// the removal of a user (not an invitee) if the user's main account corresponds to that email
12454    /// address.
12455    pub member: MemberSelector,
12456}
12457
12458impl RemoveFileMemberArg {
12459    pub fn new(file: PathOrId, member: MemberSelector) -> Self {
12460        RemoveFileMemberArg {
12461            file,
12462            member,
12463        }
12464    }
12465}
12466
12467const REMOVE_FILE_MEMBER_ARG_FIELDS: &[&str] = &["file",
12468                                                 "member"];
12469impl RemoveFileMemberArg {
12470    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
12471        map: V,
12472    ) -> Result<RemoveFileMemberArg, V::Error> {
12473        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
12474    }
12475
12476    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
12477        mut map: V,
12478        optional: bool,
12479    ) -> Result<Option<RemoveFileMemberArg>, V::Error> {
12480        let mut field_file = None;
12481        let mut field_member = None;
12482        let mut nothing = true;
12483        while let Some(key) = map.next_key::<&str>()? {
12484            nothing = false;
12485            match key {
12486                "file" => {
12487                    if field_file.is_some() {
12488                        return Err(::serde::de::Error::duplicate_field("file"));
12489                    }
12490                    field_file = Some(map.next_value()?);
12491                }
12492                "member" => {
12493                    if field_member.is_some() {
12494                        return Err(::serde::de::Error::duplicate_field("member"));
12495                    }
12496                    field_member = Some(map.next_value()?);
12497                }
12498                _ => {
12499                    // unknown field allowed and ignored
12500                    map.next_value::<::serde_json::Value>()?;
12501                }
12502            }
12503        }
12504        if optional && nothing {
12505            return Ok(None);
12506        }
12507        let result = RemoveFileMemberArg {
12508            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
12509            member: field_member.ok_or_else(|| ::serde::de::Error::missing_field("member"))?,
12510        };
12511        Ok(Some(result))
12512    }
12513
12514    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
12515        &self,
12516        s: &mut S::SerializeStruct,
12517    ) -> Result<(), S::Error> {
12518        use serde::ser::SerializeStruct;
12519        s.serialize_field("file", &self.file)?;
12520        s.serialize_field("member", &self.member)?;
12521        Ok(())
12522    }
12523}
12524
12525impl<'de> ::serde::de::Deserialize<'de> for RemoveFileMemberArg {
12526    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12527        // struct deserializer
12528        use serde::de::{MapAccess, Visitor};
12529        struct StructVisitor;
12530        impl<'de> Visitor<'de> for StructVisitor {
12531            type Value = RemoveFileMemberArg;
12532            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12533                f.write_str("a RemoveFileMemberArg struct")
12534            }
12535            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
12536                RemoveFileMemberArg::internal_deserialize(map)
12537            }
12538        }
12539        deserializer.deserialize_struct("RemoveFileMemberArg", REMOVE_FILE_MEMBER_ARG_FIELDS, StructVisitor)
12540    }
12541}
12542
12543impl ::serde::ser::Serialize for RemoveFileMemberArg {
12544    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12545        // struct serializer
12546        use serde::ser::SerializeStruct;
12547        let mut s = serializer.serialize_struct("RemoveFileMemberArg", 2)?;
12548        self.internal_serialize::<S>(&mut s)?;
12549        s.end()
12550    }
12551}
12552
12553/// Errors for [`remove_file_member_2()`](crate::sharing::remove_file_member_2).
12554#[derive(Debug, Clone, PartialEq, Eq)]
12555#[non_exhaustive] // variants may be added in the future
12556pub enum RemoveFileMemberError {
12557    UserError(SharingUserError),
12558    AccessError(SharingFileAccessError),
12559    /// This member does not have explicit access to the file and therefore cannot be removed. The
12560    /// return value is the access that a user might have to the file from a parent folder.
12561    NoExplicitAccess(MemberAccessLevelResult),
12562    /// Catch-all used for unrecognized values returned from the server. Encountering this value
12563    /// typically indicates that this SDK version is out of date.
12564    Other,
12565}
12566
12567impl<'de> ::serde::de::Deserialize<'de> for RemoveFileMemberError {
12568    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12569        // union deserializer
12570        use serde::de::{self, MapAccess, Visitor};
12571        struct EnumVisitor;
12572        impl<'de> Visitor<'de> for EnumVisitor {
12573            type Value = RemoveFileMemberError;
12574            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12575                f.write_str("a RemoveFileMemberError structure")
12576            }
12577            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
12578                let tag: &str = match map.next_key()? {
12579                    Some(".tag") => map.next_value()?,
12580                    _ => return Err(de::Error::missing_field(".tag"))
12581                };
12582                let value = match tag {
12583                    "user_error" => {
12584                        match map.next_key()? {
12585                            Some("user_error") => RemoveFileMemberError::UserError(map.next_value()?),
12586                            None => return Err(de::Error::missing_field("user_error")),
12587                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
12588                        }
12589                    }
12590                    "access_error" => {
12591                        match map.next_key()? {
12592                            Some("access_error") => RemoveFileMemberError::AccessError(map.next_value()?),
12593                            None => return Err(de::Error::missing_field("access_error")),
12594                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
12595                        }
12596                    }
12597                    "no_explicit_access" => RemoveFileMemberError::NoExplicitAccess(MemberAccessLevelResult::internal_deserialize(&mut map)?),
12598                    _ => RemoveFileMemberError::Other,
12599                };
12600                crate::eat_json_fields(&mut map)?;
12601                Ok(value)
12602            }
12603        }
12604        const VARIANTS: &[&str] = &["user_error",
12605                                    "access_error",
12606                                    "no_explicit_access",
12607                                    "other"];
12608        deserializer.deserialize_struct("RemoveFileMemberError", VARIANTS, EnumVisitor)
12609    }
12610}
12611
12612impl ::serde::ser::Serialize for RemoveFileMemberError {
12613    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12614        // union serializer
12615        use serde::ser::SerializeStruct;
12616        match self {
12617            RemoveFileMemberError::UserError(x) => {
12618                // union or polymporphic struct
12619                let mut s = serializer.serialize_struct("RemoveFileMemberError", 2)?;
12620                s.serialize_field(".tag", "user_error")?;
12621                s.serialize_field("user_error", x)?;
12622                s.end()
12623            }
12624            RemoveFileMemberError::AccessError(x) => {
12625                // union or polymporphic struct
12626                let mut s = serializer.serialize_struct("RemoveFileMemberError", 2)?;
12627                s.serialize_field(".tag", "access_error")?;
12628                s.serialize_field("access_error", x)?;
12629                s.end()
12630            }
12631            RemoveFileMemberError::NoExplicitAccess(x) => {
12632                // struct
12633                let mut s = serializer.serialize_struct("RemoveFileMemberError", 4)?;
12634                s.serialize_field(".tag", "no_explicit_access")?;
12635                x.internal_serialize::<S>(&mut s)?;
12636                s.end()
12637            }
12638            RemoveFileMemberError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
12639        }
12640    }
12641}
12642
12643impl ::std::error::Error for RemoveFileMemberError {
12644    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
12645        match self {
12646            RemoveFileMemberError::UserError(inner) => Some(inner),
12647            RemoveFileMemberError::AccessError(inner) => Some(inner),
12648            _ => None,
12649        }
12650    }
12651}
12652
12653impl ::std::fmt::Display for RemoveFileMemberError {
12654    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12655        match self {
12656            RemoveFileMemberError::UserError(inner) => write!(f, "RemoveFileMemberError: {}", inner),
12657            RemoveFileMemberError::AccessError(inner) => write!(f, "RemoveFileMemberError: {}", inner),
12658            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),
12659            _ => write!(f, "{:?}", *self),
12660        }
12661    }
12662}
12663
12664#[derive(Debug, Clone, PartialEq, Eq)]
12665#[non_exhaustive] // structs may have more fields added in the future.
12666pub struct RemoveFolderMemberArg {
12667    /// The ID for the shared folder.
12668    pub shared_folder_id: crate::types::common::SharedFolderId,
12669    /// The member to remove from the folder.
12670    pub member: MemberSelector,
12671    /// If true, the removed user will keep their copy of the folder after it's unshared, assuming
12672    /// it was mounted. Otherwise, it will be removed from their Dropbox. This must be set to false
12673    /// when removing a group, or when the folder is within a team folder or another shared folder.
12674    pub leave_a_copy: bool,
12675}
12676
12677impl RemoveFolderMemberArg {
12678    pub fn new(
12679        shared_folder_id: crate::types::common::SharedFolderId,
12680        member: MemberSelector,
12681        leave_a_copy: bool,
12682    ) -> Self {
12683        RemoveFolderMemberArg {
12684            shared_folder_id,
12685            member,
12686            leave_a_copy,
12687        }
12688    }
12689}
12690
12691const REMOVE_FOLDER_MEMBER_ARG_FIELDS: &[&str] = &["shared_folder_id",
12692                                                   "member",
12693                                                   "leave_a_copy"];
12694impl RemoveFolderMemberArg {
12695    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
12696        map: V,
12697    ) -> Result<RemoveFolderMemberArg, V::Error> {
12698        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
12699    }
12700
12701    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
12702        mut map: V,
12703        optional: bool,
12704    ) -> Result<Option<RemoveFolderMemberArg>, V::Error> {
12705        let mut field_shared_folder_id = None;
12706        let mut field_member = None;
12707        let mut field_leave_a_copy = None;
12708        let mut nothing = true;
12709        while let Some(key) = map.next_key::<&str>()? {
12710            nothing = false;
12711            match key {
12712                "shared_folder_id" => {
12713                    if field_shared_folder_id.is_some() {
12714                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
12715                    }
12716                    field_shared_folder_id = Some(map.next_value()?);
12717                }
12718                "member" => {
12719                    if field_member.is_some() {
12720                        return Err(::serde::de::Error::duplicate_field("member"));
12721                    }
12722                    field_member = Some(map.next_value()?);
12723                }
12724                "leave_a_copy" => {
12725                    if field_leave_a_copy.is_some() {
12726                        return Err(::serde::de::Error::duplicate_field("leave_a_copy"));
12727                    }
12728                    field_leave_a_copy = Some(map.next_value()?);
12729                }
12730                _ => {
12731                    // unknown field allowed and ignored
12732                    map.next_value::<::serde_json::Value>()?;
12733                }
12734            }
12735        }
12736        if optional && nothing {
12737            return Ok(None);
12738        }
12739        let result = RemoveFolderMemberArg {
12740            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
12741            member: field_member.ok_or_else(|| ::serde::de::Error::missing_field("member"))?,
12742            leave_a_copy: field_leave_a_copy.ok_or_else(|| ::serde::de::Error::missing_field("leave_a_copy"))?,
12743        };
12744        Ok(Some(result))
12745    }
12746
12747    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
12748        &self,
12749        s: &mut S::SerializeStruct,
12750    ) -> Result<(), S::Error> {
12751        use serde::ser::SerializeStruct;
12752        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
12753        s.serialize_field("member", &self.member)?;
12754        s.serialize_field("leave_a_copy", &self.leave_a_copy)?;
12755        Ok(())
12756    }
12757}
12758
12759impl<'de> ::serde::de::Deserialize<'de> for RemoveFolderMemberArg {
12760    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12761        // struct deserializer
12762        use serde::de::{MapAccess, Visitor};
12763        struct StructVisitor;
12764        impl<'de> Visitor<'de> for StructVisitor {
12765            type Value = RemoveFolderMemberArg;
12766            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12767                f.write_str("a RemoveFolderMemberArg struct")
12768            }
12769            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
12770                RemoveFolderMemberArg::internal_deserialize(map)
12771            }
12772        }
12773        deserializer.deserialize_struct("RemoveFolderMemberArg", REMOVE_FOLDER_MEMBER_ARG_FIELDS, StructVisitor)
12774    }
12775}
12776
12777impl ::serde::ser::Serialize for RemoveFolderMemberArg {
12778    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12779        // struct serializer
12780        use serde::ser::SerializeStruct;
12781        let mut s = serializer.serialize_struct("RemoveFolderMemberArg", 3)?;
12782        self.internal_serialize::<S>(&mut s)?;
12783        s.end()
12784    }
12785}
12786
12787#[derive(Debug, Clone, PartialEq, Eq)]
12788#[non_exhaustive] // variants may be added in the future
12789pub enum RemoveFolderMemberError {
12790    AccessError(SharedFolderAccessError),
12791    MemberError(SharedFolderMemberError),
12792    /// The target user is the owner of the shared folder. You can't remove this user until
12793    /// ownership has been transferred to another member.
12794    FolderOwner,
12795    /// The target user has access to the shared folder via a group.
12796    GroupAccess,
12797    /// This action cannot be performed on a team shared folder.
12798    TeamFolder,
12799    /// The current user does not have permission to perform this action.
12800    NoPermission,
12801    /// This shared folder has too many files for leaving a copy. You can still remove this user
12802    /// without leaving a copy.
12803    TooManyFiles,
12804    /// Catch-all used for unrecognized values returned from the server. Encountering this value
12805    /// typically indicates that this SDK version is out of date.
12806    Other,
12807}
12808
12809impl<'de> ::serde::de::Deserialize<'de> for RemoveFolderMemberError {
12810    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12811        // union deserializer
12812        use serde::de::{self, MapAccess, Visitor};
12813        struct EnumVisitor;
12814        impl<'de> Visitor<'de> for EnumVisitor {
12815            type Value = RemoveFolderMemberError;
12816            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12817                f.write_str("a RemoveFolderMemberError structure")
12818            }
12819            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
12820                let tag: &str = match map.next_key()? {
12821                    Some(".tag") => map.next_value()?,
12822                    _ => return Err(de::Error::missing_field(".tag"))
12823                };
12824                let value = match tag {
12825                    "access_error" => {
12826                        match map.next_key()? {
12827                            Some("access_error") => RemoveFolderMemberError::AccessError(map.next_value()?),
12828                            None => return Err(de::Error::missing_field("access_error")),
12829                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
12830                        }
12831                    }
12832                    "member_error" => {
12833                        match map.next_key()? {
12834                            Some("member_error") => RemoveFolderMemberError::MemberError(map.next_value()?),
12835                            None => return Err(de::Error::missing_field("member_error")),
12836                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
12837                        }
12838                    }
12839                    "folder_owner" => RemoveFolderMemberError::FolderOwner,
12840                    "group_access" => RemoveFolderMemberError::GroupAccess,
12841                    "team_folder" => RemoveFolderMemberError::TeamFolder,
12842                    "no_permission" => RemoveFolderMemberError::NoPermission,
12843                    "too_many_files" => RemoveFolderMemberError::TooManyFiles,
12844                    _ => RemoveFolderMemberError::Other,
12845                };
12846                crate::eat_json_fields(&mut map)?;
12847                Ok(value)
12848            }
12849        }
12850        const VARIANTS: &[&str] = &["access_error",
12851                                    "member_error",
12852                                    "folder_owner",
12853                                    "group_access",
12854                                    "team_folder",
12855                                    "no_permission",
12856                                    "too_many_files",
12857                                    "other"];
12858        deserializer.deserialize_struct("RemoveFolderMemberError", VARIANTS, EnumVisitor)
12859    }
12860}
12861
12862impl ::serde::ser::Serialize for RemoveFolderMemberError {
12863    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12864        // union serializer
12865        use serde::ser::SerializeStruct;
12866        match self {
12867            RemoveFolderMemberError::AccessError(x) => {
12868                // union or polymporphic struct
12869                let mut s = serializer.serialize_struct("RemoveFolderMemberError", 2)?;
12870                s.serialize_field(".tag", "access_error")?;
12871                s.serialize_field("access_error", x)?;
12872                s.end()
12873            }
12874            RemoveFolderMemberError::MemberError(x) => {
12875                // union or polymporphic struct
12876                let mut s = serializer.serialize_struct("RemoveFolderMemberError", 2)?;
12877                s.serialize_field(".tag", "member_error")?;
12878                s.serialize_field("member_error", x)?;
12879                s.end()
12880            }
12881            RemoveFolderMemberError::FolderOwner => {
12882                // unit
12883                let mut s = serializer.serialize_struct("RemoveFolderMemberError", 1)?;
12884                s.serialize_field(".tag", "folder_owner")?;
12885                s.end()
12886            }
12887            RemoveFolderMemberError::GroupAccess => {
12888                // unit
12889                let mut s = serializer.serialize_struct("RemoveFolderMemberError", 1)?;
12890                s.serialize_field(".tag", "group_access")?;
12891                s.end()
12892            }
12893            RemoveFolderMemberError::TeamFolder => {
12894                // unit
12895                let mut s = serializer.serialize_struct("RemoveFolderMemberError", 1)?;
12896                s.serialize_field(".tag", "team_folder")?;
12897                s.end()
12898            }
12899            RemoveFolderMemberError::NoPermission => {
12900                // unit
12901                let mut s = serializer.serialize_struct("RemoveFolderMemberError", 1)?;
12902                s.serialize_field(".tag", "no_permission")?;
12903                s.end()
12904            }
12905            RemoveFolderMemberError::TooManyFiles => {
12906                // unit
12907                let mut s = serializer.serialize_struct("RemoveFolderMemberError", 1)?;
12908                s.serialize_field(".tag", "too_many_files")?;
12909                s.end()
12910            }
12911            RemoveFolderMemberError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
12912        }
12913    }
12914}
12915
12916impl ::std::error::Error for RemoveFolderMemberError {
12917    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
12918        match self {
12919            RemoveFolderMemberError::AccessError(inner) => Some(inner),
12920            RemoveFolderMemberError::MemberError(inner) => Some(inner),
12921            _ => None,
12922        }
12923    }
12924}
12925
12926impl ::std::fmt::Display for RemoveFolderMemberError {
12927    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12928        match self {
12929            RemoveFolderMemberError::AccessError(inner) => write!(f, "RemoveFolderMemberError: {}", inner),
12930            RemoveFolderMemberError::MemberError(inner) => write!(f, "RemoveFolderMemberError: {}", inner),
12931            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."),
12932            RemoveFolderMemberError::GroupAccess => f.write_str("The target user has access to the shared folder via a group."),
12933            RemoveFolderMemberError::TeamFolder => f.write_str("This action cannot be performed on a team shared folder."),
12934            RemoveFolderMemberError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
12935            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."),
12936            _ => write!(f, "{:?}", *self),
12937        }
12938    }
12939}
12940
12941#[derive(Debug, Clone, PartialEq, Eq)]
12942pub enum RemoveMemberJobStatus {
12943    /// The asynchronous job is still in progress.
12944    InProgress,
12945    /// Removing the folder member has finished. The value is information about whether the member
12946    /// has another form of access.
12947    Complete(MemberAccessLevelResult),
12948    Failed(RemoveFolderMemberError),
12949}
12950
12951impl<'de> ::serde::de::Deserialize<'de> for RemoveMemberJobStatus {
12952    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
12953        // union deserializer
12954        use serde::de::{self, MapAccess, Visitor};
12955        struct EnumVisitor;
12956        impl<'de> Visitor<'de> for EnumVisitor {
12957            type Value = RemoveMemberJobStatus;
12958            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
12959                f.write_str("a RemoveMemberJobStatus structure")
12960            }
12961            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
12962                let tag: &str = match map.next_key()? {
12963                    Some(".tag") => map.next_value()?,
12964                    _ => return Err(de::Error::missing_field(".tag"))
12965                };
12966                let value = match tag {
12967                    "in_progress" => RemoveMemberJobStatus::InProgress,
12968                    "complete" => RemoveMemberJobStatus::Complete(MemberAccessLevelResult::internal_deserialize(&mut map)?),
12969                    "failed" => {
12970                        match map.next_key()? {
12971                            Some("failed") => RemoveMemberJobStatus::Failed(map.next_value()?),
12972                            None => return Err(de::Error::missing_field("failed")),
12973                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
12974                        }
12975                    }
12976                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
12977                };
12978                crate::eat_json_fields(&mut map)?;
12979                Ok(value)
12980            }
12981        }
12982        const VARIANTS: &[&str] = &["in_progress",
12983                                    "complete",
12984                                    "failed"];
12985        deserializer.deserialize_struct("RemoveMemberJobStatus", VARIANTS, EnumVisitor)
12986    }
12987}
12988
12989impl ::serde::ser::Serialize for RemoveMemberJobStatus {
12990    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12991        // union serializer
12992        use serde::ser::SerializeStruct;
12993        match self {
12994            RemoveMemberJobStatus::InProgress => {
12995                // unit
12996                let mut s = serializer.serialize_struct("RemoveMemberJobStatus", 1)?;
12997                s.serialize_field(".tag", "in_progress")?;
12998                s.end()
12999            }
13000            RemoveMemberJobStatus::Complete(x) => {
13001                // struct
13002                let mut s = serializer.serialize_struct("RemoveMemberJobStatus", 4)?;
13003                s.serialize_field(".tag", "complete")?;
13004                x.internal_serialize::<S>(&mut s)?;
13005                s.end()
13006            }
13007            RemoveMemberJobStatus::Failed(x) => {
13008                // union or polymporphic struct
13009                let mut s = serializer.serialize_struct("RemoveMemberJobStatus", 2)?;
13010                s.serialize_field(".tag", "failed")?;
13011                s.serialize_field("failed", x)?;
13012                s.end()
13013            }
13014        }
13015    }
13016}
13017
13018// union extends crate::types::dbx_async::PollResultBase
13019impl From<crate::types::dbx_async::PollResultBase> for RemoveMemberJobStatus {
13020    fn from(parent: crate::types::dbx_async::PollResultBase) -> Self {
13021        match parent {
13022            crate::types::dbx_async::PollResultBase::InProgress => RemoveMemberJobStatus::InProgress,
13023        }
13024    }
13025}
13026#[derive(Debug, Clone, PartialEq, Eq)]
13027#[non_exhaustive] // variants may be added in the future
13028pub enum RequestedLinkAccessLevel {
13029    /// Users who use the link can view and comment on the content.
13030    Viewer,
13031    /// Users who use the link can edit, view and comment on the content. Note not all file types
13032    /// support edit links yet.
13033    Editor,
13034    /// Request for the maximum access level you can set the link to.
13035    Max,
13036    /// Request for the default access level the user has set.
13037    Default,
13038    /// Catch-all used for unrecognized values returned from the server. Encountering this value
13039    /// typically indicates that this SDK version is out of date.
13040    Other,
13041}
13042
13043impl<'de> ::serde::de::Deserialize<'de> for RequestedLinkAccessLevel {
13044    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
13045        // union deserializer
13046        use serde::de::{self, MapAccess, Visitor};
13047        struct EnumVisitor;
13048        impl<'de> Visitor<'de> for EnumVisitor {
13049            type Value = RequestedLinkAccessLevel;
13050            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13051                f.write_str("a RequestedLinkAccessLevel structure")
13052            }
13053            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
13054                let tag: &str = match map.next_key()? {
13055                    Some(".tag") => map.next_value()?,
13056                    _ => return Err(de::Error::missing_field(".tag"))
13057                };
13058                let value = match tag {
13059                    "viewer" => RequestedLinkAccessLevel::Viewer,
13060                    "editor" => RequestedLinkAccessLevel::Editor,
13061                    "max" => RequestedLinkAccessLevel::Max,
13062                    "default" => RequestedLinkAccessLevel::Default,
13063                    _ => RequestedLinkAccessLevel::Other,
13064                };
13065                crate::eat_json_fields(&mut map)?;
13066                Ok(value)
13067            }
13068        }
13069        const VARIANTS: &[&str] = &["viewer",
13070                                    "editor",
13071                                    "max",
13072                                    "default",
13073                                    "other"];
13074        deserializer.deserialize_struct("RequestedLinkAccessLevel", VARIANTS, EnumVisitor)
13075    }
13076}
13077
13078impl ::serde::ser::Serialize for RequestedLinkAccessLevel {
13079    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13080        // union serializer
13081        use serde::ser::SerializeStruct;
13082        match self {
13083            RequestedLinkAccessLevel::Viewer => {
13084                // unit
13085                let mut s = serializer.serialize_struct("RequestedLinkAccessLevel", 1)?;
13086                s.serialize_field(".tag", "viewer")?;
13087                s.end()
13088            }
13089            RequestedLinkAccessLevel::Editor => {
13090                // unit
13091                let mut s = serializer.serialize_struct("RequestedLinkAccessLevel", 1)?;
13092                s.serialize_field(".tag", "editor")?;
13093                s.end()
13094            }
13095            RequestedLinkAccessLevel::Max => {
13096                // unit
13097                let mut s = serializer.serialize_struct("RequestedLinkAccessLevel", 1)?;
13098                s.serialize_field(".tag", "max")?;
13099                s.end()
13100            }
13101            RequestedLinkAccessLevel::Default => {
13102                // unit
13103                let mut s = serializer.serialize_struct("RequestedLinkAccessLevel", 1)?;
13104                s.serialize_field(".tag", "default")?;
13105                s.end()
13106            }
13107            RequestedLinkAccessLevel::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
13108        }
13109    }
13110}
13111
13112/// The access permission that can be requested by the caller for the shared link. Note that the
13113/// final resolved visibility of the shared link takes into account other aspects, such as team and
13114/// shared folder settings. Check the [`ResolvedVisibility`] for more info on the possible resolved
13115/// visibility values of shared links.
13116#[derive(Debug, Clone, PartialEq, Eq)]
13117pub enum RequestedVisibility {
13118    /// Anyone who has received the link can access it. No login required.
13119    Public,
13120    /// Only members of the same team can access the link. Login is required.
13121    TeamOnly,
13122    /// A link-specific password is required to access the link. Login is not required.
13123    Password,
13124}
13125
13126impl<'de> ::serde::de::Deserialize<'de> for RequestedVisibility {
13127    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
13128        // union deserializer
13129        use serde::de::{self, MapAccess, Visitor};
13130        struct EnumVisitor;
13131        impl<'de> Visitor<'de> for EnumVisitor {
13132            type Value = RequestedVisibility;
13133            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13134                f.write_str("a RequestedVisibility structure")
13135            }
13136            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
13137                let tag: &str = match map.next_key()? {
13138                    Some(".tag") => map.next_value()?,
13139                    _ => return Err(de::Error::missing_field(".tag"))
13140                };
13141                let value = match tag {
13142                    "public" => RequestedVisibility::Public,
13143                    "team_only" => RequestedVisibility::TeamOnly,
13144                    "password" => RequestedVisibility::Password,
13145                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
13146                };
13147                crate::eat_json_fields(&mut map)?;
13148                Ok(value)
13149            }
13150        }
13151        const VARIANTS: &[&str] = &["public",
13152                                    "team_only",
13153                                    "password"];
13154        deserializer.deserialize_struct("RequestedVisibility", VARIANTS, EnumVisitor)
13155    }
13156}
13157
13158impl ::serde::ser::Serialize for RequestedVisibility {
13159    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13160        // union serializer
13161        use serde::ser::SerializeStruct;
13162        match self {
13163            RequestedVisibility::Public => {
13164                // unit
13165                let mut s = serializer.serialize_struct("RequestedVisibility", 1)?;
13166                s.serialize_field(".tag", "public")?;
13167                s.end()
13168            }
13169            RequestedVisibility::TeamOnly => {
13170                // unit
13171                let mut s = serializer.serialize_struct("RequestedVisibility", 1)?;
13172                s.serialize_field(".tag", "team_only")?;
13173                s.end()
13174            }
13175            RequestedVisibility::Password => {
13176                // unit
13177                let mut s = serializer.serialize_struct("RequestedVisibility", 1)?;
13178                s.serialize_field(".tag", "password")?;
13179                s.end()
13180            }
13181        }
13182    }
13183}
13184
13185/// The actual access permissions values of shared links after taking into account user preferences
13186/// and the team and shared folder settings. Check the [`RequestedVisibility`] for more info on the
13187/// possible visibility values that can be set by the shared link's owner.
13188#[derive(Debug, Clone, PartialEq, Eq)]
13189#[non_exhaustive] // variants may be added in the future
13190pub enum ResolvedVisibility {
13191    /// Anyone who has received the link can access it. No login required.
13192    Public,
13193    /// Only members of the same team can access the link. Login is required.
13194    TeamOnly,
13195    /// A link-specific password is required to access the link. Login is not required.
13196    Password,
13197    /// Only members of the same team who have the link-specific password can access the link. Login
13198    /// is required.
13199    TeamAndPassword,
13200    /// Only members of the shared folder containing the linked file can access the link. Login is
13201    /// required.
13202    SharedFolderOnly,
13203    /// The link merely points the user to the content, and does not grant any additional rights.
13204    /// Existing members of the content who use this link can only access the content with their
13205    /// pre-existing access rights. Either on the file directly, or inherited from a parent folder.
13206    NoOne,
13207    /// Only the current user can view this link.
13208    OnlyYou,
13209    /// Catch-all used for unrecognized values returned from the server. Encountering this value
13210    /// typically indicates that this SDK version is out of date.
13211    Other,
13212}
13213
13214impl<'de> ::serde::de::Deserialize<'de> for ResolvedVisibility {
13215    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
13216        // union deserializer
13217        use serde::de::{self, MapAccess, Visitor};
13218        struct EnumVisitor;
13219        impl<'de> Visitor<'de> for EnumVisitor {
13220            type Value = ResolvedVisibility;
13221            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13222                f.write_str("a ResolvedVisibility structure")
13223            }
13224            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
13225                let tag: &str = match map.next_key()? {
13226                    Some(".tag") => map.next_value()?,
13227                    _ => return Err(de::Error::missing_field(".tag"))
13228                };
13229                let value = match tag {
13230                    "public" => ResolvedVisibility::Public,
13231                    "team_only" => ResolvedVisibility::TeamOnly,
13232                    "password" => ResolvedVisibility::Password,
13233                    "team_and_password" => ResolvedVisibility::TeamAndPassword,
13234                    "shared_folder_only" => ResolvedVisibility::SharedFolderOnly,
13235                    "no_one" => ResolvedVisibility::NoOne,
13236                    "only_you" => ResolvedVisibility::OnlyYou,
13237                    _ => ResolvedVisibility::Other,
13238                };
13239                crate::eat_json_fields(&mut map)?;
13240                Ok(value)
13241            }
13242        }
13243        const VARIANTS: &[&str] = &["public",
13244                                    "team_only",
13245                                    "password",
13246                                    "team_and_password",
13247                                    "shared_folder_only",
13248                                    "no_one",
13249                                    "only_you",
13250                                    "other"];
13251        deserializer.deserialize_struct("ResolvedVisibility", VARIANTS, EnumVisitor)
13252    }
13253}
13254
13255impl ::serde::ser::Serialize for ResolvedVisibility {
13256    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13257        // union serializer
13258        use serde::ser::SerializeStruct;
13259        match self {
13260            ResolvedVisibility::Public => {
13261                // unit
13262                let mut s = serializer.serialize_struct("ResolvedVisibility", 1)?;
13263                s.serialize_field(".tag", "public")?;
13264                s.end()
13265            }
13266            ResolvedVisibility::TeamOnly => {
13267                // unit
13268                let mut s = serializer.serialize_struct("ResolvedVisibility", 1)?;
13269                s.serialize_field(".tag", "team_only")?;
13270                s.end()
13271            }
13272            ResolvedVisibility::Password => {
13273                // unit
13274                let mut s = serializer.serialize_struct("ResolvedVisibility", 1)?;
13275                s.serialize_field(".tag", "password")?;
13276                s.end()
13277            }
13278            ResolvedVisibility::TeamAndPassword => {
13279                // unit
13280                let mut s = serializer.serialize_struct("ResolvedVisibility", 1)?;
13281                s.serialize_field(".tag", "team_and_password")?;
13282                s.end()
13283            }
13284            ResolvedVisibility::SharedFolderOnly => {
13285                // unit
13286                let mut s = serializer.serialize_struct("ResolvedVisibility", 1)?;
13287                s.serialize_field(".tag", "shared_folder_only")?;
13288                s.end()
13289            }
13290            ResolvedVisibility::NoOne => {
13291                // unit
13292                let mut s = serializer.serialize_struct("ResolvedVisibility", 1)?;
13293                s.serialize_field(".tag", "no_one")?;
13294                s.end()
13295            }
13296            ResolvedVisibility::OnlyYou => {
13297                // unit
13298                let mut s = serializer.serialize_struct("ResolvedVisibility", 1)?;
13299                s.serialize_field(".tag", "only_you")?;
13300                s.end()
13301            }
13302            ResolvedVisibility::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
13303        }
13304    }
13305}
13306
13307// union extends RequestedVisibility
13308impl From<RequestedVisibility> for ResolvedVisibility {
13309    fn from(parent: RequestedVisibility) -> Self {
13310        match parent {
13311            RequestedVisibility::Public => ResolvedVisibility::Public,
13312            RequestedVisibility::TeamOnly => ResolvedVisibility::TeamOnly,
13313            RequestedVisibility::Password => ResolvedVisibility::Password,
13314        }
13315    }
13316}
13317#[derive(Debug, Clone, PartialEq, Eq)]
13318#[non_exhaustive] // structs may have more fields added in the future.
13319pub struct RevokeSharedLinkArg {
13320    /// URL of the shared link.
13321    pub url: String,
13322}
13323
13324impl RevokeSharedLinkArg {
13325    pub fn new(url: String) -> Self {
13326        RevokeSharedLinkArg {
13327            url,
13328        }
13329    }
13330}
13331
13332const REVOKE_SHARED_LINK_ARG_FIELDS: &[&str] = &["url"];
13333impl RevokeSharedLinkArg {
13334    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
13335        map: V,
13336    ) -> Result<RevokeSharedLinkArg, V::Error> {
13337        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
13338    }
13339
13340    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
13341        mut map: V,
13342        optional: bool,
13343    ) -> Result<Option<RevokeSharedLinkArg>, V::Error> {
13344        let mut field_url = None;
13345        let mut nothing = true;
13346        while let Some(key) = map.next_key::<&str>()? {
13347            nothing = false;
13348            match key {
13349                "url" => {
13350                    if field_url.is_some() {
13351                        return Err(::serde::de::Error::duplicate_field("url"));
13352                    }
13353                    field_url = Some(map.next_value()?);
13354                }
13355                _ => {
13356                    // unknown field allowed and ignored
13357                    map.next_value::<::serde_json::Value>()?;
13358                }
13359            }
13360        }
13361        if optional && nothing {
13362            return Ok(None);
13363        }
13364        let result = RevokeSharedLinkArg {
13365            url: field_url.ok_or_else(|| ::serde::de::Error::missing_field("url"))?,
13366        };
13367        Ok(Some(result))
13368    }
13369
13370    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
13371        &self,
13372        s: &mut S::SerializeStruct,
13373    ) -> Result<(), S::Error> {
13374        use serde::ser::SerializeStruct;
13375        s.serialize_field("url", &self.url)?;
13376        Ok(())
13377    }
13378}
13379
13380impl<'de> ::serde::de::Deserialize<'de> for RevokeSharedLinkArg {
13381    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
13382        // struct deserializer
13383        use serde::de::{MapAccess, Visitor};
13384        struct StructVisitor;
13385        impl<'de> Visitor<'de> for StructVisitor {
13386            type Value = RevokeSharedLinkArg;
13387            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13388                f.write_str("a RevokeSharedLinkArg struct")
13389            }
13390            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
13391                RevokeSharedLinkArg::internal_deserialize(map)
13392            }
13393        }
13394        deserializer.deserialize_struct("RevokeSharedLinkArg", REVOKE_SHARED_LINK_ARG_FIELDS, StructVisitor)
13395    }
13396}
13397
13398impl ::serde::ser::Serialize for RevokeSharedLinkArg {
13399    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13400        // struct serializer
13401        use serde::ser::SerializeStruct;
13402        let mut s = serializer.serialize_struct("RevokeSharedLinkArg", 1)?;
13403        self.internal_serialize::<S>(&mut s)?;
13404        s.end()
13405    }
13406}
13407
13408#[derive(Debug, Clone, PartialEq, Eq)]
13409#[non_exhaustive] // variants may be added in the future
13410pub enum RevokeSharedLinkError {
13411    /// The shared link wasn't found.
13412    SharedLinkNotFound,
13413    /// The caller is not allowed to access this shared link.
13414    SharedLinkAccessDenied,
13415    /// This type of link is not supported; use [`files::export()`](crate::files::export) instead.
13416    UnsupportedLinkType,
13417    /// Shared link is malformed.
13418    SharedLinkMalformed,
13419    /// Catch-all used for unrecognized values returned from the server. Encountering this value
13420    /// typically indicates that this SDK version is out of date.
13421    Other,
13422}
13423
13424impl<'de> ::serde::de::Deserialize<'de> for RevokeSharedLinkError {
13425    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
13426        // union deserializer
13427        use serde::de::{self, MapAccess, Visitor};
13428        struct EnumVisitor;
13429        impl<'de> Visitor<'de> for EnumVisitor {
13430            type Value = RevokeSharedLinkError;
13431            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13432                f.write_str("a RevokeSharedLinkError structure")
13433            }
13434            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
13435                let tag: &str = match map.next_key()? {
13436                    Some(".tag") => map.next_value()?,
13437                    _ => return Err(de::Error::missing_field(".tag"))
13438                };
13439                let value = match tag {
13440                    "shared_link_not_found" => RevokeSharedLinkError::SharedLinkNotFound,
13441                    "shared_link_access_denied" => RevokeSharedLinkError::SharedLinkAccessDenied,
13442                    "unsupported_link_type" => RevokeSharedLinkError::UnsupportedLinkType,
13443                    "shared_link_malformed" => RevokeSharedLinkError::SharedLinkMalformed,
13444                    _ => RevokeSharedLinkError::Other,
13445                };
13446                crate::eat_json_fields(&mut map)?;
13447                Ok(value)
13448            }
13449        }
13450        const VARIANTS: &[&str] = &["shared_link_not_found",
13451                                    "shared_link_access_denied",
13452                                    "unsupported_link_type",
13453                                    "other",
13454                                    "shared_link_malformed"];
13455        deserializer.deserialize_struct("RevokeSharedLinkError", VARIANTS, EnumVisitor)
13456    }
13457}
13458
13459impl ::serde::ser::Serialize for RevokeSharedLinkError {
13460    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13461        // union serializer
13462        use serde::ser::SerializeStruct;
13463        match self {
13464            RevokeSharedLinkError::SharedLinkNotFound => {
13465                // unit
13466                let mut s = serializer.serialize_struct("RevokeSharedLinkError", 1)?;
13467                s.serialize_field(".tag", "shared_link_not_found")?;
13468                s.end()
13469            }
13470            RevokeSharedLinkError::SharedLinkAccessDenied => {
13471                // unit
13472                let mut s = serializer.serialize_struct("RevokeSharedLinkError", 1)?;
13473                s.serialize_field(".tag", "shared_link_access_denied")?;
13474                s.end()
13475            }
13476            RevokeSharedLinkError::UnsupportedLinkType => {
13477                // unit
13478                let mut s = serializer.serialize_struct("RevokeSharedLinkError", 1)?;
13479                s.serialize_field(".tag", "unsupported_link_type")?;
13480                s.end()
13481            }
13482            RevokeSharedLinkError::SharedLinkMalformed => {
13483                // unit
13484                let mut s = serializer.serialize_struct("RevokeSharedLinkError", 1)?;
13485                s.serialize_field(".tag", "shared_link_malformed")?;
13486                s.end()
13487            }
13488            RevokeSharedLinkError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
13489        }
13490    }
13491}
13492
13493impl ::std::error::Error for RevokeSharedLinkError {
13494}
13495
13496impl ::std::fmt::Display for RevokeSharedLinkError {
13497    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13498        match self {
13499            RevokeSharedLinkError::SharedLinkNotFound => f.write_str("The shared link wasn't found."),
13500            RevokeSharedLinkError::SharedLinkAccessDenied => f.write_str("The caller is not allowed to access this shared link."),
13501            RevokeSharedLinkError::SharedLinkMalformed => f.write_str("Shared link is malformed."),
13502            _ => write!(f, "{:?}", *self),
13503        }
13504    }
13505}
13506
13507// union extends SharedLinkError
13508impl From<SharedLinkError> for RevokeSharedLinkError {
13509    fn from(parent: SharedLinkError) -> Self {
13510        match parent {
13511            SharedLinkError::SharedLinkNotFound => RevokeSharedLinkError::SharedLinkNotFound,
13512            SharedLinkError::SharedLinkAccessDenied => RevokeSharedLinkError::SharedLinkAccessDenied,
13513            SharedLinkError::UnsupportedLinkType => RevokeSharedLinkError::UnsupportedLinkType,
13514            SharedLinkError::Other => RevokeSharedLinkError::Other,
13515        }
13516    }
13517}
13518#[derive(Debug, Clone, PartialEq, Eq)]
13519#[non_exhaustive] // structs may have more fields added in the future.
13520pub struct SetAccessInheritanceArg {
13521    /// The ID for the shared folder.
13522    pub shared_folder_id: crate::types::common::SharedFolderId,
13523    /// The access inheritance settings for the folder.
13524    pub access_inheritance: AccessInheritance,
13525}
13526
13527impl SetAccessInheritanceArg {
13528    pub fn new(shared_folder_id: crate::types::common::SharedFolderId) -> Self {
13529        SetAccessInheritanceArg {
13530            shared_folder_id,
13531            access_inheritance: AccessInheritance::Inherit,
13532        }
13533    }
13534
13535    pub fn with_access_inheritance(mut self, value: AccessInheritance) -> Self {
13536        self.access_inheritance = value;
13537        self
13538    }
13539}
13540
13541const SET_ACCESS_INHERITANCE_ARG_FIELDS: &[&str] = &["shared_folder_id",
13542                                                     "access_inheritance"];
13543impl SetAccessInheritanceArg {
13544    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
13545        map: V,
13546    ) -> Result<SetAccessInheritanceArg, V::Error> {
13547        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
13548    }
13549
13550    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
13551        mut map: V,
13552        optional: bool,
13553    ) -> Result<Option<SetAccessInheritanceArg>, V::Error> {
13554        let mut field_shared_folder_id = None;
13555        let mut field_access_inheritance = None;
13556        let mut nothing = true;
13557        while let Some(key) = map.next_key::<&str>()? {
13558            nothing = false;
13559            match key {
13560                "shared_folder_id" => {
13561                    if field_shared_folder_id.is_some() {
13562                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
13563                    }
13564                    field_shared_folder_id = Some(map.next_value()?);
13565                }
13566                "access_inheritance" => {
13567                    if field_access_inheritance.is_some() {
13568                        return Err(::serde::de::Error::duplicate_field("access_inheritance"));
13569                    }
13570                    field_access_inheritance = Some(map.next_value()?);
13571                }
13572                _ => {
13573                    // unknown field allowed and ignored
13574                    map.next_value::<::serde_json::Value>()?;
13575                }
13576            }
13577        }
13578        if optional && nothing {
13579            return Ok(None);
13580        }
13581        let result = SetAccessInheritanceArg {
13582            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
13583            access_inheritance: field_access_inheritance.unwrap_or(AccessInheritance::Inherit),
13584        };
13585        Ok(Some(result))
13586    }
13587
13588    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
13589        &self,
13590        s: &mut S::SerializeStruct,
13591    ) -> Result<(), S::Error> {
13592        use serde::ser::SerializeStruct;
13593        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
13594        if self.access_inheritance != AccessInheritance::Inherit {
13595            s.serialize_field("access_inheritance", &self.access_inheritance)?;
13596        }
13597        Ok(())
13598    }
13599}
13600
13601impl<'de> ::serde::de::Deserialize<'de> for SetAccessInheritanceArg {
13602    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
13603        // struct deserializer
13604        use serde::de::{MapAccess, Visitor};
13605        struct StructVisitor;
13606        impl<'de> Visitor<'de> for StructVisitor {
13607            type Value = SetAccessInheritanceArg;
13608            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13609                f.write_str("a SetAccessInheritanceArg struct")
13610            }
13611            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
13612                SetAccessInheritanceArg::internal_deserialize(map)
13613            }
13614        }
13615        deserializer.deserialize_struct("SetAccessInheritanceArg", SET_ACCESS_INHERITANCE_ARG_FIELDS, StructVisitor)
13616    }
13617}
13618
13619impl ::serde::ser::Serialize for SetAccessInheritanceArg {
13620    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13621        // struct serializer
13622        use serde::ser::SerializeStruct;
13623        let mut s = serializer.serialize_struct("SetAccessInheritanceArg", 2)?;
13624        self.internal_serialize::<S>(&mut s)?;
13625        s.end()
13626    }
13627}
13628
13629#[derive(Debug, Clone, PartialEq, Eq)]
13630#[non_exhaustive] // variants may be added in the future
13631pub enum SetAccessInheritanceError {
13632    /// Unable to access shared folder.
13633    AccessError(SharedFolderAccessError),
13634    /// The current user does not have permission to perform this action.
13635    NoPermission,
13636    /// Catch-all used for unrecognized values returned from the server. Encountering this value
13637    /// typically indicates that this SDK version is out of date.
13638    Other,
13639}
13640
13641impl<'de> ::serde::de::Deserialize<'de> for SetAccessInheritanceError {
13642    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
13643        // union deserializer
13644        use serde::de::{self, MapAccess, Visitor};
13645        struct EnumVisitor;
13646        impl<'de> Visitor<'de> for EnumVisitor {
13647            type Value = SetAccessInheritanceError;
13648            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13649                f.write_str("a SetAccessInheritanceError structure")
13650            }
13651            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
13652                let tag: &str = match map.next_key()? {
13653                    Some(".tag") => map.next_value()?,
13654                    _ => return Err(de::Error::missing_field(".tag"))
13655                };
13656                let value = match tag {
13657                    "access_error" => {
13658                        match map.next_key()? {
13659                            Some("access_error") => SetAccessInheritanceError::AccessError(map.next_value()?),
13660                            None => return Err(de::Error::missing_field("access_error")),
13661                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
13662                        }
13663                    }
13664                    "no_permission" => SetAccessInheritanceError::NoPermission,
13665                    _ => SetAccessInheritanceError::Other,
13666                };
13667                crate::eat_json_fields(&mut map)?;
13668                Ok(value)
13669            }
13670        }
13671        const VARIANTS: &[&str] = &["access_error",
13672                                    "no_permission",
13673                                    "other"];
13674        deserializer.deserialize_struct("SetAccessInheritanceError", VARIANTS, EnumVisitor)
13675    }
13676}
13677
13678impl ::serde::ser::Serialize for SetAccessInheritanceError {
13679    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13680        // union serializer
13681        use serde::ser::SerializeStruct;
13682        match self {
13683            SetAccessInheritanceError::AccessError(x) => {
13684                // union or polymporphic struct
13685                let mut s = serializer.serialize_struct("SetAccessInheritanceError", 2)?;
13686                s.serialize_field(".tag", "access_error")?;
13687                s.serialize_field("access_error", x)?;
13688                s.end()
13689            }
13690            SetAccessInheritanceError::NoPermission => {
13691                // unit
13692                let mut s = serializer.serialize_struct("SetAccessInheritanceError", 1)?;
13693                s.serialize_field(".tag", "no_permission")?;
13694                s.end()
13695            }
13696            SetAccessInheritanceError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
13697        }
13698    }
13699}
13700
13701impl ::std::error::Error for SetAccessInheritanceError {
13702    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
13703        match self {
13704            SetAccessInheritanceError::AccessError(inner) => Some(inner),
13705            _ => None,
13706        }
13707    }
13708}
13709
13710impl ::std::fmt::Display for SetAccessInheritanceError {
13711    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13712        match self {
13713            SetAccessInheritanceError::AccessError(inner) => write!(f, "Unable to access shared folder: {}", inner),
13714            SetAccessInheritanceError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
13715            _ => write!(f, "{:?}", *self),
13716        }
13717    }
13718}
13719
13720#[derive(Debug, Clone, PartialEq, Eq)]
13721#[non_exhaustive] // structs may have more fields added in the future.
13722pub struct ShareFolderArg {
13723    /// The path or the file id to the folder to share. If it does not exist, then a new one is
13724    /// created.
13725    pub path: crate::types::files::WritePathOrId,
13726    /// Who can add and remove members of this shared folder.
13727    pub acl_update_policy: Option<AclUpdatePolicy>,
13728    /// Whether to force the share to happen asynchronously.
13729    pub force_async: bool,
13730    /// Who can be a member of this shared folder. Only applicable if the current user is on a team.
13731    pub member_policy: Option<MemberPolicy>,
13732    /// The policy to apply to shared links created for content inside this shared folder.  The
13733    /// current user must be on a team to set this policy to [`SharedLinkPolicy::Members`].
13734    pub shared_link_policy: Option<SharedLinkPolicy>,
13735    /// Who can enable/disable viewer info for this shared folder.
13736    pub viewer_info_policy: Option<ViewerInfoPolicy>,
13737    /// The access inheritance settings for the folder.
13738    pub access_inheritance: AccessInheritance,
13739    /// A list of `FolderAction`s corresponding to `FolderPermission`s that should appear in the
13740    /// response's [`SharedFolderMetadata::permissions`](SharedFolderMetadata) field describing the
13741    /// actions the  authenticated user can perform on the folder.
13742    pub actions: Option<Vec<FolderAction>>,
13743    /// Settings on the link for this folder.
13744    pub link_settings: Option<LinkSettings>,
13745}
13746
13747impl ShareFolderArg {
13748    pub fn new(path: crate::types::files::WritePathOrId) -> Self {
13749        ShareFolderArg {
13750            path,
13751            acl_update_policy: None,
13752            force_async: false,
13753            member_policy: None,
13754            shared_link_policy: None,
13755            viewer_info_policy: None,
13756            access_inheritance: AccessInheritance::Inherit,
13757            actions: None,
13758            link_settings: None,
13759        }
13760    }
13761
13762    pub fn with_acl_update_policy(mut self, value: AclUpdatePolicy) -> Self {
13763        self.acl_update_policy = Some(value);
13764        self
13765    }
13766
13767    pub fn with_force_async(mut self, value: bool) -> Self {
13768        self.force_async = value;
13769        self
13770    }
13771
13772    pub fn with_member_policy(mut self, value: MemberPolicy) -> Self {
13773        self.member_policy = Some(value);
13774        self
13775    }
13776
13777    pub fn with_shared_link_policy(mut self, value: SharedLinkPolicy) -> Self {
13778        self.shared_link_policy = Some(value);
13779        self
13780    }
13781
13782    pub fn with_viewer_info_policy(mut self, value: ViewerInfoPolicy) -> Self {
13783        self.viewer_info_policy = Some(value);
13784        self
13785    }
13786
13787    pub fn with_access_inheritance(mut self, value: AccessInheritance) -> Self {
13788        self.access_inheritance = value;
13789        self
13790    }
13791
13792    pub fn with_actions(mut self, value: Vec<FolderAction>) -> Self {
13793        self.actions = Some(value);
13794        self
13795    }
13796
13797    pub fn with_link_settings(mut self, value: LinkSettings) -> Self {
13798        self.link_settings = Some(value);
13799        self
13800    }
13801}
13802
13803const SHARE_FOLDER_ARG_FIELDS: &[&str] = &["path",
13804                                           "acl_update_policy",
13805                                           "force_async",
13806                                           "member_policy",
13807                                           "shared_link_policy",
13808                                           "viewer_info_policy",
13809                                           "access_inheritance",
13810                                           "actions",
13811                                           "link_settings"];
13812impl ShareFolderArg {
13813    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
13814        map: V,
13815    ) -> Result<ShareFolderArg, V::Error> {
13816        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
13817    }
13818
13819    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
13820        mut map: V,
13821        optional: bool,
13822    ) -> Result<Option<ShareFolderArg>, V::Error> {
13823        let mut field_path = None;
13824        let mut field_acl_update_policy = None;
13825        let mut field_force_async = None;
13826        let mut field_member_policy = None;
13827        let mut field_shared_link_policy = None;
13828        let mut field_viewer_info_policy = None;
13829        let mut field_access_inheritance = None;
13830        let mut field_actions = None;
13831        let mut field_link_settings = None;
13832        let mut nothing = true;
13833        while let Some(key) = map.next_key::<&str>()? {
13834            nothing = false;
13835            match key {
13836                "path" => {
13837                    if field_path.is_some() {
13838                        return Err(::serde::de::Error::duplicate_field("path"));
13839                    }
13840                    field_path = Some(map.next_value()?);
13841                }
13842                "acl_update_policy" => {
13843                    if field_acl_update_policy.is_some() {
13844                        return Err(::serde::de::Error::duplicate_field("acl_update_policy"));
13845                    }
13846                    field_acl_update_policy = Some(map.next_value()?);
13847                }
13848                "force_async" => {
13849                    if field_force_async.is_some() {
13850                        return Err(::serde::de::Error::duplicate_field("force_async"));
13851                    }
13852                    field_force_async = Some(map.next_value()?);
13853                }
13854                "member_policy" => {
13855                    if field_member_policy.is_some() {
13856                        return Err(::serde::de::Error::duplicate_field("member_policy"));
13857                    }
13858                    field_member_policy = Some(map.next_value()?);
13859                }
13860                "shared_link_policy" => {
13861                    if field_shared_link_policy.is_some() {
13862                        return Err(::serde::de::Error::duplicate_field("shared_link_policy"));
13863                    }
13864                    field_shared_link_policy = Some(map.next_value()?);
13865                }
13866                "viewer_info_policy" => {
13867                    if field_viewer_info_policy.is_some() {
13868                        return Err(::serde::de::Error::duplicate_field("viewer_info_policy"));
13869                    }
13870                    field_viewer_info_policy = Some(map.next_value()?);
13871                }
13872                "access_inheritance" => {
13873                    if field_access_inheritance.is_some() {
13874                        return Err(::serde::de::Error::duplicate_field("access_inheritance"));
13875                    }
13876                    field_access_inheritance = Some(map.next_value()?);
13877                }
13878                "actions" => {
13879                    if field_actions.is_some() {
13880                        return Err(::serde::de::Error::duplicate_field("actions"));
13881                    }
13882                    field_actions = Some(map.next_value()?);
13883                }
13884                "link_settings" => {
13885                    if field_link_settings.is_some() {
13886                        return Err(::serde::de::Error::duplicate_field("link_settings"));
13887                    }
13888                    field_link_settings = Some(map.next_value()?);
13889                }
13890                _ => {
13891                    // unknown field allowed and ignored
13892                    map.next_value::<::serde_json::Value>()?;
13893                }
13894            }
13895        }
13896        if optional && nothing {
13897            return Ok(None);
13898        }
13899        let result = ShareFolderArg {
13900            path: field_path.ok_or_else(|| ::serde::de::Error::missing_field("path"))?,
13901            acl_update_policy: field_acl_update_policy.and_then(Option::flatten),
13902            force_async: field_force_async.unwrap_or(false),
13903            member_policy: field_member_policy.and_then(Option::flatten),
13904            shared_link_policy: field_shared_link_policy.and_then(Option::flatten),
13905            viewer_info_policy: field_viewer_info_policy.and_then(Option::flatten),
13906            access_inheritance: field_access_inheritance.unwrap_or(AccessInheritance::Inherit),
13907            actions: field_actions.and_then(Option::flatten),
13908            link_settings: field_link_settings.and_then(Option::flatten),
13909        };
13910        Ok(Some(result))
13911    }
13912
13913    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
13914        &self,
13915        s: &mut S::SerializeStruct,
13916    ) -> Result<(), S::Error> {
13917        use serde::ser::SerializeStruct;
13918        s.serialize_field("path", &self.path)?;
13919        if let Some(val) = &self.acl_update_policy {
13920            s.serialize_field("acl_update_policy", val)?;
13921        }
13922        if self.force_async {
13923            s.serialize_field("force_async", &self.force_async)?;
13924        }
13925        if let Some(val) = &self.member_policy {
13926            s.serialize_field("member_policy", val)?;
13927        }
13928        if let Some(val) = &self.shared_link_policy {
13929            s.serialize_field("shared_link_policy", val)?;
13930        }
13931        if let Some(val) = &self.viewer_info_policy {
13932            s.serialize_field("viewer_info_policy", val)?;
13933        }
13934        if self.access_inheritance != AccessInheritance::Inherit {
13935            s.serialize_field("access_inheritance", &self.access_inheritance)?;
13936        }
13937        if let Some(val) = &self.actions {
13938            s.serialize_field("actions", val)?;
13939        }
13940        if let Some(val) = &self.link_settings {
13941            s.serialize_field("link_settings", val)?;
13942        }
13943        Ok(())
13944    }
13945}
13946
13947impl<'de> ::serde::de::Deserialize<'de> for ShareFolderArg {
13948    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
13949        // struct deserializer
13950        use serde::de::{MapAccess, Visitor};
13951        struct StructVisitor;
13952        impl<'de> Visitor<'de> for StructVisitor {
13953            type Value = ShareFolderArg;
13954            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
13955                f.write_str("a ShareFolderArg struct")
13956            }
13957            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
13958                ShareFolderArg::internal_deserialize(map)
13959            }
13960        }
13961        deserializer.deserialize_struct("ShareFolderArg", SHARE_FOLDER_ARG_FIELDS, StructVisitor)
13962    }
13963}
13964
13965impl ::serde::ser::Serialize for ShareFolderArg {
13966    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13967        // struct serializer
13968        use serde::ser::SerializeStruct;
13969        let mut s = serializer.serialize_struct("ShareFolderArg", 9)?;
13970        self.internal_serialize::<S>(&mut s)?;
13971        s.end()
13972    }
13973}
13974
13975// struct extends ShareFolderArgBase
13976impl From<ShareFolderArg> for ShareFolderArgBase {
13977    fn from(subtype: ShareFolderArg) -> Self {
13978        Self {
13979            path: subtype.path,
13980            acl_update_policy: subtype.acl_update_policy,
13981            force_async: subtype.force_async,
13982            member_policy: subtype.member_policy,
13983            shared_link_policy: subtype.shared_link_policy,
13984            viewer_info_policy: subtype.viewer_info_policy,
13985            access_inheritance: subtype.access_inheritance,
13986        }
13987    }
13988}
13989#[derive(Debug, Clone, PartialEq, Eq)]
13990#[non_exhaustive] // structs may have more fields added in the future.
13991pub struct ShareFolderArgBase {
13992    /// The path or the file id to the folder to share. If it does not exist, then a new one is
13993    /// created.
13994    pub path: crate::types::files::WritePathOrId,
13995    /// Who can add and remove members of this shared folder.
13996    pub acl_update_policy: Option<AclUpdatePolicy>,
13997    /// Whether to force the share to happen asynchronously.
13998    pub force_async: bool,
13999    /// Who can be a member of this shared folder. Only applicable if the current user is on a team.
14000    pub member_policy: Option<MemberPolicy>,
14001    /// The policy to apply to shared links created for content inside this shared folder.  The
14002    /// current user must be on a team to set this policy to [`SharedLinkPolicy::Members`].
14003    pub shared_link_policy: Option<SharedLinkPolicy>,
14004    /// Who can enable/disable viewer info for this shared folder.
14005    pub viewer_info_policy: Option<ViewerInfoPolicy>,
14006    /// The access inheritance settings for the folder.
14007    pub access_inheritance: AccessInheritance,
14008}
14009
14010impl ShareFolderArgBase {
14011    pub fn new(path: crate::types::files::WritePathOrId) -> Self {
14012        ShareFolderArgBase {
14013            path,
14014            acl_update_policy: None,
14015            force_async: false,
14016            member_policy: None,
14017            shared_link_policy: None,
14018            viewer_info_policy: None,
14019            access_inheritance: AccessInheritance::Inherit,
14020        }
14021    }
14022
14023    pub fn with_acl_update_policy(mut self, value: AclUpdatePolicy) -> Self {
14024        self.acl_update_policy = Some(value);
14025        self
14026    }
14027
14028    pub fn with_force_async(mut self, value: bool) -> Self {
14029        self.force_async = value;
14030        self
14031    }
14032
14033    pub fn with_member_policy(mut self, value: MemberPolicy) -> Self {
14034        self.member_policy = Some(value);
14035        self
14036    }
14037
14038    pub fn with_shared_link_policy(mut self, value: SharedLinkPolicy) -> Self {
14039        self.shared_link_policy = Some(value);
14040        self
14041    }
14042
14043    pub fn with_viewer_info_policy(mut self, value: ViewerInfoPolicy) -> Self {
14044        self.viewer_info_policy = Some(value);
14045        self
14046    }
14047
14048    pub fn with_access_inheritance(mut self, value: AccessInheritance) -> Self {
14049        self.access_inheritance = value;
14050        self
14051    }
14052}
14053
14054const SHARE_FOLDER_ARG_BASE_FIELDS: &[&str] = &["path",
14055                                                "acl_update_policy",
14056                                                "force_async",
14057                                                "member_policy",
14058                                                "shared_link_policy",
14059                                                "viewer_info_policy",
14060                                                "access_inheritance"];
14061impl ShareFolderArgBase {
14062    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
14063        map: V,
14064    ) -> Result<ShareFolderArgBase, V::Error> {
14065        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
14066    }
14067
14068    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
14069        mut map: V,
14070        optional: bool,
14071    ) -> Result<Option<ShareFolderArgBase>, V::Error> {
14072        let mut field_path = None;
14073        let mut field_acl_update_policy = None;
14074        let mut field_force_async = None;
14075        let mut field_member_policy = None;
14076        let mut field_shared_link_policy = None;
14077        let mut field_viewer_info_policy = None;
14078        let mut field_access_inheritance = None;
14079        let mut nothing = true;
14080        while let Some(key) = map.next_key::<&str>()? {
14081            nothing = false;
14082            match key {
14083                "path" => {
14084                    if field_path.is_some() {
14085                        return Err(::serde::de::Error::duplicate_field("path"));
14086                    }
14087                    field_path = Some(map.next_value()?);
14088                }
14089                "acl_update_policy" => {
14090                    if field_acl_update_policy.is_some() {
14091                        return Err(::serde::de::Error::duplicate_field("acl_update_policy"));
14092                    }
14093                    field_acl_update_policy = Some(map.next_value()?);
14094                }
14095                "force_async" => {
14096                    if field_force_async.is_some() {
14097                        return Err(::serde::de::Error::duplicate_field("force_async"));
14098                    }
14099                    field_force_async = Some(map.next_value()?);
14100                }
14101                "member_policy" => {
14102                    if field_member_policy.is_some() {
14103                        return Err(::serde::de::Error::duplicate_field("member_policy"));
14104                    }
14105                    field_member_policy = Some(map.next_value()?);
14106                }
14107                "shared_link_policy" => {
14108                    if field_shared_link_policy.is_some() {
14109                        return Err(::serde::de::Error::duplicate_field("shared_link_policy"));
14110                    }
14111                    field_shared_link_policy = Some(map.next_value()?);
14112                }
14113                "viewer_info_policy" => {
14114                    if field_viewer_info_policy.is_some() {
14115                        return Err(::serde::de::Error::duplicate_field("viewer_info_policy"));
14116                    }
14117                    field_viewer_info_policy = Some(map.next_value()?);
14118                }
14119                "access_inheritance" => {
14120                    if field_access_inheritance.is_some() {
14121                        return Err(::serde::de::Error::duplicate_field("access_inheritance"));
14122                    }
14123                    field_access_inheritance = Some(map.next_value()?);
14124                }
14125                _ => {
14126                    // unknown field allowed and ignored
14127                    map.next_value::<::serde_json::Value>()?;
14128                }
14129            }
14130        }
14131        if optional && nothing {
14132            return Ok(None);
14133        }
14134        let result = ShareFolderArgBase {
14135            path: field_path.ok_or_else(|| ::serde::de::Error::missing_field("path"))?,
14136            acl_update_policy: field_acl_update_policy.and_then(Option::flatten),
14137            force_async: field_force_async.unwrap_or(false),
14138            member_policy: field_member_policy.and_then(Option::flatten),
14139            shared_link_policy: field_shared_link_policy.and_then(Option::flatten),
14140            viewer_info_policy: field_viewer_info_policy.and_then(Option::flatten),
14141            access_inheritance: field_access_inheritance.unwrap_or(AccessInheritance::Inherit),
14142        };
14143        Ok(Some(result))
14144    }
14145
14146    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
14147        &self,
14148        s: &mut S::SerializeStruct,
14149    ) -> Result<(), S::Error> {
14150        use serde::ser::SerializeStruct;
14151        s.serialize_field("path", &self.path)?;
14152        if let Some(val) = &self.acl_update_policy {
14153            s.serialize_field("acl_update_policy", val)?;
14154        }
14155        if self.force_async {
14156            s.serialize_field("force_async", &self.force_async)?;
14157        }
14158        if let Some(val) = &self.member_policy {
14159            s.serialize_field("member_policy", val)?;
14160        }
14161        if let Some(val) = &self.shared_link_policy {
14162            s.serialize_field("shared_link_policy", val)?;
14163        }
14164        if let Some(val) = &self.viewer_info_policy {
14165            s.serialize_field("viewer_info_policy", val)?;
14166        }
14167        if self.access_inheritance != AccessInheritance::Inherit {
14168            s.serialize_field("access_inheritance", &self.access_inheritance)?;
14169        }
14170        Ok(())
14171    }
14172}
14173
14174impl<'de> ::serde::de::Deserialize<'de> for ShareFolderArgBase {
14175    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
14176        // struct deserializer
14177        use serde::de::{MapAccess, Visitor};
14178        struct StructVisitor;
14179        impl<'de> Visitor<'de> for StructVisitor {
14180            type Value = ShareFolderArgBase;
14181            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14182                f.write_str("a ShareFolderArgBase struct")
14183            }
14184            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
14185                ShareFolderArgBase::internal_deserialize(map)
14186            }
14187        }
14188        deserializer.deserialize_struct("ShareFolderArgBase", SHARE_FOLDER_ARG_BASE_FIELDS, StructVisitor)
14189    }
14190}
14191
14192impl ::serde::ser::Serialize for ShareFolderArgBase {
14193    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
14194        // struct serializer
14195        use serde::ser::SerializeStruct;
14196        let mut s = serializer.serialize_struct("ShareFolderArgBase", 7)?;
14197        self.internal_serialize::<S>(&mut s)?;
14198        s.end()
14199    }
14200}
14201
14202#[derive(Debug, Clone, PartialEq, Eq)]
14203#[non_exhaustive] // variants may be added in the future
14204pub enum ShareFolderError {
14205    /// This user's email address is not verified. This functionality is only available on accounts
14206    /// with a verified email address. Users can verify their email address
14207    /// [here](https://www.dropbox.com/help/317).
14208    EmailUnverified,
14209    /// [`ShareFolderArg::path`](ShareFolderArg) is invalid.
14210    BadPath(SharePathError),
14211    /// Team policy is more restrictive than [`ShareFolderArg::member_policy`](ShareFolderArg).
14212    TeamPolicyDisallowsMemberPolicy,
14213    /// The current user's account is not allowed to select the specified
14214    /// [`ShareFolderArg::shared_link_policy`](ShareFolderArg).
14215    DisallowedSharedLinkPolicy,
14216    /// The current user does not have permission to perform this action.
14217    NoPermission,
14218    /// Catch-all used for unrecognized values returned from the server. Encountering this value
14219    /// typically indicates that this SDK version is out of date.
14220    Other,
14221}
14222
14223impl<'de> ::serde::de::Deserialize<'de> for ShareFolderError {
14224    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
14225        // union deserializer
14226        use serde::de::{self, MapAccess, Visitor};
14227        struct EnumVisitor;
14228        impl<'de> Visitor<'de> for EnumVisitor {
14229            type Value = ShareFolderError;
14230            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14231                f.write_str("a ShareFolderError structure")
14232            }
14233            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
14234                let tag: &str = match map.next_key()? {
14235                    Some(".tag") => map.next_value()?,
14236                    _ => return Err(de::Error::missing_field(".tag"))
14237                };
14238                let value = match tag {
14239                    "email_unverified" => ShareFolderError::EmailUnverified,
14240                    "bad_path" => {
14241                        match map.next_key()? {
14242                            Some("bad_path") => ShareFolderError::BadPath(map.next_value()?),
14243                            None => return Err(de::Error::missing_field("bad_path")),
14244                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
14245                        }
14246                    }
14247                    "team_policy_disallows_member_policy" => ShareFolderError::TeamPolicyDisallowsMemberPolicy,
14248                    "disallowed_shared_link_policy" => ShareFolderError::DisallowedSharedLinkPolicy,
14249                    "no_permission" => ShareFolderError::NoPermission,
14250                    _ => ShareFolderError::Other,
14251                };
14252                crate::eat_json_fields(&mut map)?;
14253                Ok(value)
14254            }
14255        }
14256        const VARIANTS: &[&str] = &["email_unverified",
14257                                    "bad_path",
14258                                    "team_policy_disallows_member_policy",
14259                                    "disallowed_shared_link_policy",
14260                                    "other",
14261                                    "no_permission"];
14262        deserializer.deserialize_struct("ShareFolderError", VARIANTS, EnumVisitor)
14263    }
14264}
14265
14266impl ::serde::ser::Serialize for ShareFolderError {
14267    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
14268        // union serializer
14269        use serde::ser::SerializeStruct;
14270        match self {
14271            ShareFolderError::EmailUnverified => {
14272                // unit
14273                let mut s = serializer.serialize_struct("ShareFolderError", 1)?;
14274                s.serialize_field(".tag", "email_unverified")?;
14275                s.end()
14276            }
14277            ShareFolderError::BadPath(x) => {
14278                // union or polymporphic struct
14279                let mut s = serializer.serialize_struct("ShareFolderError", 2)?;
14280                s.serialize_field(".tag", "bad_path")?;
14281                s.serialize_field("bad_path", x)?;
14282                s.end()
14283            }
14284            ShareFolderError::TeamPolicyDisallowsMemberPolicy => {
14285                // unit
14286                let mut s = serializer.serialize_struct("ShareFolderError", 1)?;
14287                s.serialize_field(".tag", "team_policy_disallows_member_policy")?;
14288                s.end()
14289            }
14290            ShareFolderError::DisallowedSharedLinkPolicy => {
14291                // unit
14292                let mut s = serializer.serialize_struct("ShareFolderError", 1)?;
14293                s.serialize_field(".tag", "disallowed_shared_link_policy")?;
14294                s.end()
14295            }
14296            ShareFolderError::NoPermission => {
14297                // unit
14298                let mut s = serializer.serialize_struct("ShareFolderError", 1)?;
14299                s.serialize_field(".tag", "no_permission")?;
14300                s.end()
14301            }
14302            ShareFolderError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
14303        }
14304    }
14305}
14306
14307impl ::std::error::Error for ShareFolderError {
14308    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
14309        match self {
14310            ShareFolderError::BadPath(inner) => Some(inner),
14311            _ => None,
14312        }
14313    }
14314}
14315
14316impl ::std::fmt::Display for ShareFolderError {
14317    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14318        match self {
14319            ShareFolderError::BadPath(inner) => write!(f, "ShareFolderError: {}", inner),
14320            ShareFolderError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
14321            _ => write!(f, "{:?}", *self),
14322        }
14323    }
14324}
14325
14326// union extends ShareFolderErrorBase
14327impl From<ShareFolderErrorBase> for ShareFolderError {
14328    fn from(parent: ShareFolderErrorBase) -> Self {
14329        match parent {
14330            ShareFolderErrorBase::EmailUnverified => ShareFolderError::EmailUnverified,
14331            ShareFolderErrorBase::BadPath(x) => ShareFolderError::BadPath(x),
14332            ShareFolderErrorBase::TeamPolicyDisallowsMemberPolicy => ShareFolderError::TeamPolicyDisallowsMemberPolicy,
14333            ShareFolderErrorBase::DisallowedSharedLinkPolicy => ShareFolderError::DisallowedSharedLinkPolicy,
14334            ShareFolderErrorBase::Other => ShareFolderError::Other,
14335        }
14336    }
14337}
14338#[derive(Debug, Clone, PartialEq, Eq)]
14339#[non_exhaustive] // variants may be added in the future
14340pub enum ShareFolderErrorBase {
14341    /// This user's email address is not verified. This functionality is only available on accounts
14342    /// with a verified email address. Users can verify their email address
14343    /// [here](https://www.dropbox.com/help/317).
14344    EmailUnverified,
14345    /// [`ShareFolderArg::path`](ShareFolderArg) is invalid.
14346    BadPath(SharePathError),
14347    /// Team policy is more restrictive than [`ShareFolderArg::member_policy`](ShareFolderArg).
14348    TeamPolicyDisallowsMemberPolicy,
14349    /// The current user's account is not allowed to select the specified
14350    /// [`ShareFolderArg::shared_link_policy`](ShareFolderArg).
14351    DisallowedSharedLinkPolicy,
14352    /// Catch-all used for unrecognized values returned from the server. Encountering this value
14353    /// typically indicates that this SDK version is out of date.
14354    Other,
14355}
14356
14357impl<'de> ::serde::de::Deserialize<'de> for ShareFolderErrorBase {
14358    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
14359        // union deserializer
14360        use serde::de::{self, MapAccess, Visitor};
14361        struct EnumVisitor;
14362        impl<'de> Visitor<'de> for EnumVisitor {
14363            type Value = ShareFolderErrorBase;
14364            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14365                f.write_str("a ShareFolderErrorBase structure")
14366            }
14367            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
14368                let tag: &str = match map.next_key()? {
14369                    Some(".tag") => map.next_value()?,
14370                    _ => return Err(de::Error::missing_field(".tag"))
14371                };
14372                let value = match tag {
14373                    "email_unverified" => ShareFolderErrorBase::EmailUnverified,
14374                    "bad_path" => {
14375                        match map.next_key()? {
14376                            Some("bad_path") => ShareFolderErrorBase::BadPath(map.next_value()?),
14377                            None => return Err(de::Error::missing_field("bad_path")),
14378                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
14379                        }
14380                    }
14381                    "team_policy_disallows_member_policy" => ShareFolderErrorBase::TeamPolicyDisallowsMemberPolicy,
14382                    "disallowed_shared_link_policy" => ShareFolderErrorBase::DisallowedSharedLinkPolicy,
14383                    _ => ShareFolderErrorBase::Other,
14384                };
14385                crate::eat_json_fields(&mut map)?;
14386                Ok(value)
14387            }
14388        }
14389        const VARIANTS: &[&str] = &["email_unverified",
14390                                    "bad_path",
14391                                    "team_policy_disallows_member_policy",
14392                                    "disallowed_shared_link_policy",
14393                                    "other"];
14394        deserializer.deserialize_struct("ShareFolderErrorBase", VARIANTS, EnumVisitor)
14395    }
14396}
14397
14398impl ::serde::ser::Serialize for ShareFolderErrorBase {
14399    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
14400        // union serializer
14401        use serde::ser::SerializeStruct;
14402        match self {
14403            ShareFolderErrorBase::EmailUnverified => {
14404                // unit
14405                let mut s = serializer.serialize_struct("ShareFolderErrorBase", 1)?;
14406                s.serialize_field(".tag", "email_unverified")?;
14407                s.end()
14408            }
14409            ShareFolderErrorBase::BadPath(x) => {
14410                // union or polymporphic struct
14411                let mut s = serializer.serialize_struct("ShareFolderErrorBase", 2)?;
14412                s.serialize_field(".tag", "bad_path")?;
14413                s.serialize_field("bad_path", x)?;
14414                s.end()
14415            }
14416            ShareFolderErrorBase::TeamPolicyDisallowsMemberPolicy => {
14417                // unit
14418                let mut s = serializer.serialize_struct("ShareFolderErrorBase", 1)?;
14419                s.serialize_field(".tag", "team_policy_disallows_member_policy")?;
14420                s.end()
14421            }
14422            ShareFolderErrorBase::DisallowedSharedLinkPolicy => {
14423                // unit
14424                let mut s = serializer.serialize_struct("ShareFolderErrorBase", 1)?;
14425                s.serialize_field(".tag", "disallowed_shared_link_policy")?;
14426                s.end()
14427            }
14428            ShareFolderErrorBase::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
14429        }
14430    }
14431}
14432
14433#[derive(Debug, Clone, PartialEq, Eq)]
14434pub enum ShareFolderJobStatus {
14435    /// The asynchronous job is still in progress.
14436    InProgress,
14437    /// The share job has finished. The value is the metadata for the folder.
14438    Complete(SharedFolderMetadata),
14439    Failed(ShareFolderError),
14440}
14441
14442impl<'de> ::serde::de::Deserialize<'de> for ShareFolderJobStatus {
14443    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
14444        // union deserializer
14445        use serde::de::{self, MapAccess, Visitor};
14446        struct EnumVisitor;
14447        impl<'de> Visitor<'de> for EnumVisitor {
14448            type Value = ShareFolderJobStatus;
14449            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14450                f.write_str("a ShareFolderJobStatus structure")
14451            }
14452            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
14453                let tag: &str = match map.next_key()? {
14454                    Some(".tag") => map.next_value()?,
14455                    _ => return Err(de::Error::missing_field(".tag"))
14456                };
14457                let value = match tag {
14458                    "in_progress" => ShareFolderJobStatus::InProgress,
14459                    "complete" => ShareFolderJobStatus::Complete(SharedFolderMetadata::internal_deserialize(&mut map)?),
14460                    "failed" => {
14461                        match map.next_key()? {
14462                            Some("failed") => ShareFolderJobStatus::Failed(map.next_value()?),
14463                            None => return Err(de::Error::missing_field("failed")),
14464                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
14465                        }
14466                    }
14467                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
14468                };
14469                crate::eat_json_fields(&mut map)?;
14470                Ok(value)
14471            }
14472        }
14473        const VARIANTS: &[&str] = &["in_progress",
14474                                    "complete",
14475                                    "failed"];
14476        deserializer.deserialize_struct("ShareFolderJobStatus", VARIANTS, EnumVisitor)
14477    }
14478}
14479
14480impl ::serde::ser::Serialize for ShareFolderJobStatus {
14481    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
14482        // union serializer
14483        use serde::ser::SerializeStruct;
14484        match self {
14485            ShareFolderJobStatus::InProgress => {
14486                // unit
14487                let mut s = serializer.serialize_struct("ShareFolderJobStatus", 1)?;
14488                s.serialize_field(".tag", "in_progress")?;
14489                s.end()
14490            }
14491            ShareFolderJobStatus::Complete(x) => {
14492                // struct
14493                let mut s = serializer.serialize_struct("ShareFolderJobStatus", 18)?;
14494                s.serialize_field(".tag", "complete")?;
14495                x.internal_serialize::<S>(&mut s)?;
14496                s.end()
14497            }
14498            ShareFolderJobStatus::Failed(x) => {
14499                // union or polymporphic struct
14500                let mut s = serializer.serialize_struct("ShareFolderJobStatus", 2)?;
14501                s.serialize_field(".tag", "failed")?;
14502                s.serialize_field("failed", x)?;
14503                s.end()
14504            }
14505        }
14506    }
14507}
14508
14509// union extends crate::types::dbx_async::PollResultBase
14510impl From<crate::types::dbx_async::PollResultBase> for ShareFolderJobStatus {
14511    fn from(parent: crate::types::dbx_async::PollResultBase) -> Self {
14512        match parent {
14513            crate::types::dbx_async::PollResultBase::InProgress => ShareFolderJobStatus::InProgress,
14514        }
14515    }
14516}
14517#[derive(Debug, Clone, PartialEq, Eq)]
14518pub enum ShareFolderLaunch {
14519    /// This response indicates that the processing is asynchronous. The string is an id that can be
14520    /// used to obtain the status of the asynchronous job.
14521    AsyncJobId(crate::types::dbx_async::AsyncJobId),
14522    Complete(SharedFolderMetadata),
14523}
14524
14525impl<'de> ::serde::de::Deserialize<'de> for ShareFolderLaunch {
14526    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
14527        // union deserializer
14528        use serde::de::{self, MapAccess, Visitor};
14529        struct EnumVisitor;
14530        impl<'de> Visitor<'de> for EnumVisitor {
14531            type Value = ShareFolderLaunch;
14532            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14533                f.write_str("a ShareFolderLaunch structure")
14534            }
14535            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
14536                let tag: &str = match map.next_key()? {
14537                    Some(".tag") => map.next_value()?,
14538                    _ => return Err(de::Error::missing_field(".tag"))
14539                };
14540                let value = match tag {
14541                    "async_job_id" => {
14542                        match map.next_key()? {
14543                            Some("async_job_id") => ShareFolderLaunch::AsyncJobId(map.next_value()?),
14544                            None => return Err(de::Error::missing_field("async_job_id")),
14545                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
14546                        }
14547                    }
14548                    "complete" => ShareFolderLaunch::Complete(SharedFolderMetadata::internal_deserialize(&mut map)?),
14549                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
14550                };
14551                crate::eat_json_fields(&mut map)?;
14552                Ok(value)
14553            }
14554        }
14555        const VARIANTS: &[&str] = &["async_job_id",
14556                                    "complete"];
14557        deserializer.deserialize_struct("ShareFolderLaunch", VARIANTS, EnumVisitor)
14558    }
14559}
14560
14561impl ::serde::ser::Serialize for ShareFolderLaunch {
14562    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
14563        // union serializer
14564        use serde::ser::SerializeStruct;
14565        match self {
14566            ShareFolderLaunch::AsyncJobId(x) => {
14567                // primitive
14568                let mut s = serializer.serialize_struct("ShareFolderLaunch", 2)?;
14569                s.serialize_field(".tag", "async_job_id")?;
14570                s.serialize_field("async_job_id", x)?;
14571                s.end()
14572            }
14573            ShareFolderLaunch::Complete(x) => {
14574                // struct
14575                let mut s = serializer.serialize_struct("ShareFolderLaunch", 18)?;
14576                s.serialize_field(".tag", "complete")?;
14577                x.internal_serialize::<S>(&mut s)?;
14578                s.end()
14579            }
14580        }
14581    }
14582}
14583
14584// union extends crate::types::dbx_async::LaunchResultBase
14585impl From<crate::types::dbx_async::LaunchResultBase> for ShareFolderLaunch {
14586    fn from(parent: crate::types::dbx_async::LaunchResultBase) -> Self {
14587        match parent {
14588            crate::types::dbx_async::LaunchResultBase::AsyncJobId(x) => ShareFolderLaunch::AsyncJobId(x),
14589        }
14590    }
14591}
14592#[derive(Debug, Clone, PartialEq, Eq)]
14593#[non_exhaustive] // variants may be added in the future
14594pub enum SharePathError {
14595    /// A file is at the specified path.
14596    IsFile,
14597    /// We do not support sharing a folder inside a shared folder.
14598    InsideSharedFolder,
14599    /// We do not support shared folders that contain shared folders.
14600    ContainsSharedFolder,
14601    /// We do not support shared folders that contain app folders.
14602    ContainsAppFolder,
14603    /// We do not support shared folders that contain team folders.
14604    ContainsTeamFolder,
14605    /// We do not support sharing an app folder.
14606    IsAppFolder,
14607    /// We do not support sharing a folder inside an app folder.
14608    InsideAppFolder,
14609    /// A public folder can't be shared this way. Use a public link instead.
14610    IsPublicFolder,
14611    /// A folder inside a public folder can't be shared this way. Use a public link instead.
14612    InsidePublicFolder,
14613    /// Folder is already shared. Contains metadata about the existing shared folder.
14614    AlreadyShared(SharedFolderMetadata),
14615    /// Path is not valid.
14616    InvalidPath,
14617    /// We do not support sharing a Mac OS X package.
14618    IsOsxPackage,
14619    /// We do not support sharing a folder inside a Mac OS X package.
14620    InsideOsxPackage,
14621    /// We do not support sharing the Vault folder.
14622    IsVault,
14623    /// We do not support sharing a folder inside a locked Vault.
14624    IsVaultLocked,
14625    /// We do not support sharing the Family folder.
14626    IsFamily,
14627    /// Catch-all used for unrecognized values returned from the server. Encountering this value
14628    /// typically indicates that this SDK version is out of date.
14629    Other,
14630}
14631
14632impl<'de> ::serde::de::Deserialize<'de> for SharePathError {
14633    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
14634        // union deserializer
14635        use serde::de::{self, MapAccess, Visitor};
14636        struct EnumVisitor;
14637        impl<'de> Visitor<'de> for EnumVisitor {
14638            type Value = SharePathError;
14639            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14640                f.write_str("a SharePathError structure")
14641            }
14642            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
14643                let tag: &str = match map.next_key()? {
14644                    Some(".tag") => map.next_value()?,
14645                    _ => return Err(de::Error::missing_field(".tag"))
14646                };
14647                let value = match tag {
14648                    "is_file" => SharePathError::IsFile,
14649                    "inside_shared_folder" => SharePathError::InsideSharedFolder,
14650                    "contains_shared_folder" => SharePathError::ContainsSharedFolder,
14651                    "contains_app_folder" => SharePathError::ContainsAppFolder,
14652                    "contains_team_folder" => SharePathError::ContainsTeamFolder,
14653                    "is_app_folder" => SharePathError::IsAppFolder,
14654                    "inside_app_folder" => SharePathError::InsideAppFolder,
14655                    "is_public_folder" => SharePathError::IsPublicFolder,
14656                    "inside_public_folder" => SharePathError::InsidePublicFolder,
14657                    "already_shared" => SharePathError::AlreadyShared(SharedFolderMetadata::internal_deserialize(&mut map)?),
14658                    "invalid_path" => SharePathError::InvalidPath,
14659                    "is_osx_package" => SharePathError::IsOsxPackage,
14660                    "inside_osx_package" => SharePathError::InsideOsxPackage,
14661                    "is_vault" => SharePathError::IsVault,
14662                    "is_vault_locked" => SharePathError::IsVaultLocked,
14663                    "is_family" => SharePathError::IsFamily,
14664                    _ => SharePathError::Other,
14665                };
14666                crate::eat_json_fields(&mut map)?;
14667                Ok(value)
14668            }
14669        }
14670        const VARIANTS: &[&str] = &["is_file",
14671                                    "inside_shared_folder",
14672                                    "contains_shared_folder",
14673                                    "contains_app_folder",
14674                                    "contains_team_folder",
14675                                    "is_app_folder",
14676                                    "inside_app_folder",
14677                                    "is_public_folder",
14678                                    "inside_public_folder",
14679                                    "already_shared",
14680                                    "invalid_path",
14681                                    "is_osx_package",
14682                                    "inside_osx_package",
14683                                    "is_vault",
14684                                    "is_vault_locked",
14685                                    "is_family",
14686                                    "other"];
14687        deserializer.deserialize_struct("SharePathError", VARIANTS, EnumVisitor)
14688    }
14689}
14690
14691impl ::serde::ser::Serialize for SharePathError {
14692    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
14693        // union serializer
14694        use serde::ser::SerializeStruct;
14695        match self {
14696            SharePathError::IsFile => {
14697                // unit
14698                let mut s = serializer.serialize_struct("SharePathError", 1)?;
14699                s.serialize_field(".tag", "is_file")?;
14700                s.end()
14701            }
14702            SharePathError::InsideSharedFolder => {
14703                // unit
14704                let mut s = serializer.serialize_struct("SharePathError", 1)?;
14705                s.serialize_field(".tag", "inside_shared_folder")?;
14706                s.end()
14707            }
14708            SharePathError::ContainsSharedFolder => {
14709                // unit
14710                let mut s = serializer.serialize_struct("SharePathError", 1)?;
14711                s.serialize_field(".tag", "contains_shared_folder")?;
14712                s.end()
14713            }
14714            SharePathError::ContainsAppFolder => {
14715                // unit
14716                let mut s = serializer.serialize_struct("SharePathError", 1)?;
14717                s.serialize_field(".tag", "contains_app_folder")?;
14718                s.end()
14719            }
14720            SharePathError::ContainsTeamFolder => {
14721                // unit
14722                let mut s = serializer.serialize_struct("SharePathError", 1)?;
14723                s.serialize_field(".tag", "contains_team_folder")?;
14724                s.end()
14725            }
14726            SharePathError::IsAppFolder => {
14727                // unit
14728                let mut s = serializer.serialize_struct("SharePathError", 1)?;
14729                s.serialize_field(".tag", "is_app_folder")?;
14730                s.end()
14731            }
14732            SharePathError::InsideAppFolder => {
14733                // unit
14734                let mut s = serializer.serialize_struct("SharePathError", 1)?;
14735                s.serialize_field(".tag", "inside_app_folder")?;
14736                s.end()
14737            }
14738            SharePathError::IsPublicFolder => {
14739                // unit
14740                let mut s = serializer.serialize_struct("SharePathError", 1)?;
14741                s.serialize_field(".tag", "is_public_folder")?;
14742                s.end()
14743            }
14744            SharePathError::InsidePublicFolder => {
14745                // unit
14746                let mut s = serializer.serialize_struct("SharePathError", 1)?;
14747                s.serialize_field(".tag", "inside_public_folder")?;
14748                s.end()
14749            }
14750            SharePathError::AlreadyShared(x) => {
14751                // struct
14752                let mut s = serializer.serialize_struct("SharePathError", 18)?;
14753                s.serialize_field(".tag", "already_shared")?;
14754                x.internal_serialize::<S>(&mut s)?;
14755                s.end()
14756            }
14757            SharePathError::InvalidPath => {
14758                // unit
14759                let mut s = serializer.serialize_struct("SharePathError", 1)?;
14760                s.serialize_field(".tag", "invalid_path")?;
14761                s.end()
14762            }
14763            SharePathError::IsOsxPackage => {
14764                // unit
14765                let mut s = serializer.serialize_struct("SharePathError", 1)?;
14766                s.serialize_field(".tag", "is_osx_package")?;
14767                s.end()
14768            }
14769            SharePathError::InsideOsxPackage => {
14770                // unit
14771                let mut s = serializer.serialize_struct("SharePathError", 1)?;
14772                s.serialize_field(".tag", "inside_osx_package")?;
14773                s.end()
14774            }
14775            SharePathError::IsVault => {
14776                // unit
14777                let mut s = serializer.serialize_struct("SharePathError", 1)?;
14778                s.serialize_field(".tag", "is_vault")?;
14779                s.end()
14780            }
14781            SharePathError::IsVaultLocked => {
14782                // unit
14783                let mut s = serializer.serialize_struct("SharePathError", 1)?;
14784                s.serialize_field(".tag", "is_vault_locked")?;
14785                s.end()
14786            }
14787            SharePathError::IsFamily => {
14788                // unit
14789                let mut s = serializer.serialize_struct("SharePathError", 1)?;
14790                s.serialize_field(".tag", "is_family")?;
14791                s.end()
14792            }
14793            SharePathError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
14794        }
14795    }
14796}
14797
14798impl ::std::error::Error for SharePathError {
14799}
14800
14801impl ::std::fmt::Display for SharePathError {
14802    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
14803        match self {
14804            SharePathError::IsFile => f.write_str("A file is at the specified path."),
14805            SharePathError::InsideSharedFolder => f.write_str("We do not support sharing a folder inside a shared folder."),
14806            SharePathError::ContainsSharedFolder => f.write_str("We do not support shared folders that contain shared folders."),
14807            SharePathError::ContainsAppFolder => f.write_str("We do not support shared folders that contain app folders."),
14808            SharePathError::ContainsTeamFolder => f.write_str("We do not support shared folders that contain team folders."),
14809            SharePathError::IsAppFolder => f.write_str("We do not support sharing an app folder."),
14810            SharePathError::InsideAppFolder => f.write_str("We do not support sharing a folder inside an app folder."),
14811            SharePathError::IsPublicFolder => f.write_str("A public folder can't be shared this way. Use a public link instead."),
14812            SharePathError::InsidePublicFolder => f.write_str("A folder inside a public folder can't be shared this way. Use a public link instead."),
14813            SharePathError::AlreadyShared(inner) => write!(f, "Folder is already shared. Contains metadata about the existing shared folder: {:?}", inner),
14814            SharePathError::InvalidPath => f.write_str("Path is not valid."),
14815            SharePathError::IsOsxPackage => f.write_str("We do not support sharing a Mac OS X package."),
14816            SharePathError::InsideOsxPackage => f.write_str("We do not support sharing a folder inside a Mac OS X package."),
14817            SharePathError::IsVault => f.write_str("We do not support sharing the Vault folder."),
14818            SharePathError::IsVaultLocked => f.write_str("We do not support sharing a folder inside a locked Vault."),
14819            SharePathError::IsFamily => f.write_str("We do not support sharing the Family folder."),
14820            _ => write!(f, "{:?}", *self),
14821        }
14822    }
14823}
14824
14825/// Metadata of a shared link for a file or folder.
14826#[derive(Debug, Clone, PartialEq, Eq)]
14827#[non_exhaustive] // structs may have more fields added in the future.
14828pub struct SharedContentLinkMetadata {
14829    /// The audience options that are available for the content. Some audience options may be
14830    /// unavailable. For example, team_only may be unavailable if the content is not owned by a user
14831    /// on a team. The 'default' audience option is always available if the user can modify link
14832    /// settings.
14833    pub audience_options: Vec<LinkAudience>,
14834    /// The current audience of the link.
14835    pub current_audience: LinkAudience,
14836    /// A list of permissions for actions you can perform on the link.
14837    pub link_permissions: Vec<LinkPermission>,
14838    /// Whether the link is protected by a password.
14839    pub password_protected: bool,
14840    /// The URL of the link.
14841    pub url: String,
14842    /// The access level on the link for this file.
14843    pub access_level: Option<AccessLevel>,
14844    /// The shared folder that prevents the link audience for this link from being more restrictive.
14845    pub audience_restricting_shared_folder: Option<AudienceRestrictingSharedFolder>,
14846    /// Whether the link has an expiry set on it. A link with an expiry will have its  audience
14847    /// changed to members when the expiry is reached.
14848    pub expiry: Option<crate::types::common::DropboxTimestamp>,
14849    /// The content inside this folder with link audience different than this folder's. This is only
14850    /// returned when an endpoint that returns metadata for a single shared folder is called, e.g.
14851    /// /get_folder_metadata.
14852    pub audience_exceptions: Option<AudienceExceptions>,
14853}
14854
14855impl SharedContentLinkMetadata {
14856    pub fn new(
14857        audience_options: Vec<LinkAudience>,
14858        current_audience: LinkAudience,
14859        link_permissions: Vec<LinkPermission>,
14860        password_protected: bool,
14861        url: String,
14862    ) -> Self {
14863        SharedContentLinkMetadata {
14864            audience_options,
14865            current_audience,
14866            link_permissions,
14867            password_protected,
14868            url,
14869            access_level: None,
14870            audience_restricting_shared_folder: None,
14871            expiry: None,
14872            audience_exceptions: None,
14873        }
14874    }
14875
14876    pub fn with_access_level(mut self, value: AccessLevel) -> Self {
14877        self.access_level = Some(value);
14878        self
14879    }
14880
14881    pub fn with_audience_restricting_shared_folder(
14882        mut self,
14883        value: AudienceRestrictingSharedFolder,
14884    ) -> Self {
14885        self.audience_restricting_shared_folder = Some(value);
14886        self
14887    }
14888
14889    pub fn with_expiry(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
14890        self.expiry = Some(value);
14891        self
14892    }
14893
14894    pub fn with_audience_exceptions(mut self, value: AudienceExceptions) -> Self {
14895        self.audience_exceptions = Some(value);
14896        self
14897    }
14898}
14899
14900const SHARED_CONTENT_LINK_METADATA_FIELDS: &[&str] = &["audience_options",
14901                                                       "current_audience",
14902                                                       "link_permissions",
14903                                                       "password_protected",
14904                                                       "url",
14905                                                       "access_level",
14906                                                       "audience_restricting_shared_folder",
14907                                                       "expiry",
14908                                                       "audience_exceptions"];
14909impl SharedContentLinkMetadata {
14910    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
14911        map: V,
14912    ) -> Result<SharedContentLinkMetadata, V::Error> {
14913        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
14914    }
14915
14916    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
14917        mut map: V,
14918        optional: bool,
14919    ) -> Result<Option<SharedContentLinkMetadata>, V::Error> {
14920        let mut field_audience_options = None;
14921        let mut field_current_audience = None;
14922        let mut field_link_permissions = None;
14923        let mut field_password_protected = None;
14924        let mut field_url = None;
14925        let mut field_access_level = None;
14926        let mut field_audience_restricting_shared_folder = None;
14927        let mut field_expiry = None;
14928        let mut field_audience_exceptions = None;
14929        let mut nothing = true;
14930        while let Some(key) = map.next_key::<&str>()? {
14931            nothing = false;
14932            match key {
14933                "audience_options" => {
14934                    if field_audience_options.is_some() {
14935                        return Err(::serde::de::Error::duplicate_field("audience_options"));
14936                    }
14937                    field_audience_options = Some(map.next_value()?);
14938                }
14939                "current_audience" => {
14940                    if field_current_audience.is_some() {
14941                        return Err(::serde::de::Error::duplicate_field("current_audience"));
14942                    }
14943                    field_current_audience = Some(map.next_value()?);
14944                }
14945                "link_permissions" => {
14946                    if field_link_permissions.is_some() {
14947                        return Err(::serde::de::Error::duplicate_field("link_permissions"));
14948                    }
14949                    field_link_permissions = Some(map.next_value()?);
14950                }
14951                "password_protected" => {
14952                    if field_password_protected.is_some() {
14953                        return Err(::serde::de::Error::duplicate_field("password_protected"));
14954                    }
14955                    field_password_protected = Some(map.next_value()?);
14956                }
14957                "url" => {
14958                    if field_url.is_some() {
14959                        return Err(::serde::de::Error::duplicate_field("url"));
14960                    }
14961                    field_url = Some(map.next_value()?);
14962                }
14963                "access_level" => {
14964                    if field_access_level.is_some() {
14965                        return Err(::serde::de::Error::duplicate_field("access_level"));
14966                    }
14967                    field_access_level = Some(map.next_value()?);
14968                }
14969                "audience_restricting_shared_folder" => {
14970                    if field_audience_restricting_shared_folder.is_some() {
14971                        return Err(::serde::de::Error::duplicate_field("audience_restricting_shared_folder"));
14972                    }
14973                    field_audience_restricting_shared_folder = Some(map.next_value()?);
14974                }
14975                "expiry" => {
14976                    if field_expiry.is_some() {
14977                        return Err(::serde::de::Error::duplicate_field("expiry"));
14978                    }
14979                    field_expiry = Some(map.next_value()?);
14980                }
14981                "audience_exceptions" => {
14982                    if field_audience_exceptions.is_some() {
14983                        return Err(::serde::de::Error::duplicate_field("audience_exceptions"));
14984                    }
14985                    field_audience_exceptions = Some(map.next_value()?);
14986                }
14987                _ => {
14988                    // unknown field allowed and ignored
14989                    map.next_value::<::serde_json::Value>()?;
14990                }
14991            }
14992        }
14993        if optional && nothing {
14994            return Ok(None);
14995        }
14996        let result = SharedContentLinkMetadata {
14997            audience_options: field_audience_options.ok_or_else(|| ::serde::de::Error::missing_field("audience_options"))?,
14998            current_audience: field_current_audience.ok_or_else(|| ::serde::de::Error::missing_field("current_audience"))?,
14999            link_permissions: field_link_permissions.ok_or_else(|| ::serde::de::Error::missing_field("link_permissions"))?,
15000            password_protected: field_password_protected.ok_or_else(|| ::serde::de::Error::missing_field("password_protected"))?,
15001            url: field_url.ok_or_else(|| ::serde::de::Error::missing_field("url"))?,
15002            access_level: field_access_level.and_then(Option::flatten),
15003            audience_restricting_shared_folder: field_audience_restricting_shared_folder.and_then(Option::flatten),
15004            expiry: field_expiry.and_then(Option::flatten),
15005            audience_exceptions: field_audience_exceptions.and_then(Option::flatten),
15006        };
15007        Ok(Some(result))
15008    }
15009
15010    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
15011        &self,
15012        s: &mut S::SerializeStruct,
15013    ) -> Result<(), S::Error> {
15014        use serde::ser::SerializeStruct;
15015        s.serialize_field("audience_options", &self.audience_options)?;
15016        s.serialize_field("current_audience", &self.current_audience)?;
15017        s.serialize_field("link_permissions", &self.link_permissions)?;
15018        s.serialize_field("password_protected", &self.password_protected)?;
15019        s.serialize_field("url", &self.url)?;
15020        if let Some(val) = &self.access_level {
15021            s.serialize_field("access_level", val)?;
15022        }
15023        if let Some(val) = &self.audience_restricting_shared_folder {
15024            s.serialize_field("audience_restricting_shared_folder", val)?;
15025        }
15026        if let Some(val) = &self.expiry {
15027            s.serialize_field("expiry", val)?;
15028        }
15029        if let Some(val) = &self.audience_exceptions {
15030            s.serialize_field("audience_exceptions", val)?;
15031        }
15032        Ok(())
15033    }
15034}
15035
15036impl<'de> ::serde::de::Deserialize<'de> for SharedContentLinkMetadata {
15037    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
15038        // struct deserializer
15039        use serde::de::{MapAccess, Visitor};
15040        struct StructVisitor;
15041        impl<'de> Visitor<'de> for StructVisitor {
15042            type Value = SharedContentLinkMetadata;
15043            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
15044                f.write_str("a SharedContentLinkMetadata struct")
15045            }
15046            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
15047                SharedContentLinkMetadata::internal_deserialize(map)
15048            }
15049        }
15050        deserializer.deserialize_struct("SharedContentLinkMetadata", SHARED_CONTENT_LINK_METADATA_FIELDS, StructVisitor)
15051    }
15052}
15053
15054impl ::serde::ser::Serialize for SharedContentLinkMetadata {
15055    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
15056        // struct serializer
15057        use serde::ser::SerializeStruct;
15058        let mut s = serializer.serialize_struct("SharedContentLinkMetadata", 9)?;
15059        self.internal_serialize::<S>(&mut s)?;
15060        s.end()
15061    }
15062}
15063
15064// struct extends SharedContentLinkMetadataBase
15065impl From<SharedContentLinkMetadata> for SharedContentLinkMetadataBase {
15066    fn from(subtype: SharedContentLinkMetadata) -> Self {
15067        Self {
15068            audience_options: subtype.audience_options,
15069            current_audience: subtype.current_audience,
15070            link_permissions: subtype.link_permissions,
15071            password_protected: subtype.password_protected,
15072            access_level: subtype.access_level,
15073            audience_restricting_shared_folder: subtype.audience_restricting_shared_folder,
15074            expiry: subtype.expiry,
15075        }
15076    }
15077}
15078#[derive(Debug, Clone, PartialEq, Eq)]
15079#[non_exhaustive] // structs may have more fields added in the future.
15080pub struct SharedContentLinkMetadataBase {
15081    /// The audience options that are available for the content. Some audience options may be
15082    /// unavailable. For example, team_only may be unavailable if the content is not owned by a user
15083    /// on a team. The 'default' audience option is always available if the user can modify link
15084    /// settings.
15085    pub audience_options: Vec<LinkAudience>,
15086    /// The current audience of the link.
15087    pub current_audience: LinkAudience,
15088    /// A list of permissions for actions you can perform on the link.
15089    pub link_permissions: Vec<LinkPermission>,
15090    /// Whether the link is protected by a password.
15091    pub password_protected: bool,
15092    /// The access level on the link for this file.
15093    pub access_level: Option<AccessLevel>,
15094    /// The shared folder that prevents the link audience for this link from being more restrictive.
15095    pub audience_restricting_shared_folder: Option<AudienceRestrictingSharedFolder>,
15096    /// Whether the link has an expiry set on it. A link with an expiry will have its  audience
15097    /// changed to members when the expiry is reached.
15098    pub expiry: Option<crate::types::common::DropboxTimestamp>,
15099}
15100
15101impl SharedContentLinkMetadataBase {
15102    pub fn new(
15103        audience_options: Vec<LinkAudience>,
15104        current_audience: LinkAudience,
15105        link_permissions: Vec<LinkPermission>,
15106        password_protected: bool,
15107    ) -> Self {
15108        SharedContentLinkMetadataBase {
15109            audience_options,
15110            current_audience,
15111            link_permissions,
15112            password_protected,
15113            access_level: None,
15114            audience_restricting_shared_folder: None,
15115            expiry: None,
15116        }
15117    }
15118
15119    pub fn with_access_level(mut self, value: AccessLevel) -> Self {
15120        self.access_level = Some(value);
15121        self
15122    }
15123
15124    pub fn with_audience_restricting_shared_folder(
15125        mut self,
15126        value: AudienceRestrictingSharedFolder,
15127    ) -> Self {
15128        self.audience_restricting_shared_folder = Some(value);
15129        self
15130    }
15131
15132    pub fn with_expiry(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
15133        self.expiry = Some(value);
15134        self
15135    }
15136}
15137
15138const SHARED_CONTENT_LINK_METADATA_BASE_FIELDS: &[&str] = &["audience_options",
15139                                                            "current_audience",
15140                                                            "link_permissions",
15141                                                            "password_protected",
15142                                                            "access_level",
15143                                                            "audience_restricting_shared_folder",
15144                                                            "expiry"];
15145impl SharedContentLinkMetadataBase {
15146    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
15147        map: V,
15148    ) -> Result<SharedContentLinkMetadataBase, V::Error> {
15149        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
15150    }
15151
15152    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
15153        mut map: V,
15154        optional: bool,
15155    ) -> Result<Option<SharedContentLinkMetadataBase>, V::Error> {
15156        let mut field_audience_options = None;
15157        let mut field_current_audience = None;
15158        let mut field_link_permissions = None;
15159        let mut field_password_protected = None;
15160        let mut field_access_level = None;
15161        let mut field_audience_restricting_shared_folder = None;
15162        let mut field_expiry = None;
15163        let mut nothing = true;
15164        while let Some(key) = map.next_key::<&str>()? {
15165            nothing = false;
15166            match key {
15167                "audience_options" => {
15168                    if field_audience_options.is_some() {
15169                        return Err(::serde::de::Error::duplicate_field("audience_options"));
15170                    }
15171                    field_audience_options = Some(map.next_value()?);
15172                }
15173                "current_audience" => {
15174                    if field_current_audience.is_some() {
15175                        return Err(::serde::de::Error::duplicate_field("current_audience"));
15176                    }
15177                    field_current_audience = Some(map.next_value()?);
15178                }
15179                "link_permissions" => {
15180                    if field_link_permissions.is_some() {
15181                        return Err(::serde::de::Error::duplicate_field("link_permissions"));
15182                    }
15183                    field_link_permissions = Some(map.next_value()?);
15184                }
15185                "password_protected" => {
15186                    if field_password_protected.is_some() {
15187                        return Err(::serde::de::Error::duplicate_field("password_protected"));
15188                    }
15189                    field_password_protected = Some(map.next_value()?);
15190                }
15191                "access_level" => {
15192                    if field_access_level.is_some() {
15193                        return Err(::serde::de::Error::duplicate_field("access_level"));
15194                    }
15195                    field_access_level = Some(map.next_value()?);
15196                }
15197                "audience_restricting_shared_folder" => {
15198                    if field_audience_restricting_shared_folder.is_some() {
15199                        return Err(::serde::de::Error::duplicate_field("audience_restricting_shared_folder"));
15200                    }
15201                    field_audience_restricting_shared_folder = Some(map.next_value()?);
15202                }
15203                "expiry" => {
15204                    if field_expiry.is_some() {
15205                        return Err(::serde::de::Error::duplicate_field("expiry"));
15206                    }
15207                    field_expiry = Some(map.next_value()?);
15208                }
15209                _ => {
15210                    // unknown field allowed and ignored
15211                    map.next_value::<::serde_json::Value>()?;
15212                }
15213            }
15214        }
15215        if optional && nothing {
15216            return Ok(None);
15217        }
15218        let result = SharedContentLinkMetadataBase {
15219            audience_options: field_audience_options.ok_or_else(|| ::serde::de::Error::missing_field("audience_options"))?,
15220            current_audience: field_current_audience.ok_or_else(|| ::serde::de::Error::missing_field("current_audience"))?,
15221            link_permissions: field_link_permissions.ok_or_else(|| ::serde::de::Error::missing_field("link_permissions"))?,
15222            password_protected: field_password_protected.ok_or_else(|| ::serde::de::Error::missing_field("password_protected"))?,
15223            access_level: field_access_level.and_then(Option::flatten),
15224            audience_restricting_shared_folder: field_audience_restricting_shared_folder.and_then(Option::flatten),
15225            expiry: field_expiry.and_then(Option::flatten),
15226        };
15227        Ok(Some(result))
15228    }
15229
15230    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
15231        &self,
15232        s: &mut S::SerializeStruct,
15233    ) -> Result<(), S::Error> {
15234        use serde::ser::SerializeStruct;
15235        s.serialize_field("audience_options", &self.audience_options)?;
15236        s.serialize_field("current_audience", &self.current_audience)?;
15237        s.serialize_field("link_permissions", &self.link_permissions)?;
15238        s.serialize_field("password_protected", &self.password_protected)?;
15239        if let Some(val) = &self.access_level {
15240            s.serialize_field("access_level", val)?;
15241        }
15242        if let Some(val) = &self.audience_restricting_shared_folder {
15243            s.serialize_field("audience_restricting_shared_folder", val)?;
15244        }
15245        if let Some(val) = &self.expiry {
15246            s.serialize_field("expiry", val)?;
15247        }
15248        Ok(())
15249    }
15250}
15251
15252impl<'de> ::serde::de::Deserialize<'de> for SharedContentLinkMetadataBase {
15253    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
15254        // struct deserializer
15255        use serde::de::{MapAccess, Visitor};
15256        struct StructVisitor;
15257        impl<'de> Visitor<'de> for StructVisitor {
15258            type Value = SharedContentLinkMetadataBase;
15259            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
15260                f.write_str("a SharedContentLinkMetadataBase struct")
15261            }
15262            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
15263                SharedContentLinkMetadataBase::internal_deserialize(map)
15264            }
15265        }
15266        deserializer.deserialize_struct("SharedContentLinkMetadataBase", SHARED_CONTENT_LINK_METADATA_BASE_FIELDS, StructVisitor)
15267    }
15268}
15269
15270impl ::serde::ser::Serialize for SharedContentLinkMetadataBase {
15271    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
15272        // struct serializer
15273        use serde::ser::SerializeStruct;
15274        let mut s = serializer.serialize_struct("SharedContentLinkMetadataBase", 7)?;
15275        self.internal_serialize::<S>(&mut s)?;
15276        s.end()
15277    }
15278}
15279
15280/// Shared file user, group, and invitee membership. Used for the results of
15281/// [`list_file_members()`](crate::sharing::list_file_members) and
15282/// [`list_file_members_continue()`](crate::sharing::list_file_members_continue), and used as part
15283/// of the results for [`list_file_members_batch()`](crate::sharing::list_file_members_batch).
15284#[derive(Debug, Clone, PartialEq, Eq)]
15285#[non_exhaustive] // structs may have more fields added in the future.
15286pub struct SharedFileMembers {
15287    /// The list of user members of the shared file.
15288    pub users: Vec<UserFileMembershipInfo>,
15289    /// The list of group members of the shared file.
15290    pub groups: Vec<GroupMembershipInfo>,
15291    /// The list of invited members of a file, but have not logged in and claimed this.
15292    pub invitees: Vec<InviteeMembershipInfo>,
15293    /// Present if there are additional shared file members that have not been returned yet. Pass
15294    /// the cursor into [`list_file_members_continue()`](crate::sharing::list_file_members_continue)
15295    /// to list additional members.
15296    pub cursor: Option<String>,
15297}
15298
15299impl SharedFileMembers {
15300    pub fn new(
15301        users: Vec<UserFileMembershipInfo>,
15302        groups: Vec<GroupMembershipInfo>,
15303        invitees: Vec<InviteeMembershipInfo>,
15304    ) -> Self {
15305        SharedFileMembers {
15306            users,
15307            groups,
15308            invitees,
15309            cursor: None,
15310        }
15311    }
15312
15313    pub fn with_cursor(mut self, value: String) -> Self {
15314        self.cursor = Some(value);
15315        self
15316    }
15317}
15318
15319const SHARED_FILE_MEMBERS_FIELDS: &[&str] = &["users",
15320                                              "groups",
15321                                              "invitees",
15322                                              "cursor"];
15323impl SharedFileMembers {
15324    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
15325        map: V,
15326    ) -> Result<SharedFileMembers, V::Error> {
15327        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
15328    }
15329
15330    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
15331        mut map: V,
15332        optional: bool,
15333    ) -> Result<Option<SharedFileMembers>, V::Error> {
15334        let mut field_users = None;
15335        let mut field_groups = None;
15336        let mut field_invitees = None;
15337        let mut field_cursor = None;
15338        let mut nothing = true;
15339        while let Some(key) = map.next_key::<&str>()? {
15340            nothing = false;
15341            match key {
15342                "users" => {
15343                    if field_users.is_some() {
15344                        return Err(::serde::de::Error::duplicate_field("users"));
15345                    }
15346                    field_users = Some(map.next_value()?);
15347                }
15348                "groups" => {
15349                    if field_groups.is_some() {
15350                        return Err(::serde::de::Error::duplicate_field("groups"));
15351                    }
15352                    field_groups = Some(map.next_value()?);
15353                }
15354                "invitees" => {
15355                    if field_invitees.is_some() {
15356                        return Err(::serde::de::Error::duplicate_field("invitees"));
15357                    }
15358                    field_invitees = Some(map.next_value()?);
15359                }
15360                "cursor" => {
15361                    if field_cursor.is_some() {
15362                        return Err(::serde::de::Error::duplicate_field("cursor"));
15363                    }
15364                    field_cursor = Some(map.next_value()?);
15365                }
15366                _ => {
15367                    // unknown field allowed and ignored
15368                    map.next_value::<::serde_json::Value>()?;
15369                }
15370            }
15371        }
15372        if optional && nothing {
15373            return Ok(None);
15374        }
15375        let result = SharedFileMembers {
15376            users: field_users.ok_or_else(|| ::serde::de::Error::missing_field("users"))?,
15377            groups: field_groups.ok_or_else(|| ::serde::de::Error::missing_field("groups"))?,
15378            invitees: field_invitees.ok_or_else(|| ::serde::de::Error::missing_field("invitees"))?,
15379            cursor: field_cursor.and_then(Option::flatten),
15380        };
15381        Ok(Some(result))
15382    }
15383
15384    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
15385        &self,
15386        s: &mut S::SerializeStruct,
15387    ) -> Result<(), S::Error> {
15388        use serde::ser::SerializeStruct;
15389        s.serialize_field("users", &self.users)?;
15390        s.serialize_field("groups", &self.groups)?;
15391        s.serialize_field("invitees", &self.invitees)?;
15392        if let Some(val) = &self.cursor {
15393            s.serialize_field("cursor", val)?;
15394        }
15395        Ok(())
15396    }
15397}
15398
15399impl<'de> ::serde::de::Deserialize<'de> for SharedFileMembers {
15400    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
15401        // struct deserializer
15402        use serde::de::{MapAccess, Visitor};
15403        struct StructVisitor;
15404        impl<'de> Visitor<'de> for StructVisitor {
15405            type Value = SharedFileMembers;
15406            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
15407                f.write_str("a SharedFileMembers struct")
15408            }
15409            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
15410                SharedFileMembers::internal_deserialize(map)
15411            }
15412        }
15413        deserializer.deserialize_struct("SharedFileMembers", SHARED_FILE_MEMBERS_FIELDS, StructVisitor)
15414    }
15415}
15416
15417impl ::serde::ser::Serialize for SharedFileMembers {
15418    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
15419        // struct serializer
15420        use serde::ser::SerializeStruct;
15421        let mut s = serializer.serialize_struct("SharedFileMembers", 4)?;
15422        self.internal_serialize::<S>(&mut s)?;
15423        s.end()
15424    }
15425}
15426
15427/// Properties of the shared file.
15428#[derive(Debug, Clone, PartialEq, Eq)]
15429#[non_exhaustive] // structs may have more fields added in the future.
15430pub struct SharedFileMetadata {
15431    /// The ID of the file.
15432    pub id: crate::types::files::FileId,
15433    /// The name of this file.
15434    pub name: String,
15435    /// Policies governing this shared file.
15436    pub policy: FolderPolicy,
15437    /// URL for displaying a web preview of the shared file.
15438    pub preview_url: String,
15439    /// The current user's access level for this shared file.
15440    pub access_type: Option<AccessLevel>,
15441    /// The expected metadata of the link associated for the file when it is first shared. Absent if
15442    /// the link already exists. This is for an unreleased feature so it may not be returned yet.
15443    pub expected_link_metadata: Option<ExpectedSharedContentLinkMetadata>,
15444    /// The metadata of the link associated for the file. This is for an unreleased feature so it
15445    /// may not be returned yet.
15446    pub link_metadata: Option<SharedContentLinkMetadata>,
15447    /// The display names of the users that own the file. If the file is part of a team folder, the
15448    /// display names of the team admins are also included. Absent if the owner display names cannot
15449    /// be fetched.
15450    pub owner_display_names: Option<Vec<String>>,
15451    /// The team that owns the file. This field is not present if the file is not owned by a team.
15452    pub owner_team: Option<crate::types::users::Team>,
15453    /// The ID of the parent shared folder. This field is present only if the file is contained
15454    /// within a shared folder.
15455    pub parent_shared_folder_id: Option<crate::types::common::SharedFolderId>,
15456    /// The cased path to be used for display purposes only. In rare instances the casing will not
15457    /// correctly match the user's filesystem, but this behavior will match the path provided in the
15458    /// Core API v1. Absent for unmounted files.
15459    pub path_display: Option<String>,
15460    /// The lower-case full path of this file. Absent for unmounted files.
15461    pub path_lower: Option<String>,
15462    /// The sharing permissions that requesting user has on this file. This corresponds to the
15463    /// entries given in [`GetFileMetadataBatchArg::actions`](GetFileMetadataBatchArg) or
15464    /// [`GetFileMetadataArg::actions`](GetFileMetadataArg).
15465    pub permissions: Option<Vec<FilePermission>>,
15466    /// Timestamp indicating when the current user was invited to this shared file. If the user was
15467    /// not invited to the shared file, the timestamp will indicate when the user was invited to the
15468    /// parent shared folder. This value may be absent.
15469    pub time_invited: Option<crate::types::common::DropboxTimestamp>,
15470}
15471
15472impl SharedFileMetadata {
15473    pub fn new(
15474        id: crate::types::files::FileId,
15475        name: String,
15476        policy: FolderPolicy,
15477        preview_url: String,
15478    ) -> Self {
15479        SharedFileMetadata {
15480            id,
15481            name,
15482            policy,
15483            preview_url,
15484            access_type: None,
15485            expected_link_metadata: None,
15486            link_metadata: None,
15487            owner_display_names: None,
15488            owner_team: None,
15489            parent_shared_folder_id: None,
15490            path_display: None,
15491            path_lower: None,
15492            permissions: None,
15493            time_invited: None,
15494        }
15495    }
15496
15497    pub fn with_access_type(mut self, value: AccessLevel) -> Self {
15498        self.access_type = Some(value);
15499        self
15500    }
15501
15502    pub fn with_expected_link_metadata(
15503        mut self,
15504        value: ExpectedSharedContentLinkMetadata,
15505    ) -> Self {
15506        self.expected_link_metadata = Some(value);
15507        self
15508    }
15509
15510    pub fn with_link_metadata(mut self, value: SharedContentLinkMetadata) -> Self {
15511        self.link_metadata = Some(value);
15512        self
15513    }
15514
15515    pub fn with_owner_display_names(mut self, value: Vec<String>) -> Self {
15516        self.owner_display_names = Some(value);
15517        self
15518    }
15519
15520    pub fn with_owner_team(mut self, value: crate::types::users::Team) -> Self {
15521        self.owner_team = Some(value);
15522        self
15523    }
15524
15525    pub fn with_parent_shared_folder_id(
15526        mut self,
15527        value: crate::types::common::SharedFolderId,
15528    ) -> Self {
15529        self.parent_shared_folder_id = Some(value);
15530        self
15531    }
15532
15533    pub fn with_path_display(mut self, value: String) -> Self {
15534        self.path_display = Some(value);
15535        self
15536    }
15537
15538    pub fn with_path_lower(mut self, value: String) -> Self {
15539        self.path_lower = Some(value);
15540        self
15541    }
15542
15543    pub fn with_permissions(mut self, value: Vec<FilePermission>) -> Self {
15544        self.permissions = Some(value);
15545        self
15546    }
15547
15548    pub fn with_time_invited(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
15549        self.time_invited = Some(value);
15550        self
15551    }
15552}
15553
15554const SHARED_FILE_METADATA_FIELDS: &[&str] = &["id",
15555                                               "name",
15556                                               "policy",
15557                                               "preview_url",
15558                                               "access_type",
15559                                               "expected_link_metadata",
15560                                               "link_metadata",
15561                                               "owner_display_names",
15562                                               "owner_team",
15563                                               "parent_shared_folder_id",
15564                                               "path_display",
15565                                               "path_lower",
15566                                               "permissions",
15567                                               "time_invited"];
15568impl SharedFileMetadata {
15569    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
15570        map: V,
15571    ) -> Result<SharedFileMetadata, V::Error> {
15572        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
15573    }
15574
15575    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
15576        mut map: V,
15577        optional: bool,
15578    ) -> Result<Option<SharedFileMetadata>, V::Error> {
15579        let mut field_id = None;
15580        let mut field_name = None;
15581        let mut field_policy = None;
15582        let mut field_preview_url = None;
15583        let mut field_access_type = None;
15584        let mut field_expected_link_metadata = None;
15585        let mut field_link_metadata = None;
15586        let mut field_owner_display_names = None;
15587        let mut field_owner_team = None;
15588        let mut field_parent_shared_folder_id = None;
15589        let mut field_path_display = None;
15590        let mut field_path_lower = None;
15591        let mut field_permissions = None;
15592        let mut field_time_invited = None;
15593        let mut nothing = true;
15594        while let Some(key) = map.next_key::<&str>()? {
15595            nothing = false;
15596            match key {
15597                "id" => {
15598                    if field_id.is_some() {
15599                        return Err(::serde::de::Error::duplicate_field("id"));
15600                    }
15601                    field_id = Some(map.next_value()?);
15602                }
15603                "name" => {
15604                    if field_name.is_some() {
15605                        return Err(::serde::de::Error::duplicate_field("name"));
15606                    }
15607                    field_name = Some(map.next_value()?);
15608                }
15609                "policy" => {
15610                    if field_policy.is_some() {
15611                        return Err(::serde::de::Error::duplicate_field("policy"));
15612                    }
15613                    field_policy = Some(map.next_value()?);
15614                }
15615                "preview_url" => {
15616                    if field_preview_url.is_some() {
15617                        return Err(::serde::de::Error::duplicate_field("preview_url"));
15618                    }
15619                    field_preview_url = Some(map.next_value()?);
15620                }
15621                "access_type" => {
15622                    if field_access_type.is_some() {
15623                        return Err(::serde::de::Error::duplicate_field("access_type"));
15624                    }
15625                    field_access_type = Some(map.next_value()?);
15626                }
15627                "expected_link_metadata" => {
15628                    if field_expected_link_metadata.is_some() {
15629                        return Err(::serde::de::Error::duplicate_field("expected_link_metadata"));
15630                    }
15631                    field_expected_link_metadata = Some(map.next_value()?);
15632                }
15633                "link_metadata" => {
15634                    if field_link_metadata.is_some() {
15635                        return Err(::serde::de::Error::duplicate_field("link_metadata"));
15636                    }
15637                    field_link_metadata = Some(map.next_value()?);
15638                }
15639                "owner_display_names" => {
15640                    if field_owner_display_names.is_some() {
15641                        return Err(::serde::de::Error::duplicate_field("owner_display_names"));
15642                    }
15643                    field_owner_display_names = Some(map.next_value()?);
15644                }
15645                "owner_team" => {
15646                    if field_owner_team.is_some() {
15647                        return Err(::serde::de::Error::duplicate_field("owner_team"));
15648                    }
15649                    field_owner_team = Some(map.next_value()?);
15650                }
15651                "parent_shared_folder_id" => {
15652                    if field_parent_shared_folder_id.is_some() {
15653                        return Err(::serde::de::Error::duplicate_field("parent_shared_folder_id"));
15654                    }
15655                    field_parent_shared_folder_id = Some(map.next_value()?);
15656                }
15657                "path_display" => {
15658                    if field_path_display.is_some() {
15659                        return Err(::serde::de::Error::duplicate_field("path_display"));
15660                    }
15661                    field_path_display = Some(map.next_value()?);
15662                }
15663                "path_lower" => {
15664                    if field_path_lower.is_some() {
15665                        return Err(::serde::de::Error::duplicate_field("path_lower"));
15666                    }
15667                    field_path_lower = Some(map.next_value()?);
15668                }
15669                "permissions" => {
15670                    if field_permissions.is_some() {
15671                        return Err(::serde::de::Error::duplicate_field("permissions"));
15672                    }
15673                    field_permissions = Some(map.next_value()?);
15674                }
15675                "time_invited" => {
15676                    if field_time_invited.is_some() {
15677                        return Err(::serde::de::Error::duplicate_field("time_invited"));
15678                    }
15679                    field_time_invited = Some(map.next_value()?);
15680                }
15681                _ => {
15682                    // unknown field allowed and ignored
15683                    map.next_value::<::serde_json::Value>()?;
15684                }
15685            }
15686        }
15687        if optional && nothing {
15688            return Ok(None);
15689        }
15690        let result = SharedFileMetadata {
15691            id: field_id.ok_or_else(|| ::serde::de::Error::missing_field("id"))?,
15692            name: field_name.ok_or_else(|| ::serde::de::Error::missing_field("name"))?,
15693            policy: field_policy.ok_or_else(|| ::serde::de::Error::missing_field("policy"))?,
15694            preview_url: field_preview_url.ok_or_else(|| ::serde::de::Error::missing_field("preview_url"))?,
15695            access_type: field_access_type.and_then(Option::flatten),
15696            expected_link_metadata: field_expected_link_metadata.and_then(Option::flatten),
15697            link_metadata: field_link_metadata.and_then(Option::flatten),
15698            owner_display_names: field_owner_display_names.and_then(Option::flatten),
15699            owner_team: field_owner_team.and_then(Option::flatten),
15700            parent_shared_folder_id: field_parent_shared_folder_id.and_then(Option::flatten),
15701            path_display: field_path_display.and_then(Option::flatten),
15702            path_lower: field_path_lower.and_then(Option::flatten),
15703            permissions: field_permissions.and_then(Option::flatten),
15704            time_invited: field_time_invited.and_then(Option::flatten),
15705        };
15706        Ok(Some(result))
15707    }
15708
15709    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
15710        &self,
15711        s: &mut S::SerializeStruct,
15712    ) -> Result<(), S::Error> {
15713        use serde::ser::SerializeStruct;
15714        s.serialize_field("id", &self.id)?;
15715        s.serialize_field("name", &self.name)?;
15716        s.serialize_field("policy", &self.policy)?;
15717        s.serialize_field("preview_url", &self.preview_url)?;
15718        if let Some(val) = &self.access_type {
15719            s.serialize_field("access_type", val)?;
15720        }
15721        if let Some(val) = &self.expected_link_metadata {
15722            s.serialize_field("expected_link_metadata", val)?;
15723        }
15724        if let Some(val) = &self.link_metadata {
15725            s.serialize_field("link_metadata", val)?;
15726        }
15727        if let Some(val) = &self.owner_display_names {
15728            s.serialize_field("owner_display_names", val)?;
15729        }
15730        if let Some(val) = &self.owner_team {
15731            s.serialize_field("owner_team", val)?;
15732        }
15733        if let Some(val) = &self.parent_shared_folder_id {
15734            s.serialize_field("parent_shared_folder_id", val)?;
15735        }
15736        if let Some(val) = &self.path_display {
15737            s.serialize_field("path_display", val)?;
15738        }
15739        if let Some(val) = &self.path_lower {
15740            s.serialize_field("path_lower", val)?;
15741        }
15742        if let Some(val) = &self.permissions {
15743            s.serialize_field("permissions", val)?;
15744        }
15745        if let Some(val) = &self.time_invited {
15746            s.serialize_field("time_invited", val)?;
15747        }
15748        Ok(())
15749    }
15750}
15751
15752impl<'de> ::serde::de::Deserialize<'de> for SharedFileMetadata {
15753    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
15754        // struct deserializer
15755        use serde::de::{MapAccess, Visitor};
15756        struct StructVisitor;
15757        impl<'de> Visitor<'de> for StructVisitor {
15758            type Value = SharedFileMetadata;
15759            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
15760                f.write_str("a SharedFileMetadata struct")
15761            }
15762            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
15763                SharedFileMetadata::internal_deserialize(map)
15764            }
15765        }
15766        deserializer.deserialize_struct("SharedFileMetadata", SHARED_FILE_METADATA_FIELDS, StructVisitor)
15767    }
15768}
15769
15770impl ::serde::ser::Serialize for SharedFileMetadata {
15771    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
15772        // struct serializer
15773        use serde::ser::SerializeStruct;
15774        let mut s = serializer.serialize_struct("SharedFileMetadata", 14)?;
15775        self.internal_serialize::<S>(&mut s)?;
15776        s.end()
15777    }
15778}
15779
15780/// There is an error accessing the shared folder.
15781#[derive(Debug, Clone, PartialEq, Eq)]
15782#[non_exhaustive] // variants may be added in the future
15783pub enum SharedFolderAccessError {
15784    /// This shared folder ID is invalid.
15785    InvalidId,
15786    /// The user is not a member of the shared folder thus cannot access it.
15787    NotAMember,
15788    /// The user does not exist or their account is disabled.
15789    InvalidMember,
15790    /// Never set.
15791    EmailUnverified,
15792    /// The shared folder is unmounted.
15793    Unmounted,
15794    /// Catch-all used for unrecognized values returned from the server. Encountering this value
15795    /// typically indicates that this SDK version is out of date.
15796    Other,
15797}
15798
15799impl<'de> ::serde::de::Deserialize<'de> for SharedFolderAccessError {
15800    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
15801        // union deserializer
15802        use serde::de::{self, MapAccess, Visitor};
15803        struct EnumVisitor;
15804        impl<'de> Visitor<'de> for EnumVisitor {
15805            type Value = SharedFolderAccessError;
15806            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
15807                f.write_str("a SharedFolderAccessError structure")
15808            }
15809            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
15810                let tag: &str = match map.next_key()? {
15811                    Some(".tag") => map.next_value()?,
15812                    _ => return Err(de::Error::missing_field(".tag"))
15813                };
15814                let value = match tag {
15815                    "invalid_id" => SharedFolderAccessError::InvalidId,
15816                    "not_a_member" => SharedFolderAccessError::NotAMember,
15817                    "invalid_member" => SharedFolderAccessError::InvalidMember,
15818                    "email_unverified" => SharedFolderAccessError::EmailUnverified,
15819                    "unmounted" => SharedFolderAccessError::Unmounted,
15820                    _ => SharedFolderAccessError::Other,
15821                };
15822                crate::eat_json_fields(&mut map)?;
15823                Ok(value)
15824            }
15825        }
15826        const VARIANTS: &[&str] = &["invalid_id",
15827                                    "not_a_member",
15828                                    "invalid_member",
15829                                    "email_unverified",
15830                                    "unmounted",
15831                                    "other"];
15832        deserializer.deserialize_struct("SharedFolderAccessError", VARIANTS, EnumVisitor)
15833    }
15834}
15835
15836impl ::serde::ser::Serialize for SharedFolderAccessError {
15837    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
15838        // union serializer
15839        use serde::ser::SerializeStruct;
15840        match self {
15841            SharedFolderAccessError::InvalidId => {
15842                // unit
15843                let mut s = serializer.serialize_struct("SharedFolderAccessError", 1)?;
15844                s.serialize_field(".tag", "invalid_id")?;
15845                s.end()
15846            }
15847            SharedFolderAccessError::NotAMember => {
15848                // unit
15849                let mut s = serializer.serialize_struct("SharedFolderAccessError", 1)?;
15850                s.serialize_field(".tag", "not_a_member")?;
15851                s.end()
15852            }
15853            SharedFolderAccessError::InvalidMember => {
15854                // unit
15855                let mut s = serializer.serialize_struct("SharedFolderAccessError", 1)?;
15856                s.serialize_field(".tag", "invalid_member")?;
15857                s.end()
15858            }
15859            SharedFolderAccessError::EmailUnverified => {
15860                // unit
15861                let mut s = serializer.serialize_struct("SharedFolderAccessError", 1)?;
15862                s.serialize_field(".tag", "email_unverified")?;
15863                s.end()
15864            }
15865            SharedFolderAccessError::Unmounted => {
15866                // unit
15867                let mut s = serializer.serialize_struct("SharedFolderAccessError", 1)?;
15868                s.serialize_field(".tag", "unmounted")?;
15869                s.end()
15870            }
15871            SharedFolderAccessError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
15872        }
15873    }
15874}
15875
15876impl ::std::error::Error for SharedFolderAccessError {
15877}
15878
15879impl ::std::fmt::Display for SharedFolderAccessError {
15880    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
15881        match self {
15882            SharedFolderAccessError::InvalidId => f.write_str("This shared folder ID is invalid."),
15883            SharedFolderAccessError::NotAMember => f.write_str("The user is not a member of the shared folder thus cannot access it."),
15884            SharedFolderAccessError::InvalidMember => f.write_str("The user does not exist or their account is disabled."),
15885            SharedFolderAccessError::EmailUnverified => f.write_str("Never set."),
15886            SharedFolderAccessError::Unmounted => f.write_str("The shared folder is unmounted."),
15887            _ => write!(f, "{:?}", *self),
15888        }
15889    }
15890}
15891
15892#[derive(Debug, Clone, PartialEq, Eq)]
15893#[non_exhaustive] // variants may be added in the future
15894pub enum SharedFolderMemberError {
15895    /// The target dropbox_id is invalid.
15896    InvalidDropboxId,
15897    /// The target dropbox_id is not a member of the shared folder.
15898    NotAMember,
15899    /// The target member only has inherited access to the shared folder.
15900    NoExplicitAccess(MemberAccessLevelResult),
15901    /// Catch-all used for unrecognized values returned from the server. Encountering this value
15902    /// typically indicates that this SDK version is out of date.
15903    Other,
15904}
15905
15906impl<'de> ::serde::de::Deserialize<'de> for SharedFolderMemberError {
15907    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
15908        // union deserializer
15909        use serde::de::{self, MapAccess, Visitor};
15910        struct EnumVisitor;
15911        impl<'de> Visitor<'de> for EnumVisitor {
15912            type Value = SharedFolderMemberError;
15913            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
15914                f.write_str("a SharedFolderMemberError structure")
15915            }
15916            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
15917                let tag: &str = match map.next_key()? {
15918                    Some(".tag") => map.next_value()?,
15919                    _ => return Err(de::Error::missing_field(".tag"))
15920                };
15921                let value = match tag {
15922                    "invalid_dropbox_id" => SharedFolderMemberError::InvalidDropboxId,
15923                    "not_a_member" => SharedFolderMemberError::NotAMember,
15924                    "no_explicit_access" => SharedFolderMemberError::NoExplicitAccess(MemberAccessLevelResult::internal_deserialize(&mut map)?),
15925                    _ => SharedFolderMemberError::Other,
15926                };
15927                crate::eat_json_fields(&mut map)?;
15928                Ok(value)
15929            }
15930        }
15931        const VARIANTS: &[&str] = &["invalid_dropbox_id",
15932                                    "not_a_member",
15933                                    "no_explicit_access",
15934                                    "other"];
15935        deserializer.deserialize_struct("SharedFolderMemberError", VARIANTS, EnumVisitor)
15936    }
15937}
15938
15939impl ::serde::ser::Serialize for SharedFolderMemberError {
15940    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
15941        // union serializer
15942        use serde::ser::SerializeStruct;
15943        match self {
15944            SharedFolderMemberError::InvalidDropboxId => {
15945                // unit
15946                let mut s = serializer.serialize_struct("SharedFolderMemberError", 1)?;
15947                s.serialize_field(".tag", "invalid_dropbox_id")?;
15948                s.end()
15949            }
15950            SharedFolderMemberError::NotAMember => {
15951                // unit
15952                let mut s = serializer.serialize_struct("SharedFolderMemberError", 1)?;
15953                s.serialize_field(".tag", "not_a_member")?;
15954                s.end()
15955            }
15956            SharedFolderMemberError::NoExplicitAccess(x) => {
15957                // struct
15958                let mut s = serializer.serialize_struct("SharedFolderMemberError", 4)?;
15959                s.serialize_field(".tag", "no_explicit_access")?;
15960                x.internal_serialize::<S>(&mut s)?;
15961                s.end()
15962            }
15963            SharedFolderMemberError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
15964        }
15965    }
15966}
15967
15968impl ::std::error::Error for SharedFolderMemberError {
15969}
15970
15971impl ::std::fmt::Display for SharedFolderMemberError {
15972    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
15973        match self {
15974            SharedFolderMemberError::InvalidDropboxId => f.write_str("The target dropbox_id is invalid."),
15975            SharedFolderMemberError::NotAMember => f.write_str("The target dropbox_id is not a member of the shared folder."),
15976            SharedFolderMemberError::NoExplicitAccess(inner) => write!(f, "The target member only has inherited access to the shared folder: {:?}", inner),
15977            _ => write!(f, "{:?}", *self),
15978        }
15979    }
15980}
15981
15982/// Shared folder user and group membership.
15983#[derive(Debug, Clone, PartialEq, Eq)]
15984#[non_exhaustive] // structs may have more fields added in the future.
15985pub struct SharedFolderMembers {
15986    /// The list of user members of the shared folder.
15987    pub users: Vec<UserMembershipInfo>,
15988    /// The list of group members of the shared folder.
15989    pub groups: Vec<GroupMembershipInfo>,
15990    /// The list of invitees to the shared folder.
15991    pub invitees: Vec<InviteeMembershipInfo>,
15992    /// Present if there are additional shared folder members that have not been returned yet. Pass
15993    /// the cursor into
15994    /// [`list_folder_members_continue()`](crate::sharing::list_folder_members_continue) to list
15995    /// additional members.
15996    pub cursor: Option<String>,
15997}
15998
15999impl SharedFolderMembers {
16000    pub fn new(
16001        users: Vec<UserMembershipInfo>,
16002        groups: Vec<GroupMembershipInfo>,
16003        invitees: Vec<InviteeMembershipInfo>,
16004    ) -> Self {
16005        SharedFolderMembers {
16006            users,
16007            groups,
16008            invitees,
16009            cursor: None,
16010        }
16011    }
16012
16013    pub fn with_cursor(mut self, value: String) -> Self {
16014        self.cursor = Some(value);
16015        self
16016    }
16017}
16018
16019const SHARED_FOLDER_MEMBERS_FIELDS: &[&str] = &["users",
16020                                                "groups",
16021                                                "invitees",
16022                                                "cursor"];
16023impl SharedFolderMembers {
16024    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
16025        map: V,
16026    ) -> Result<SharedFolderMembers, V::Error> {
16027        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
16028    }
16029
16030    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
16031        mut map: V,
16032        optional: bool,
16033    ) -> Result<Option<SharedFolderMembers>, V::Error> {
16034        let mut field_users = None;
16035        let mut field_groups = None;
16036        let mut field_invitees = None;
16037        let mut field_cursor = None;
16038        let mut nothing = true;
16039        while let Some(key) = map.next_key::<&str>()? {
16040            nothing = false;
16041            match key {
16042                "users" => {
16043                    if field_users.is_some() {
16044                        return Err(::serde::de::Error::duplicate_field("users"));
16045                    }
16046                    field_users = Some(map.next_value()?);
16047                }
16048                "groups" => {
16049                    if field_groups.is_some() {
16050                        return Err(::serde::de::Error::duplicate_field("groups"));
16051                    }
16052                    field_groups = Some(map.next_value()?);
16053                }
16054                "invitees" => {
16055                    if field_invitees.is_some() {
16056                        return Err(::serde::de::Error::duplicate_field("invitees"));
16057                    }
16058                    field_invitees = Some(map.next_value()?);
16059                }
16060                "cursor" => {
16061                    if field_cursor.is_some() {
16062                        return Err(::serde::de::Error::duplicate_field("cursor"));
16063                    }
16064                    field_cursor = Some(map.next_value()?);
16065                }
16066                _ => {
16067                    // unknown field allowed and ignored
16068                    map.next_value::<::serde_json::Value>()?;
16069                }
16070            }
16071        }
16072        if optional && nothing {
16073            return Ok(None);
16074        }
16075        let result = SharedFolderMembers {
16076            users: field_users.ok_or_else(|| ::serde::de::Error::missing_field("users"))?,
16077            groups: field_groups.ok_or_else(|| ::serde::de::Error::missing_field("groups"))?,
16078            invitees: field_invitees.ok_or_else(|| ::serde::de::Error::missing_field("invitees"))?,
16079            cursor: field_cursor.and_then(Option::flatten),
16080        };
16081        Ok(Some(result))
16082    }
16083
16084    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
16085        &self,
16086        s: &mut S::SerializeStruct,
16087    ) -> Result<(), S::Error> {
16088        use serde::ser::SerializeStruct;
16089        s.serialize_field("users", &self.users)?;
16090        s.serialize_field("groups", &self.groups)?;
16091        s.serialize_field("invitees", &self.invitees)?;
16092        if let Some(val) = &self.cursor {
16093            s.serialize_field("cursor", val)?;
16094        }
16095        Ok(())
16096    }
16097}
16098
16099impl<'de> ::serde::de::Deserialize<'de> for SharedFolderMembers {
16100    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
16101        // struct deserializer
16102        use serde::de::{MapAccess, Visitor};
16103        struct StructVisitor;
16104        impl<'de> Visitor<'de> for StructVisitor {
16105            type Value = SharedFolderMembers;
16106            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
16107                f.write_str("a SharedFolderMembers struct")
16108            }
16109            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
16110                SharedFolderMembers::internal_deserialize(map)
16111            }
16112        }
16113        deserializer.deserialize_struct("SharedFolderMembers", SHARED_FOLDER_MEMBERS_FIELDS, StructVisitor)
16114    }
16115}
16116
16117impl ::serde::ser::Serialize for SharedFolderMembers {
16118    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
16119        // struct serializer
16120        use serde::ser::SerializeStruct;
16121        let mut s = serializer.serialize_struct("SharedFolderMembers", 4)?;
16122        self.internal_serialize::<S>(&mut s)?;
16123        s.end()
16124    }
16125}
16126
16127/// The metadata which includes basic information about the shared folder.
16128#[derive(Debug, Clone, PartialEq, Eq)]
16129#[non_exhaustive] // structs may have more fields added in the future.
16130pub struct SharedFolderMetadata {
16131    /// The current user's access level for this shared folder.
16132    pub access_type: AccessLevel,
16133    /// Whether this folder is inside of a team folder.
16134    pub is_inside_team_folder: bool,
16135    /// Whether this folder is a [team folder](https://www.dropbox.com/en/help/986).
16136    pub is_team_folder: bool,
16137    /// The name of the this shared folder.
16138    pub name: String,
16139    /// Policies governing this shared folder.
16140    pub policy: FolderPolicy,
16141    /// URL for displaying a web preview of the shared folder.
16142    pub preview_url: String,
16143    /// The ID of the shared folder.
16144    pub shared_folder_id: crate::types::common::SharedFolderId,
16145    /// Timestamp indicating when the current user was invited to this shared folder.
16146    pub time_invited: crate::types::common::DropboxTimestamp,
16147    /// The display names of the users that own the folder. If the folder is part of a team folder,
16148    /// the display names of the team admins are also included. Absent if the owner display names
16149    /// cannot be fetched.
16150    pub owner_display_names: Option<Vec<String>>,
16151    /// The team that owns the folder. This field is not present if the folder is not owned by a
16152    /// team.
16153    pub owner_team: Option<crate::types::users::Team>,
16154    /// The ID of the parent shared folder. This field is present only if the folder is contained
16155    /// within another shared folder.
16156    pub parent_shared_folder_id: Option<crate::types::common::SharedFolderId>,
16157    /// The full path of this shared folder. Absent for unmounted folders.
16158    pub path_display: Option<String>,
16159    /// The lower-cased full path of this shared folder. Absent for unmounted folders.
16160    pub path_lower: Option<String>,
16161    /// Display name for the parent folder.
16162    pub parent_folder_name: Option<String>,
16163    /// The metadata of the shared content link to this shared folder. Absent if there is no link on
16164    /// the folder. This is for an unreleased feature so it may not be returned yet.
16165    pub link_metadata: Option<SharedContentLinkMetadata>,
16166    /// Actions the current user may perform on the folder and its contents. The set of permissions
16167    /// corresponds to the FolderActions in the request.
16168    pub permissions: Option<Vec<FolderPermission>>,
16169    /// Whether the folder inherits its members from its parent.
16170    pub access_inheritance: AccessInheritance,
16171}
16172
16173impl SharedFolderMetadata {
16174    pub fn new(
16175        access_type: AccessLevel,
16176        is_inside_team_folder: bool,
16177        is_team_folder: bool,
16178        name: String,
16179        policy: FolderPolicy,
16180        preview_url: String,
16181        shared_folder_id: crate::types::common::SharedFolderId,
16182        time_invited: crate::types::common::DropboxTimestamp,
16183    ) -> Self {
16184        SharedFolderMetadata {
16185            access_type,
16186            is_inside_team_folder,
16187            is_team_folder,
16188            name,
16189            policy,
16190            preview_url,
16191            shared_folder_id,
16192            time_invited,
16193            owner_display_names: None,
16194            owner_team: None,
16195            parent_shared_folder_id: None,
16196            path_display: None,
16197            path_lower: None,
16198            parent_folder_name: None,
16199            link_metadata: None,
16200            permissions: None,
16201            access_inheritance: AccessInheritance::Inherit,
16202        }
16203    }
16204
16205    pub fn with_owner_display_names(mut self, value: Vec<String>) -> Self {
16206        self.owner_display_names = Some(value);
16207        self
16208    }
16209
16210    pub fn with_owner_team(mut self, value: crate::types::users::Team) -> Self {
16211        self.owner_team = Some(value);
16212        self
16213    }
16214
16215    pub fn with_parent_shared_folder_id(
16216        mut self,
16217        value: crate::types::common::SharedFolderId,
16218    ) -> Self {
16219        self.parent_shared_folder_id = Some(value);
16220        self
16221    }
16222
16223    pub fn with_path_display(mut self, value: String) -> Self {
16224        self.path_display = Some(value);
16225        self
16226    }
16227
16228    pub fn with_path_lower(mut self, value: String) -> Self {
16229        self.path_lower = Some(value);
16230        self
16231    }
16232
16233    pub fn with_parent_folder_name(mut self, value: String) -> Self {
16234        self.parent_folder_name = Some(value);
16235        self
16236    }
16237
16238    pub fn with_link_metadata(mut self, value: SharedContentLinkMetadata) -> Self {
16239        self.link_metadata = Some(value);
16240        self
16241    }
16242
16243    pub fn with_permissions(mut self, value: Vec<FolderPermission>) -> Self {
16244        self.permissions = Some(value);
16245        self
16246    }
16247
16248    pub fn with_access_inheritance(mut self, value: AccessInheritance) -> Self {
16249        self.access_inheritance = value;
16250        self
16251    }
16252}
16253
16254const SHARED_FOLDER_METADATA_FIELDS: &[&str] = &["access_type",
16255                                                 "is_inside_team_folder",
16256                                                 "is_team_folder",
16257                                                 "name",
16258                                                 "policy",
16259                                                 "preview_url",
16260                                                 "shared_folder_id",
16261                                                 "time_invited",
16262                                                 "owner_display_names",
16263                                                 "owner_team",
16264                                                 "parent_shared_folder_id",
16265                                                 "path_display",
16266                                                 "path_lower",
16267                                                 "parent_folder_name",
16268                                                 "link_metadata",
16269                                                 "permissions",
16270                                                 "access_inheritance"];
16271impl SharedFolderMetadata {
16272    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
16273        map: V,
16274    ) -> Result<SharedFolderMetadata, V::Error> {
16275        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
16276    }
16277
16278    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
16279        mut map: V,
16280        optional: bool,
16281    ) -> Result<Option<SharedFolderMetadata>, V::Error> {
16282        let mut field_access_type = None;
16283        let mut field_is_inside_team_folder = None;
16284        let mut field_is_team_folder = None;
16285        let mut field_name = None;
16286        let mut field_policy = None;
16287        let mut field_preview_url = None;
16288        let mut field_shared_folder_id = None;
16289        let mut field_time_invited = None;
16290        let mut field_owner_display_names = None;
16291        let mut field_owner_team = None;
16292        let mut field_parent_shared_folder_id = None;
16293        let mut field_path_display = None;
16294        let mut field_path_lower = None;
16295        let mut field_parent_folder_name = None;
16296        let mut field_link_metadata = None;
16297        let mut field_permissions = None;
16298        let mut field_access_inheritance = None;
16299        let mut nothing = true;
16300        while let Some(key) = map.next_key::<&str>()? {
16301            nothing = false;
16302            match key {
16303                "access_type" => {
16304                    if field_access_type.is_some() {
16305                        return Err(::serde::de::Error::duplicate_field("access_type"));
16306                    }
16307                    field_access_type = Some(map.next_value()?);
16308                }
16309                "is_inside_team_folder" => {
16310                    if field_is_inside_team_folder.is_some() {
16311                        return Err(::serde::de::Error::duplicate_field("is_inside_team_folder"));
16312                    }
16313                    field_is_inside_team_folder = Some(map.next_value()?);
16314                }
16315                "is_team_folder" => {
16316                    if field_is_team_folder.is_some() {
16317                        return Err(::serde::de::Error::duplicate_field("is_team_folder"));
16318                    }
16319                    field_is_team_folder = Some(map.next_value()?);
16320                }
16321                "name" => {
16322                    if field_name.is_some() {
16323                        return Err(::serde::de::Error::duplicate_field("name"));
16324                    }
16325                    field_name = Some(map.next_value()?);
16326                }
16327                "policy" => {
16328                    if field_policy.is_some() {
16329                        return Err(::serde::de::Error::duplicate_field("policy"));
16330                    }
16331                    field_policy = Some(map.next_value()?);
16332                }
16333                "preview_url" => {
16334                    if field_preview_url.is_some() {
16335                        return Err(::serde::de::Error::duplicate_field("preview_url"));
16336                    }
16337                    field_preview_url = Some(map.next_value()?);
16338                }
16339                "shared_folder_id" => {
16340                    if field_shared_folder_id.is_some() {
16341                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
16342                    }
16343                    field_shared_folder_id = Some(map.next_value()?);
16344                }
16345                "time_invited" => {
16346                    if field_time_invited.is_some() {
16347                        return Err(::serde::de::Error::duplicate_field("time_invited"));
16348                    }
16349                    field_time_invited = Some(map.next_value()?);
16350                }
16351                "owner_display_names" => {
16352                    if field_owner_display_names.is_some() {
16353                        return Err(::serde::de::Error::duplicate_field("owner_display_names"));
16354                    }
16355                    field_owner_display_names = Some(map.next_value()?);
16356                }
16357                "owner_team" => {
16358                    if field_owner_team.is_some() {
16359                        return Err(::serde::de::Error::duplicate_field("owner_team"));
16360                    }
16361                    field_owner_team = Some(map.next_value()?);
16362                }
16363                "parent_shared_folder_id" => {
16364                    if field_parent_shared_folder_id.is_some() {
16365                        return Err(::serde::de::Error::duplicate_field("parent_shared_folder_id"));
16366                    }
16367                    field_parent_shared_folder_id = Some(map.next_value()?);
16368                }
16369                "path_display" => {
16370                    if field_path_display.is_some() {
16371                        return Err(::serde::de::Error::duplicate_field("path_display"));
16372                    }
16373                    field_path_display = Some(map.next_value()?);
16374                }
16375                "path_lower" => {
16376                    if field_path_lower.is_some() {
16377                        return Err(::serde::de::Error::duplicate_field("path_lower"));
16378                    }
16379                    field_path_lower = Some(map.next_value()?);
16380                }
16381                "parent_folder_name" => {
16382                    if field_parent_folder_name.is_some() {
16383                        return Err(::serde::de::Error::duplicate_field("parent_folder_name"));
16384                    }
16385                    field_parent_folder_name = Some(map.next_value()?);
16386                }
16387                "link_metadata" => {
16388                    if field_link_metadata.is_some() {
16389                        return Err(::serde::de::Error::duplicate_field("link_metadata"));
16390                    }
16391                    field_link_metadata = Some(map.next_value()?);
16392                }
16393                "permissions" => {
16394                    if field_permissions.is_some() {
16395                        return Err(::serde::de::Error::duplicate_field("permissions"));
16396                    }
16397                    field_permissions = Some(map.next_value()?);
16398                }
16399                "access_inheritance" => {
16400                    if field_access_inheritance.is_some() {
16401                        return Err(::serde::de::Error::duplicate_field("access_inheritance"));
16402                    }
16403                    field_access_inheritance = Some(map.next_value()?);
16404                }
16405                _ => {
16406                    // unknown field allowed and ignored
16407                    map.next_value::<::serde_json::Value>()?;
16408                }
16409            }
16410        }
16411        if optional && nothing {
16412            return Ok(None);
16413        }
16414        let result = SharedFolderMetadata {
16415            access_type: field_access_type.ok_or_else(|| ::serde::de::Error::missing_field("access_type"))?,
16416            is_inside_team_folder: field_is_inside_team_folder.ok_or_else(|| ::serde::de::Error::missing_field("is_inside_team_folder"))?,
16417            is_team_folder: field_is_team_folder.ok_or_else(|| ::serde::de::Error::missing_field("is_team_folder"))?,
16418            name: field_name.ok_or_else(|| ::serde::de::Error::missing_field("name"))?,
16419            policy: field_policy.ok_or_else(|| ::serde::de::Error::missing_field("policy"))?,
16420            preview_url: field_preview_url.ok_or_else(|| ::serde::de::Error::missing_field("preview_url"))?,
16421            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
16422            time_invited: field_time_invited.ok_or_else(|| ::serde::de::Error::missing_field("time_invited"))?,
16423            owner_display_names: field_owner_display_names.and_then(Option::flatten),
16424            owner_team: field_owner_team.and_then(Option::flatten),
16425            parent_shared_folder_id: field_parent_shared_folder_id.and_then(Option::flatten),
16426            path_display: field_path_display.and_then(Option::flatten),
16427            path_lower: field_path_lower.and_then(Option::flatten),
16428            parent_folder_name: field_parent_folder_name.and_then(Option::flatten),
16429            link_metadata: field_link_metadata.and_then(Option::flatten),
16430            permissions: field_permissions.and_then(Option::flatten),
16431            access_inheritance: field_access_inheritance.unwrap_or(AccessInheritance::Inherit),
16432        };
16433        Ok(Some(result))
16434    }
16435
16436    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
16437        &self,
16438        s: &mut S::SerializeStruct,
16439    ) -> Result<(), S::Error> {
16440        use serde::ser::SerializeStruct;
16441        s.serialize_field("access_type", &self.access_type)?;
16442        s.serialize_field("is_inside_team_folder", &self.is_inside_team_folder)?;
16443        s.serialize_field("is_team_folder", &self.is_team_folder)?;
16444        s.serialize_field("name", &self.name)?;
16445        s.serialize_field("policy", &self.policy)?;
16446        s.serialize_field("preview_url", &self.preview_url)?;
16447        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
16448        s.serialize_field("time_invited", &self.time_invited)?;
16449        if let Some(val) = &self.owner_display_names {
16450            s.serialize_field("owner_display_names", val)?;
16451        }
16452        if let Some(val) = &self.owner_team {
16453            s.serialize_field("owner_team", val)?;
16454        }
16455        if let Some(val) = &self.parent_shared_folder_id {
16456            s.serialize_field("parent_shared_folder_id", val)?;
16457        }
16458        if let Some(val) = &self.path_display {
16459            s.serialize_field("path_display", val)?;
16460        }
16461        if let Some(val) = &self.path_lower {
16462            s.serialize_field("path_lower", val)?;
16463        }
16464        if let Some(val) = &self.parent_folder_name {
16465            s.serialize_field("parent_folder_name", val)?;
16466        }
16467        if let Some(val) = &self.link_metadata {
16468            s.serialize_field("link_metadata", val)?;
16469        }
16470        if let Some(val) = &self.permissions {
16471            s.serialize_field("permissions", val)?;
16472        }
16473        if self.access_inheritance != AccessInheritance::Inherit {
16474            s.serialize_field("access_inheritance", &self.access_inheritance)?;
16475        }
16476        Ok(())
16477    }
16478}
16479
16480impl<'de> ::serde::de::Deserialize<'de> for SharedFolderMetadata {
16481    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
16482        // struct deserializer
16483        use serde::de::{MapAccess, Visitor};
16484        struct StructVisitor;
16485        impl<'de> Visitor<'de> for StructVisitor {
16486            type Value = SharedFolderMetadata;
16487            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
16488                f.write_str("a SharedFolderMetadata struct")
16489            }
16490            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
16491                SharedFolderMetadata::internal_deserialize(map)
16492            }
16493        }
16494        deserializer.deserialize_struct("SharedFolderMetadata", SHARED_FOLDER_METADATA_FIELDS, StructVisitor)
16495    }
16496}
16497
16498impl ::serde::ser::Serialize for SharedFolderMetadata {
16499    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
16500        // struct serializer
16501        use serde::ser::SerializeStruct;
16502        let mut s = serializer.serialize_struct("SharedFolderMetadata", 17)?;
16503        self.internal_serialize::<S>(&mut s)?;
16504        s.end()
16505    }
16506}
16507
16508// struct extends SharedFolderMetadataBase
16509impl From<SharedFolderMetadata> for SharedFolderMetadataBase {
16510    fn from(subtype: SharedFolderMetadata) -> Self {
16511        Self {
16512            access_type: subtype.access_type,
16513            is_inside_team_folder: subtype.is_inside_team_folder,
16514            is_team_folder: subtype.is_team_folder,
16515            owner_display_names: subtype.owner_display_names,
16516            owner_team: subtype.owner_team,
16517            parent_shared_folder_id: subtype.parent_shared_folder_id,
16518            path_display: subtype.path_display,
16519            path_lower: subtype.path_lower,
16520            parent_folder_name: subtype.parent_folder_name,
16521        }
16522    }
16523}
16524/// Properties of the shared folder.
16525#[derive(Debug, Clone, PartialEq, Eq)]
16526#[non_exhaustive] // structs may have more fields added in the future.
16527pub struct SharedFolderMetadataBase {
16528    /// The current user's access level for this shared folder.
16529    pub access_type: AccessLevel,
16530    /// Whether this folder is inside of a team folder.
16531    pub is_inside_team_folder: bool,
16532    /// Whether this folder is a [team folder](https://www.dropbox.com/en/help/986).
16533    pub is_team_folder: bool,
16534    /// The display names of the users that own the folder. If the folder is part of a team folder,
16535    /// the display names of the team admins are also included. Absent if the owner display names
16536    /// cannot be fetched.
16537    pub owner_display_names: Option<Vec<String>>,
16538    /// The team that owns the folder. This field is not present if the folder is not owned by a
16539    /// team.
16540    pub owner_team: Option<crate::types::users::Team>,
16541    /// The ID of the parent shared folder. This field is present only if the folder is contained
16542    /// within another shared folder.
16543    pub parent_shared_folder_id: Option<crate::types::common::SharedFolderId>,
16544    /// The full path of this shared folder. Absent for unmounted folders.
16545    pub path_display: Option<String>,
16546    /// The lower-cased full path of this shared folder. Absent for unmounted folders.
16547    pub path_lower: Option<String>,
16548    /// Display name for the parent folder.
16549    pub parent_folder_name: Option<String>,
16550}
16551
16552impl SharedFolderMetadataBase {
16553    pub fn new(
16554        access_type: AccessLevel,
16555        is_inside_team_folder: bool,
16556        is_team_folder: bool,
16557    ) -> Self {
16558        SharedFolderMetadataBase {
16559            access_type,
16560            is_inside_team_folder,
16561            is_team_folder,
16562            owner_display_names: None,
16563            owner_team: None,
16564            parent_shared_folder_id: None,
16565            path_display: None,
16566            path_lower: None,
16567            parent_folder_name: None,
16568        }
16569    }
16570
16571    pub fn with_owner_display_names(mut self, value: Vec<String>) -> Self {
16572        self.owner_display_names = Some(value);
16573        self
16574    }
16575
16576    pub fn with_owner_team(mut self, value: crate::types::users::Team) -> Self {
16577        self.owner_team = Some(value);
16578        self
16579    }
16580
16581    pub fn with_parent_shared_folder_id(
16582        mut self,
16583        value: crate::types::common::SharedFolderId,
16584    ) -> Self {
16585        self.parent_shared_folder_id = Some(value);
16586        self
16587    }
16588
16589    pub fn with_path_display(mut self, value: String) -> Self {
16590        self.path_display = Some(value);
16591        self
16592    }
16593
16594    pub fn with_path_lower(mut self, value: String) -> Self {
16595        self.path_lower = Some(value);
16596        self
16597    }
16598
16599    pub fn with_parent_folder_name(mut self, value: String) -> Self {
16600        self.parent_folder_name = Some(value);
16601        self
16602    }
16603}
16604
16605const SHARED_FOLDER_METADATA_BASE_FIELDS: &[&str] = &["access_type",
16606                                                      "is_inside_team_folder",
16607                                                      "is_team_folder",
16608                                                      "owner_display_names",
16609                                                      "owner_team",
16610                                                      "parent_shared_folder_id",
16611                                                      "path_display",
16612                                                      "path_lower",
16613                                                      "parent_folder_name"];
16614impl SharedFolderMetadataBase {
16615    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
16616        map: V,
16617    ) -> Result<SharedFolderMetadataBase, V::Error> {
16618        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
16619    }
16620
16621    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
16622        mut map: V,
16623        optional: bool,
16624    ) -> Result<Option<SharedFolderMetadataBase>, V::Error> {
16625        let mut field_access_type = None;
16626        let mut field_is_inside_team_folder = None;
16627        let mut field_is_team_folder = None;
16628        let mut field_owner_display_names = None;
16629        let mut field_owner_team = None;
16630        let mut field_parent_shared_folder_id = None;
16631        let mut field_path_display = None;
16632        let mut field_path_lower = None;
16633        let mut field_parent_folder_name = None;
16634        let mut nothing = true;
16635        while let Some(key) = map.next_key::<&str>()? {
16636            nothing = false;
16637            match key {
16638                "access_type" => {
16639                    if field_access_type.is_some() {
16640                        return Err(::serde::de::Error::duplicate_field("access_type"));
16641                    }
16642                    field_access_type = Some(map.next_value()?);
16643                }
16644                "is_inside_team_folder" => {
16645                    if field_is_inside_team_folder.is_some() {
16646                        return Err(::serde::de::Error::duplicate_field("is_inside_team_folder"));
16647                    }
16648                    field_is_inside_team_folder = Some(map.next_value()?);
16649                }
16650                "is_team_folder" => {
16651                    if field_is_team_folder.is_some() {
16652                        return Err(::serde::de::Error::duplicate_field("is_team_folder"));
16653                    }
16654                    field_is_team_folder = Some(map.next_value()?);
16655                }
16656                "owner_display_names" => {
16657                    if field_owner_display_names.is_some() {
16658                        return Err(::serde::de::Error::duplicate_field("owner_display_names"));
16659                    }
16660                    field_owner_display_names = Some(map.next_value()?);
16661                }
16662                "owner_team" => {
16663                    if field_owner_team.is_some() {
16664                        return Err(::serde::de::Error::duplicate_field("owner_team"));
16665                    }
16666                    field_owner_team = Some(map.next_value()?);
16667                }
16668                "parent_shared_folder_id" => {
16669                    if field_parent_shared_folder_id.is_some() {
16670                        return Err(::serde::de::Error::duplicate_field("parent_shared_folder_id"));
16671                    }
16672                    field_parent_shared_folder_id = Some(map.next_value()?);
16673                }
16674                "path_display" => {
16675                    if field_path_display.is_some() {
16676                        return Err(::serde::de::Error::duplicate_field("path_display"));
16677                    }
16678                    field_path_display = Some(map.next_value()?);
16679                }
16680                "path_lower" => {
16681                    if field_path_lower.is_some() {
16682                        return Err(::serde::de::Error::duplicate_field("path_lower"));
16683                    }
16684                    field_path_lower = Some(map.next_value()?);
16685                }
16686                "parent_folder_name" => {
16687                    if field_parent_folder_name.is_some() {
16688                        return Err(::serde::de::Error::duplicate_field("parent_folder_name"));
16689                    }
16690                    field_parent_folder_name = Some(map.next_value()?);
16691                }
16692                _ => {
16693                    // unknown field allowed and ignored
16694                    map.next_value::<::serde_json::Value>()?;
16695                }
16696            }
16697        }
16698        if optional && nothing {
16699            return Ok(None);
16700        }
16701        let result = SharedFolderMetadataBase {
16702            access_type: field_access_type.ok_or_else(|| ::serde::de::Error::missing_field("access_type"))?,
16703            is_inside_team_folder: field_is_inside_team_folder.ok_or_else(|| ::serde::de::Error::missing_field("is_inside_team_folder"))?,
16704            is_team_folder: field_is_team_folder.ok_or_else(|| ::serde::de::Error::missing_field("is_team_folder"))?,
16705            owner_display_names: field_owner_display_names.and_then(Option::flatten),
16706            owner_team: field_owner_team.and_then(Option::flatten),
16707            parent_shared_folder_id: field_parent_shared_folder_id.and_then(Option::flatten),
16708            path_display: field_path_display.and_then(Option::flatten),
16709            path_lower: field_path_lower.and_then(Option::flatten),
16710            parent_folder_name: field_parent_folder_name.and_then(Option::flatten),
16711        };
16712        Ok(Some(result))
16713    }
16714
16715    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
16716        &self,
16717        s: &mut S::SerializeStruct,
16718    ) -> Result<(), S::Error> {
16719        use serde::ser::SerializeStruct;
16720        s.serialize_field("access_type", &self.access_type)?;
16721        s.serialize_field("is_inside_team_folder", &self.is_inside_team_folder)?;
16722        s.serialize_field("is_team_folder", &self.is_team_folder)?;
16723        if let Some(val) = &self.owner_display_names {
16724            s.serialize_field("owner_display_names", val)?;
16725        }
16726        if let Some(val) = &self.owner_team {
16727            s.serialize_field("owner_team", val)?;
16728        }
16729        if let Some(val) = &self.parent_shared_folder_id {
16730            s.serialize_field("parent_shared_folder_id", val)?;
16731        }
16732        if let Some(val) = &self.path_display {
16733            s.serialize_field("path_display", val)?;
16734        }
16735        if let Some(val) = &self.path_lower {
16736            s.serialize_field("path_lower", val)?;
16737        }
16738        if let Some(val) = &self.parent_folder_name {
16739            s.serialize_field("parent_folder_name", val)?;
16740        }
16741        Ok(())
16742    }
16743}
16744
16745impl<'de> ::serde::de::Deserialize<'de> for SharedFolderMetadataBase {
16746    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
16747        // struct deserializer
16748        use serde::de::{MapAccess, Visitor};
16749        struct StructVisitor;
16750        impl<'de> Visitor<'de> for StructVisitor {
16751            type Value = SharedFolderMetadataBase;
16752            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
16753                f.write_str("a SharedFolderMetadataBase struct")
16754            }
16755            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
16756                SharedFolderMetadataBase::internal_deserialize(map)
16757            }
16758        }
16759        deserializer.deserialize_struct("SharedFolderMetadataBase", SHARED_FOLDER_METADATA_BASE_FIELDS, StructVisitor)
16760    }
16761}
16762
16763impl ::serde::ser::Serialize for SharedFolderMetadataBase {
16764    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
16765        // struct serializer
16766        use serde::ser::SerializeStruct;
16767        let mut s = serializer.serialize_struct("SharedFolderMetadataBase", 9)?;
16768        self.internal_serialize::<S>(&mut s)?;
16769        s.end()
16770    }
16771}
16772
16773#[derive(Debug, Clone, PartialEq, Eq)]
16774#[non_exhaustive] // variants may be added in the future
16775pub enum SharedLinkAccessFailureReason {
16776    /// User is not logged in.
16777    LoginRequired,
16778    /// This user's email address is not verified. This functionality is only available on accounts
16779    /// with a verified email address. Users can verify their email address
16780    /// [here](https://www.dropbox.com/help/317).
16781    EmailVerifyRequired,
16782    /// The link is password protected.
16783    PasswordRequired,
16784    /// Access is allowed for team members only.
16785    TeamOnly,
16786    /// Access is allowed for the shared link's owner only.
16787    OwnerOnly,
16788    /// Catch-all used for unrecognized values returned from the server. Encountering this value
16789    /// typically indicates that this SDK version is out of date.
16790    Other,
16791}
16792
16793impl<'de> ::serde::de::Deserialize<'de> for SharedLinkAccessFailureReason {
16794    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
16795        // union deserializer
16796        use serde::de::{self, MapAccess, Visitor};
16797        struct EnumVisitor;
16798        impl<'de> Visitor<'de> for EnumVisitor {
16799            type Value = SharedLinkAccessFailureReason;
16800            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
16801                f.write_str("a SharedLinkAccessFailureReason structure")
16802            }
16803            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
16804                let tag: &str = match map.next_key()? {
16805                    Some(".tag") => map.next_value()?,
16806                    _ => return Err(de::Error::missing_field(".tag"))
16807                };
16808                let value = match tag {
16809                    "login_required" => SharedLinkAccessFailureReason::LoginRequired,
16810                    "email_verify_required" => SharedLinkAccessFailureReason::EmailVerifyRequired,
16811                    "password_required" => SharedLinkAccessFailureReason::PasswordRequired,
16812                    "team_only" => SharedLinkAccessFailureReason::TeamOnly,
16813                    "owner_only" => SharedLinkAccessFailureReason::OwnerOnly,
16814                    _ => SharedLinkAccessFailureReason::Other,
16815                };
16816                crate::eat_json_fields(&mut map)?;
16817                Ok(value)
16818            }
16819        }
16820        const VARIANTS: &[&str] = &["login_required",
16821                                    "email_verify_required",
16822                                    "password_required",
16823                                    "team_only",
16824                                    "owner_only",
16825                                    "other"];
16826        deserializer.deserialize_struct("SharedLinkAccessFailureReason", VARIANTS, EnumVisitor)
16827    }
16828}
16829
16830impl ::serde::ser::Serialize for SharedLinkAccessFailureReason {
16831    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
16832        // union serializer
16833        use serde::ser::SerializeStruct;
16834        match self {
16835            SharedLinkAccessFailureReason::LoginRequired => {
16836                // unit
16837                let mut s = serializer.serialize_struct("SharedLinkAccessFailureReason", 1)?;
16838                s.serialize_field(".tag", "login_required")?;
16839                s.end()
16840            }
16841            SharedLinkAccessFailureReason::EmailVerifyRequired => {
16842                // unit
16843                let mut s = serializer.serialize_struct("SharedLinkAccessFailureReason", 1)?;
16844                s.serialize_field(".tag", "email_verify_required")?;
16845                s.end()
16846            }
16847            SharedLinkAccessFailureReason::PasswordRequired => {
16848                // unit
16849                let mut s = serializer.serialize_struct("SharedLinkAccessFailureReason", 1)?;
16850                s.serialize_field(".tag", "password_required")?;
16851                s.end()
16852            }
16853            SharedLinkAccessFailureReason::TeamOnly => {
16854                // unit
16855                let mut s = serializer.serialize_struct("SharedLinkAccessFailureReason", 1)?;
16856                s.serialize_field(".tag", "team_only")?;
16857                s.end()
16858            }
16859            SharedLinkAccessFailureReason::OwnerOnly => {
16860                // unit
16861                let mut s = serializer.serialize_struct("SharedLinkAccessFailureReason", 1)?;
16862                s.serialize_field(".tag", "owner_only")?;
16863                s.end()
16864            }
16865            SharedLinkAccessFailureReason::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
16866        }
16867    }
16868}
16869
16870#[derive(Debug, Clone, PartialEq, Eq)]
16871#[non_exhaustive] // variants may be added in the future
16872pub enum SharedLinkAlreadyExistsMetadata {
16873    /// Metadata of the shared link that already exists.
16874    Metadata(SharedLinkMetadata),
16875    /// Catch-all used for unrecognized values returned from the server. Encountering this value
16876    /// typically indicates that this SDK version is out of date.
16877    Other,
16878}
16879
16880impl<'de> ::serde::de::Deserialize<'de> for SharedLinkAlreadyExistsMetadata {
16881    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
16882        // union deserializer
16883        use serde::de::{self, MapAccess, Visitor};
16884        struct EnumVisitor;
16885        impl<'de> Visitor<'de> for EnumVisitor {
16886            type Value = SharedLinkAlreadyExistsMetadata;
16887            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
16888                f.write_str("a SharedLinkAlreadyExistsMetadata structure")
16889            }
16890            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
16891                let tag: &str = match map.next_key()? {
16892                    Some(".tag") => map.next_value()?,
16893                    _ => return Err(de::Error::missing_field(".tag"))
16894                };
16895                let value = match tag {
16896                    "metadata" => {
16897                        match map.next_key()? {
16898                            Some("metadata") => SharedLinkAlreadyExistsMetadata::Metadata(map.next_value()?),
16899                            None => return Err(de::Error::missing_field("metadata")),
16900                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
16901                        }
16902                    }
16903                    _ => SharedLinkAlreadyExistsMetadata::Other,
16904                };
16905                crate::eat_json_fields(&mut map)?;
16906                Ok(value)
16907            }
16908        }
16909        const VARIANTS: &[&str] = &["metadata",
16910                                    "other"];
16911        deserializer.deserialize_struct("SharedLinkAlreadyExistsMetadata", VARIANTS, EnumVisitor)
16912    }
16913}
16914
16915impl ::serde::ser::Serialize for SharedLinkAlreadyExistsMetadata {
16916    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
16917        // union serializer
16918        use serde::ser::SerializeStruct;
16919        match self {
16920            SharedLinkAlreadyExistsMetadata::Metadata(x) => {
16921                // union or polymporphic struct
16922                let mut s = serializer.serialize_struct("SharedLinkAlreadyExistsMetadata", 2)?;
16923                s.serialize_field(".tag", "metadata")?;
16924                s.serialize_field("metadata", x)?;
16925                s.end()
16926            }
16927            SharedLinkAlreadyExistsMetadata::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
16928        }
16929    }
16930}
16931
16932#[derive(Debug, Clone, PartialEq, Eq)]
16933#[non_exhaustive] // variants may be added in the future
16934pub enum SharedLinkError {
16935    /// The shared link wasn't found.
16936    SharedLinkNotFound,
16937    /// The caller is not allowed to access this shared link.
16938    SharedLinkAccessDenied,
16939    /// This type of link is not supported; use [`files::export()`](crate::files::export) instead.
16940    UnsupportedLinkType,
16941    /// Catch-all used for unrecognized values returned from the server. Encountering this value
16942    /// typically indicates that this SDK version is out of date.
16943    Other,
16944}
16945
16946impl<'de> ::serde::de::Deserialize<'de> for SharedLinkError {
16947    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
16948        // union deserializer
16949        use serde::de::{self, MapAccess, Visitor};
16950        struct EnumVisitor;
16951        impl<'de> Visitor<'de> for EnumVisitor {
16952            type Value = SharedLinkError;
16953            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
16954                f.write_str("a SharedLinkError structure")
16955            }
16956            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
16957                let tag: &str = match map.next_key()? {
16958                    Some(".tag") => map.next_value()?,
16959                    _ => return Err(de::Error::missing_field(".tag"))
16960                };
16961                let value = match tag {
16962                    "shared_link_not_found" => SharedLinkError::SharedLinkNotFound,
16963                    "shared_link_access_denied" => SharedLinkError::SharedLinkAccessDenied,
16964                    "unsupported_link_type" => SharedLinkError::UnsupportedLinkType,
16965                    _ => SharedLinkError::Other,
16966                };
16967                crate::eat_json_fields(&mut map)?;
16968                Ok(value)
16969            }
16970        }
16971        const VARIANTS: &[&str] = &["shared_link_not_found",
16972                                    "shared_link_access_denied",
16973                                    "unsupported_link_type",
16974                                    "other"];
16975        deserializer.deserialize_struct("SharedLinkError", VARIANTS, EnumVisitor)
16976    }
16977}
16978
16979impl ::serde::ser::Serialize for SharedLinkError {
16980    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
16981        // union serializer
16982        use serde::ser::SerializeStruct;
16983        match self {
16984            SharedLinkError::SharedLinkNotFound => {
16985                // unit
16986                let mut s = serializer.serialize_struct("SharedLinkError", 1)?;
16987                s.serialize_field(".tag", "shared_link_not_found")?;
16988                s.end()
16989            }
16990            SharedLinkError::SharedLinkAccessDenied => {
16991                // unit
16992                let mut s = serializer.serialize_struct("SharedLinkError", 1)?;
16993                s.serialize_field(".tag", "shared_link_access_denied")?;
16994                s.end()
16995            }
16996            SharedLinkError::UnsupportedLinkType => {
16997                // unit
16998                let mut s = serializer.serialize_struct("SharedLinkError", 1)?;
16999                s.serialize_field(".tag", "unsupported_link_type")?;
17000                s.end()
17001            }
17002            SharedLinkError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
17003        }
17004    }
17005}
17006
17007impl ::std::error::Error for SharedLinkError {
17008}
17009
17010impl ::std::fmt::Display for SharedLinkError {
17011    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17012        match self {
17013            SharedLinkError::SharedLinkNotFound => f.write_str("The shared link wasn't found."),
17014            SharedLinkError::SharedLinkAccessDenied => f.write_str("The caller is not allowed to access this shared link."),
17015            _ => write!(f, "{:?}", *self),
17016        }
17017    }
17018}
17019
17020/// The metadata of a shared link.
17021#[derive(Debug, Clone, PartialEq, Eq)]
17022#[non_exhaustive] // variants may be added in the future
17023pub enum SharedLinkMetadata {
17024    File(FileLinkMetadata),
17025    Folder(FolderLinkMetadata),
17026    /// Catch-all used for unrecognized values returned from the server. Encountering this value
17027    /// typically indicates that this SDK version is out of date.
17028    Other,
17029}
17030
17031impl<'de> ::serde::de::Deserialize<'de> for SharedLinkMetadata {
17032    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
17033        // polymorphic struct deserializer
17034        use serde::de::{self, MapAccess, Visitor};
17035        struct EnumVisitor;
17036        impl<'de> Visitor<'de> for EnumVisitor {
17037            type Value = SharedLinkMetadata;
17038            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17039                f.write_str("a SharedLinkMetadata structure")
17040            }
17041            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
17042                let tag = match map.next_key()? {
17043                    Some(".tag") => map.next_value()?,
17044                    _ => return Err(de::Error::missing_field(".tag"))
17045                };
17046                match tag {
17047                    "file" => Ok(SharedLinkMetadata::File(FileLinkMetadata::internal_deserialize(map)?)),
17048                    "folder" => Ok(SharedLinkMetadata::Folder(FolderLinkMetadata::internal_deserialize(map)?)),
17049                    _ => {
17050                        crate::eat_json_fields(&mut map)?;
17051                        Ok(SharedLinkMetadata::Other)
17052                    }
17053                }
17054            }
17055        }
17056        const VARIANTS: &[&str] = &["file",
17057                                    "folder"];
17058        deserializer.deserialize_struct("SharedLinkMetadata", VARIANTS, EnumVisitor)
17059    }
17060}
17061
17062impl ::serde::ser::Serialize for SharedLinkMetadata {
17063    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
17064        // polymorphic struct serializer
17065        use serde::ser::SerializeStruct;
17066        match self {
17067            SharedLinkMetadata::File(x) => {
17068                let mut s = serializer.serialize_struct("SharedLinkMetadata", 13)?;
17069                s.serialize_field(".tag", "file")?;
17070                x.internal_serialize::<S>(&mut s)?;
17071                s.end()
17072            }
17073            SharedLinkMetadata::Folder(x) => {
17074                let mut s = serializer.serialize_struct("SharedLinkMetadata", 9)?;
17075                s.serialize_field(".tag", "folder")?;
17076                x.internal_serialize::<S>(&mut s)?;
17077                s.end()
17078            }
17079            SharedLinkMetadata::Other => Err(::serde::ser::Error::custom("cannot serialize unknown variant"))
17080        }
17081    }
17082}
17083
17084/// Who can view shared links in this folder.
17085#[derive(Debug, Clone, PartialEq, Eq)]
17086#[non_exhaustive] // variants may be added in the future
17087pub enum SharedLinkPolicy {
17088    /// Links can be shared with anyone.
17089    Anyone,
17090    /// Links can be shared with anyone on the same team as the owner.
17091    Team,
17092    /// Links can only be shared among members of the shared folder.
17093    Members,
17094    /// Catch-all used for unrecognized values returned from the server. Encountering this value
17095    /// typically indicates that this SDK version is out of date.
17096    Other,
17097}
17098
17099impl<'de> ::serde::de::Deserialize<'de> for SharedLinkPolicy {
17100    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
17101        // union deserializer
17102        use serde::de::{self, MapAccess, Visitor};
17103        struct EnumVisitor;
17104        impl<'de> Visitor<'de> for EnumVisitor {
17105            type Value = SharedLinkPolicy;
17106            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17107                f.write_str("a SharedLinkPolicy structure")
17108            }
17109            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
17110                let tag: &str = match map.next_key()? {
17111                    Some(".tag") => map.next_value()?,
17112                    _ => return Err(de::Error::missing_field(".tag"))
17113                };
17114                let value = match tag {
17115                    "anyone" => SharedLinkPolicy::Anyone,
17116                    "team" => SharedLinkPolicy::Team,
17117                    "members" => SharedLinkPolicy::Members,
17118                    _ => SharedLinkPolicy::Other,
17119                };
17120                crate::eat_json_fields(&mut map)?;
17121                Ok(value)
17122            }
17123        }
17124        const VARIANTS: &[&str] = &["anyone",
17125                                    "team",
17126                                    "members",
17127                                    "other"];
17128        deserializer.deserialize_struct("SharedLinkPolicy", VARIANTS, EnumVisitor)
17129    }
17130}
17131
17132impl ::serde::ser::Serialize for SharedLinkPolicy {
17133    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
17134        // union serializer
17135        use serde::ser::SerializeStruct;
17136        match self {
17137            SharedLinkPolicy::Anyone => {
17138                // unit
17139                let mut s = serializer.serialize_struct("SharedLinkPolicy", 1)?;
17140                s.serialize_field(".tag", "anyone")?;
17141                s.end()
17142            }
17143            SharedLinkPolicy::Team => {
17144                // unit
17145                let mut s = serializer.serialize_struct("SharedLinkPolicy", 1)?;
17146                s.serialize_field(".tag", "team")?;
17147                s.end()
17148            }
17149            SharedLinkPolicy::Members => {
17150                // unit
17151                let mut s = serializer.serialize_struct("SharedLinkPolicy", 1)?;
17152                s.serialize_field(".tag", "members")?;
17153                s.end()
17154            }
17155            SharedLinkPolicy::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
17156        }
17157    }
17158}
17159
17160#[derive(Debug, Clone, PartialEq, Eq, Default)]
17161#[non_exhaustive] // structs may have more fields added in the future.
17162pub struct SharedLinkSettings {
17163    /// Boolean flag to enable or disable password protection.
17164    pub require_password: Option<bool>,
17165    /// If `require_password` is true, this is needed to specify the password to access the link.
17166    pub link_password: Option<String>,
17167    /// Expiration time of the shared link. By default the link won't expire.
17168    pub expires: Option<crate::types::common::DropboxTimestamp>,
17169    /// The new audience who can benefit from the access level specified by the link's access level
17170    /// specified in the `link_access_level` field of `LinkPermissions`. This is used in conjunction
17171    /// with team policies and shared folder policies to determine the final effective audience type
17172    /// in the `effective_audience` field of `LinkPermissions.
17173    pub audience: Option<LinkAudience>,
17174    /// Requested access level you want the audience to gain from this link. Note, modifying access
17175    /// level for an existing link is not supported.
17176    pub access: Option<RequestedLinkAccessLevel>,
17177    /// Use `audience` instead.  The requested access for this shared link.
17178    pub requested_visibility: Option<RequestedVisibility>,
17179    /// Boolean flag to allow or not download capabilities for shared links.
17180    pub allow_download: Option<bool>,
17181}
17182
17183impl SharedLinkSettings {
17184    pub fn with_require_password(mut self, value: bool) -> Self {
17185        self.require_password = Some(value);
17186        self
17187    }
17188
17189    pub fn with_link_password(mut self, value: String) -> Self {
17190        self.link_password = Some(value);
17191        self
17192    }
17193
17194    pub fn with_expires(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
17195        self.expires = Some(value);
17196        self
17197    }
17198
17199    pub fn with_audience(mut self, value: LinkAudience) -> Self {
17200        self.audience = Some(value);
17201        self
17202    }
17203
17204    pub fn with_access(mut self, value: RequestedLinkAccessLevel) -> Self {
17205        self.access = Some(value);
17206        self
17207    }
17208
17209    pub fn with_requested_visibility(mut self, value: RequestedVisibility) -> Self {
17210        self.requested_visibility = Some(value);
17211        self
17212    }
17213
17214    pub fn with_allow_download(mut self, value: bool) -> Self {
17215        self.allow_download = Some(value);
17216        self
17217    }
17218}
17219
17220const SHARED_LINK_SETTINGS_FIELDS: &[&str] = &["require_password",
17221                                               "link_password",
17222                                               "expires",
17223                                               "audience",
17224                                               "access",
17225                                               "requested_visibility",
17226                                               "allow_download"];
17227impl SharedLinkSettings {
17228    // no _opt deserializer
17229    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
17230        mut map: V,
17231    ) -> Result<SharedLinkSettings, V::Error> {
17232        let mut field_require_password = None;
17233        let mut field_link_password = None;
17234        let mut field_expires = None;
17235        let mut field_audience = None;
17236        let mut field_access = None;
17237        let mut field_requested_visibility = None;
17238        let mut field_allow_download = None;
17239        while let Some(key) = map.next_key::<&str>()? {
17240            match key {
17241                "require_password" => {
17242                    if field_require_password.is_some() {
17243                        return Err(::serde::de::Error::duplicate_field("require_password"));
17244                    }
17245                    field_require_password = Some(map.next_value()?);
17246                }
17247                "link_password" => {
17248                    if field_link_password.is_some() {
17249                        return Err(::serde::de::Error::duplicate_field("link_password"));
17250                    }
17251                    field_link_password = Some(map.next_value()?);
17252                }
17253                "expires" => {
17254                    if field_expires.is_some() {
17255                        return Err(::serde::de::Error::duplicate_field("expires"));
17256                    }
17257                    field_expires = Some(map.next_value()?);
17258                }
17259                "audience" => {
17260                    if field_audience.is_some() {
17261                        return Err(::serde::de::Error::duplicate_field("audience"));
17262                    }
17263                    field_audience = Some(map.next_value()?);
17264                }
17265                "access" => {
17266                    if field_access.is_some() {
17267                        return Err(::serde::de::Error::duplicate_field("access"));
17268                    }
17269                    field_access = Some(map.next_value()?);
17270                }
17271                "requested_visibility" => {
17272                    if field_requested_visibility.is_some() {
17273                        return Err(::serde::de::Error::duplicate_field("requested_visibility"));
17274                    }
17275                    field_requested_visibility = Some(map.next_value()?);
17276                }
17277                "allow_download" => {
17278                    if field_allow_download.is_some() {
17279                        return Err(::serde::de::Error::duplicate_field("allow_download"));
17280                    }
17281                    field_allow_download = Some(map.next_value()?);
17282                }
17283                _ => {
17284                    // unknown field allowed and ignored
17285                    map.next_value::<::serde_json::Value>()?;
17286                }
17287            }
17288        }
17289        let result = SharedLinkSettings {
17290            require_password: field_require_password.and_then(Option::flatten),
17291            link_password: field_link_password.and_then(Option::flatten),
17292            expires: field_expires.and_then(Option::flatten),
17293            audience: field_audience.and_then(Option::flatten),
17294            access: field_access.and_then(Option::flatten),
17295            requested_visibility: field_requested_visibility.and_then(Option::flatten),
17296            allow_download: field_allow_download.and_then(Option::flatten),
17297        };
17298        Ok(result)
17299    }
17300
17301    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
17302        &self,
17303        s: &mut S::SerializeStruct,
17304    ) -> Result<(), S::Error> {
17305        use serde::ser::SerializeStruct;
17306        if let Some(val) = &self.require_password {
17307            s.serialize_field("require_password", val)?;
17308        }
17309        if let Some(val) = &self.link_password {
17310            s.serialize_field("link_password", val)?;
17311        }
17312        if let Some(val) = &self.expires {
17313            s.serialize_field("expires", val)?;
17314        }
17315        if let Some(val) = &self.audience {
17316            s.serialize_field("audience", val)?;
17317        }
17318        if let Some(val) = &self.access {
17319            s.serialize_field("access", val)?;
17320        }
17321        if let Some(val) = &self.requested_visibility {
17322            s.serialize_field("requested_visibility", val)?;
17323        }
17324        if let Some(val) = &self.allow_download {
17325            s.serialize_field("allow_download", val)?;
17326        }
17327        Ok(())
17328    }
17329}
17330
17331impl<'de> ::serde::de::Deserialize<'de> for SharedLinkSettings {
17332    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
17333        // struct deserializer
17334        use serde::de::{MapAccess, Visitor};
17335        struct StructVisitor;
17336        impl<'de> Visitor<'de> for StructVisitor {
17337            type Value = SharedLinkSettings;
17338            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17339                f.write_str("a SharedLinkSettings struct")
17340            }
17341            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
17342                SharedLinkSettings::internal_deserialize(map)
17343            }
17344        }
17345        deserializer.deserialize_struct("SharedLinkSettings", SHARED_LINK_SETTINGS_FIELDS, StructVisitor)
17346    }
17347}
17348
17349impl ::serde::ser::Serialize for SharedLinkSettings {
17350    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
17351        // struct serializer
17352        use serde::ser::SerializeStruct;
17353        let mut s = serializer.serialize_struct("SharedLinkSettings", 7)?;
17354        self.internal_serialize::<S>(&mut s)?;
17355        s.end()
17356    }
17357}
17358
17359#[derive(Debug, Clone, PartialEq, Eq)]
17360pub enum SharedLinkSettingsError {
17361    /// The given settings are invalid (for example, all attributes of the [`SharedLinkSettings`]
17362    /// are empty, the requested visibility is [`RequestedVisibility::Password`] but the
17363    /// [`SharedLinkSettings::link_password`](SharedLinkSettings) is missing,
17364    /// [`SharedLinkSettings::expires`](SharedLinkSettings) is set to the past, etc.).
17365    InvalidSettings,
17366    /// User is not allowed to modify the settings of this link. Note that basic users can only set
17367    /// [`RequestedVisibility::Public`] as the
17368    /// [`SharedLinkSettings::requested_visibility`](SharedLinkSettings) and cannot set
17369    /// [`SharedLinkSettings::expires`](SharedLinkSettings).
17370    NotAuthorized,
17371}
17372
17373impl<'de> ::serde::de::Deserialize<'de> for SharedLinkSettingsError {
17374    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
17375        // union deserializer
17376        use serde::de::{self, MapAccess, Visitor};
17377        struct EnumVisitor;
17378        impl<'de> Visitor<'de> for EnumVisitor {
17379            type Value = SharedLinkSettingsError;
17380            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17381                f.write_str("a SharedLinkSettingsError structure")
17382            }
17383            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
17384                let tag: &str = match map.next_key()? {
17385                    Some(".tag") => map.next_value()?,
17386                    _ => return Err(de::Error::missing_field(".tag"))
17387                };
17388                let value = match tag {
17389                    "invalid_settings" => SharedLinkSettingsError::InvalidSettings,
17390                    "not_authorized" => SharedLinkSettingsError::NotAuthorized,
17391                    _ => return Err(de::Error::unknown_variant(tag, VARIANTS))
17392                };
17393                crate::eat_json_fields(&mut map)?;
17394                Ok(value)
17395            }
17396        }
17397        const VARIANTS: &[&str] = &["invalid_settings",
17398                                    "not_authorized"];
17399        deserializer.deserialize_struct("SharedLinkSettingsError", VARIANTS, EnumVisitor)
17400    }
17401}
17402
17403impl ::serde::ser::Serialize for SharedLinkSettingsError {
17404    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
17405        // union serializer
17406        use serde::ser::SerializeStruct;
17407        match self {
17408            SharedLinkSettingsError::InvalidSettings => {
17409                // unit
17410                let mut s = serializer.serialize_struct("SharedLinkSettingsError", 1)?;
17411                s.serialize_field(".tag", "invalid_settings")?;
17412                s.end()
17413            }
17414            SharedLinkSettingsError::NotAuthorized => {
17415                // unit
17416                let mut s = serializer.serialize_struct("SharedLinkSettingsError", 1)?;
17417                s.serialize_field(".tag", "not_authorized")?;
17418                s.end()
17419            }
17420        }
17421    }
17422}
17423
17424impl ::std::error::Error for SharedLinkSettingsError {
17425}
17426
17427impl ::std::fmt::Display for SharedLinkSettingsError {
17428    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17429        write!(f, "{:?}", *self)
17430    }
17431}
17432
17433/// User could not access this file.
17434#[derive(Debug, Clone, PartialEq, Eq)]
17435#[non_exhaustive] // variants may be added in the future
17436pub enum SharingFileAccessError {
17437    /// Current user does not have sufficient privileges to perform the desired action.
17438    NoPermission,
17439    /// File specified was not found.
17440    InvalidFile,
17441    /// A folder can't be shared this way. Use folder sharing or a shared link instead.
17442    IsFolder,
17443    /// A file inside a public folder can't be shared this way. Use a public link instead.
17444    InsidePublicFolder,
17445    /// A Mac OS X package can't be shared this way. Use a shared link instead.
17446    InsideOsxPackage,
17447    /// Catch-all used for unrecognized values returned from the server. Encountering this value
17448    /// typically indicates that this SDK version is out of date.
17449    Other,
17450}
17451
17452impl<'de> ::serde::de::Deserialize<'de> for SharingFileAccessError {
17453    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
17454        // union deserializer
17455        use serde::de::{self, MapAccess, Visitor};
17456        struct EnumVisitor;
17457        impl<'de> Visitor<'de> for EnumVisitor {
17458            type Value = SharingFileAccessError;
17459            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17460                f.write_str("a SharingFileAccessError structure")
17461            }
17462            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
17463                let tag: &str = match map.next_key()? {
17464                    Some(".tag") => map.next_value()?,
17465                    _ => return Err(de::Error::missing_field(".tag"))
17466                };
17467                let value = match tag {
17468                    "no_permission" => SharingFileAccessError::NoPermission,
17469                    "invalid_file" => SharingFileAccessError::InvalidFile,
17470                    "is_folder" => SharingFileAccessError::IsFolder,
17471                    "inside_public_folder" => SharingFileAccessError::InsidePublicFolder,
17472                    "inside_osx_package" => SharingFileAccessError::InsideOsxPackage,
17473                    _ => SharingFileAccessError::Other,
17474                };
17475                crate::eat_json_fields(&mut map)?;
17476                Ok(value)
17477            }
17478        }
17479        const VARIANTS: &[&str] = &["no_permission",
17480                                    "invalid_file",
17481                                    "is_folder",
17482                                    "inside_public_folder",
17483                                    "inside_osx_package",
17484                                    "other"];
17485        deserializer.deserialize_struct("SharingFileAccessError", VARIANTS, EnumVisitor)
17486    }
17487}
17488
17489impl ::serde::ser::Serialize for SharingFileAccessError {
17490    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
17491        // union serializer
17492        use serde::ser::SerializeStruct;
17493        match self {
17494            SharingFileAccessError::NoPermission => {
17495                // unit
17496                let mut s = serializer.serialize_struct("SharingFileAccessError", 1)?;
17497                s.serialize_field(".tag", "no_permission")?;
17498                s.end()
17499            }
17500            SharingFileAccessError::InvalidFile => {
17501                // unit
17502                let mut s = serializer.serialize_struct("SharingFileAccessError", 1)?;
17503                s.serialize_field(".tag", "invalid_file")?;
17504                s.end()
17505            }
17506            SharingFileAccessError::IsFolder => {
17507                // unit
17508                let mut s = serializer.serialize_struct("SharingFileAccessError", 1)?;
17509                s.serialize_field(".tag", "is_folder")?;
17510                s.end()
17511            }
17512            SharingFileAccessError::InsidePublicFolder => {
17513                // unit
17514                let mut s = serializer.serialize_struct("SharingFileAccessError", 1)?;
17515                s.serialize_field(".tag", "inside_public_folder")?;
17516                s.end()
17517            }
17518            SharingFileAccessError::InsideOsxPackage => {
17519                // unit
17520                let mut s = serializer.serialize_struct("SharingFileAccessError", 1)?;
17521                s.serialize_field(".tag", "inside_osx_package")?;
17522                s.end()
17523            }
17524            SharingFileAccessError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
17525        }
17526    }
17527}
17528
17529impl ::std::error::Error for SharingFileAccessError {
17530}
17531
17532impl ::std::fmt::Display for SharingFileAccessError {
17533    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17534        match self {
17535            SharingFileAccessError::NoPermission => f.write_str("Current user does not have sufficient privileges to perform the desired action."),
17536            SharingFileAccessError::InvalidFile => f.write_str("File specified was not found."),
17537            SharingFileAccessError::IsFolder => f.write_str("A folder can't be shared this way. Use folder sharing or a shared link instead."),
17538            SharingFileAccessError::InsidePublicFolder => f.write_str("A file inside a public folder can't be shared this way. Use a public link instead."),
17539            SharingFileAccessError::InsideOsxPackage => f.write_str("A Mac OS X package can't be shared this way. Use a shared link instead."),
17540            _ => write!(f, "{:?}", *self),
17541        }
17542    }
17543}
17544
17545/// User account had a problem preventing this action.
17546#[derive(Debug, Clone, PartialEq, Eq)]
17547#[non_exhaustive] // variants may be added in the future
17548pub enum SharingUserError {
17549    /// This user's email address is not verified. This functionality is only available on accounts
17550    /// with a verified email address. Users can verify their email address
17551    /// [here](https://www.dropbox.com/help/317).
17552    EmailUnverified,
17553    /// Catch-all used for unrecognized values returned from the server. Encountering this value
17554    /// typically indicates that this SDK version is out of date.
17555    Other,
17556}
17557
17558impl<'de> ::serde::de::Deserialize<'de> for SharingUserError {
17559    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
17560        // union deserializer
17561        use serde::de::{self, MapAccess, Visitor};
17562        struct EnumVisitor;
17563        impl<'de> Visitor<'de> for EnumVisitor {
17564            type Value = SharingUserError;
17565            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17566                f.write_str("a SharingUserError structure")
17567            }
17568            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
17569                let tag: &str = match map.next_key()? {
17570                    Some(".tag") => map.next_value()?,
17571                    _ => return Err(de::Error::missing_field(".tag"))
17572                };
17573                let value = match tag {
17574                    "email_unverified" => SharingUserError::EmailUnverified,
17575                    _ => SharingUserError::Other,
17576                };
17577                crate::eat_json_fields(&mut map)?;
17578                Ok(value)
17579            }
17580        }
17581        const VARIANTS: &[&str] = &["email_unverified",
17582                                    "other"];
17583        deserializer.deserialize_struct("SharingUserError", VARIANTS, EnumVisitor)
17584    }
17585}
17586
17587impl ::serde::ser::Serialize for SharingUserError {
17588    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
17589        // union serializer
17590        use serde::ser::SerializeStruct;
17591        match self {
17592            SharingUserError::EmailUnverified => {
17593                // unit
17594                let mut s = serializer.serialize_struct("SharingUserError", 1)?;
17595                s.serialize_field(".tag", "email_unverified")?;
17596                s.end()
17597            }
17598            SharingUserError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
17599        }
17600    }
17601}
17602
17603impl ::std::error::Error for SharingUserError {
17604}
17605
17606impl ::std::fmt::Display for SharingUserError {
17607    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17608        write!(f, "{:?}", *self)
17609    }
17610}
17611
17612/// Information about a team member.
17613#[derive(Debug, Clone, PartialEq, Eq)]
17614#[non_exhaustive] // structs may have more fields added in the future.
17615pub struct TeamMemberInfo {
17616    /// Information about the member's team.
17617    pub team_info: TeamInfo,
17618    /// The display name of the user.
17619    pub display_name: String,
17620    /// ID of user as a member of a team. This field will only be present if the member is in the
17621    /// same team as current user.
17622    pub member_id: Option<String>,
17623}
17624
17625impl TeamMemberInfo {
17626    pub fn new(team_info: TeamInfo, display_name: String) -> Self {
17627        TeamMemberInfo {
17628            team_info,
17629            display_name,
17630            member_id: None,
17631        }
17632    }
17633
17634    pub fn with_member_id(mut self, value: String) -> Self {
17635        self.member_id = Some(value);
17636        self
17637    }
17638}
17639
17640const TEAM_MEMBER_INFO_FIELDS: &[&str] = &["team_info",
17641                                           "display_name",
17642                                           "member_id"];
17643impl TeamMemberInfo {
17644    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
17645        map: V,
17646    ) -> Result<TeamMemberInfo, V::Error> {
17647        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
17648    }
17649
17650    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
17651        mut map: V,
17652        optional: bool,
17653    ) -> Result<Option<TeamMemberInfo>, V::Error> {
17654        let mut field_team_info = None;
17655        let mut field_display_name = None;
17656        let mut field_member_id = None;
17657        let mut nothing = true;
17658        while let Some(key) = map.next_key::<&str>()? {
17659            nothing = false;
17660            match key {
17661                "team_info" => {
17662                    if field_team_info.is_some() {
17663                        return Err(::serde::de::Error::duplicate_field("team_info"));
17664                    }
17665                    field_team_info = Some(map.next_value()?);
17666                }
17667                "display_name" => {
17668                    if field_display_name.is_some() {
17669                        return Err(::serde::de::Error::duplicate_field("display_name"));
17670                    }
17671                    field_display_name = Some(map.next_value()?);
17672                }
17673                "member_id" => {
17674                    if field_member_id.is_some() {
17675                        return Err(::serde::de::Error::duplicate_field("member_id"));
17676                    }
17677                    field_member_id = Some(map.next_value()?);
17678                }
17679                _ => {
17680                    // unknown field allowed and ignored
17681                    map.next_value::<::serde_json::Value>()?;
17682                }
17683            }
17684        }
17685        if optional && nothing {
17686            return Ok(None);
17687        }
17688        let result = TeamMemberInfo {
17689            team_info: field_team_info.ok_or_else(|| ::serde::de::Error::missing_field("team_info"))?,
17690            display_name: field_display_name.ok_or_else(|| ::serde::de::Error::missing_field("display_name"))?,
17691            member_id: field_member_id.and_then(Option::flatten),
17692        };
17693        Ok(Some(result))
17694    }
17695
17696    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
17697        &self,
17698        s: &mut S::SerializeStruct,
17699    ) -> Result<(), S::Error> {
17700        use serde::ser::SerializeStruct;
17701        s.serialize_field("team_info", &self.team_info)?;
17702        s.serialize_field("display_name", &self.display_name)?;
17703        if let Some(val) = &self.member_id {
17704            s.serialize_field("member_id", val)?;
17705        }
17706        Ok(())
17707    }
17708}
17709
17710impl<'de> ::serde::de::Deserialize<'de> for TeamMemberInfo {
17711    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
17712        // struct deserializer
17713        use serde::de::{MapAccess, Visitor};
17714        struct StructVisitor;
17715        impl<'de> Visitor<'de> for StructVisitor {
17716            type Value = TeamMemberInfo;
17717            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17718                f.write_str("a TeamMemberInfo struct")
17719            }
17720            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
17721                TeamMemberInfo::internal_deserialize(map)
17722            }
17723        }
17724        deserializer.deserialize_struct("TeamMemberInfo", TEAM_MEMBER_INFO_FIELDS, StructVisitor)
17725    }
17726}
17727
17728impl ::serde::ser::Serialize for TeamMemberInfo {
17729    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
17730        // struct serializer
17731        use serde::ser::SerializeStruct;
17732        let mut s = serializer.serialize_struct("TeamMemberInfo", 3)?;
17733        self.internal_serialize::<S>(&mut s)?;
17734        s.end()
17735    }
17736}
17737
17738#[derive(Debug, Clone, PartialEq, Eq)]
17739#[non_exhaustive] // structs may have more fields added in the future.
17740pub struct TransferFolderArg {
17741    /// The ID for the shared folder.
17742    pub shared_folder_id: crate::types::common::SharedFolderId,
17743    /// A account or team member ID to transfer ownership to.
17744    pub to_dropbox_id: DropboxId,
17745}
17746
17747impl TransferFolderArg {
17748    pub fn new(
17749        shared_folder_id: crate::types::common::SharedFolderId,
17750        to_dropbox_id: DropboxId,
17751    ) -> Self {
17752        TransferFolderArg {
17753            shared_folder_id,
17754            to_dropbox_id,
17755        }
17756    }
17757}
17758
17759const TRANSFER_FOLDER_ARG_FIELDS: &[&str] = &["shared_folder_id",
17760                                              "to_dropbox_id"];
17761impl TransferFolderArg {
17762    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
17763        map: V,
17764    ) -> Result<TransferFolderArg, V::Error> {
17765        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
17766    }
17767
17768    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
17769        mut map: V,
17770        optional: bool,
17771    ) -> Result<Option<TransferFolderArg>, V::Error> {
17772        let mut field_shared_folder_id = None;
17773        let mut field_to_dropbox_id = None;
17774        let mut nothing = true;
17775        while let Some(key) = map.next_key::<&str>()? {
17776            nothing = false;
17777            match key {
17778                "shared_folder_id" => {
17779                    if field_shared_folder_id.is_some() {
17780                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
17781                    }
17782                    field_shared_folder_id = Some(map.next_value()?);
17783                }
17784                "to_dropbox_id" => {
17785                    if field_to_dropbox_id.is_some() {
17786                        return Err(::serde::de::Error::duplicate_field("to_dropbox_id"));
17787                    }
17788                    field_to_dropbox_id = Some(map.next_value()?);
17789                }
17790                _ => {
17791                    // unknown field allowed and ignored
17792                    map.next_value::<::serde_json::Value>()?;
17793                }
17794            }
17795        }
17796        if optional && nothing {
17797            return Ok(None);
17798        }
17799        let result = TransferFolderArg {
17800            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
17801            to_dropbox_id: field_to_dropbox_id.ok_or_else(|| ::serde::de::Error::missing_field("to_dropbox_id"))?,
17802        };
17803        Ok(Some(result))
17804    }
17805
17806    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
17807        &self,
17808        s: &mut S::SerializeStruct,
17809    ) -> Result<(), S::Error> {
17810        use serde::ser::SerializeStruct;
17811        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
17812        s.serialize_field("to_dropbox_id", &self.to_dropbox_id)?;
17813        Ok(())
17814    }
17815}
17816
17817impl<'de> ::serde::de::Deserialize<'de> for TransferFolderArg {
17818    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
17819        // struct deserializer
17820        use serde::de::{MapAccess, Visitor};
17821        struct StructVisitor;
17822        impl<'de> Visitor<'de> for StructVisitor {
17823            type Value = TransferFolderArg;
17824            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17825                f.write_str("a TransferFolderArg struct")
17826            }
17827            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
17828                TransferFolderArg::internal_deserialize(map)
17829            }
17830        }
17831        deserializer.deserialize_struct("TransferFolderArg", TRANSFER_FOLDER_ARG_FIELDS, StructVisitor)
17832    }
17833}
17834
17835impl ::serde::ser::Serialize for TransferFolderArg {
17836    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
17837        // struct serializer
17838        use serde::ser::SerializeStruct;
17839        let mut s = serializer.serialize_struct("TransferFolderArg", 2)?;
17840        self.internal_serialize::<S>(&mut s)?;
17841        s.end()
17842    }
17843}
17844
17845#[derive(Debug, Clone, PartialEq, Eq)]
17846#[non_exhaustive] // variants may be added in the future
17847pub enum TransferFolderError {
17848    AccessError(SharedFolderAccessError),
17849    /// [`TransferFolderArg::to_dropbox_id`](TransferFolderArg) is invalid.
17850    InvalidDropboxId,
17851    /// The new designated owner is not currently a member of the shared folder.
17852    NewOwnerNotAMember,
17853    /// The new designated owner has not added the folder to their Dropbox.
17854    NewOwnerUnmounted,
17855    /// The new designated owner's email address is not verified. This functionality is only
17856    /// available on accounts with a verified email address. Users can verify their email address
17857    /// [here](https://www.dropbox.com/help/317).
17858    NewOwnerEmailUnverified,
17859    /// This action cannot be performed on a team shared folder.
17860    TeamFolder,
17861    /// The current user does not have permission to perform this action.
17862    NoPermission,
17863    /// Catch-all used for unrecognized values returned from the server. Encountering this value
17864    /// typically indicates that this SDK version is out of date.
17865    Other,
17866}
17867
17868impl<'de> ::serde::de::Deserialize<'de> for TransferFolderError {
17869    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
17870        // union deserializer
17871        use serde::de::{self, MapAccess, Visitor};
17872        struct EnumVisitor;
17873        impl<'de> Visitor<'de> for EnumVisitor {
17874            type Value = TransferFolderError;
17875            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17876                f.write_str("a TransferFolderError structure")
17877            }
17878            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
17879                let tag: &str = match map.next_key()? {
17880                    Some(".tag") => map.next_value()?,
17881                    _ => return Err(de::Error::missing_field(".tag"))
17882                };
17883                let value = match tag {
17884                    "access_error" => {
17885                        match map.next_key()? {
17886                            Some("access_error") => TransferFolderError::AccessError(map.next_value()?),
17887                            None => return Err(de::Error::missing_field("access_error")),
17888                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
17889                        }
17890                    }
17891                    "invalid_dropbox_id" => TransferFolderError::InvalidDropboxId,
17892                    "new_owner_not_a_member" => TransferFolderError::NewOwnerNotAMember,
17893                    "new_owner_unmounted" => TransferFolderError::NewOwnerUnmounted,
17894                    "new_owner_email_unverified" => TransferFolderError::NewOwnerEmailUnverified,
17895                    "team_folder" => TransferFolderError::TeamFolder,
17896                    "no_permission" => TransferFolderError::NoPermission,
17897                    _ => TransferFolderError::Other,
17898                };
17899                crate::eat_json_fields(&mut map)?;
17900                Ok(value)
17901            }
17902        }
17903        const VARIANTS: &[&str] = &["access_error",
17904                                    "invalid_dropbox_id",
17905                                    "new_owner_not_a_member",
17906                                    "new_owner_unmounted",
17907                                    "new_owner_email_unverified",
17908                                    "team_folder",
17909                                    "no_permission",
17910                                    "other"];
17911        deserializer.deserialize_struct("TransferFolderError", VARIANTS, EnumVisitor)
17912    }
17913}
17914
17915impl ::serde::ser::Serialize for TransferFolderError {
17916    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
17917        // union serializer
17918        use serde::ser::SerializeStruct;
17919        match self {
17920            TransferFolderError::AccessError(x) => {
17921                // union or polymporphic struct
17922                let mut s = serializer.serialize_struct("TransferFolderError", 2)?;
17923                s.serialize_field(".tag", "access_error")?;
17924                s.serialize_field("access_error", x)?;
17925                s.end()
17926            }
17927            TransferFolderError::InvalidDropboxId => {
17928                // unit
17929                let mut s = serializer.serialize_struct("TransferFolderError", 1)?;
17930                s.serialize_field(".tag", "invalid_dropbox_id")?;
17931                s.end()
17932            }
17933            TransferFolderError::NewOwnerNotAMember => {
17934                // unit
17935                let mut s = serializer.serialize_struct("TransferFolderError", 1)?;
17936                s.serialize_field(".tag", "new_owner_not_a_member")?;
17937                s.end()
17938            }
17939            TransferFolderError::NewOwnerUnmounted => {
17940                // unit
17941                let mut s = serializer.serialize_struct("TransferFolderError", 1)?;
17942                s.serialize_field(".tag", "new_owner_unmounted")?;
17943                s.end()
17944            }
17945            TransferFolderError::NewOwnerEmailUnverified => {
17946                // unit
17947                let mut s = serializer.serialize_struct("TransferFolderError", 1)?;
17948                s.serialize_field(".tag", "new_owner_email_unverified")?;
17949                s.end()
17950            }
17951            TransferFolderError::TeamFolder => {
17952                // unit
17953                let mut s = serializer.serialize_struct("TransferFolderError", 1)?;
17954                s.serialize_field(".tag", "team_folder")?;
17955                s.end()
17956            }
17957            TransferFolderError::NoPermission => {
17958                // unit
17959                let mut s = serializer.serialize_struct("TransferFolderError", 1)?;
17960                s.serialize_field(".tag", "no_permission")?;
17961                s.end()
17962            }
17963            TransferFolderError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
17964        }
17965    }
17966}
17967
17968impl ::std::error::Error for TransferFolderError {
17969    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
17970        match self {
17971            TransferFolderError::AccessError(inner) => Some(inner),
17972            _ => None,
17973        }
17974    }
17975}
17976
17977impl ::std::fmt::Display for TransferFolderError {
17978    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
17979        match self {
17980            TransferFolderError::AccessError(inner) => write!(f, "TransferFolderError: {}", inner),
17981            TransferFolderError::NewOwnerNotAMember => f.write_str("The new designated owner is not currently a member of the shared folder."),
17982            TransferFolderError::NewOwnerUnmounted => f.write_str("The new designated owner has not added the folder to their Dropbox."),
17983            TransferFolderError::TeamFolder => f.write_str("This action cannot be performed on a team shared folder."),
17984            TransferFolderError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
17985            _ => write!(f, "{:?}", *self),
17986        }
17987    }
17988}
17989
17990#[derive(Debug, Clone, PartialEq, Eq)]
17991#[non_exhaustive] // structs may have more fields added in the future.
17992pub struct UnmountFolderArg {
17993    /// The ID for the shared folder.
17994    pub shared_folder_id: crate::types::common::SharedFolderId,
17995}
17996
17997impl UnmountFolderArg {
17998    pub fn new(shared_folder_id: crate::types::common::SharedFolderId) -> Self {
17999        UnmountFolderArg {
18000            shared_folder_id,
18001        }
18002    }
18003}
18004
18005const UNMOUNT_FOLDER_ARG_FIELDS: &[&str] = &["shared_folder_id"];
18006impl UnmountFolderArg {
18007    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
18008        map: V,
18009    ) -> Result<UnmountFolderArg, V::Error> {
18010        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
18011    }
18012
18013    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
18014        mut map: V,
18015        optional: bool,
18016    ) -> Result<Option<UnmountFolderArg>, V::Error> {
18017        let mut field_shared_folder_id = None;
18018        let mut nothing = true;
18019        while let Some(key) = map.next_key::<&str>()? {
18020            nothing = false;
18021            match key {
18022                "shared_folder_id" => {
18023                    if field_shared_folder_id.is_some() {
18024                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
18025                    }
18026                    field_shared_folder_id = Some(map.next_value()?);
18027                }
18028                _ => {
18029                    // unknown field allowed and ignored
18030                    map.next_value::<::serde_json::Value>()?;
18031                }
18032            }
18033        }
18034        if optional && nothing {
18035            return Ok(None);
18036        }
18037        let result = UnmountFolderArg {
18038            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
18039        };
18040        Ok(Some(result))
18041    }
18042
18043    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
18044        &self,
18045        s: &mut S::SerializeStruct,
18046    ) -> Result<(), S::Error> {
18047        use serde::ser::SerializeStruct;
18048        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
18049        Ok(())
18050    }
18051}
18052
18053impl<'de> ::serde::de::Deserialize<'de> for UnmountFolderArg {
18054    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18055        // struct deserializer
18056        use serde::de::{MapAccess, Visitor};
18057        struct StructVisitor;
18058        impl<'de> Visitor<'de> for StructVisitor {
18059            type Value = UnmountFolderArg;
18060            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18061                f.write_str("a UnmountFolderArg struct")
18062            }
18063            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
18064                UnmountFolderArg::internal_deserialize(map)
18065            }
18066        }
18067        deserializer.deserialize_struct("UnmountFolderArg", UNMOUNT_FOLDER_ARG_FIELDS, StructVisitor)
18068    }
18069}
18070
18071impl ::serde::ser::Serialize for UnmountFolderArg {
18072    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18073        // struct serializer
18074        use serde::ser::SerializeStruct;
18075        let mut s = serializer.serialize_struct("UnmountFolderArg", 1)?;
18076        self.internal_serialize::<S>(&mut s)?;
18077        s.end()
18078    }
18079}
18080
18081#[derive(Debug, Clone, PartialEq, Eq)]
18082#[non_exhaustive] // variants may be added in the future
18083pub enum UnmountFolderError {
18084    AccessError(SharedFolderAccessError),
18085    /// The current user does not have permission to perform this action.
18086    NoPermission,
18087    /// The shared folder can't be unmounted. One example where this can occur is when the shared
18088    /// folder's parent folder is also a shared folder that resides in the current user's Dropbox.
18089    NotUnmountable,
18090    /// Catch-all used for unrecognized values returned from the server. Encountering this value
18091    /// typically indicates that this SDK version is out of date.
18092    Other,
18093}
18094
18095impl<'de> ::serde::de::Deserialize<'de> for UnmountFolderError {
18096    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18097        // union deserializer
18098        use serde::de::{self, MapAccess, Visitor};
18099        struct EnumVisitor;
18100        impl<'de> Visitor<'de> for EnumVisitor {
18101            type Value = UnmountFolderError;
18102            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18103                f.write_str("a UnmountFolderError structure")
18104            }
18105            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
18106                let tag: &str = match map.next_key()? {
18107                    Some(".tag") => map.next_value()?,
18108                    _ => return Err(de::Error::missing_field(".tag"))
18109                };
18110                let value = match tag {
18111                    "access_error" => {
18112                        match map.next_key()? {
18113                            Some("access_error") => UnmountFolderError::AccessError(map.next_value()?),
18114                            None => return Err(de::Error::missing_field("access_error")),
18115                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
18116                        }
18117                    }
18118                    "no_permission" => UnmountFolderError::NoPermission,
18119                    "not_unmountable" => UnmountFolderError::NotUnmountable,
18120                    _ => UnmountFolderError::Other,
18121                };
18122                crate::eat_json_fields(&mut map)?;
18123                Ok(value)
18124            }
18125        }
18126        const VARIANTS: &[&str] = &["access_error",
18127                                    "no_permission",
18128                                    "not_unmountable",
18129                                    "other"];
18130        deserializer.deserialize_struct("UnmountFolderError", VARIANTS, EnumVisitor)
18131    }
18132}
18133
18134impl ::serde::ser::Serialize for UnmountFolderError {
18135    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18136        // union serializer
18137        use serde::ser::SerializeStruct;
18138        match self {
18139            UnmountFolderError::AccessError(x) => {
18140                // union or polymporphic struct
18141                let mut s = serializer.serialize_struct("UnmountFolderError", 2)?;
18142                s.serialize_field(".tag", "access_error")?;
18143                s.serialize_field("access_error", x)?;
18144                s.end()
18145            }
18146            UnmountFolderError::NoPermission => {
18147                // unit
18148                let mut s = serializer.serialize_struct("UnmountFolderError", 1)?;
18149                s.serialize_field(".tag", "no_permission")?;
18150                s.end()
18151            }
18152            UnmountFolderError::NotUnmountable => {
18153                // unit
18154                let mut s = serializer.serialize_struct("UnmountFolderError", 1)?;
18155                s.serialize_field(".tag", "not_unmountable")?;
18156                s.end()
18157            }
18158            UnmountFolderError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
18159        }
18160    }
18161}
18162
18163impl ::std::error::Error for UnmountFolderError {
18164    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
18165        match self {
18166            UnmountFolderError::AccessError(inner) => Some(inner),
18167            _ => None,
18168        }
18169    }
18170}
18171
18172impl ::std::fmt::Display for UnmountFolderError {
18173    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18174        match self {
18175            UnmountFolderError::AccessError(inner) => write!(f, "UnmountFolderError: {}", inner),
18176            UnmountFolderError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
18177            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."),
18178            _ => write!(f, "{:?}", *self),
18179        }
18180    }
18181}
18182
18183/// Arguments for [`unshare_file()`](crate::sharing::unshare_file).
18184#[derive(Debug, Clone, PartialEq, Eq)]
18185#[non_exhaustive] // structs may have more fields added in the future.
18186pub struct UnshareFileArg {
18187    /// The file to unshare.
18188    pub file: PathOrId,
18189}
18190
18191impl UnshareFileArg {
18192    pub fn new(file: PathOrId) -> Self {
18193        UnshareFileArg {
18194            file,
18195        }
18196    }
18197}
18198
18199const UNSHARE_FILE_ARG_FIELDS: &[&str] = &["file"];
18200impl UnshareFileArg {
18201    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
18202        map: V,
18203    ) -> Result<UnshareFileArg, V::Error> {
18204        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
18205    }
18206
18207    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
18208        mut map: V,
18209        optional: bool,
18210    ) -> Result<Option<UnshareFileArg>, V::Error> {
18211        let mut field_file = None;
18212        let mut nothing = true;
18213        while let Some(key) = map.next_key::<&str>()? {
18214            nothing = false;
18215            match key {
18216                "file" => {
18217                    if field_file.is_some() {
18218                        return Err(::serde::de::Error::duplicate_field("file"));
18219                    }
18220                    field_file = Some(map.next_value()?);
18221                }
18222                _ => {
18223                    // unknown field allowed and ignored
18224                    map.next_value::<::serde_json::Value>()?;
18225                }
18226            }
18227        }
18228        if optional && nothing {
18229            return Ok(None);
18230        }
18231        let result = UnshareFileArg {
18232            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
18233        };
18234        Ok(Some(result))
18235    }
18236
18237    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
18238        &self,
18239        s: &mut S::SerializeStruct,
18240    ) -> Result<(), S::Error> {
18241        use serde::ser::SerializeStruct;
18242        s.serialize_field("file", &self.file)?;
18243        Ok(())
18244    }
18245}
18246
18247impl<'de> ::serde::de::Deserialize<'de> for UnshareFileArg {
18248    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18249        // struct deserializer
18250        use serde::de::{MapAccess, Visitor};
18251        struct StructVisitor;
18252        impl<'de> Visitor<'de> for StructVisitor {
18253            type Value = UnshareFileArg;
18254            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18255                f.write_str("a UnshareFileArg struct")
18256            }
18257            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
18258                UnshareFileArg::internal_deserialize(map)
18259            }
18260        }
18261        deserializer.deserialize_struct("UnshareFileArg", UNSHARE_FILE_ARG_FIELDS, StructVisitor)
18262    }
18263}
18264
18265impl ::serde::ser::Serialize for UnshareFileArg {
18266    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18267        // struct serializer
18268        use serde::ser::SerializeStruct;
18269        let mut s = serializer.serialize_struct("UnshareFileArg", 1)?;
18270        self.internal_serialize::<S>(&mut s)?;
18271        s.end()
18272    }
18273}
18274
18275/// Error result for [`unshare_file()`](crate::sharing::unshare_file).
18276#[derive(Debug, Clone, PartialEq, Eq)]
18277#[non_exhaustive] // variants may be added in the future
18278pub enum UnshareFileError {
18279    UserError(SharingUserError),
18280    AccessError(SharingFileAccessError),
18281    /// Catch-all used for unrecognized values returned from the server. Encountering this value
18282    /// typically indicates that this SDK version is out of date.
18283    Other,
18284}
18285
18286impl<'de> ::serde::de::Deserialize<'de> for UnshareFileError {
18287    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18288        // union deserializer
18289        use serde::de::{self, MapAccess, Visitor};
18290        struct EnumVisitor;
18291        impl<'de> Visitor<'de> for EnumVisitor {
18292            type Value = UnshareFileError;
18293            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18294                f.write_str("a UnshareFileError structure")
18295            }
18296            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
18297                let tag: &str = match map.next_key()? {
18298                    Some(".tag") => map.next_value()?,
18299                    _ => return Err(de::Error::missing_field(".tag"))
18300                };
18301                let value = match tag {
18302                    "user_error" => {
18303                        match map.next_key()? {
18304                            Some("user_error") => UnshareFileError::UserError(map.next_value()?),
18305                            None => return Err(de::Error::missing_field("user_error")),
18306                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
18307                        }
18308                    }
18309                    "access_error" => {
18310                        match map.next_key()? {
18311                            Some("access_error") => UnshareFileError::AccessError(map.next_value()?),
18312                            None => return Err(de::Error::missing_field("access_error")),
18313                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
18314                        }
18315                    }
18316                    _ => UnshareFileError::Other,
18317                };
18318                crate::eat_json_fields(&mut map)?;
18319                Ok(value)
18320            }
18321        }
18322        const VARIANTS: &[&str] = &["user_error",
18323                                    "access_error",
18324                                    "other"];
18325        deserializer.deserialize_struct("UnshareFileError", VARIANTS, EnumVisitor)
18326    }
18327}
18328
18329impl ::serde::ser::Serialize for UnshareFileError {
18330    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18331        // union serializer
18332        use serde::ser::SerializeStruct;
18333        match self {
18334            UnshareFileError::UserError(x) => {
18335                // union or polymporphic struct
18336                let mut s = serializer.serialize_struct("UnshareFileError", 2)?;
18337                s.serialize_field(".tag", "user_error")?;
18338                s.serialize_field("user_error", x)?;
18339                s.end()
18340            }
18341            UnshareFileError::AccessError(x) => {
18342                // union or polymporphic struct
18343                let mut s = serializer.serialize_struct("UnshareFileError", 2)?;
18344                s.serialize_field(".tag", "access_error")?;
18345                s.serialize_field("access_error", x)?;
18346                s.end()
18347            }
18348            UnshareFileError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
18349        }
18350    }
18351}
18352
18353impl ::std::error::Error for UnshareFileError {
18354    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
18355        match self {
18356            UnshareFileError::UserError(inner) => Some(inner),
18357            UnshareFileError::AccessError(inner) => Some(inner),
18358            _ => None,
18359        }
18360    }
18361}
18362
18363impl ::std::fmt::Display for UnshareFileError {
18364    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18365        match self {
18366            UnshareFileError::UserError(inner) => write!(f, "UnshareFileError: {}", inner),
18367            UnshareFileError::AccessError(inner) => write!(f, "UnshareFileError: {}", inner),
18368            _ => write!(f, "{:?}", *self),
18369        }
18370    }
18371}
18372
18373#[derive(Debug, Clone, PartialEq, Eq)]
18374#[non_exhaustive] // structs may have more fields added in the future.
18375pub struct UnshareFolderArg {
18376    /// The ID for the shared folder.
18377    pub shared_folder_id: crate::types::common::SharedFolderId,
18378    /// If true, members of this shared folder will get a copy of this folder after it's unshared.
18379    /// Otherwise, it will be removed from their Dropbox. The current user, who is an owner, will
18380    /// always retain their copy.
18381    pub leave_a_copy: bool,
18382}
18383
18384impl UnshareFolderArg {
18385    pub fn new(shared_folder_id: crate::types::common::SharedFolderId) -> Self {
18386        UnshareFolderArg {
18387            shared_folder_id,
18388            leave_a_copy: false,
18389        }
18390    }
18391
18392    pub fn with_leave_a_copy(mut self, value: bool) -> Self {
18393        self.leave_a_copy = value;
18394        self
18395    }
18396}
18397
18398const UNSHARE_FOLDER_ARG_FIELDS: &[&str] = &["shared_folder_id",
18399                                             "leave_a_copy"];
18400impl UnshareFolderArg {
18401    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
18402        map: V,
18403    ) -> Result<UnshareFolderArg, V::Error> {
18404        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
18405    }
18406
18407    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
18408        mut map: V,
18409        optional: bool,
18410    ) -> Result<Option<UnshareFolderArg>, V::Error> {
18411        let mut field_shared_folder_id = None;
18412        let mut field_leave_a_copy = None;
18413        let mut nothing = true;
18414        while let Some(key) = map.next_key::<&str>()? {
18415            nothing = false;
18416            match key {
18417                "shared_folder_id" => {
18418                    if field_shared_folder_id.is_some() {
18419                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
18420                    }
18421                    field_shared_folder_id = Some(map.next_value()?);
18422                }
18423                "leave_a_copy" => {
18424                    if field_leave_a_copy.is_some() {
18425                        return Err(::serde::de::Error::duplicate_field("leave_a_copy"));
18426                    }
18427                    field_leave_a_copy = Some(map.next_value()?);
18428                }
18429                _ => {
18430                    // unknown field allowed and ignored
18431                    map.next_value::<::serde_json::Value>()?;
18432                }
18433            }
18434        }
18435        if optional && nothing {
18436            return Ok(None);
18437        }
18438        let result = UnshareFolderArg {
18439            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
18440            leave_a_copy: field_leave_a_copy.unwrap_or(false),
18441        };
18442        Ok(Some(result))
18443    }
18444
18445    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
18446        &self,
18447        s: &mut S::SerializeStruct,
18448    ) -> Result<(), S::Error> {
18449        use serde::ser::SerializeStruct;
18450        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
18451        if self.leave_a_copy {
18452            s.serialize_field("leave_a_copy", &self.leave_a_copy)?;
18453        }
18454        Ok(())
18455    }
18456}
18457
18458impl<'de> ::serde::de::Deserialize<'de> for UnshareFolderArg {
18459    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18460        // struct deserializer
18461        use serde::de::{MapAccess, Visitor};
18462        struct StructVisitor;
18463        impl<'de> Visitor<'de> for StructVisitor {
18464            type Value = UnshareFolderArg;
18465            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18466                f.write_str("a UnshareFolderArg struct")
18467            }
18468            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
18469                UnshareFolderArg::internal_deserialize(map)
18470            }
18471        }
18472        deserializer.deserialize_struct("UnshareFolderArg", UNSHARE_FOLDER_ARG_FIELDS, StructVisitor)
18473    }
18474}
18475
18476impl ::serde::ser::Serialize for UnshareFolderArg {
18477    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18478        // struct serializer
18479        use serde::ser::SerializeStruct;
18480        let mut s = serializer.serialize_struct("UnshareFolderArg", 2)?;
18481        self.internal_serialize::<S>(&mut s)?;
18482        s.end()
18483    }
18484}
18485
18486#[derive(Debug, Clone, PartialEq, Eq)]
18487#[non_exhaustive] // variants may be added in the future
18488pub enum UnshareFolderError {
18489    AccessError(SharedFolderAccessError),
18490    /// This action cannot be performed on a team shared folder.
18491    TeamFolder,
18492    /// The current user does not have permission to perform this action.
18493    NoPermission,
18494    /// This shared folder has too many files to be unshared.
18495    TooManyFiles,
18496    /// Catch-all used for unrecognized values returned from the server. Encountering this value
18497    /// typically indicates that this SDK version is out of date.
18498    Other,
18499}
18500
18501impl<'de> ::serde::de::Deserialize<'de> for UnshareFolderError {
18502    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18503        // union deserializer
18504        use serde::de::{self, MapAccess, Visitor};
18505        struct EnumVisitor;
18506        impl<'de> Visitor<'de> for EnumVisitor {
18507            type Value = UnshareFolderError;
18508            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18509                f.write_str("a UnshareFolderError structure")
18510            }
18511            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
18512                let tag: &str = match map.next_key()? {
18513                    Some(".tag") => map.next_value()?,
18514                    _ => return Err(de::Error::missing_field(".tag"))
18515                };
18516                let value = match tag {
18517                    "access_error" => {
18518                        match map.next_key()? {
18519                            Some("access_error") => UnshareFolderError::AccessError(map.next_value()?),
18520                            None => return Err(de::Error::missing_field("access_error")),
18521                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
18522                        }
18523                    }
18524                    "team_folder" => UnshareFolderError::TeamFolder,
18525                    "no_permission" => UnshareFolderError::NoPermission,
18526                    "too_many_files" => UnshareFolderError::TooManyFiles,
18527                    _ => UnshareFolderError::Other,
18528                };
18529                crate::eat_json_fields(&mut map)?;
18530                Ok(value)
18531            }
18532        }
18533        const VARIANTS: &[&str] = &["access_error",
18534                                    "team_folder",
18535                                    "no_permission",
18536                                    "too_many_files",
18537                                    "other"];
18538        deserializer.deserialize_struct("UnshareFolderError", VARIANTS, EnumVisitor)
18539    }
18540}
18541
18542impl ::serde::ser::Serialize for UnshareFolderError {
18543    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18544        // union serializer
18545        use serde::ser::SerializeStruct;
18546        match self {
18547            UnshareFolderError::AccessError(x) => {
18548                // union or polymporphic struct
18549                let mut s = serializer.serialize_struct("UnshareFolderError", 2)?;
18550                s.serialize_field(".tag", "access_error")?;
18551                s.serialize_field("access_error", x)?;
18552                s.end()
18553            }
18554            UnshareFolderError::TeamFolder => {
18555                // unit
18556                let mut s = serializer.serialize_struct("UnshareFolderError", 1)?;
18557                s.serialize_field(".tag", "team_folder")?;
18558                s.end()
18559            }
18560            UnshareFolderError::NoPermission => {
18561                // unit
18562                let mut s = serializer.serialize_struct("UnshareFolderError", 1)?;
18563                s.serialize_field(".tag", "no_permission")?;
18564                s.end()
18565            }
18566            UnshareFolderError::TooManyFiles => {
18567                // unit
18568                let mut s = serializer.serialize_struct("UnshareFolderError", 1)?;
18569                s.serialize_field(".tag", "too_many_files")?;
18570                s.end()
18571            }
18572            UnshareFolderError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
18573        }
18574    }
18575}
18576
18577impl ::std::error::Error for UnshareFolderError {
18578    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
18579        match self {
18580            UnshareFolderError::AccessError(inner) => Some(inner),
18581            _ => None,
18582        }
18583    }
18584}
18585
18586impl ::std::fmt::Display for UnshareFolderError {
18587    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18588        match self {
18589            UnshareFolderError::AccessError(inner) => write!(f, "UnshareFolderError: {}", inner),
18590            UnshareFolderError::TeamFolder => f.write_str("This action cannot be performed on a team shared folder."),
18591            UnshareFolderError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
18592            UnshareFolderError::TooManyFiles => f.write_str("This shared folder has too many files to be unshared."),
18593            _ => write!(f, "{:?}", *self),
18594        }
18595    }
18596}
18597
18598/// Arguments for [`update_file_member()`](crate::sharing::update_file_member).
18599#[derive(Debug, Clone, PartialEq, Eq)]
18600#[non_exhaustive] // structs may have more fields added in the future.
18601pub struct UpdateFileMemberArgs {
18602    /// File for which we are changing a member's access.
18603    pub file: PathOrId,
18604    /// The member whose access we are changing.
18605    pub member: MemberSelector,
18606    /// The new access level for the member.
18607    pub access_level: AccessLevel,
18608}
18609
18610impl UpdateFileMemberArgs {
18611    pub fn new(file: PathOrId, member: MemberSelector, access_level: AccessLevel) -> Self {
18612        UpdateFileMemberArgs {
18613            file,
18614            member,
18615            access_level,
18616        }
18617    }
18618}
18619
18620const UPDATE_FILE_MEMBER_ARGS_FIELDS: &[&str] = &["file",
18621                                                  "member",
18622                                                  "access_level"];
18623impl UpdateFileMemberArgs {
18624    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
18625        map: V,
18626    ) -> Result<UpdateFileMemberArgs, V::Error> {
18627        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
18628    }
18629
18630    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
18631        mut map: V,
18632        optional: bool,
18633    ) -> Result<Option<UpdateFileMemberArgs>, V::Error> {
18634        let mut field_file = None;
18635        let mut field_member = None;
18636        let mut field_access_level = None;
18637        let mut nothing = true;
18638        while let Some(key) = map.next_key::<&str>()? {
18639            nothing = false;
18640            match key {
18641                "file" => {
18642                    if field_file.is_some() {
18643                        return Err(::serde::de::Error::duplicate_field("file"));
18644                    }
18645                    field_file = Some(map.next_value()?);
18646                }
18647                "member" => {
18648                    if field_member.is_some() {
18649                        return Err(::serde::de::Error::duplicate_field("member"));
18650                    }
18651                    field_member = Some(map.next_value()?);
18652                }
18653                "access_level" => {
18654                    if field_access_level.is_some() {
18655                        return Err(::serde::de::Error::duplicate_field("access_level"));
18656                    }
18657                    field_access_level = Some(map.next_value()?);
18658                }
18659                _ => {
18660                    // unknown field allowed and ignored
18661                    map.next_value::<::serde_json::Value>()?;
18662                }
18663            }
18664        }
18665        if optional && nothing {
18666            return Ok(None);
18667        }
18668        let result = UpdateFileMemberArgs {
18669            file: field_file.ok_or_else(|| ::serde::de::Error::missing_field("file"))?,
18670            member: field_member.ok_or_else(|| ::serde::de::Error::missing_field("member"))?,
18671            access_level: field_access_level.ok_or_else(|| ::serde::de::Error::missing_field("access_level"))?,
18672        };
18673        Ok(Some(result))
18674    }
18675
18676    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
18677        &self,
18678        s: &mut S::SerializeStruct,
18679    ) -> Result<(), S::Error> {
18680        use serde::ser::SerializeStruct;
18681        s.serialize_field("file", &self.file)?;
18682        s.serialize_field("member", &self.member)?;
18683        s.serialize_field("access_level", &self.access_level)?;
18684        Ok(())
18685    }
18686}
18687
18688impl<'de> ::serde::de::Deserialize<'de> for UpdateFileMemberArgs {
18689    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18690        // struct deserializer
18691        use serde::de::{MapAccess, Visitor};
18692        struct StructVisitor;
18693        impl<'de> Visitor<'de> for StructVisitor {
18694            type Value = UpdateFileMemberArgs;
18695            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18696                f.write_str("a UpdateFileMemberArgs struct")
18697            }
18698            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
18699                UpdateFileMemberArgs::internal_deserialize(map)
18700            }
18701        }
18702        deserializer.deserialize_struct("UpdateFileMemberArgs", UPDATE_FILE_MEMBER_ARGS_FIELDS, StructVisitor)
18703    }
18704}
18705
18706impl ::serde::ser::Serialize for UpdateFileMemberArgs {
18707    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18708        // struct serializer
18709        use serde::ser::SerializeStruct;
18710        let mut s = serializer.serialize_struct("UpdateFileMemberArgs", 3)?;
18711        self.internal_serialize::<S>(&mut s)?;
18712        s.end()
18713    }
18714}
18715
18716#[derive(Debug, Clone, PartialEq, Eq)]
18717#[non_exhaustive] // structs may have more fields added in the future.
18718pub struct UpdateFolderMemberArg {
18719    /// The ID for the shared folder.
18720    pub shared_folder_id: crate::types::common::SharedFolderId,
18721    /// The member of the shared folder to update.  Only the [`MemberSelector::DropboxId`] may be
18722    /// set at this time.
18723    pub member: MemberSelector,
18724    /// The new access level for `member`. [`AccessLevel::Owner`] is disallowed.
18725    pub access_level: AccessLevel,
18726}
18727
18728impl UpdateFolderMemberArg {
18729    pub fn new(
18730        shared_folder_id: crate::types::common::SharedFolderId,
18731        member: MemberSelector,
18732        access_level: AccessLevel,
18733    ) -> Self {
18734        UpdateFolderMemberArg {
18735            shared_folder_id,
18736            member,
18737            access_level,
18738        }
18739    }
18740}
18741
18742const UPDATE_FOLDER_MEMBER_ARG_FIELDS: &[&str] = &["shared_folder_id",
18743                                                   "member",
18744                                                   "access_level"];
18745impl UpdateFolderMemberArg {
18746    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
18747        map: V,
18748    ) -> Result<UpdateFolderMemberArg, V::Error> {
18749        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
18750    }
18751
18752    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
18753        mut map: V,
18754        optional: bool,
18755    ) -> Result<Option<UpdateFolderMemberArg>, V::Error> {
18756        let mut field_shared_folder_id = None;
18757        let mut field_member = None;
18758        let mut field_access_level = None;
18759        let mut nothing = true;
18760        while let Some(key) = map.next_key::<&str>()? {
18761            nothing = false;
18762            match key {
18763                "shared_folder_id" => {
18764                    if field_shared_folder_id.is_some() {
18765                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
18766                    }
18767                    field_shared_folder_id = Some(map.next_value()?);
18768                }
18769                "member" => {
18770                    if field_member.is_some() {
18771                        return Err(::serde::de::Error::duplicate_field("member"));
18772                    }
18773                    field_member = Some(map.next_value()?);
18774                }
18775                "access_level" => {
18776                    if field_access_level.is_some() {
18777                        return Err(::serde::de::Error::duplicate_field("access_level"));
18778                    }
18779                    field_access_level = Some(map.next_value()?);
18780                }
18781                _ => {
18782                    // unknown field allowed and ignored
18783                    map.next_value::<::serde_json::Value>()?;
18784                }
18785            }
18786        }
18787        if optional && nothing {
18788            return Ok(None);
18789        }
18790        let result = UpdateFolderMemberArg {
18791            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
18792            member: field_member.ok_or_else(|| ::serde::de::Error::missing_field("member"))?,
18793            access_level: field_access_level.ok_or_else(|| ::serde::de::Error::missing_field("access_level"))?,
18794        };
18795        Ok(Some(result))
18796    }
18797
18798    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
18799        &self,
18800        s: &mut S::SerializeStruct,
18801    ) -> Result<(), S::Error> {
18802        use serde::ser::SerializeStruct;
18803        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
18804        s.serialize_field("member", &self.member)?;
18805        s.serialize_field("access_level", &self.access_level)?;
18806        Ok(())
18807    }
18808}
18809
18810impl<'de> ::serde::de::Deserialize<'de> for UpdateFolderMemberArg {
18811    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18812        // struct deserializer
18813        use serde::de::{MapAccess, Visitor};
18814        struct StructVisitor;
18815        impl<'de> Visitor<'de> for StructVisitor {
18816            type Value = UpdateFolderMemberArg;
18817            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18818                f.write_str("a UpdateFolderMemberArg struct")
18819            }
18820            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
18821                UpdateFolderMemberArg::internal_deserialize(map)
18822            }
18823        }
18824        deserializer.deserialize_struct("UpdateFolderMemberArg", UPDATE_FOLDER_MEMBER_ARG_FIELDS, StructVisitor)
18825    }
18826}
18827
18828impl ::serde::ser::Serialize for UpdateFolderMemberArg {
18829    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18830        // struct serializer
18831        use serde::ser::SerializeStruct;
18832        let mut s = serializer.serialize_struct("UpdateFolderMemberArg", 3)?;
18833        self.internal_serialize::<S>(&mut s)?;
18834        s.end()
18835    }
18836}
18837
18838#[derive(Debug, Clone, PartialEq, Eq)]
18839#[non_exhaustive] // variants may be added in the future
18840pub enum UpdateFolderMemberError {
18841    AccessError(SharedFolderAccessError),
18842    MemberError(SharedFolderMemberError),
18843    /// If updating the access type required the member to be added to the shared folder and there
18844    /// was an error when adding the member.
18845    NoExplicitAccess(AddFolderMemberError),
18846    /// The current user's account doesn't support this action. An example of this is when
18847    /// downgrading a member from editor to viewer. This action can only be performed by users that
18848    /// have upgraded to a Pro or Business plan.
18849    InsufficientPlan,
18850    /// The current user does not have permission to perform this action.
18851    NoPermission,
18852    /// Catch-all used for unrecognized values returned from the server. Encountering this value
18853    /// typically indicates that this SDK version is out of date.
18854    Other,
18855}
18856
18857impl<'de> ::serde::de::Deserialize<'de> for UpdateFolderMemberError {
18858    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18859        // union deserializer
18860        use serde::de::{self, MapAccess, Visitor};
18861        struct EnumVisitor;
18862        impl<'de> Visitor<'de> for EnumVisitor {
18863            type Value = UpdateFolderMemberError;
18864            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18865                f.write_str("a UpdateFolderMemberError structure")
18866            }
18867            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
18868                let tag: &str = match map.next_key()? {
18869                    Some(".tag") => map.next_value()?,
18870                    _ => return Err(de::Error::missing_field(".tag"))
18871                };
18872                let value = match tag {
18873                    "access_error" => {
18874                        match map.next_key()? {
18875                            Some("access_error") => UpdateFolderMemberError::AccessError(map.next_value()?),
18876                            None => return Err(de::Error::missing_field("access_error")),
18877                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
18878                        }
18879                    }
18880                    "member_error" => {
18881                        match map.next_key()? {
18882                            Some("member_error") => UpdateFolderMemberError::MemberError(map.next_value()?),
18883                            None => return Err(de::Error::missing_field("member_error")),
18884                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
18885                        }
18886                    }
18887                    "no_explicit_access" => {
18888                        match map.next_key()? {
18889                            Some("no_explicit_access") => UpdateFolderMemberError::NoExplicitAccess(map.next_value()?),
18890                            None => return Err(de::Error::missing_field("no_explicit_access")),
18891                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
18892                        }
18893                    }
18894                    "insufficient_plan" => UpdateFolderMemberError::InsufficientPlan,
18895                    "no_permission" => UpdateFolderMemberError::NoPermission,
18896                    _ => UpdateFolderMemberError::Other,
18897                };
18898                crate::eat_json_fields(&mut map)?;
18899                Ok(value)
18900            }
18901        }
18902        const VARIANTS: &[&str] = &["access_error",
18903                                    "member_error",
18904                                    "no_explicit_access",
18905                                    "insufficient_plan",
18906                                    "no_permission",
18907                                    "other"];
18908        deserializer.deserialize_struct("UpdateFolderMemberError", VARIANTS, EnumVisitor)
18909    }
18910}
18911
18912impl ::serde::ser::Serialize for UpdateFolderMemberError {
18913    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18914        // union serializer
18915        use serde::ser::SerializeStruct;
18916        match self {
18917            UpdateFolderMemberError::AccessError(x) => {
18918                // union or polymporphic struct
18919                let mut s = serializer.serialize_struct("UpdateFolderMemberError", 2)?;
18920                s.serialize_field(".tag", "access_error")?;
18921                s.serialize_field("access_error", x)?;
18922                s.end()
18923            }
18924            UpdateFolderMemberError::MemberError(x) => {
18925                // union or polymporphic struct
18926                let mut s = serializer.serialize_struct("UpdateFolderMemberError", 2)?;
18927                s.serialize_field(".tag", "member_error")?;
18928                s.serialize_field("member_error", x)?;
18929                s.end()
18930            }
18931            UpdateFolderMemberError::NoExplicitAccess(x) => {
18932                // union or polymporphic struct
18933                let mut s = serializer.serialize_struct("UpdateFolderMemberError", 2)?;
18934                s.serialize_field(".tag", "no_explicit_access")?;
18935                s.serialize_field("no_explicit_access", x)?;
18936                s.end()
18937            }
18938            UpdateFolderMemberError::InsufficientPlan => {
18939                // unit
18940                let mut s = serializer.serialize_struct("UpdateFolderMemberError", 1)?;
18941                s.serialize_field(".tag", "insufficient_plan")?;
18942                s.end()
18943            }
18944            UpdateFolderMemberError::NoPermission => {
18945                // unit
18946                let mut s = serializer.serialize_struct("UpdateFolderMemberError", 1)?;
18947                s.serialize_field(".tag", "no_permission")?;
18948                s.end()
18949            }
18950            UpdateFolderMemberError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
18951        }
18952    }
18953}
18954
18955impl ::std::error::Error for UpdateFolderMemberError {
18956    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
18957        match self {
18958            UpdateFolderMemberError::AccessError(inner) => Some(inner),
18959            UpdateFolderMemberError::MemberError(inner) => Some(inner),
18960            UpdateFolderMemberError::NoExplicitAccess(inner) => Some(inner),
18961            _ => None,
18962        }
18963    }
18964}
18965
18966impl ::std::fmt::Display for UpdateFolderMemberError {
18967    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
18968        match self {
18969            UpdateFolderMemberError::AccessError(inner) => write!(f, "UpdateFolderMemberError: {}", inner),
18970            UpdateFolderMemberError::MemberError(inner) => write!(f, "UpdateFolderMemberError: {}", inner),
18971            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),
18972            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."),
18973            UpdateFolderMemberError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
18974            _ => write!(f, "{:?}", *self),
18975        }
18976    }
18977}
18978
18979/// If any of the policies are unset, then they retain their current setting.
18980#[derive(Debug, Clone, PartialEq, Eq)]
18981#[non_exhaustive] // structs may have more fields added in the future.
18982pub struct UpdateFolderPolicyArg {
18983    /// The ID for the shared folder.
18984    pub shared_folder_id: crate::types::common::SharedFolderId,
18985    /// Who can be a member of this shared folder. Only applicable if the current user is on a team.
18986    pub member_policy: Option<MemberPolicy>,
18987    /// Who can add and remove members of this shared folder.
18988    pub acl_update_policy: Option<AclUpdatePolicy>,
18989    /// Who can enable/disable viewer info for this shared folder.
18990    pub viewer_info_policy: Option<ViewerInfoPolicy>,
18991    /// The policy to apply to shared links created for content inside this shared folder. The
18992    /// current user must be on a team to set this policy to [`SharedLinkPolicy::Members`].
18993    pub shared_link_policy: Option<SharedLinkPolicy>,
18994    /// Settings on the link for this folder.
18995    pub link_settings: Option<LinkSettings>,
18996    /// A list of `FolderAction`s corresponding to `FolderPermission`s that should appear in the
18997    /// response's [`SharedFolderMetadata::permissions`](SharedFolderMetadata) field describing the
18998    /// actions the  authenticated user can perform on the folder.
18999    pub actions: Option<Vec<FolderAction>>,
19000}
19001
19002impl UpdateFolderPolicyArg {
19003    pub fn new(shared_folder_id: crate::types::common::SharedFolderId) -> Self {
19004        UpdateFolderPolicyArg {
19005            shared_folder_id,
19006            member_policy: None,
19007            acl_update_policy: None,
19008            viewer_info_policy: None,
19009            shared_link_policy: None,
19010            link_settings: None,
19011            actions: None,
19012        }
19013    }
19014
19015    pub fn with_member_policy(mut self, value: MemberPolicy) -> Self {
19016        self.member_policy = Some(value);
19017        self
19018    }
19019
19020    pub fn with_acl_update_policy(mut self, value: AclUpdatePolicy) -> Self {
19021        self.acl_update_policy = Some(value);
19022        self
19023    }
19024
19025    pub fn with_viewer_info_policy(mut self, value: ViewerInfoPolicy) -> Self {
19026        self.viewer_info_policy = Some(value);
19027        self
19028    }
19029
19030    pub fn with_shared_link_policy(mut self, value: SharedLinkPolicy) -> Self {
19031        self.shared_link_policy = Some(value);
19032        self
19033    }
19034
19035    pub fn with_link_settings(mut self, value: LinkSettings) -> Self {
19036        self.link_settings = Some(value);
19037        self
19038    }
19039
19040    pub fn with_actions(mut self, value: Vec<FolderAction>) -> Self {
19041        self.actions = Some(value);
19042        self
19043    }
19044}
19045
19046const UPDATE_FOLDER_POLICY_ARG_FIELDS: &[&str] = &["shared_folder_id",
19047                                                   "member_policy",
19048                                                   "acl_update_policy",
19049                                                   "viewer_info_policy",
19050                                                   "shared_link_policy",
19051                                                   "link_settings",
19052                                                   "actions"];
19053impl UpdateFolderPolicyArg {
19054    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
19055        map: V,
19056    ) -> Result<UpdateFolderPolicyArg, V::Error> {
19057        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
19058    }
19059
19060    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
19061        mut map: V,
19062        optional: bool,
19063    ) -> Result<Option<UpdateFolderPolicyArg>, V::Error> {
19064        let mut field_shared_folder_id = None;
19065        let mut field_member_policy = None;
19066        let mut field_acl_update_policy = None;
19067        let mut field_viewer_info_policy = None;
19068        let mut field_shared_link_policy = None;
19069        let mut field_link_settings = None;
19070        let mut field_actions = None;
19071        let mut nothing = true;
19072        while let Some(key) = map.next_key::<&str>()? {
19073            nothing = false;
19074            match key {
19075                "shared_folder_id" => {
19076                    if field_shared_folder_id.is_some() {
19077                        return Err(::serde::de::Error::duplicate_field("shared_folder_id"));
19078                    }
19079                    field_shared_folder_id = Some(map.next_value()?);
19080                }
19081                "member_policy" => {
19082                    if field_member_policy.is_some() {
19083                        return Err(::serde::de::Error::duplicate_field("member_policy"));
19084                    }
19085                    field_member_policy = Some(map.next_value()?);
19086                }
19087                "acl_update_policy" => {
19088                    if field_acl_update_policy.is_some() {
19089                        return Err(::serde::de::Error::duplicate_field("acl_update_policy"));
19090                    }
19091                    field_acl_update_policy = Some(map.next_value()?);
19092                }
19093                "viewer_info_policy" => {
19094                    if field_viewer_info_policy.is_some() {
19095                        return Err(::serde::de::Error::duplicate_field("viewer_info_policy"));
19096                    }
19097                    field_viewer_info_policy = Some(map.next_value()?);
19098                }
19099                "shared_link_policy" => {
19100                    if field_shared_link_policy.is_some() {
19101                        return Err(::serde::de::Error::duplicate_field("shared_link_policy"));
19102                    }
19103                    field_shared_link_policy = Some(map.next_value()?);
19104                }
19105                "link_settings" => {
19106                    if field_link_settings.is_some() {
19107                        return Err(::serde::de::Error::duplicate_field("link_settings"));
19108                    }
19109                    field_link_settings = Some(map.next_value()?);
19110                }
19111                "actions" => {
19112                    if field_actions.is_some() {
19113                        return Err(::serde::de::Error::duplicate_field("actions"));
19114                    }
19115                    field_actions = Some(map.next_value()?);
19116                }
19117                _ => {
19118                    // unknown field allowed and ignored
19119                    map.next_value::<::serde_json::Value>()?;
19120                }
19121            }
19122        }
19123        if optional && nothing {
19124            return Ok(None);
19125        }
19126        let result = UpdateFolderPolicyArg {
19127            shared_folder_id: field_shared_folder_id.ok_or_else(|| ::serde::de::Error::missing_field("shared_folder_id"))?,
19128            member_policy: field_member_policy.and_then(Option::flatten),
19129            acl_update_policy: field_acl_update_policy.and_then(Option::flatten),
19130            viewer_info_policy: field_viewer_info_policy.and_then(Option::flatten),
19131            shared_link_policy: field_shared_link_policy.and_then(Option::flatten),
19132            link_settings: field_link_settings.and_then(Option::flatten),
19133            actions: field_actions.and_then(Option::flatten),
19134        };
19135        Ok(Some(result))
19136    }
19137
19138    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
19139        &self,
19140        s: &mut S::SerializeStruct,
19141    ) -> Result<(), S::Error> {
19142        use serde::ser::SerializeStruct;
19143        s.serialize_field("shared_folder_id", &self.shared_folder_id)?;
19144        if let Some(val) = &self.member_policy {
19145            s.serialize_field("member_policy", val)?;
19146        }
19147        if let Some(val) = &self.acl_update_policy {
19148            s.serialize_field("acl_update_policy", val)?;
19149        }
19150        if let Some(val) = &self.viewer_info_policy {
19151            s.serialize_field("viewer_info_policy", val)?;
19152        }
19153        if let Some(val) = &self.shared_link_policy {
19154            s.serialize_field("shared_link_policy", val)?;
19155        }
19156        if let Some(val) = &self.link_settings {
19157            s.serialize_field("link_settings", val)?;
19158        }
19159        if let Some(val) = &self.actions {
19160            s.serialize_field("actions", val)?;
19161        }
19162        Ok(())
19163    }
19164}
19165
19166impl<'de> ::serde::de::Deserialize<'de> for UpdateFolderPolicyArg {
19167    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19168        // struct deserializer
19169        use serde::de::{MapAccess, Visitor};
19170        struct StructVisitor;
19171        impl<'de> Visitor<'de> for StructVisitor {
19172            type Value = UpdateFolderPolicyArg;
19173            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19174                f.write_str("a UpdateFolderPolicyArg struct")
19175            }
19176            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
19177                UpdateFolderPolicyArg::internal_deserialize(map)
19178            }
19179        }
19180        deserializer.deserialize_struct("UpdateFolderPolicyArg", UPDATE_FOLDER_POLICY_ARG_FIELDS, StructVisitor)
19181    }
19182}
19183
19184impl ::serde::ser::Serialize for UpdateFolderPolicyArg {
19185    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19186        // struct serializer
19187        use serde::ser::SerializeStruct;
19188        let mut s = serializer.serialize_struct("UpdateFolderPolicyArg", 7)?;
19189        self.internal_serialize::<S>(&mut s)?;
19190        s.end()
19191    }
19192}
19193
19194#[derive(Debug, Clone, PartialEq, Eq)]
19195#[non_exhaustive] // variants may be added in the future
19196pub enum UpdateFolderPolicyError {
19197    AccessError(SharedFolderAccessError),
19198    /// [`UpdateFolderPolicyArg::member_policy`](UpdateFolderPolicyArg) was set even though user is
19199    /// not on a team.
19200    NotOnTeam,
19201    /// Team policy is more restrictive than [`ShareFolderArg::member_policy`](ShareFolderArg).
19202    TeamPolicyDisallowsMemberPolicy,
19203    /// The current account is not allowed to select the specified
19204    /// [`ShareFolderArg::shared_link_policy`](ShareFolderArg).
19205    DisallowedSharedLinkPolicy,
19206    /// The current user does not have permission to perform this action.
19207    NoPermission,
19208    /// This action cannot be performed on a team shared folder.
19209    TeamFolder,
19210    /// Catch-all used for unrecognized values returned from the server. Encountering this value
19211    /// typically indicates that this SDK version is out of date.
19212    Other,
19213}
19214
19215impl<'de> ::serde::de::Deserialize<'de> for UpdateFolderPolicyError {
19216    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19217        // union deserializer
19218        use serde::de::{self, MapAccess, Visitor};
19219        struct EnumVisitor;
19220        impl<'de> Visitor<'de> for EnumVisitor {
19221            type Value = UpdateFolderPolicyError;
19222            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19223                f.write_str("a UpdateFolderPolicyError structure")
19224            }
19225            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
19226                let tag: &str = match map.next_key()? {
19227                    Some(".tag") => map.next_value()?,
19228                    _ => return Err(de::Error::missing_field(".tag"))
19229                };
19230                let value = match tag {
19231                    "access_error" => {
19232                        match map.next_key()? {
19233                            Some("access_error") => UpdateFolderPolicyError::AccessError(map.next_value()?),
19234                            None => return Err(de::Error::missing_field("access_error")),
19235                            _ => return Err(de::Error::unknown_field(tag, VARIANTS))
19236                        }
19237                    }
19238                    "not_on_team" => UpdateFolderPolicyError::NotOnTeam,
19239                    "team_policy_disallows_member_policy" => UpdateFolderPolicyError::TeamPolicyDisallowsMemberPolicy,
19240                    "disallowed_shared_link_policy" => UpdateFolderPolicyError::DisallowedSharedLinkPolicy,
19241                    "no_permission" => UpdateFolderPolicyError::NoPermission,
19242                    "team_folder" => UpdateFolderPolicyError::TeamFolder,
19243                    _ => UpdateFolderPolicyError::Other,
19244                };
19245                crate::eat_json_fields(&mut map)?;
19246                Ok(value)
19247            }
19248        }
19249        const VARIANTS: &[&str] = &["access_error",
19250                                    "not_on_team",
19251                                    "team_policy_disallows_member_policy",
19252                                    "disallowed_shared_link_policy",
19253                                    "no_permission",
19254                                    "team_folder",
19255                                    "other"];
19256        deserializer.deserialize_struct("UpdateFolderPolicyError", VARIANTS, EnumVisitor)
19257    }
19258}
19259
19260impl ::serde::ser::Serialize for UpdateFolderPolicyError {
19261    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19262        // union serializer
19263        use serde::ser::SerializeStruct;
19264        match self {
19265            UpdateFolderPolicyError::AccessError(x) => {
19266                // union or polymporphic struct
19267                let mut s = serializer.serialize_struct("UpdateFolderPolicyError", 2)?;
19268                s.serialize_field(".tag", "access_error")?;
19269                s.serialize_field("access_error", x)?;
19270                s.end()
19271            }
19272            UpdateFolderPolicyError::NotOnTeam => {
19273                // unit
19274                let mut s = serializer.serialize_struct("UpdateFolderPolicyError", 1)?;
19275                s.serialize_field(".tag", "not_on_team")?;
19276                s.end()
19277            }
19278            UpdateFolderPolicyError::TeamPolicyDisallowsMemberPolicy => {
19279                // unit
19280                let mut s = serializer.serialize_struct("UpdateFolderPolicyError", 1)?;
19281                s.serialize_field(".tag", "team_policy_disallows_member_policy")?;
19282                s.end()
19283            }
19284            UpdateFolderPolicyError::DisallowedSharedLinkPolicy => {
19285                // unit
19286                let mut s = serializer.serialize_struct("UpdateFolderPolicyError", 1)?;
19287                s.serialize_field(".tag", "disallowed_shared_link_policy")?;
19288                s.end()
19289            }
19290            UpdateFolderPolicyError::NoPermission => {
19291                // unit
19292                let mut s = serializer.serialize_struct("UpdateFolderPolicyError", 1)?;
19293                s.serialize_field(".tag", "no_permission")?;
19294                s.end()
19295            }
19296            UpdateFolderPolicyError::TeamFolder => {
19297                // unit
19298                let mut s = serializer.serialize_struct("UpdateFolderPolicyError", 1)?;
19299                s.serialize_field(".tag", "team_folder")?;
19300                s.end()
19301            }
19302            UpdateFolderPolicyError::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
19303        }
19304    }
19305}
19306
19307impl ::std::error::Error for UpdateFolderPolicyError {
19308    fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
19309        match self {
19310            UpdateFolderPolicyError::AccessError(inner) => Some(inner),
19311            _ => None,
19312        }
19313    }
19314}
19315
19316impl ::std::fmt::Display for UpdateFolderPolicyError {
19317    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19318        match self {
19319            UpdateFolderPolicyError::AccessError(inner) => write!(f, "UpdateFolderPolicyError: {}", inner),
19320            UpdateFolderPolicyError::NoPermission => f.write_str("The current user does not have permission to perform this action."),
19321            UpdateFolderPolicyError::TeamFolder => f.write_str("This action cannot be performed on a team shared folder."),
19322            _ => write!(f, "{:?}", *self),
19323        }
19324    }
19325}
19326
19327/// The information about a user member of the shared content with an appended last seen timestamp.
19328#[derive(Debug, Clone, PartialEq, Eq)]
19329#[non_exhaustive] // structs may have more fields added in the future.
19330pub struct UserFileMembershipInfo {
19331    /// The access type for this member. It contains inherited access type from parent folder, and
19332    /// acquired access type from this folder.
19333    pub access_type: AccessLevel,
19334    /// The account information for the membership user.
19335    pub user: UserInfo,
19336    /// The permissions that requesting user has on this member. The set of permissions corresponds
19337    /// to the MemberActions in the request.
19338    pub permissions: Option<Vec<MemberPermission>>,
19339    /// Never set.
19340    pub initials: Option<String>,
19341    /// True if the member has access from a parent folder.
19342    pub is_inherited: bool,
19343    /// The UTC timestamp of when the user has last seen the content. Only populated if the user has
19344    /// seen the content and the caller has a plan that includes viewer history.
19345    pub time_last_seen: Option<crate::types::common::DropboxTimestamp>,
19346    /// The platform on which the user has last seen the content, or unknown.
19347    pub platform_type: Option<crate::types::seen_state::PlatformType>,
19348}
19349
19350impl UserFileMembershipInfo {
19351    pub fn new(access_type: AccessLevel, user: UserInfo) -> Self {
19352        UserFileMembershipInfo {
19353            access_type,
19354            user,
19355            permissions: None,
19356            initials: None,
19357            is_inherited: false,
19358            time_last_seen: None,
19359            platform_type: None,
19360        }
19361    }
19362
19363    pub fn with_permissions(mut self, value: Vec<MemberPermission>) -> Self {
19364        self.permissions = Some(value);
19365        self
19366    }
19367
19368    pub fn with_initials(mut self, value: String) -> Self {
19369        self.initials = Some(value);
19370        self
19371    }
19372
19373    pub fn with_is_inherited(mut self, value: bool) -> Self {
19374        self.is_inherited = value;
19375        self
19376    }
19377
19378    pub fn with_time_last_seen(mut self, value: crate::types::common::DropboxTimestamp) -> Self {
19379        self.time_last_seen = Some(value);
19380        self
19381    }
19382
19383    pub fn with_platform_type(mut self, value: crate::types::seen_state::PlatformType) -> Self {
19384        self.platform_type = Some(value);
19385        self
19386    }
19387}
19388
19389const USER_FILE_MEMBERSHIP_INFO_FIELDS: &[&str] = &["access_type",
19390                                                    "user",
19391                                                    "permissions",
19392                                                    "initials",
19393                                                    "is_inherited",
19394                                                    "time_last_seen",
19395                                                    "platform_type"];
19396impl UserFileMembershipInfo {
19397    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
19398        map: V,
19399    ) -> Result<UserFileMembershipInfo, V::Error> {
19400        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
19401    }
19402
19403    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
19404        mut map: V,
19405        optional: bool,
19406    ) -> Result<Option<UserFileMembershipInfo>, V::Error> {
19407        let mut field_access_type = None;
19408        let mut field_user = None;
19409        let mut field_permissions = None;
19410        let mut field_initials = None;
19411        let mut field_is_inherited = None;
19412        let mut field_time_last_seen = None;
19413        let mut field_platform_type = None;
19414        let mut nothing = true;
19415        while let Some(key) = map.next_key::<&str>()? {
19416            nothing = false;
19417            match key {
19418                "access_type" => {
19419                    if field_access_type.is_some() {
19420                        return Err(::serde::de::Error::duplicate_field("access_type"));
19421                    }
19422                    field_access_type = Some(map.next_value()?);
19423                }
19424                "user" => {
19425                    if field_user.is_some() {
19426                        return Err(::serde::de::Error::duplicate_field("user"));
19427                    }
19428                    field_user = Some(map.next_value()?);
19429                }
19430                "permissions" => {
19431                    if field_permissions.is_some() {
19432                        return Err(::serde::de::Error::duplicate_field("permissions"));
19433                    }
19434                    field_permissions = Some(map.next_value()?);
19435                }
19436                "initials" => {
19437                    if field_initials.is_some() {
19438                        return Err(::serde::de::Error::duplicate_field("initials"));
19439                    }
19440                    field_initials = Some(map.next_value()?);
19441                }
19442                "is_inherited" => {
19443                    if field_is_inherited.is_some() {
19444                        return Err(::serde::de::Error::duplicate_field("is_inherited"));
19445                    }
19446                    field_is_inherited = Some(map.next_value()?);
19447                }
19448                "time_last_seen" => {
19449                    if field_time_last_seen.is_some() {
19450                        return Err(::serde::de::Error::duplicate_field("time_last_seen"));
19451                    }
19452                    field_time_last_seen = Some(map.next_value()?);
19453                }
19454                "platform_type" => {
19455                    if field_platform_type.is_some() {
19456                        return Err(::serde::de::Error::duplicate_field("platform_type"));
19457                    }
19458                    field_platform_type = Some(map.next_value()?);
19459                }
19460                _ => {
19461                    // unknown field allowed and ignored
19462                    map.next_value::<::serde_json::Value>()?;
19463                }
19464            }
19465        }
19466        if optional && nothing {
19467            return Ok(None);
19468        }
19469        let result = UserFileMembershipInfo {
19470            access_type: field_access_type.ok_or_else(|| ::serde::de::Error::missing_field("access_type"))?,
19471            user: field_user.ok_or_else(|| ::serde::de::Error::missing_field("user"))?,
19472            permissions: field_permissions.and_then(Option::flatten),
19473            initials: field_initials.and_then(Option::flatten),
19474            is_inherited: field_is_inherited.unwrap_or(false),
19475            time_last_seen: field_time_last_seen.and_then(Option::flatten),
19476            platform_type: field_platform_type.and_then(Option::flatten),
19477        };
19478        Ok(Some(result))
19479    }
19480
19481    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
19482        &self,
19483        s: &mut S::SerializeStruct,
19484    ) -> Result<(), S::Error> {
19485        use serde::ser::SerializeStruct;
19486        s.serialize_field("access_type", &self.access_type)?;
19487        s.serialize_field("user", &self.user)?;
19488        if let Some(val) = &self.permissions {
19489            s.serialize_field("permissions", val)?;
19490        }
19491        if let Some(val) = &self.initials {
19492            s.serialize_field("initials", val)?;
19493        }
19494        if self.is_inherited {
19495            s.serialize_field("is_inherited", &self.is_inherited)?;
19496        }
19497        if let Some(val) = &self.time_last_seen {
19498            s.serialize_field("time_last_seen", val)?;
19499        }
19500        if let Some(val) = &self.platform_type {
19501            s.serialize_field("platform_type", val)?;
19502        }
19503        Ok(())
19504    }
19505}
19506
19507impl<'de> ::serde::de::Deserialize<'de> for UserFileMembershipInfo {
19508    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19509        // struct deserializer
19510        use serde::de::{MapAccess, Visitor};
19511        struct StructVisitor;
19512        impl<'de> Visitor<'de> for StructVisitor {
19513            type Value = UserFileMembershipInfo;
19514            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19515                f.write_str("a UserFileMembershipInfo struct")
19516            }
19517            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
19518                UserFileMembershipInfo::internal_deserialize(map)
19519            }
19520        }
19521        deserializer.deserialize_struct("UserFileMembershipInfo", USER_FILE_MEMBERSHIP_INFO_FIELDS, StructVisitor)
19522    }
19523}
19524
19525impl ::serde::ser::Serialize for UserFileMembershipInfo {
19526    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19527        // struct serializer
19528        use serde::ser::SerializeStruct;
19529        let mut s = serializer.serialize_struct("UserFileMembershipInfo", 7)?;
19530        self.internal_serialize::<S>(&mut s)?;
19531        s.end()
19532    }
19533}
19534
19535// struct extends UserMembershipInfo
19536impl From<UserFileMembershipInfo> for UserMembershipInfo {
19537    fn from(subtype: UserFileMembershipInfo) -> Self {
19538        Self {
19539            access_type: subtype.access_type,
19540            user: subtype.user,
19541            permissions: subtype.permissions,
19542            initials: subtype.initials,
19543            is_inherited: subtype.is_inherited,
19544        }
19545    }
19546}
19547/// Basic information about a user. Use [`users::get_account()`](crate::users::get_account) and
19548/// [`users::get_account_batch()`](crate::users::get_account_batch) to obtain more detailed
19549/// information.
19550#[derive(Debug, Clone, PartialEq, Eq)]
19551#[non_exhaustive] // structs may have more fields added in the future.
19552pub struct UserInfo {
19553    /// The account ID of the user.
19554    pub account_id: crate::types::users_common::AccountId,
19555    /// Email address of user.
19556    pub email: String,
19557    /// The display name of the user.
19558    pub display_name: String,
19559    /// If the user is in the same team as current user.
19560    pub same_team: bool,
19561    /// The team member ID of the shared folder member. Only present if `same_team` is true.
19562    pub team_member_id: Option<String>,
19563}
19564
19565impl UserInfo {
19566    pub fn new(
19567        account_id: crate::types::users_common::AccountId,
19568        email: String,
19569        display_name: String,
19570        same_team: bool,
19571    ) -> Self {
19572        UserInfo {
19573            account_id,
19574            email,
19575            display_name,
19576            same_team,
19577            team_member_id: None,
19578        }
19579    }
19580
19581    pub fn with_team_member_id(mut self, value: String) -> Self {
19582        self.team_member_id = Some(value);
19583        self
19584    }
19585}
19586
19587const USER_INFO_FIELDS: &[&str] = &["account_id",
19588                                    "email",
19589                                    "display_name",
19590                                    "same_team",
19591                                    "team_member_id"];
19592impl UserInfo {
19593    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
19594        map: V,
19595    ) -> Result<UserInfo, V::Error> {
19596        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
19597    }
19598
19599    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
19600        mut map: V,
19601        optional: bool,
19602    ) -> Result<Option<UserInfo>, V::Error> {
19603        let mut field_account_id = None;
19604        let mut field_email = None;
19605        let mut field_display_name = None;
19606        let mut field_same_team = None;
19607        let mut field_team_member_id = None;
19608        let mut nothing = true;
19609        while let Some(key) = map.next_key::<&str>()? {
19610            nothing = false;
19611            match key {
19612                "account_id" => {
19613                    if field_account_id.is_some() {
19614                        return Err(::serde::de::Error::duplicate_field("account_id"));
19615                    }
19616                    field_account_id = Some(map.next_value()?);
19617                }
19618                "email" => {
19619                    if field_email.is_some() {
19620                        return Err(::serde::de::Error::duplicate_field("email"));
19621                    }
19622                    field_email = Some(map.next_value()?);
19623                }
19624                "display_name" => {
19625                    if field_display_name.is_some() {
19626                        return Err(::serde::de::Error::duplicate_field("display_name"));
19627                    }
19628                    field_display_name = Some(map.next_value()?);
19629                }
19630                "same_team" => {
19631                    if field_same_team.is_some() {
19632                        return Err(::serde::de::Error::duplicate_field("same_team"));
19633                    }
19634                    field_same_team = Some(map.next_value()?);
19635                }
19636                "team_member_id" => {
19637                    if field_team_member_id.is_some() {
19638                        return Err(::serde::de::Error::duplicate_field("team_member_id"));
19639                    }
19640                    field_team_member_id = Some(map.next_value()?);
19641                }
19642                _ => {
19643                    // unknown field allowed and ignored
19644                    map.next_value::<::serde_json::Value>()?;
19645                }
19646            }
19647        }
19648        if optional && nothing {
19649            return Ok(None);
19650        }
19651        let result = UserInfo {
19652            account_id: field_account_id.ok_or_else(|| ::serde::de::Error::missing_field("account_id"))?,
19653            email: field_email.ok_or_else(|| ::serde::de::Error::missing_field("email"))?,
19654            display_name: field_display_name.ok_or_else(|| ::serde::de::Error::missing_field("display_name"))?,
19655            same_team: field_same_team.ok_or_else(|| ::serde::de::Error::missing_field("same_team"))?,
19656            team_member_id: field_team_member_id.and_then(Option::flatten),
19657        };
19658        Ok(Some(result))
19659    }
19660
19661    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
19662        &self,
19663        s: &mut S::SerializeStruct,
19664    ) -> Result<(), S::Error> {
19665        use serde::ser::SerializeStruct;
19666        s.serialize_field("account_id", &self.account_id)?;
19667        s.serialize_field("email", &self.email)?;
19668        s.serialize_field("display_name", &self.display_name)?;
19669        s.serialize_field("same_team", &self.same_team)?;
19670        if let Some(val) = &self.team_member_id {
19671            s.serialize_field("team_member_id", val)?;
19672        }
19673        Ok(())
19674    }
19675}
19676
19677impl<'de> ::serde::de::Deserialize<'de> for UserInfo {
19678    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19679        // struct deserializer
19680        use serde::de::{MapAccess, Visitor};
19681        struct StructVisitor;
19682        impl<'de> Visitor<'de> for StructVisitor {
19683            type Value = UserInfo;
19684            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19685                f.write_str("a UserInfo struct")
19686            }
19687            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
19688                UserInfo::internal_deserialize(map)
19689            }
19690        }
19691        deserializer.deserialize_struct("UserInfo", USER_INFO_FIELDS, StructVisitor)
19692    }
19693}
19694
19695impl ::serde::ser::Serialize for UserInfo {
19696    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19697        // struct serializer
19698        use serde::ser::SerializeStruct;
19699        let mut s = serializer.serialize_struct("UserInfo", 5)?;
19700        self.internal_serialize::<S>(&mut s)?;
19701        s.end()
19702    }
19703}
19704
19705/// The information about a user member of the shared content.
19706#[derive(Debug, Clone, PartialEq, Eq)]
19707#[non_exhaustive] // structs may have more fields added in the future.
19708pub struct UserMembershipInfo {
19709    /// The access type for this member. It contains inherited access type from parent folder, and
19710    /// acquired access type from this folder.
19711    pub access_type: AccessLevel,
19712    /// The account information for the membership user.
19713    pub user: UserInfo,
19714    /// The permissions that requesting user has on this member. The set of permissions corresponds
19715    /// to the MemberActions in the request.
19716    pub permissions: Option<Vec<MemberPermission>>,
19717    /// Never set.
19718    pub initials: Option<String>,
19719    /// True if the member has access from a parent folder.
19720    pub is_inherited: bool,
19721}
19722
19723impl UserMembershipInfo {
19724    pub fn new(access_type: AccessLevel, user: UserInfo) -> Self {
19725        UserMembershipInfo {
19726            access_type,
19727            user,
19728            permissions: None,
19729            initials: None,
19730            is_inherited: false,
19731        }
19732    }
19733
19734    pub fn with_permissions(mut self, value: Vec<MemberPermission>) -> Self {
19735        self.permissions = Some(value);
19736        self
19737    }
19738
19739    pub fn with_initials(mut self, value: String) -> Self {
19740        self.initials = Some(value);
19741        self
19742    }
19743
19744    pub fn with_is_inherited(mut self, value: bool) -> Self {
19745        self.is_inherited = value;
19746        self
19747    }
19748}
19749
19750const USER_MEMBERSHIP_INFO_FIELDS: &[&str] = &["access_type",
19751                                               "user",
19752                                               "permissions",
19753                                               "initials",
19754                                               "is_inherited"];
19755impl UserMembershipInfo {
19756    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
19757        map: V,
19758    ) -> Result<UserMembershipInfo, V::Error> {
19759        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
19760    }
19761
19762    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
19763        mut map: V,
19764        optional: bool,
19765    ) -> Result<Option<UserMembershipInfo>, V::Error> {
19766        let mut field_access_type = None;
19767        let mut field_user = None;
19768        let mut field_permissions = None;
19769        let mut field_initials = None;
19770        let mut field_is_inherited = None;
19771        let mut nothing = true;
19772        while let Some(key) = map.next_key::<&str>()? {
19773            nothing = false;
19774            match key {
19775                "access_type" => {
19776                    if field_access_type.is_some() {
19777                        return Err(::serde::de::Error::duplicate_field("access_type"));
19778                    }
19779                    field_access_type = Some(map.next_value()?);
19780                }
19781                "user" => {
19782                    if field_user.is_some() {
19783                        return Err(::serde::de::Error::duplicate_field("user"));
19784                    }
19785                    field_user = Some(map.next_value()?);
19786                }
19787                "permissions" => {
19788                    if field_permissions.is_some() {
19789                        return Err(::serde::de::Error::duplicate_field("permissions"));
19790                    }
19791                    field_permissions = Some(map.next_value()?);
19792                }
19793                "initials" => {
19794                    if field_initials.is_some() {
19795                        return Err(::serde::de::Error::duplicate_field("initials"));
19796                    }
19797                    field_initials = Some(map.next_value()?);
19798                }
19799                "is_inherited" => {
19800                    if field_is_inherited.is_some() {
19801                        return Err(::serde::de::Error::duplicate_field("is_inherited"));
19802                    }
19803                    field_is_inherited = Some(map.next_value()?);
19804                }
19805                _ => {
19806                    // unknown field allowed and ignored
19807                    map.next_value::<::serde_json::Value>()?;
19808                }
19809            }
19810        }
19811        if optional && nothing {
19812            return Ok(None);
19813        }
19814        let result = UserMembershipInfo {
19815            access_type: field_access_type.ok_or_else(|| ::serde::de::Error::missing_field("access_type"))?,
19816            user: field_user.ok_or_else(|| ::serde::de::Error::missing_field("user"))?,
19817            permissions: field_permissions.and_then(Option::flatten),
19818            initials: field_initials.and_then(Option::flatten),
19819            is_inherited: field_is_inherited.unwrap_or(false),
19820        };
19821        Ok(Some(result))
19822    }
19823
19824    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
19825        &self,
19826        s: &mut S::SerializeStruct,
19827    ) -> Result<(), S::Error> {
19828        use serde::ser::SerializeStruct;
19829        s.serialize_field("access_type", &self.access_type)?;
19830        s.serialize_field("user", &self.user)?;
19831        if let Some(val) = &self.permissions {
19832            s.serialize_field("permissions", val)?;
19833        }
19834        if let Some(val) = &self.initials {
19835            s.serialize_field("initials", val)?;
19836        }
19837        if self.is_inherited {
19838            s.serialize_field("is_inherited", &self.is_inherited)?;
19839        }
19840        Ok(())
19841    }
19842}
19843
19844impl<'de> ::serde::de::Deserialize<'de> for UserMembershipInfo {
19845    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19846        // struct deserializer
19847        use serde::de::{MapAccess, Visitor};
19848        struct StructVisitor;
19849        impl<'de> Visitor<'de> for StructVisitor {
19850            type Value = UserMembershipInfo;
19851            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19852                f.write_str("a UserMembershipInfo struct")
19853            }
19854            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
19855                UserMembershipInfo::internal_deserialize(map)
19856            }
19857        }
19858        deserializer.deserialize_struct("UserMembershipInfo", USER_MEMBERSHIP_INFO_FIELDS, StructVisitor)
19859    }
19860}
19861
19862impl ::serde::ser::Serialize for UserMembershipInfo {
19863    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19864        // struct serializer
19865        use serde::ser::SerializeStruct;
19866        let mut s = serializer.serialize_struct("UserMembershipInfo", 5)?;
19867        self.internal_serialize::<S>(&mut s)?;
19868        s.end()
19869    }
19870}
19871
19872// struct extends MembershipInfo
19873impl From<UserMembershipInfo> for MembershipInfo {
19874    fn from(subtype: UserMembershipInfo) -> Self {
19875        Self {
19876            access_type: subtype.access_type,
19877            permissions: subtype.permissions,
19878            initials: subtype.initials,
19879            is_inherited: subtype.is_inherited,
19880        }
19881    }
19882}
19883#[derive(Debug, Clone, PartialEq, Eq)]
19884#[non_exhaustive] // variants may be added in the future
19885pub enum ViewerInfoPolicy {
19886    /// Viewer information is available on this file.
19887    Enabled,
19888    /// Viewer information is disabled on this file.
19889    Disabled,
19890    /// Catch-all used for unrecognized values returned from the server. Encountering this value
19891    /// typically indicates that this SDK version is out of date.
19892    Other,
19893}
19894
19895impl<'de> ::serde::de::Deserialize<'de> for ViewerInfoPolicy {
19896    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19897        // union deserializer
19898        use serde::de::{self, MapAccess, Visitor};
19899        struct EnumVisitor;
19900        impl<'de> Visitor<'de> for EnumVisitor {
19901            type Value = ViewerInfoPolicy;
19902            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19903                f.write_str("a ViewerInfoPolicy structure")
19904            }
19905            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
19906                let tag: &str = match map.next_key()? {
19907                    Some(".tag") => map.next_value()?,
19908                    _ => return Err(de::Error::missing_field(".tag"))
19909                };
19910                let value = match tag {
19911                    "enabled" => ViewerInfoPolicy::Enabled,
19912                    "disabled" => ViewerInfoPolicy::Disabled,
19913                    _ => ViewerInfoPolicy::Other,
19914                };
19915                crate::eat_json_fields(&mut map)?;
19916                Ok(value)
19917            }
19918        }
19919        const VARIANTS: &[&str] = &["enabled",
19920                                    "disabled",
19921                                    "other"];
19922        deserializer.deserialize_struct("ViewerInfoPolicy", VARIANTS, EnumVisitor)
19923    }
19924}
19925
19926impl ::serde::ser::Serialize for ViewerInfoPolicy {
19927    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19928        // union serializer
19929        use serde::ser::SerializeStruct;
19930        match self {
19931            ViewerInfoPolicy::Enabled => {
19932                // unit
19933                let mut s = serializer.serialize_struct("ViewerInfoPolicy", 1)?;
19934                s.serialize_field(".tag", "enabled")?;
19935                s.end()
19936            }
19937            ViewerInfoPolicy::Disabled => {
19938                // unit
19939                let mut s = serializer.serialize_struct("ViewerInfoPolicy", 1)?;
19940                s.serialize_field(".tag", "disabled")?;
19941                s.end()
19942            }
19943            ViewerInfoPolicy::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
19944        }
19945    }
19946}
19947
19948/// Who can access a shared link. The most open visibility is [`Public`](Visibility::Public). The
19949/// default depends on many aspects, such as team and user preferences and shared folder settings.
19950#[derive(Debug, Clone, PartialEq, Eq)]
19951#[non_exhaustive] // variants may be added in the future
19952pub enum Visibility {
19953    /// Anyone who has received the link can access it. No login required.
19954    Public,
19955    /// Only members of the same team can access the link. Login is required.
19956    TeamOnly,
19957    /// A link-specific password is required to access the link. Login is not required.
19958    Password,
19959    /// Only members of the same team who have the link-specific password can access the link.
19960    TeamAndPassword,
19961    /// Only members of the shared folder containing the linked file can access the link. Login is
19962    /// required.
19963    SharedFolderOnly,
19964    /// Catch-all used for unrecognized values returned from the server. Encountering this value
19965    /// typically indicates that this SDK version is out of date.
19966    Other,
19967}
19968
19969impl<'de> ::serde::de::Deserialize<'de> for Visibility {
19970    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19971        // union deserializer
19972        use serde::de::{self, MapAccess, Visitor};
19973        struct EnumVisitor;
19974        impl<'de> Visitor<'de> for EnumVisitor {
19975            type Value = Visibility;
19976            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
19977                f.write_str("a Visibility structure")
19978            }
19979            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
19980                let tag: &str = match map.next_key()? {
19981                    Some(".tag") => map.next_value()?,
19982                    _ => return Err(de::Error::missing_field(".tag"))
19983                };
19984                let value = match tag {
19985                    "public" => Visibility::Public,
19986                    "team_only" => Visibility::TeamOnly,
19987                    "password" => Visibility::Password,
19988                    "team_and_password" => Visibility::TeamAndPassword,
19989                    "shared_folder_only" => Visibility::SharedFolderOnly,
19990                    _ => Visibility::Other,
19991                };
19992                crate::eat_json_fields(&mut map)?;
19993                Ok(value)
19994            }
19995        }
19996        const VARIANTS: &[&str] = &["public",
19997                                    "team_only",
19998                                    "password",
19999                                    "team_and_password",
20000                                    "shared_folder_only",
20001                                    "other"];
20002        deserializer.deserialize_struct("Visibility", VARIANTS, EnumVisitor)
20003    }
20004}
20005
20006impl ::serde::ser::Serialize for Visibility {
20007    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
20008        // union serializer
20009        use serde::ser::SerializeStruct;
20010        match self {
20011            Visibility::Public => {
20012                // unit
20013                let mut s = serializer.serialize_struct("Visibility", 1)?;
20014                s.serialize_field(".tag", "public")?;
20015                s.end()
20016            }
20017            Visibility::TeamOnly => {
20018                // unit
20019                let mut s = serializer.serialize_struct("Visibility", 1)?;
20020                s.serialize_field(".tag", "team_only")?;
20021                s.end()
20022            }
20023            Visibility::Password => {
20024                // unit
20025                let mut s = serializer.serialize_struct("Visibility", 1)?;
20026                s.serialize_field(".tag", "password")?;
20027                s.end()
20028            }
20029            Visibility::TeamAndPassword => {
20030                // unit
20031                let mut s = serializer.serialize_struct("Visibility", 1)?;
20032                s.serialize_field(".tag", "team_and_password")?;
20033                s.end()
20034            }
20035            Visibility::SharedFolderOnly => {
20036                // unit
20037                let mut s = serializer.serialize_struct("Visibility", 1)?;
20038                s.serialize_field(".tag", "shared_folder_only")?;
20039                s.end()
20040            }
20041            Visibility::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
20042        }
20043    }
20044}
20045
20046#[derive(Debug, Clone, PartialEq, Eq)]
20047#[non_exhaustive] // structs may have more fields added in the future.
20048pub struct VisibilityPolicy {
20049    /// This is the value to submit when saving the visibility setting.
20050    pub policy: RequestedVisibility,
20051    /// This is what the effective policy would be, if you selected this option. The resolved policy
20052    /// is obtained after considering external effects such as shared folder settings and team
20053    /// policy. This value is guaranteed to be provided.
20054    pub resolved_policy: AlphaResolvedVisibility,
20055    /// Whether the user is permitted to set the visibility to this policy.
20056    pub allowed: bool,
20057    /// If `allowed` is `false`, this will provide the reason that the user is not permitted to set
20058    /// the visibility to this policy.
20059    pub disallowed_reason: Option<VisibilityPolicyDisallowedReason>,
20060}
20061
20062impl VisibilityPolicy {
20063    pub fn new(
20064        policy: RequestedVisibility,
20065        resolved_policy: AlphaResolvedVisibility,
20066        allowed: bool,
20067    ) -> Self {
20068        VisibilityPolicy {
20069            policy,
20070            resolved_policy,
20071            allowed,
20072            disallowed_reason: None,
20073        }
20074    }
20075
20076    pub fn with_disallowed_reason(mut self, value: VisibilityPolicyDisallowedReason) -> Self {
20077        self.disallowed_reason = Some(value);
20078        self
20079    }
20080}
20081
20082const VISIBILITY_POLICY_FIELDS: &[&str] = &["policy",
20083                                            "resolved_policy",
20084                                            "allowed",
20085                                            "disallowed_reason"];
20086impl VisibilityPolicy {
20087    pub(crate) fn internal_deserialize<'de, V: ::serde::de::MapAccess<'de>>(
20088        map: V,
20089    ) -> Result<VisibilityPolicy, V::Error> {
20090        Self::internal_deserialize_opt(map, false).map(Option::unwrap)
20091    }
20092
20093    pub(crate) fn internal_deserialize_opt<'de, V: ::serde::de::MapAccess<'de>>(
20094        mut map: V,
20095        optional: bool,
20096    ) -> Result<Option<VisibilityPolicy>, V::Error> {
20097        let mut field_policy = None;
20098        let mut field_resolved_policy = None;
20099        let mut field_allowed = None;
20100        let mut field_disallowed_reason = None;
20101        let mut nothing = true;
20102        while let Some(key) = map.next_key::<&str>()? {
20103            nothing = false;
20104            match key {
20105                "policy" => {
20106                    if field_policy.is_some() {
20107                        return Err(::serde::de::Error::duplicate_field("policy"));
20108                    }
20109                    field_policy = Some(map.next_value()?);
20110                }
20111                "resolved_policy" => {
20112                    if field_resolved_policy.is_some() {
20113                        return Err(::serde::de::Error::duplicate_field("resolved_policy"));
20114                    }
20115                    field_resolved_policy = Some(map.next_value()?);
20116                }
20117                "allowed" => {
20118                    if field_allowed.is_some() {
20119                        return Err(::serde::de::Error::duplicate_field("allowed"));
20120                    }
20121                    field_allowed = Some(map.next_value()?);
20122                }
20123                "disallowed_reason" => {
20124                    if field_disallowed_reason.is_some() {
20125                        return Err(::serde::de::Error::duplicate_field("disallowed_reason"));
20126                    }
20127                    field_disallowed_reason = Some(map.next_value()?);
20128                }
20129                _ => {
20130                    // unknown field allowed and ignored
20131                    map.next_value::<::serde_json::Value>()?;
20132                }
20133            }
20134        }
20135        if optional && nothing {
20136            return Ok(None);
20137        }
20138        let result = VisibilityPolicy {
20139            policy: field_policy.ok_or_else(|| ::serde::de::Error::missing_field("policy"))?,
20140            resolved_policy: field_resolved_policy.ok_or_else(|| ::serde::de::Error::missing_field("resolved_policy"))?,
20141            allowed: field_allowed.ok_or_else(|| ::serde::de::Error::missing_field("allowed"))?,
20142            disallowed_reason: field_disallowed_reason.and_then(Option::flatten),
20143        };
20144        Ok(Some(result))
20145    }
20146
20147    pub(crate) fn internal_serialize<S: ::serde::ser::Serializer>(
20148        &self,
20149        s: &mut S::SerializeStruct,
20150    ) -> Result<(), S::Error> {
20151        use serde::ser::SerializeStruct;
20152        s.serialize_field("policy", &self.policy)?;
20153        s.serialize_field("resolved_policy", &self.resolved_policy)?;
20154        s.serialize_field("allowed", &self.allowed)?;
20155        if let Some(val) = &self.disallowed_reason {
20156            s.serialize_field("disallowed_reason", val)?;
20157        }
20158        Ok(())
20159    }
20160}
20161
20162impl<'de> ::serde::de::Deserialize<'de> for VisibilityPolicy {
20163    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
20164        // struct deserializer
20165        use serde::de::{MapAccess, Visitor};
20166        struct StructVisitor;
20167        impl<'de> Visitor<'de> for StructVisitor {
20168            type Value = VisibilityPolicy;
20169            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
20170                f.write_str("a VisibilityPolicy struct")
20171            }
20172            fn visit_map<V: MapAccess<'de>>(self, map: V) -> Result<Self::Value, V::Error> {
20173                VisibilityPolicy::internal_deserialize(map)
20174            }
20175        }
20176        deserializer.deserialize_struct("VisibilityPolicy", VISIBILITY_POLICY_FIELDS, StructVisitor)
20177    }
20178}
20179
20180impl ::serde::ser::Serialize for VisibilityPolicy {
20181    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
20182        // struct serializer
20183        use serde::ser::SerializeStruct;
20184        let mut s = serializer.serialize_struct("VisibilityPolicy", 4)?;
20185        self.internal_serialize::<S>(&mut s)?;
20186        s.end()
20187    }
20188}
20189
20190#[derive(Debug, Clone, PartialEq, Eq)]
20191#[non_exhaustive] // variants may be added in the future
20192pub enum VisibilityPolicyDisallowedReason {
20193    /// The user needs to delete and recreate the link to change the visibility policy.
20194    DeleteAndRecreate,
20195    /// The parent shared folder restricts sharing of links outside the shared folder. To change the
20196    /// visibility policy, remove the restriction from the parent shared folder.
20197    RestrictedBySharedFolder,
20198    /// The team policy prevents links being shared outside the team.
20199    RestrictedByTeam,
20200    /// The user needs to be on a team to set this policy.
20201    UserNotOnTeam,
20202    /// The user is a basic user or is on a limited team.
20203    UserAccountType,
20204    /// The user does not have permission.
20205    PermissionDenied,
20206    /// Catch-all used for unrecognized values returned from the server. Encountering this value
20207    /// typically indicates that this SDK version is out of date.
20208    Other,
20209}
20210
20211impl<'de> ::serde::de::Deserialize<'de> for VisibilityPolicyDisallowedReason {
20212    fn deserialize<D: ::serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
20213        // union deserializer
20214        use serde::de::{self, MapAccess, Visitor};
20215        struct EnumVisitor;
20216        impl<'de> Visitor<'de> for EnumVisitor {
20217            type Value = VisibilityPolicyDisallowedReason;
20218            fn expecting(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
20219                f.write_str("a VisibilityPolicyDisallowedReason structure")
20220            }
20221            fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<Self::Value, V::Error> {
20222                let tag: &str = match map.next_key()? {
20223                    Some(".tag") => map.next_value()?,
20224                    _ => return Err(de::Error::missing_field(".tag"))
20225                };
20226                let value = match tag {
20227                    "delete_and_recreate" => VisibilityPolicyDisallowedReason::DeleteAndRecreate,
20228                    "restricted_by_shared_folder" => VisibilityPolicyDisallowedReason::RestrictedBySharedFolder,
20229                    "restricted_by_team" => VisibilityPolicyDisallowedReason::RestrictedByTeam,
20230                    "user_not_on_team" => VisibilityPolicyDisallowedReason::UserNotOnTeam,
20231                    "user_account_type" => VisibilityPolicyDisallowedReason::UserAccountType,
20232                    "permission_denied" => VisibilityPolicyDisallowedReason::PermissionDenied,
20233                    _ => VisibilityPolicyDisallowedReason::Other,
20234                };
20235                crate::eat_json_fields(&mut map)?;
20236                Ok(value)
20237            }
20238        }
20239        const VARIANTS: &[&str] = &["delete_and_recreate",
20240                                    "restricted_by_shared_folder",
20241                                    "restricted_by_team",
20242                                    "user_not_on_team",
20243                                    "user_account_type",
20244                                    "permission_denied",
20245                                    "other"];
20246        deserializer.deserialize_struct("VisibilityPolicyDisallowedReason", VARIANTS, EnumVisitor)
20247    }
20248}
20249
20250impl ::serde::ser::Serialize for VisibilityPolicyDisallowedReason {
20251    fn serialize<S: ::serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
20252        // union serializer
20253        use serde::ser::SerializeStruct;
20254        match self {
20255            VisibilityPolicyDisallowedReason::DeleteAndRecreate => {
20256                // unit
20257                let mut s = serializer.serialize_struct("VisibilityPolicyDisallowedReason", 1)?;
20258                s.serialize_field(".tag", "delete_and_recreate")?;
20259                s.end()
20260            }
20261            VisibilityPolicyDisallowedReason::RestrictedBySharedFolder => {
20262                // unit
20263                let mut s = serializer.serialize_struct("VisibilityPolicyDisallowedReason", 1)?;
20264                s.serialize_field(".tag", "restricted_by_shared_folder")?;
20265                s.end()
20266            }
20267            VisibilityPolicyDisallowedReason::RestrictedByTeam => {
20268                // unit
20269                let mut s = serializer.serialize_struct("VisibilityPolicyDisallowedReason", 1)?;
20270                s.serialize_field(".tag", "restricted_by_team")?;
20271                s.end()
20272            }
20273            VisibilityPolicyDisallowedReason::UserNotOnTeam => {
20274                // unit
20275                let mut s = serializer.serialize_struct("VisibilityPolicyDisallowedReason", 1)?;
20276                s.serialize_field(".tag", "user_not_on_team")?;
20277                s.end()
20278            }
20279            VisibilityPolicyDisallowedReason::UserAccountType => {
20280                // unit
20281                let mut s = serializer.serialize_struct("VisibilityPolicyDisallowedReason", 1)?;
20282                s.serialize_field(".tag", "user_account_type")?;
20283                s.end()
20284            }
20285            VisibilityPolicyDisallowedReason::PermissionDenied => {
20286                // unit
20287                let mut s = serializer.serialize_struct("VisibilityPolicyDisallowedReason", 1)?;
20288                s.serialize_field(".tag", "permission_denied")?;
20289                s.end()
20290            }
20291            VisibilityPolicyDisallowedReason::Other => Err(::serde::ser::Error::custom("cannot serialize 'Other' variant"))
20292        }
20293    }
20294}
20295