This repository has no description
1#![allow(dead_code)]
2
3use std::path::PathBuf;
4
5use knot_cob::{CobHome, CobId, CobStore};
6use knot_cobs::{CollaboratorsChange, Grant, MembersChange, Registration, RegistryChange, Removal};
7use knot_git::{Layout, Repo};
8use knot_index::Index;
9use knot_runtime::{K256Signer, SeededEntropy};
10use knot_types::{AccountDid, KnotId, OwnerDid, RepoDid, RepoName, RepoRkey, UnixSeconds};
11use tempfile::TempDir;
12
13pub fn acc(suffix: &str) -> AccountDid {
14 AccountDid::new(format!("did:plc:{suffix}")).unwrap()
15}
16
17pub fn own(suffix: &str) -> OwnerDid {
18 OwnerDid::new(format!("did:plc:{suffix}")).unwrap()
19}
20
21pub fn repo_did(suffix: &str) -> RepoDid {
22 RepoDid::new(format!("did:plc:{suffix}")).unwrap()
23}
24
25pub fn rkey(value: &str) -> RepoRkey {
26 RepoRkey::new(value).unwrap()
27}
28
29pub fn at(seconds: i64) -> UnixSeconds {
30 UnixSeconds::new(seconds)
31}
32
33pub fn meta_home() -> CobHome {
34 CobHome::from(&KnotId::new("did:web:knot.nel.pet").unwrap())
35}
36
37pub fn grant(subject: &str, added_by: &str, seconds: i64) -> Grant {
38 Grant {
39 subject: acc(subject),
40 added_by: acc(added_by),
41 created_at: at(seconds),
42 }
43}
44
45pub fn registration(owner_id: &str, key: &str, repo: &RepoDid, seconds: i64) -> Registration {
46 Registration {
47 owner: own(owner_id),
48 rkey: rkey(key),
49 name: RepoName::new(key).unwrap(),
50 repo: repo.clone(),
51 created_at: at(seconds),
52 }
53}
54
55pub fn named_registration(
56 owner_id: &str,
57 key: &str,
58 display: &str,
59 repo: &RepoDid,
60 seconds: i64,
61) -> Registration {
62 Registration {
63 owner: own(owner_id),
64 rkey: rkey(key),
65 name: RepoName::new(display).unwrap(),
66 repo: repo.clone(),
67 created_at: at(seconds),
68 }
69}
70
71pub struct World {
72 _dir: TempDir,
73 pub meta_path: PathBuf,
74 pub layout: Layout,
75 pub signer: K256Signer,
76}
77
78impl World {
79 pub fn new() -> Self {
80 Self::seeded(1)
81 }
82
83 pub fn seeded(seed: u64) -> Self {
84 let dir = tempfile::tempdir().unwrap();
85 let meta_path = dir.path().join("meta");
86 Repo::create(&meta_path).unwrap();
87 let layout = Layout::new(dir.path().join("repos"));
88 let signer = K256Signer::generate(&SeededEntropy::new(seed));
89 Self {
90 _dir: dir,
91 meta_path,
92 layout,
93 signer,
94 }
95 }
96
97 pub fn index(&self) -> Index {
98 Index::new(&self.meta_path, self.layout.clone())
99 }
100
101 pub fn seed_members(&self) -> CobId {
102 let meta = Repo::open(&self.meta_path).unwrap();
103 let store = CobStore::new(&meta);
104 let created = store
105 .create(
106 &meta_home(),
107 &MembersChange::Add(grant("nel", "nel", 1)),
108 &self.signer,
109 at(1),
110 )
111 .unwrap();
112 store
113 .update(
114 &meta_home(),
115 created.object,
116 &MembersChange::Add(grant("olaren", "nel", 2)),
117 &self.signer,
118 at(2),
119 )
120 .unwrap();
121 created.object
122 }
123
124 pub fn add_member(&self, object: CobId, subject: &str, seconds: i64) {
125 let meta = Repo::open(&self.meta_path).unwrap();
126 let store = CobStore::new(&meta);
127 store
128 .update(
129 &meta_home(),
130 object,
131 &MembersChange::Add(grant(subject, "nel", seconds)),
132 &self.signer,
133 at(seconds),
134 )
135 .unwrap();
136 }
137
138 pub fn seed_registry(&self, repo: &RepoDid) -> CobId {
139 let meta = Repo::open(&self.meta_path).unwrap();
140 let store = CobStore::new(&meta);
141 store
142 .create(
143 &meta_home(),
144 &RegistryChange::Register(registration("nel", "anemone", repo, 1)),
145 &self.signer,
146 at(1),
147 )
148 .unwrap()
149 .object
150 }
151
152 pub fn register_extra(&self, repo: &RepoDid, key: &str, registry: CobId) {
153 let meta = Repo::open(&self.meta_path).unwrap();
154 let store = CobStore::new(&meta);
155 store
156 .update(
157 &meta_home(),
158 registry,
159 &RegistryChange::Register(registration("nel", key, repo, 2)),
160 &self.signer,
161 at(2),
162 )
163 .unwrap();
164 }
165
166 pub fn seed_collaborator(&self, repo: &RepoDid, subject: &str) -> CobId {
167 let git = self.layout.create(repo).unwrap();
168 let store = CobStore::new(&git);
169 store
170 .create(
171 &CobHome::from(repo),
172 &CollaboratorsChange::Add(grant(subject, "nel", 1)),
173 &self.signer,
174 at(1),
175 )
176 .unwrap()
177 .object
178 }
179
180 pub fn remove_collaborator(&self, repo: &RepoDid, object: CobId, subject: &str, seconds: i64) {
181 let git = self.layout.open(repo).unwrap();
182 let store = CobStore::new(&git);
183 store
184 .update(
185 &CobHome::from(repo),
186 object,
187 &CollaboratorsChange::Remove(Removal {
188 subject: acc(subject),
189 }),
190 &self.signer,
191 at(seconds),
192 )
193 .unwrap();
194 }
195}