Skip to content

Commit 8ff21c7

Browse files
committed
Move Executor into Generalization
1 parent f4edff9 commit 8ff21c7

23 files changed

Lines changed: 481 additions & 322 deletions

File tree

Cargo.lock

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

native/acter/src/api/client/sync.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
use acter_matrix::{
2-
events::AnySyncActerEvent, executor::Executor, models::AnyActerModel,
3-
referencing::ExecuteReference, spaces::is_acter_space,
2+
events::AnySyncActerEvent,
3+
executor::Executor,
4+
models::{event_meta_for_redacted_source, AnyActerModel, EventMeta},
5+
referencing::ExecuteReference,
6+
spaces::is_acter_space,
47
};
58
use anyhow::Result;
69
use core::time::Duration;
@@ -235,7 +238,12 @@ impl Client {
235238

236239
if let RoomRedactionEvent::Original(t) = ev.into_full_event(room_id.to_owned()) {
237240
trace!(?room_id, "received redaction");
238-
if let Err(error) = executor.live_redact(t).await {
241+
let Some(meta) = event_meta_for_redacted_source(&t) else {
242+
warn!(?room_id, "redaction event has no meta");
243+
return;
244+
};
245+
246+
if let Err(error) = executor.live_redact(meta, Some(t.into())).await {
239247
error!(?room_id, ?error, "redaction failed");
240248
}
241249
} else {

native/core/Cargo.toml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ license-file = "../../LICENSE.txt"
1010
rust-version.workspace = true
1111

1212
[features]
13-
testing = [ "dep:tokio", "dep:thiserror"]
13+
testing = [ "tokio/full", "thiserror"]
1414
strum = ["dep:strum"]
1515

1616
[dependencies]
@@ -20,12 +20,15 @@ tracing = { workspace = true }
2020
async-recursion = "1"
2121
eyeball-im = { workspace = true }
2222
futures = { version = "0.3.30" }
23+
scc = "2.3.4"
24+
tokio = { version = "1" }
2325

2426
# for testing-feature only
25-
tokio = { version = "1", features = ["full"], optional = true }
2627
thiserror = { version = "2", optional = true }
2728

2829
[dev-dependencies]
2930
serde_json = "1"
3031
tokio = { version = "1", features = ["full"] }
31-
thiserror = "2"
32+
thiserror = "2"
33+
env_logger = "0.11"
34+
anyhow = "1"

native/core/src/execution.rs

Lines changed: 36 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -7,29 +7,30 @@ use crate::{
77
};
88

99
#[async_recursion]
10-
pub async fn transition_tree<C, M, S, I, E>(store: &S, parents: I, model: &M) -> Result<Vec<M>, E>
10+
pub async fn transition_tree<C, M, S, I>(
11+
store: &S,
12+
parents: I,
13+
model: &M,
14+
) -> Result<Vec<M>, C::Error>
1115
where
1216
C: TypeConfig,
1317
M: ModelT<C> + Sync,
1418
S: StoreT<C, Model = M> + Sync,
1519
S::Model: ModelT<C>,
1620
I: Iterator<Item = C::ObjectId> + Send,
17-
E: core::error::Error + Send,
18-
E: From<<S as StoreT<C>>::Error>,
19-
E: From<<M as ModelT<C>>::Error>,
2021
{
2122
let mut models = vec![];
2223
for p in parents {
2324
let mut parent = store.get(&p).await?;
2425
if parent.transition(model)? {
2526
if let Some(grandparents) = parent.belongs_to() {
26-
let mut parent_models =
27-
transition_tree::<C, M, S, std::vec::IntoIter<<C as TypeConfig>::ObjectId>, E>(
28-
store,
29-
grandparents.into_iter(),
30-
&parent,
31-
)
32-
.await?;
27+
let mut parent_models = transition_tree::<
28+
C,
29+
M,
30+
S,
31+
std::vec::IntoIter<<C as TypeConfig>::ObjectId>,
32+
>(store, grandparents.into_iter(), &parent)
33+
.await?;
3334
if !parent_models.is_empty() {
3435
models.append(&mut parent_models);
3536
}
@@ -40,34 +41,30 @@ where
4041
Ok(models)
4142
}
4243

43-
pub async fn default_model_execute<C: TypeConfig, M, S, E>(
44+
pub async fn default_model_execute<C: TypeConfig, M, S>(
4445
store: &S,
4546
model: M,
46-
) -> Result<Vec<ExecuteReference<C>>, E>
47+
) -> Result<Vec<ExecuteReference<C>>, C::Error>
4748
where
4849
M: ModelT<C> + Sync,
4950
S: StoreT<C, Model = M> + Sync,
5051
S::Model: ModelT<C>,
51-
E: core::error::Error + Send,
52-
E: From<<S as StoreT<C>>::Error>,
53-
E: From<<M as ModelT<C>>::Error>,
5452
{
5553
trace!(object_id=?model.object_id(), ?model, "handling");
5654
let Some(belongs_to) = model.belongs_to() else {
5755
trace!(object_id=?model.object_id(), "saving simple model");
58-
return Ok(store.save(model).await?);
56+
return store.save(model).await;
5957
};
6058

6159
trace!(object_id=?model.object_id(), ?belongs_to, "transitioning tree");
62-
let mut models =
63-
transition_tree::<C, M, S, std::vec::IntoIter<<C as TypeConfig>::ObjectId>, E>(
64-
store,
65-
belongs_to.into_iter(),
66-
&model,
67-
)
68-
.await?;
60+
let mut models = transition_tree::<C, M, S, std::vec::IntoIter<<C as TypeConfig>::ObjectId>>(
61+
store,
62+
belongs_to.into_iter(),
63+
&model,
64+
)
65+
.await?;
6966
models.push(model);
70-
Ok(store.save_many(models.into_iter()).await?)
67+
store.save_many(models.into_iter()).await
7168
}
7269

7370
#[cfg(test)]
@@ -88,7 +85,7 @@ mod tests {
8885
let child = MockModel::new("child1", 5, Some(vec!["parent1"]));
8986

9087
let parents = vec![MockObjectId("parent1".to_string())];
91-
let result = transition_tree::<MockTypeConfig, MockModel, MockStore, _, MockError>(
88+
let result = transition_tree::<MockTypeConfig, MockModel, MockStore, _>(
9289
&store,
9390
parents.into_iter(),
9491
&child,
@@ -112,7 +109,7 @@ mod tests {
112109
let child = MockModel::new("child1", 10, Some(vec!["parent1"]));
113110

114111
let parents = vec![MockObjectId("parent1".to_string())];
115-
let result = transition_tree::<MockTypeConfig, MockModel, MockStore, _, MockError>(
112+
let result = transition_tree::<MockTypeConfig, MockModel, MockStore, _>(
116113
&store,
117114
parents.into_iter(),
118115
&child,
@@ -145,7 +142,7 @@ mod tests {
145142
MockObjectId("parent1".to_string()),
146143
MockObjectId("parent2".to_string()),
147144
];
148-
let result = transition_tree::<MockTypeConfig, MockModel, MockStore, _, MockError>(
145+
let result = transition_tree::<MockTypeConfig, MockModel, MockStore, _>(
149146
&store,
150147
parents.into_iter(),
151148
&child,
@@ -182,7 +179,7 @@ mod tests {
182179
let child = MockModel::new("child", 15, Some(vec!["parent"]));
183180

184181
let parents = vec![MockObjectId("parent".to_string())];
185-
let result = transition_tree::<MockTypeConfig, MockModel, MockStore, _, MockError>(
182+
let result = transition_tree::<MockTypeConfig, MockModel, MockStore, _>(
186183
&store,
187184
parents.into_iter(),
188185
&child,
@@ -211,7 +208,7 @@ mod tests {
211208
let child = MockModel::new("child1", 10, None);
212209
let parents: Vec<MockObjectId> = vec![];
213210

214-
let result = transition_tree::<MockTypeConfig, MockModel, MockStore, _, MockError>(
211+
let result = transition_tree::<MockTypeConfig, MockModel, MockStore, _>(
215212
&store,
216213
parents.into_iter(),
217214
&child,
@@ -230,7 +227,7 @@ mod tests {
230227
let child = MockModel::new("child1", 10, Some(vec!["nonexistent"]));
231228
let parents = vec![MockObjectId("nonexistent".to_string())];
232229

233-
let result = transition_tree::<MockTypeConfig, MockModel, MockStore, _, MockError>(
230+
let result = transition_tree::<MockTypeConfig, MockModel, MockStore, _>(
234231
&store,
235232
parents.into_iter(),
236233
&child,
@@ -252,8 +249,7 @@ mod tests {
252249
let model = MockModel::new("simple", 10, None);
253250

254251
let result =
255-
default_model_execute::<MockTypeConfig, MockModel, MockStore, MockError>(&store, model)
256-
.await;
252+
default_model_execute::<MockTypeConfig, MockModel, MockStore>(&store, model).await;
257253

258254
assert!(result.is_ok());
259255
let references = result.unwrap();
@@ -275,8 +271,7 @@ mod tests {
275271
let model = MockModel::new("child", 15, Some(vec!["parent1", "parent2"]));
276272

277273
let result =
278-
default_model_execute::<MockTypeConfig, MockModel, MockStore, MockError>(&store, model)
279-
.await;
274+
default_model_execute::<MockTypeConfig, MockModel, MockStore>(&store, model).await;
280275

281276
assert!(result.is_ok());
282277
let references = result.unwrap();
@@ -314,8 +309,7 @@ mod tests {
314309
let child = MockModel::new("child", 20, Some(vec!["parent"]));
315310

316311
let result =
317-
default_model_execute::<MockTypeConfig, MockModel, MockStore, MockError>(&store, child)
318-
.await;
312+
default_model_execute::<MockTypeConfig, MockModel, MockStore>(&store, child).await;
319313

320314
assert!(result.is_ok());
321315
let references = result.unwrap();
@@ -351,8 +345,7 @@ mod tests {
351345
let model = MockModel::new("child", 15, Some(vec!["parent1", "parent2"]));
352346

353347
let result =
354-
default_model_execute::<MockTypeConfig, MockModel, MockStore, MockError>(&store, model)
355-
.await;
348+
default_model_execute::<MockTypeConfig, MockModel, MockStore>(&store, model).await;
356349

357350
assert!(result.is_ok());
358351
let references = result.unwrap();
@@ -382,8 +375,7 @@ mod tests {
382375
let model = MockModel::new("child", 15, Some(vec!["nonexistent"]));
383376

384377
let result =
385-
default_model_execute::<MockTypeConfig, MockModel, MockStore, MockError>(&store, model)
386-
.await;
378+
default_model_execute::<MockTypeConfig, MockModel, MockStore>(&store, model).await;
387379

388380
assert!(result.is_err());
389381
assert_eq!(
@@ -406,7 +398,7 @@ mod tests {
406398

407399
// First transition
408400
let parents = vec![MockObjectId("parent".to_string())];
409-
let result1 = transition_tree::<MockTypeConfig, MockModel, MockStore, _, MockError>(
401+
let result1 = transition_tree::<MockTypeConfig, MockModel, MockStore, _>(
410402
&store,
411403
parents.clone().into_iter(),
412404
&child1,
@@ -424,7 +416,7 @@ mod tests {
424416
store.save(current_parent).await.unwrap();
425417

426418
// Second transition should update the already-transitioned parent
427-
let result2 = transition_tree::<MockTypeConfig, MockModel, MockStore, _, MockError>(
419+
let result2 = transition_tree::<MockTypeConfig, MockModel, MockStore, _>(
428420
&store,
429421
parents.clone().into_iter(),
430422
&child2,
@@ -457,7 +449,7 @@ mod tests {
457449
let leaf = MockModel::new("leaf", 100, Some(vec!["level2"]));
458450

459451
let parents = vec![MockObjectId("level2".to_string())];
460-
let result = transition_tree::<MockTypeConfig, MockModel, MockStore, _, MockError>(
452+
let result = transition_tree::<MockTypeConfig, MockModel, MockStore, _>(
461453
&store,
462454
parents.into_iter(),
463455
&leaf,

0 commit comments

Comments
 (0)