From b993e35460614f6a2f8d1eba1bf16fe89f230ba9 Mon Sep 17 00:00:00 2001 From: Josh Thomas Date: Thu, 12 Dec 2024 22:51:35 -0600 Subject: [PATCH] centralize commands (#28) --- crates/djls-django/src/django.rs | 14 ++------ crates/djls-ipc/src/commands.rs | 62 ++++++++++++++++++++++++++++++++ crates/djls-ipc/src/lib.rs | 2 ++ crates/djls-python/src/python.rs | 13 ++----- 4 files changed, 68 insertions(+), 23 deletions(-) create mode 100644 crates/djls-ipc/src/commands.rs diff --git a/crates/djls-django/src/django.rs b/crates/djls-django/src/django.rs index 42f1714..3b0ede9 100644 --- a/crates/djls-django/src/django.rs +++ b/crates/djls-django/src/django.rs @@ -1,5 +1,6 @@ use crate::gis::{check_gis_setup, GISError}; use djls_ipc::v1::*; +use djls_ipc::IpcCommand; use djls_ipc::{ProcessError, PythonProcess, TransportError}; use djls_python::Python; use std::fmt; @@ -35,23 +36,12 @@ impl DjangoProject { }); } - let request = messages::Request { - command: Some(messages::request::Command::DjangoGetProjectInfo( - django::GetProjectInfoRequest {}, - )), - }; - - let response = python - .send(request) - .map_err(|e| ProjectError::Transport(e))?; + let response = django::GetProjectInfoRequest::execute(&mut python)?; let version = match response.result { Some(messages::response::Result::DjangoGetProjectInfo(response)) => { response.project.unwrap().version } - Some(messages::response::Result::Error(e)) => { - return Err(ProjectError::Process(ProcessError::Health(e.message))); - } _ => { return Err(ProjectError::Process(ProcessError::Response)); } diff --git a/crates/djls-ipc/src/commands.rs b/crates/djls-ipc/src/commands.rs new file mode 100644 index 0000000..8d739e6 --- /dev/null +++ b/crates/djls-ipc/src/commands.rs @@ -0,0 +1,62 @@ +use crate::proto::v1::{self, messages}; +use crate::{ProcessError, PythonProcess}; + +pub trait IpcCommand: Default { + fn into_request(&self) -> messages::Request; + fn from_response(response: messages::Response) -> Result; + + fn execute(process: &mut PythonProcess) -> Result { + let cmd = Self::default(); + let request = cmd.into_request(); + let response = process.send(request).map_err(ProcessError::Transport)?; + Self::from_response(response) + } +} + +impl IpcCommand for v1::check::HealthRequest { + fn into_request(&self) -> messages::Request { + messages::Request { + command: Some(messages::request::Command::CheckHealth(*self)), + } + } + + fn from_response(response: messages::Response) -> Result { + match response.result { + Some(messages::response::Result::CheckHealth(_)) => Ok(response), + Some(messages::response::Result::Error(e)) => Err(ProcessError::Health(e.message)), + _ => Err(ProcessError::Response), + } + } +} + +impl IpcCommand for v1::python::GetEnvironmentRequest { + fn into_request(&self) -> messages::Request { + messages::Request { + command: Some(messages::request::Command::PythonGetEnvironment(*self)), + } + } + + fn from_response(response: messages::Response) -> Result { + match response.result { + Some(messages::response::Result::PythonGetEnvironment(_)) => Ok(response), + Some(messages::response::Result::Error(e)) => Err(ProcessError::Health(e.message)), + _ => Err(ProcessError::Response), + } + } +} + +impl IpcCommand for v1::django::GetProjectInfoRequest { + fn into_request(&self) -> messages::Request { + messages::Request { + command: Some(messages::request::Command::DjangoGetProjectInfo(*self)), + } + } + + fn from_response(response: messages::Response) -> Result { + match response.result { + Some(messages::response::Result::DjangoGetProjectInfo(_)) => Ok(response), + Some(messages::response::Result::Error(e)) => Err(ProcessError::Health(e.message)), + _ => Err(ProcessError::Response), + } + } +} diff --git a/crates/djls-ipc/src/lib.rs b/crates/djls-ipc/src/lib.rs index cb79255..de596a3 100644 --- a/crates/djls-ipc/src/lib.rs +++ b/crates/djls-ipc/src/lib.rs @@ -1,7 +1,9 @@ +mod commands; mod process; mod proto; mod transport; +pub use commands::IpcCommand; pub use process::ProcessError; pub use process::PythonProcess; pub use proto::v1; diff --git a/crates/djls-python/src/python.rs b/crates/djls-python/src/python.rs index e14d549..5ecfbfc 100644 --- a/crates/djls-python/src/python.rs +++ b/crates/djls-python/src/python.rs @@ -1,5 +1,6 @@ use crate::packaging::{Packages, PackagingError}; use djls_ipc::v1::*; +use djls_ipc::IpcCommand; use djls_ipc::{ProcessError, PythonProcess, TransportError}; use serde::Deserialize; use std::fmt; @@ -90,22 +91,12 @@ pub struct Python { impl Python { pub fn setup(python: &mut PythonProcess) -> Result { - let request = messages::Request { - command: Some(messages::request::Command::PythonGetEnvironment( - python::GetEnvironmentRequest {}, - )), - }; - - let response = python.send(request).map_err(PythonError::Transport)?; - + let response = python::GetEnvironmentRequest::execute(python)?; match response.result { Some(messages::response::Result::PythonGetEnvironment(response)) => response .python .ok_or_else(|| PythonError::Process(ProcessError::Response)) .map(Into::into), - Some(messages::response::Result::Error(e)) => { - Err(PythonError::Process(ProcessError::Health(e.message))) - } _ => Err(PythonError::Process(ProcessError::Response)), } }