use serde::{Deserialize, Serialize};
pub type EntityId = String;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct TimeSpan {
pub start: i32,
pub end: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub enum Status {
Active,
Dead,
Destroyed,
Dissolved,
Evacuated,
Captured,
Transformed,
Corrupted,
Unknown,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum Sentiment {
Triumphant,
Vindicated,
Dutiful,
Determined,
Righteous,
Transformative,
Neutral,
Sorrowful,
Fearful,
Desperate,
Defiant,
Devastating,
Resentful,
Fractured,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum Role {
Attacker,
Defender,
Leader,
Participant,
Witness,
Discoverer,
Instigator,
Victim,
Mediator,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum Fidelity {
Canonical,
Partial,
Distorted,
Biased,
Fabricated,
Corrupted,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum StateChange {
StatusChange(Status),
Founded,
AffiliationAdded(EntityId),
AffiliationRemoved(EntityId),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Participant {
pub actor: EntityId,
pub role: Role,
pub sentiment: Sentiment,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EventStateChange {
pub entity: EntityId,
pub change: StateChange,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum ActorType {
Character,
Faction,
Deity,
Organization,
Creature,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum PlaceType {
Settlement,
Region,
Dungeon,
Landmark,
Ruin,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum EventType {
Battle,
Siege,
Discovery,
Political,
Migration,
Death,
Founding,
Catastrophe,
Ritual,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum ConceptType {
Religion,
Technology,
Artifact,
Law,
Tradition,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Actor {
pub id: EntityId,
pub name: String,
#[serde(rename = "type")]
pub actor_type: ActorType,
#[serde(default = "default_status")]
pub status: Status,
#[serde(default)]
pub status_since_event: Option<EntityId>,
#[serde(default)]
pub affiliations: Vec<EntityId>,
#[serde(default)]
pub lifespan: Option<TimeSpan>,
#[serde(default)]
pub description: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Place {
pub id: EntityId,
pub name: String,
#[serde(rename = "type")]
pub place_type: PlaceType,
#[serde(default = "default_status")]
pub status: Status,
#[serde(default)]
pub status_since_event: Option<EntityId>,
#[serde(default)]
pub region: Option<EntityId>,
#[serde(default)]
pub description: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Event {
pub id: EntityId,
pub name: String,
#[serde(rename = "type")]
pub event_type: EventType,
pub time_span: TimeSpan,
#[serde(default)]
pub location: Option<EntityId>,
#[serde(default)]
pub caused_by: Vec<EntityId>,
#[serde(default)]
pub participants: Vec<Participant>,
#[serde(default)]
pub state_changes: Vec<EventStateChange>,
#[serde(default)]
pub description: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Concept {
pub id: EntityId,
pub name: String,
#[serde(rename = "type")]
pub concept_type: ConceptType,
#[serde(default)]
pub origin_event: Option<EntityId>,
#[serde(default)]
pub description: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Account {
pub id: EntityId,
pub source: EntityId,
pub fidelity: Fidelity,
#[serde(default)]
pub event_refs: Vec<EntityId>,
pub text: String,
}
fn default_status() -> Status {
Status::Active
}
#[derive(Debug, Clone)]
pub struct ValidationConfig {
pub terminal_statuses: std::collections::HashSet<Status>,
}
impl Default for ValidationConfig {
fn default() -> Self {
Self {
terminal_statuses: [Status::Dead, Status::Destroyed, Status::Dissolved].into(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Entity {
Actor(Actor),
Place(Place),
Event(Event),
Concept(Concept),
Account(Account),
}
impl Entity {
pub fn id(&self) -> &str {
match self {
Entity::Actor(a) => &a.id,
Entity::Place(p) => &p.id,
Entity::Event(e) => &e.id,
Entity::Concept(c) => &c.id,
Entity::Account(a) => &a.id,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Relationship {
ParticipatedIn {
role: Role,
sentiment: Sentiment,
},
OccurredAt,
CausedBy,
HasStateChange {
change: StateChange,
},
AffiliatedWith,
OriginatedFrom,
AccountOf,
AuthoredBy,
Mentions,
LocatedIn,
}