sofapub/
actor.rs

1use serde::{Deserialize, Serialize};
2
3use crate::Configuration;
4
5#[derive(Serialize, Deserialize, Clone, Debug)]
6#[serde(rename_all = "camelCase")]
7pub struct PublicKey {
8    id: String,
9    owner: String,
10    public_key_pem: String,
11}
12
13#[derive(Serialize, Deserialize, Clone, Debug)]
14#[serde(rename_all = "camelCase")]
15pub struct Actor {
16    #[serde(rename = "@context")]
17    pub context: String,
18
19    #[serde(rename = "type")]
20    pub kind: String,
21
22    pub name: String,
23    pub summary: String,
24    pub id: String,
25    pub preferred_username: String,
26    pub inbox: String,
27    pub outbox: String,
28    pub public_key: PublicKey,
29    pub published: String,
30}
31
32impl From<Configuration> for Actor {
33    fn from(configuration: Configuration) -> Self {
34        Actor {
35            context: "https://www.w3.org/ns/activitystreams".to_string(),
36            kind: "Person".to_string(),
37            name: configuration.display_name.clone(),
38            summary: configuration.summary.clone(),
39            id: format!("https://{}/profile", configuration.domain),
40            preferred_username: configuration.username.clone(),
41            inbox: format!("https://{}/inbox", configuration.domain,),
42            outbox: format!("https://{}/outbox", configuration.domain,),
43            public_key: PublicKey {
44                id: format!("https://{}/profile#main-key", configuration.domain),
45                owner: format!("https://{}/profile", configuration.domain),
46                public_key_pem: configuration.public_key,
47            },
48            published: configuration.published,
49        }
50    }
51}
52
53impl Actor {
54    pub fn profile(&self) -> String {
55        format!(
56            "<html><body><h1>{}</h1><h2>{}</h2></body></html>",
57            self.name, self.id
58        )
59    }
60}