#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum LineMode {
#[default]
Normal,
Narration,
Debug,
}
#[must_use]
pub fn line_mode_from_tags(tags: &[String]) -> LineMode {
if tags.iter().any(|t| t == "debug") {
LineMode::Debug
} else if tags.iter().any(|t| t == "narration") {
LineMode::Narration
} else {
LineMode::Normal
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MarkupSpan {
pub name: String,
pub start: usize,
pub length: usize,
pub properties: Vec<(String, String)>,
}
#[must_use]
pub fn line_id_from_tags(tags: &[String]) -> Option<String> {
tags.iter()
.find_map(|t| t.strip_prefix("line:"))
.map(str::to_owned)
.filter(|s| !s.is_empty())
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DialogueOption {
pub text: String,
pub available: bool,
pub line_id: Option<String>,
pub tags: Vec<String>,
pub spans: Vec<MarkupSpan>,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq)]
pub enum DialogueEvent {
NodeStarted(String),
Line {
speaker: Option<String>,
text: String,
line_id: Option<String>,
tags: Vec<String>,
line_mode: LineMode,
spans: Vec<MarkupSpan>,
},
Options(Vec<DialogueOption>),
Command {
name: String,
args: Vec<String>,
tags: Vec<String>,
},
NodeComplete(String),
DialogueComplete,
}
#[cfg(test)]
#[path = "event_tests.rs"]
mod tests;