use std::io;
use thiserror::Error;
pub type ChangeArtifactMutationServiceResult<T> = Result<T, ChangeArtifactMutationError>;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ChangeArtifactKind {
Proposal,
Design,
Tasks,
SpecDelta {
capability: String,
},
}
impl ChangeArtifactKind {
pub fn label(&self) -> String {
match self {
ChangeArtifactKind::Proposal => "proposal".to_string(),
ChangeArtifactKind::Design => "design".to_string(),
ChangeArtifactKind::Tasks => "tasks".to_string(),
ChangeArtifactKind::SpecDelta { capability } => format!("spec:{capability}"),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ChangeArtifactRef {
pub change_id: String,
pub artifact: ChangeArtifactKind,
}
impl ChangeArtifactRef {
pub fn label(&self) -> String {
format!("{}:{}", self.change_id, self.artifact.label())
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ChangeArtifactMutationResult {
pub target: ChangeArtifactRef,
pub existed: bool,
pub revision: Option<String>,
}
#[derive(Debug, Error)]
pub enum ChangeArtifactMutationError {
#[error("I/O failure while {context}: {source}")]
Io {
context: String,
#[source]
source: io::Error,
},
#[error("{0}")]
Validation(String),
#[error("{0}")]
NotFound(String),
#[error("{0}")]
Other(String),
}
impl ChangeArtifactMutationError {
pub fn io(context: impl Into<String>, source: io::Error) -> Self {
Self::Io {
context: context.into(),
source,
}
}
pub fn validation(message: impl Into<String>) -> Self {
Self::Validation(message.into())
}
pub fn not_found(message: impl Into<String>) -> Self {
Self::NotFound(message.into())
}
pub fn other(message: impl Into<String>) -> Self {
Self::Other(message.into())
}
}
pub trait ChangeArtifactMutationService: Send + Sync {
fn load_artifact(
&self,
target: &ChangeArtifactRef,
) -> ChangeArtifactMutationServiceResult<Option<String>>;
fn write_artifact(
&self,
target: &ChangeArtifactRef,
content: &str,
) -> ChangeArtifactMutationServiceResult<ChangeArtifactMutationResult>;
fn patch_artifact(
&self,
target: &ChangeArtifactRef,
patch: &str,
) -> ChangeArtifactMutationServiceResult<ChangeArtifactMutationResult>;
}