use super::AbsolutePath;
use super::Arc;
use super::Child;
#[cfg(test)]
use super::JoinHandle;
use super::LintEventKind;
use super::LintTriggerEvent;
use super::LintTriggerKind;
use super::Mutex;
use super::RegisterProjectRequest;
use super::StdSender;
#[derive(Clone)]
pub struct RuntimeHandle {
pub(super) supervisor_sender: StdSender<SupervisorMsg>,
}
impl RuntimeHandle {
pub fn sync_projects(&self, projects: Vec<RegisterProjectRequest>) {
let _ = self
.supervisor_sender
.send(SupervisorMsg::SyncProjects { projects });
}
pub fn register_project(&self, project: RegisterProjectRequest) {
let _ = self
.supervisor_sender
.send(SupervisorMsg::RegisterProject { project });
}
pub fn unregister_project(&self, abs_path: AbsolutePath) {
let _ = self
.supervisor_sender
.send(SupervisorMsg::UnregisterProject { abs_path });
}
pub fn lint_trigger(&self, event: LintTriggerEvent) {
let _ = self
.supervisor_sender
.send(SupervisorMsg::LintTriggered { event });
}
pub fn pause(&self) { let _ = self.supervisor_sender.send(SupervisorMsg::Pause); }
pub fn resume(&self) { let _ = self.supervisor_sender.send(SupervisorMsg::Resume); }
pub fn request_startup_lint(&self, project_root: AbsolutePath) {
let _ = self.supervisor_sender.send(SupervisorMsg::LintTriggered {
event: LintTriggerEvent {
project_root,
trigger: LintTriggerKind::Startup,
event_kind: LintEventKind::CreateOrModify,
},
});
}
}
pub struct SpawnResult {
pub handle: Option<RuntimeHandle>,
pub warning: Option<String>,
#[cfg(test)]
pub(crate) supervisor: Option<JoinHandle<()>>,
}
pub(super) enum SupervisorMsg {
SyncProjects {
projects: Vec<RegisterProjectRequest>,
},
RegisterProject {
project: RegisterProjectRequest,
},
UnregisterProject {
abs_path: AbsolutePath,
},
LintTriggered {
event: LintTriggerEvent,
},
Pause,
Resume,
}
pub(super) type ChildSlot = Arc<Mutex<Option<Child>>>;