use content_addressable::{canonical, ContentAddressable, ContentError};
use serde::{Deserialize, Serialize};
use crate::error::ProtocolError;
use crate::ids::{DefinitionId, InstanceId, Nonce, Revision};
pub const INSTANCE_SCHEMA_V1: &str = "newt.interaction.instance/v1";
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
#[non_exhaustive]
pub enum LifecycleState {
Draft,
Published,
Answered,
Cancelled,
Expired,
Unsupported,
}
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
#[non_exhaustive]
pub enum Audience {
Terminal,
Web,
}
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ResponderPolicy {
pub audiences: Vec<Audience>,
pub requires_assertion: bool,
}
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct Scope {
pub workspace_key: String,
pub conversation_id: String,
}
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct Provenance {
pub origin: String,
pub minted_tick: i64,
}
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct InteractionInstance {
pub schema: crate::tag::InstanceTag,
pub nonce: Nonce,
pub definition: DefinitionId,
pub revision: Revision,
pub ttl_ticks: i64,
pub scope: Scope,
pub responder_policy: ResponderPolicy,
pub provenance: Provenance,
}
impl InteractionInstance {
pub fn instance_id(&self) -> Result<InstanceId, ProtocolError> {
Ok(InstanceId::from_content_id(self.content_id()?))
}
#[must_use]
pub fn schema_tag(&self) -> &'static str {
self.schema.as_str()
}
}
impl ContentAddressable for InteractionInstance {
fn canonical_form(&self) -> Result<Vec<u8>, ContentError> {
canonical::to_canonical_dagcbor(self)
}
}