dinio_sdk/ops/members.rs
1//! Zone members by email or user uuid.
2
3use uuid::Uuid;
4
5use crate::client::Client;
6use crate::error::{Error, Result};
7use crate::models::ZoneMember;
8
9/// The member `reference` names: a user uuid, or an email compared case-insensitively
10/// (as Core does when adding).
11///
12/// # Examples
13///
14/// ```
15/// use dinio_sdk::models::ZoneMember;
16/// use dinio_sdk::Uuid;
17///
18/// let members = vec![ZoneMember {
19/// zone_id: Uuid::nil(),
20/// user_id: Uuid::nil(),
21/// email: Some("Ana@example.com".into()),
22/// role: "Administrator".into(),
23/// created_at: 0,
24/// updated_at: 0,
25/// }];
26/// assert!(dinio_sdk::ops::match_member(&members, "ana@EXAMPLE.com").is_some());
27/// assert!(dinio_sdk::ops::match_member(&members, "00000000-0000-0000-0000-000000000000").is_some());
28/// assert!(dinio_sdk::ops::match_member(&members, "ivo@example.com").is_none());
29/// ```
30pub fn match_member<'a>(members: &'a [ZoneMember], reference: &str) -> Option<&'a ZoneMember> {
31 let reference = reference.trim();
32 if let Ok(user_id) = reference.parse::<Uuid>() {
33 return members.iter().find(|m| m.user_id == user_id);
34 }
35 let email = reference.to_lowercase();
36 members.iter().find(|m| {
37 m.email
38 .as_deref()
39 .is_some_and(|e| e.to_lowercase() == email)
40 })
41}
42
43/// The zone's member `reference` names (user uuid or email, see [`match_member`]).
44/// Removing a member takes the user uuid, which this finds from an email.
45///
46/// # Errors
47///
48/// * [`Error::NotFound`] if no member matches.
49/// * Any error of [`ZoneMembers::list`](crate::api::ZoneMembers::list).
50///
51/// # Examples
52///
53/// ```no_run
54/// # async fn example(client: &dinio_sdk::Client, zone: &dinio_sdk::models::Zone) -> dinio_sdk::Result<()> {
55/// let member = dinio_sdk::ops::find_member(client, zone.uuid, "ana@example.com").await?;
56/// client.zone_members().remove(zone.uuid, member.user_id).await?;
57/// # Ok(())
58/// # }
59/// ```
60pub async fn find_member(client: &Client, zone_id: Uuid, reference: &str) -> Result<ZoneMember> {
61 let members = client.zone_members().list(zone_id).await?;
62 match_member(&members, reference).cloned().ok_or_else(|| {
63 Error::NotFound(format!(
64 "no member with user uuid or email {:?} in this zone",
65 reference.trim()
66 ))
67 })
68}