use serde::{Deserialize, Serialize};
use starweaver_core::Metadata;
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum RetryEventKind {
Output,
Tool,
}
#[derive(Clone, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
pub struct CapabilityId(String);
impl CapabilityId {
#[must_use]
pub fn from_string(value: impl Into<String>) -> Self {
Self(value.into())
}
#[must_use]
pub fn as_str(&self) -> &str {
&self.0
}
}
impl From<&str> for CapabilityId {
fn from(value: &str) -> Self {
Self::from_string(value)
}
}
impl From<String> for CapabilityId {
fn from(value: String) -> Self {
Self::from_string(value)
}
}
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub struct CapabilityOrdering {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub after: Vec<CapabilityId>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub before: Vec<CapabilityId>,
}
impl CapabilityOrdering {
#[must_use]
pub fn after(mut self, id: impl Into<CapabilityId>) -> Self {
self.after.push(id.into());
self
}
#[must_use]
pub fn before(mut self, id: impl Into<CapabilityId>) -> Self {
self.before.push(id.into());
self
}
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct CapabilitySpec {
pub id: CapabilityId,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default)]
pub ordering: CapabilityOrdering,
#[serde(default)]
pub on_demand: bool,
#[serde(default, skip_serializing_if = "Metadata::is_empty")]
pub metadata: Metadata,
}
impl CapabilitySpec {
#[must_use]
pub fn new(id: impl Into<CapabilityId>) -> Self {
Self {
id: id.into(),
description: None,
ordering: CapabilityOrdering::default(),
on_demand: false,
metadata: Metadata::default(),
}
}
#[must_use]
pub fn with_description(mut self, description: impl Into<String>) -> Self {
self.description = Some(description.into());
self
}
#[must_use]
pub fn with_ordering(mut self, ordering: CapabilityOrdering) -> Self {
self.ordering = ordering;
self
}
#[must_use]
pub const fn with_on_demand(mut self, on_demand: bool) -> Self {
self.on_demand = on_demand;
self
}
#[must_use]
pub fn with_metadata(mut self, metadata: Metadata) -> Self {
self.metadata = metadata;
self
}
}