use linkrs_core::error::DBError;
use linkrs_core::types::{SpaceStatus, SpaceSummary};
use linkrs_core::{DataSet, Value};
#[derive(Debug, Clone)]
pub enum ExecutionResult {
DataSet { data: DataSet },
Empty,
Success,
SpaceSwitched(SpaceSummary),
Error(String),
ConfigUpdate {
module: Option<String>,
name: String,
value: Value,
},
ShowConfigs { module: Option<String> },
}
impl ExecutionResult {
pub fn count(&self) -> usize {
match self {
ExecutionResult::DataSet { data, .. } => data.row_count(),
ExecutionResult::Success => 0,
ExecutionResult::Empty => 0,
ExecutionResult::SpaceSwitched(_) => 0,
ExecutionResult::Error(_) => 0,
ExecutionResult::ConfigUpdate { .. } => 0,
ExecutionResult::ShowConfigs { .. } => 0,
}
}
pub fn from_data_set(data: DataSet) -> Self {
ExecutionResult::DataSet { data }
}
pub fn to_data_set(&self) -> Option<&DataSet> {
match self {
ExecutionResult::DataSet { data, .. } => Some(data),
_ => None,
}
}
pub fn is_space_switched(&self) -> bool {
matches!(self, ExecutionResult::SpaceSwitched(_))
}
pub fn space_summary(&self) -> Option<&SpaceSummary> {
match self {
ExecutionResult::SpaceSwitched(summary) => Some(summary),
_ => None,
}
}
}
pub type DBResult<T> = Result<T, DBError>;
pub trait IntoExecutionResult {
fn into_execution_result(self) -> ExecutionResult;
}
impl IntoExecutionResult for DataSet {
fn into_execution_result(self) -> ExecutionResult {
ExecutionResult::DataSet { data: self }
}
}
impl IntoExecutionResult for () {
fn into_execution_result(self) -> ExecutionResult {
ExecutionResult::Success
}
}
pub fn check_space_writable(space: &SpaceSummary) -> Result<(), ExecutionResult> {
match space.status {
SpaceStatus::Online => Ok(()),
SpaceStatus::Maintenance => Err(ExecutionResult::Error(format!(
"Space '{}' is in maintenance mode. Write operations are not allowed.",
space.name
))),
SpaceStatus::ReadOnly => Err(ExecutionResult::Error(format!(
"Space '{}' is in read-only mode. Write operations are not allowed.",
space.name
))),
SpaceStatus::Offline => Err(ExecutionResult::Error(format!(
"Space '{}' is offline. Operations are not allowed.",
space.name
))),
}
}
pub fn check_space_accessible(space: &SpaceSummary) -> Result<(), ExecutionResult> {
if space.is_accessible() {
Ok(())
} else {
Err(ExecutionResult::Error(format!(
"Space '{}' is offline. Operations are not allowed.",
space.name
)))
}
}
#[cfg(test)]
mod tests {
use super::*;
use linkrs_core::types::DataType;
fn create_test_summary_with_status(status: SpaceStatus) -> SpaceSummary {
SpaceSummary {
id: 1,
name: "test_space".to_string(),
vid_type: DataType::String,
status,
}
}
#[test]
fn test_check_space_writable_online() {
let summary = create_test_summary_with_status(SpaceStatus::Online);
assert!(check_space_writable(&summary).is_ok());
}
#[test]
fn test_check_space_writable_maintenance() {
let summary = create_test_summary_with_status(SpaceStatus::Maintenance);
let result = check_space_writable(&summary);
assert!(result.is_err());
if let Err(ExecutionResult::Error(msg)) = result {
assert!(msg.contains("maintenance mode"));
}
}
#[test]
fn test_check_space_writable_readonly() {
let summary = create_test_summary_with_status(SpaceStatus::ReadOnly);
let result = check_space_writable(&summary);
assert!(result.is_err());
if let Err(ExecutionResult::Error(msg)) = result {
assert!(msg.contains("read-only mode"));
}
}
#[test]
fn test_check_space_writable_offline() {
let summary = create_test_summary_with_status(SpaceStatus::Offline);
let result = check_space_writable(&summary);
assert!(result.is_err());
if let Err(ExecutionResult::Error(msg)) = result {
assert!(msg.contains("offline"));
}
}
#[test]
fn test_check_space_accessible() {
let online = create_test_summary_with_status(SpaceStatus::Online);
let maintenance = create_test_summary_with_status(SpaceStatus::Maintenance);
let readonly = create_test_summary_with_status(SpaceStatus::ReadOnly);
let offline = create_test_summary_with_status(SpaceStatus::Offline);
assert!(check_space_accessible(&online).is_ok());
assert!(check_space_accessible(&maintenance).is_ok());
assert!(check_space_accessible(&readonly).is_ok());
assert!(check_space_accessible(&offline).is_err());
}
}