use onetaskgraph_plugin_api::Priority;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use super::delivery::source_failed;
use super::{Engine, EngineError};
use crate::GlobalId;
use crate::resolve::ResolvedSource;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct TaskPrioritySet {
pub id: GlobalId,
pub priority: Priority,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct TaskContentSet {
pub id: GlobalId,
}
impl Engine {
pub async fn set_task_priority(
&self,
id: &GlobalId,
priority: Priority,
) -> Result<TaskPrioritySet, EngineError> {
let source = self.built(&id.source)?;
if !source.source().writes().is_supported() {
return Err(EngineError::PriorityNotWritable {
name: source.name().to_string(),
kind: source.kind().to_owned(),
});
}
if !source.source().capabilities().priority.is_native() {
return Err(no_priority(source, &id.to_string(), priority));
}
let read = source
.source()
.set_task_priority(&id.native, priority)
.await
.map_err(|error| source_failed(source, error))?
.ok_or_else(|| EngineError::NoSuchTask { id: id.to_string() })?;
Ok(TaskPrioritySet {
id: id.clone(),
priority: read,
})
}
pub async fn set_task_content(
&self,
id: &GlobalId,
content: &str,
) -> Result<TaskContentSet, EngineError> {
let source = self.built(&id.source)?;
if !source.source().writes().is_supported() {
return Err(EngineError::ContentNotWritable {
name: source.name().to_string(),
kind: source.kind().to_owned(),
});
}
source
.source()
.set_task_content(&id.native, content)
.await
.map_err(|error| source_failed(source, error))?
.ok_or_else(|| EngineError::NoSuchTask { id: id.to_string() })?;
Ok(TaskContentSet { id: id.clone() })
}
}
pub(super) fn holds_priority(
source: &ResolvedSource,
task: &str,
priority: Priority,
) -> Result<(), EngineError> {
if priority == Priority::None || source.source().capabilities().priority.is_native() {
return Ok(());
}
Err(no_priority(source, task, priority))
}
fn no_priority(source: &ResolvedSource, task: &str, priority: Priority) -> EngineError {
EngineError::NoPriority {
name: source.name().to_string(),
kind: source.kind().to_owned(),
task: task.to_owned(),
priority,
}
}