cyfs_core/im/
add_friend.rs1use crate::CoreObjectType;
2use cyfs_base::*;
3use serde::Serialize;
4
5#[derive(Clone, ProtobufEncode, ProtobufDecode, ProtobufTransform, Serialize)]
6#[cyfs_protobuf_type(crate::codec::protos::AddFriendDescContent)]
7pub struct AddFriendDescContent {
8 to: PeopleId,
9}
10
11impl DescContent for AddFriendDescContent {
12 fn obj_type() -> u16 {
13 CoreObjectType::AddFriend as u16
14 }
15
16 fn format(&self) -> u8 {
17 OBJECT_CONTENT_CODEC_FORMAT_PROTOBUF
18 }
19
20 fn debug_info() -> String {
21 String::from("AddFriendDescContent")
22 }
23
24 type OwnerType = Option<ObjectId>;
25 type AreaType = SubDescNone;
26 type AuthorType = Option<ObjectId>;
27 type PublicKeyType = SubDescNone;
28}
29
30type AddFriendType = NamedObjType<AddFriendDescContent, EmptyProtobufBodyContent>;
31type AddFriendBuilder = NamedObjectBuilder<AddFriendDescContent, EmptyProtobufBodyContent>;
32
33pub type AddFriendId = NamedObjectId<AddFriendType>;
34pub type AddFriend = NamedObjectBase<AddFriendType>;
35
36impl AddFriendDescContent {
37 pub fn new(to: PeopleId) -> Self {
38 Self { to }
39 }
40}
41
42pub trait AddFriendObject {
43 fn create(owner: PeopleId, author: ObjectId, to: PeopleId) -> Self;
44 fn to(&self) -> &PeopleId;
45}
46
47impl AddFriendObject for AddFriend {
48 fn create(owner: PeopleId, author: ObjectId, to: PeopleId) -> Self {
49 let desc = AddFriendDescContent { to };
50
51 AddFriendBuilder::new(desc, EmptyProtobufBodyContent::default())
52 .owner(owner.into())
53 .author(author)
54 .build()
55 }
56
57 fn to(&self) -> &PeopleId {
58 &self.desc().content().to
59 }
60}
61#[cfg(test)]
62mod test {
63 use super::{AddFriend, AddFriendObject};
64 use cyfs_base::*;
65
66 #[async_std::test]
67 async fn add_friend() {
68 let secret1 = PrivateKey::generate_rsa(1024).unwrap();
69 let secret2 = PrivateKey::generate_rsa(1024).unwrap();
70 let people1 = People::new(None, vec![], secret1.public(), None, None, None).build();
71 let people1_id = people1.desc().people_id();
72 let people2 = People::new(None, vec![], secret2.public(), None, None, None).build();
73 let _people2_id = people2.desc().people_id();
74
75 let mut add1 = AddFriend::create(
76 people1_id.clone(),
77 people1_id.object_id().to_owned(),
78 people1_id.clone(),
79 );
80
81 let signer = RsaCPUObjectSigner::new(people1.desc().public_key().clone(), secret1);
82 let ret = sign_and_push_named_object_body(&signer, &mut add1, &SignatureSource::RefIndex(0)).await;
83 assert!(ret.is_ok());
84
85 let buf = add1.to_vec().unwrap();
86 let add2 = AddFriend::clone_from_slice(&buf).unwrap();
87 let any = AnyNamedObject::clone_from_slice(&buf).unwrap();
88 assert_eq!(add1.desc().calculate_id(), add2.desc().calculate_id());
89 assert_eq!(add1.desc().calculate_id(), any.calculate_id());
90 }
91}