+
+
+
-
-
-
diff --git a/server/src/command/definition.rs b/server/src/command/definition.rs
new file mode 100644
index 0000000..d724c8a
--- /dev/null
+++ b/server/src/command/definition.rs
@@ -0,0 +1,36 @@
+use crate::command::service::RegisteredCommand;
+use crate::core::TelemetryDataType;
+use crate::telemetry::data_type::tlm_data_type_deserializer;
+use crate::telemetry::data_type::tlm_data_type_serializer;
+use serde::{Deserialize, Serialize};
+
+#[derive(Clone, Debug, Serialize, Deserialize)]
+pub struct CommandParameterDefinition {
+ pub name: String,
+ #[serde(serialize_with = "tlm_data_type_serializer")]
+ #[serde(deserialize_with = "tlm_data_type_deserializer")]
+ pub data_type: TelemetryDataType,
+}
+
+#[derive(Clone, Debug, Serialize, Deserialize)]
+pub struct CommandDefinition {
+ pub name: String,
+ pub parameters: Vec
,
+}
+
+impl From for CommandDefinition {
+ fn from(value: RegisteredCommand) -> Self {
+ Self {
+ name: value.name,
+ parameters: value
+ .definition
+ .parameters
+ .into_iter()
+ .map(|param| CommandParameterDefinition {
+ data_type: param.data_type(),
+ name: param.name,
+ })
+ .collect(),
+ }
+ }
+}
diff --git a/server/src/command/error.rs b/server/src/command/error.rs
new file mode 100644
index 0000000..aa0bbe0
--- /dev/null
+++ b/server/src/command/error.rs
@@ -0,0 +1,36 @@
+use crate::core::TelemetryDataType;
+use actix_web::http::StatusCode;
+use actix_web::ResponseError;
+use thiserror::Error;
+
+#[derive(Error, Debug)]
+pub enum Error {
+ #[error("Command Not Found {0}")]
+ CommandNotFound(String),
+ #[error("Incorrect Number of Parameters Specified. {expected} expected. {actual} found.")]
+ IncorrectParameterCount { expected: usize, actual: usize },
+ #[error("Missing Parameter {0}.")]
+ MisingParameter(String),
+ #[error("Incorrect Parameter Type for {name}. {expected_type:?} expected.")]
+ WrongParameterType {
+ name: String,
+ expected_type: TelemetryDataType,
+ },
+ #[error("No Command Receiver")]
+ NoCommandReceiver,
+ #[error("Failed to Send")]
+ FailedToSend,
+}
+
+impl ResponseError for Error {
+ fn status_code(&self) -> StatusCode {
+ match *self {
+ Error::CommandNotFound(_) => StatusCode::NOT_FOUND,
+ Error::IncorrectParameterCount { .. } => StatusCode::BAD_REQUEST,
+ Error::MisingParameter(_) => StatusCode::BAD_REQUEST,
+ Error::WrongParameterType { .. } => StatusCode::BAD_REQUEST,
+ Error::NoCommandReceiver => StatusCode::SERVICE_UNAVAILABLE,
+ Error::FailedToSend => StatusCode::INTERNAL_SERVER_ERROR,
+ }
+ }
+}
diff --git a/server/src/command/mod.rs b/server/src/command/mod.rs
index 1f278a4..e3c4024 100644
--- a/server/src/command/mod.rs
+++ b/server/src/command/mod.rs
@@ -1 +1,3 @@
+mod definition;
+pub mod error;
pub mod service;
diff --git a/server/src/command/service.rs b/server/src/command/service.rs
index b4bcd83..452451e 100644
--- a/server/src/command/service.rs
+++ b/server/src/command/service.rs
@@ -1,16 +1,24 @@
+use crate::command::definition::CommandDefinition;
+use crate::command::error::Error as CmdError;
+use crate::command::error::Error::{
+ CommandNotFound, FailedToSend, IncorrectParameterCount, MisingParameter, NoCommandReceiver,
+ WrongParameterType,
+};
use crate::core::telemetry_value::Value;
use crate::core::{
Command, CommandDefinitionRequest, TelemetryDataType, TelemetryValue, Timestamp,
};
-use anyhow::{bail, ensure};
use chrono::{DateTime, Utc};
+use log::error;
use papaya::HashMap;
use std::collections::HashMap as StdHashMap;
use tokio::sync::mpsc;
use tokio::sync::mpsc::{Receiver, Sender};
-struct RegisteredCommand {
- definition: CommandDefinitionRequest,
+#[derive(Clone)]
+pub(super) struct RegisteredCommand {
+ pub(super) name: String,
+ pub(super) definition: CommandDefinitionRequest,
tx: Sender