cyfs_core/im/
add_friend.rs

1use 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}