1use crate::admin::MemberPublicKeys;
4use crate::codes::InviteKind;
5use crate::error::Error;
6use crate::value::name;
7use crate::wire::{wire_struct, Decoder, Encoder, Wire};
8use coven_foundation::id_source::{DeviceId, InviteId, MemberId};
9
10#[derive(Clone, Debug, PartialEq, Eq)]
12pub struct JoinRequest {
13 pub invite: InviteId,
15 pub member: MemberId,
18 pub keys: MemberPublicKeys,
20 pub device: DeviceId,
23 pub device_name: String,
25 pub joiner: Joiner,
28}
29wire_struct!(JoinRequest, invite, member, keys, device, device_name => crate::wire::get_name, joiner);
30impl JoinRequest {
31 pub(crate) fn validate(&self) -> Result<(), Error> {
32 name(&self.device_name)?;
33 self.joiner.validate()
34 }
35}
36
37#[derive(Clone, Debug, PartialEq, Eq)]
40pub enum Joiner {
41 NewPerson {
44 name: String,
46 },
47 Recovery,
50}
51impl Joiner {
52 pub fn kind(&self) -> InviteKind {
54 match self {
55 Self::NewPerson { .. } => InviteKind::NewPerson,
56 Self::Recovery => InviteKind::Recovery,
57 }
58 }
59 fn validate(&self) -> Result<(), Error> {
60 match self {
61 Self::NewPerson { name: person } => name(person),
62 Self::Recovery => Ok(()),
63 }
64 }
65}
66impl Wire for Joiner {
67 fn put(&self, out: &mut Encoder) -> Result<(), Error> {
68 match self {
69 Self::Recovery => 0u8.put(out),
70 Self::NewPerson { name: person } => {
71 1u8.put(out)?;
72 person.put(out)
73 }
74 }
75 }
76 fn get(input: &mut Decoder<'_>) -> Result<Self, Error> {
77 match u8::get(input)? {
78 0 => Ok(Self::Recovery),
79 1 => Ok(Self::NewPerson { name: crate::wire::get_name(input)? }),
80 tag => Err(Error::UnknownTag { field: "joiner", tag }),
81 }
82 }
83}
84
85#[cfg(test)]
86#[path = "objects_tests.rs"]
87mod tests;