use serde::{Deserialize, Serialize};
pub const PROTOCOL_VERSION: &str = "gap/0.1";
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum Name {
Synthesize,
Edit,
Handle,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum ArtifactState {
Draft,
Published,
Archived,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Meta {
#[serde(skip_serializing_if = "Option::is_none")]
pub format: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tokens_used: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub checksum: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub state: Option<ArtifactState>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Envelope {
pub protocol: String,
pub id: String,
pub version: u64,
pub name: Name,
pub meta: Meta,
pub content: Vec<serde_json::Value>,
}
impl Envelope {
pub fn from_json(s: &str) -> Result<Self, serde_json::Error> {
serde_json::from_str(s)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Artifact {
pub id: String,
pub version: u64,
pub format: String,
pub body: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SynthesizeContentItem {
pub body: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", content = "value")]
pub enum Target {
#[serde(rename = "id")]
Id(String),
#[serde(rename = "pointer")]
Pointer(String),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum OpType {
Replace,
InsertBefore,
InsertAfter,
Delete,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EditOp {
pub op: OpType,
pub target: Target,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TargetInfo {
pub id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub label: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub accepts: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HandleContentItem {
pub id: String,
pub version: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub token_count: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub state: Option<ArtifactState>,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub targets: Option<Vec<TargetInfo>>,
}