Skip to main content

Mountain/Environment/DocumentProvider/
Notifications.rs

1//! Notification helpers for sending document lifecycle events to Cocoon.
2
3use std::sync::Arc;
4
5use CommonLibrary::{Environment::Requires::Requires, IPC::IPCProvider::IPCProvider};
6use serde_json::json;
7use url::Url;
8
9use crate::dev_log;
10
11/// Notifies Cocoon that a new document model has been added.
12pub(super) async fn notify_model_added(
13	environment:&crate::Environment::MountainEnvironment::MountainEnvironment,
14	document_state_dto:&serde_json::Value,
15) {
16	let uri_string = document_state_dto
17		.get("URI")
18		.and_then(serde_json::Value::as_str)
19		.unwrap_or("unknown");
20
21	dev_log!("model", "[DocumentProvider] Notifying ModelAdded for: {}", uri_string);
22
23	let payload = json!([document_state_dto]);
24
25	let ipc_provider:Arc<dyn IPCProvider> = environment.Require();
26
27	if let Err(error) = ipc_provider
28		.SendNotificationToSideCar("cocoon-main".to_string(), "$acceptModelAdded".to_string(), payload)
29		.await
30	{
31		dev_log!(
32			"model",
33			"error: [DocumentProvider] Failed to send $acceptModelAdded for {}: {}",
34			uri_string,
35			error
36		);
37	}
38}
39
40/// Notifies Cocoon that a document's content has changed.
41pub(super) async fn notify_model_changed(
42	environment:&crate::Environment::MountainEnvironment::MountainEnvironment,
43	uri:&Url,
44	new_version:i64,
45	changes:serde_json::Value,
46) {
47	dev_log!("model", "[DocumentProvider] Notifying ModelChanged for: {}", uri);
48
49	let uri_components = json!({ "external": uri.to_string(), "$mid": 1 });
50
51	let event_data = json!({ "versionId": new_version, "changes": changes, "isDirty": true });
52
53	let payload = json!([uri_components, event_data]);
54
55	let ipc_provider:Arc<dyn IPCProvider> = environment.Require();
56
57	if let Err(error) = ipc_provider
58		.SendNotificationToSideCar("cocoon-main".to_string(), "$acceptModelChanged".to_string(), payload)
59		.await
60	{
61		dev_log!(
62			"model",
63			"error: [DocumentProvider] Failed to send $acceptModelChanged for {}: {}",
64			uri,
65			error
66		);
67	}
68}
69
70/// Notifies Cocoon that a document has been saved to disk.
71pub(super) async fn notify_model_saved(
72	environment:&crate::Environment::MountainEnvironment::MountainEnvironment,
73	uri:&Url,
74) {
75	dev_log!("model", "[DocumentProvider] Notifying ModelSaved for: {}", uri);
76
77	let uri_components = json!({ "external": uri.to_string(), "$mid": 1 });
78
79	let payload = json!([uri_components]);
80
81	let ipc_provider:Arc<dyn IPCProvider> = environment.Require();
82
83	if let Err(error) = ipc_provider
84		.SendNotificationToSideCar("cocoon-main".to_string(), "$acceptModelSaved".to_string(), payload)
85		.await
86	{
87		dev_log!(
88			"model",
89			"error: [DocumentProvider] Failed to send $acceptModelSaved for {}: {}",
90			uri,
91			error
92		);
93	}
94}
95
96/// Notifies Cocoon that a document has been closed or renamed.
97pub(super) async fn notify_model_removed(
98	environment:&crate::Environment::MountainEnvironment::MountainEnvironment,
99	uri:&Url,
100) {
101	dev_log!("model", "[DocumentProvider] Notifying ModelRemoved for: {}", uri);
102
103	let uri_components = json!({ "external": uri.to_string(), "$mid": 1 });
104
105	let payload = json!([uri_components]);
106
107	let ipc_provider:Arc<dyn IPCProvider> = environment.Require();
108
109	if let Err(error) = ipc_provider
110		.SendNotificationToSideCar("cocoon-main".to_string(), "$acceptModelRemoved".to_string(), payload)
111		.await
112	{
113		dev_log!(
114			"model",
115			"error: [DocumentProvider] Failed to send $acceptModelRemoved for {}: {}",
116			uri,
117			error
118		);
119	}
120}