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