use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use crate::kind::{Kind, Status};
use crate::relationship::{EntityType, Relationship};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Frontmatter {
pub id: String,
pub title: String,
pub status: Status,
pub created: DateTime<Utc>,
pub updated: DateTime<Utc>,
#[serde(flatten)]
pub kind_data: KindData,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "lowercase")]
pub enum KindData {
Entity(EntityData),
Concept(ConceptData),
Synthesis(SynthesisData),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EntityData {
#[serde(rename = "type")]
pub entity_type: EntityType,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub aliases: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub relationships: Vec<Relationship>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ConceptData {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub relationships: Vec<Relationship>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SynthesisData {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub inputs: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub question: Option<String>,
}
impl Frontmatter {
#[must_use]
pub fn kind(&self) -> Kind {
match &self.kind_data {
KindData::Entity(_) => Kind::Entity,
KindData::Concept(_) => Kind::Concept,
KindData::Synthesis(_) => Kind::Synthesis,
}
}
}