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}