use indexmap::IndexMap;
use crate::error::ParseError;
use crate::value::QuillValue;
use crate::version::QuillReference;
use crate::Diagnostic;
pub mod assemble;
pub mod edit;
pub mod emit;
pub mod fences;
pub mod limits;
pub mod sentinel;
pub use edit::EditError;
#[cfg(test)]
mod tests;
#[derive(Debug)]
pub struct ParseOutput {
pub document: Document,
pub warnings: Vec<Diagnostic>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Card {
tag: String,
fields: IndexMap<String, QuillValue>,
body: String,
}
impl Card {
pub fn new_internal(tag: String, fields: IndexMap<String, QuillValue>, body: String) -> Self {
Self { tag, fields, body }
}
pub fn tag(&self) -> &str {
&self.tag
}
pub fn fields(&self) -> &IndexMap<String, QuillValue> {
&self.fields
}
pub fn body(&self) -> &str {
&self.body
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct Document {
quill_ref: QuillReference,
frontmatter: IndexMap<String, QuillValue>,
body: String,
cards: Vec<Card>,
warnings: Vec<Diagnostic>,
}
impl Document {
pub fn new_internal(
quill_ref: QuillReference,
frontmatter: IndexMap<String, QuillValue>,
body: String,
cards: Vec<Card>,
warnings: Vec<Diagnostic>,
) -> Self {
Self {
quill_ref,
frontmatter,
body,
cards,
warnings,
}
}
pub fn from_markdown(markdown: &str) -> Result<Self, ParseError> {
assemble::decompose(markdown)
}
pub fn from_markdown_with_warnings(markdown: &str) -> Result<ParseOutput, ParseError> {
assemble::decompose_with_warnings(markdown)
.map(|(document, warnings)| ParseOutput { document, warnings })
}
pub fn quill_reference(&self) -> &QuillReference {
&self.quill_ref
}
pub fn frontmatter(&self) -> &IndexMap<String, QuillValue> {
&self.frontmatter
}
pub fn body(&self) -> &str {
&self.body
}
pub fn cards(&self) -> &[Card] {
&self.cards
}
pub fn warnings(&self) -> &[Diagnostic] {
&self.warnings
}
pub fn to_plate_json(&self) -> serde_json::Value {
let mut map = serde_json::Map::new();
map.insert(
"QUILL".to_string(),
serde_json::Value::String(self.quill_ref.to_string()),
);
for (key, value) in &self.frontmatter {
map.insert(key.clone(), value.as_json().clone());
}
map.insert(
"BODY".to_string(),
serde_json::Value::String(self.body.clone()),
);
let cards_array: Vec<serde_json::Value> = self
.cards
.iter()
.map(|card| {
let mut card_map = serde_json::Map::new();
card_map.insert(
"CARD".to_string(),
serde_json::Value::String(card.tag.clone()),
);
for (key, value) in &card.fields {
card_map.insert(key.clone(), value.as_json().clone());
}
card_map.insert(
"BODY".to_string(),
serde_json::Value::String(card.body.clone()),
);
serde_json::Value::Object(card_map)
})
.collect();
map.insert("CARDS".to_string(), serde_json::Value::Array(cards_array));
serde_json::Value::Object(map)
}
}