use indexmap::IndexMap;
use quillmark_content::Content;
use super::Quill;
use crate::quill::CardSchema;
use crate::{Card, Document, Payload, QuillReference, QuillValue, SeedOverlay};
fn seed_parts(schema: &CardSchema, overlay: Option<&SeedOverlay>) -> (Payload, Content) {
let mut fields: IndexMap<String, QuillValue> = IndexMap::new();
for (name, field) in &schema.fields {
let value = overlay
.and_then(|o| o.fields.get(name))
.or(field.example_content.as_ref())
.or(field.example.as_ref());
if let Some(value) = value {
fields.insert(name.clone(), value.clone());
}
}
let body = if schema.body_enabled() {
if let Some(overlay_body) = overlay.and_then(|o| o.body.clone()) {
crate::document::import_body(&overlay_body).unwrap_or_else(|_| Content::empty())
} else if let Some(content) = schema.body.as_ref().and_then(|b| b.example_content.as_ref()) {
quillmark_content::serial::from_canonical_value(content.as_json())
.unwrap_or_else(|_| Content::empty())
} else if let Some(example) = schema.body.as_ref().and_then(|b| b.example.as_ref()) {
crate::document::import_body(example).unwrap_or_else(|_| Content::empty())
} else {
Content::empty()
}
} else {
Content::empty()
};
(Payload::from_index_map(fields), body)
}
fn main_reference(quill: &Quill) -> QuillReference {
let config = quill.config();
format!("{}@{}", config.name, config.version)
.parse()
.unwrap_or_else(|_| QuillReference::latest(config.name.clone()))
}
pub(crate) fn seed_main(quill: &Quill) -> Card {
let (mut payload, body) = seed_parts(&quill.config().main, None);
payload.set_quill(main_reference(quill));
payload.set_kind("main");
Card::from_parts(payload, body)
}
pub(crate) fn seed_card_for_kind(
quill: &Quill,
card_kind: &str,
overlay: Option<&SeedOverlay>,
) -> Option<Card> {
let schema = quill.config().card_kind(card_kind)?;
Some(seed_composable(schema, overlay))
}
fn seed_composable(schema: &CardSchema, overlay: Option<&SeedOverlay>) -> Card {
let (mut payload, body) = seed_parts(schema, overlay);
payload.set_kind(schema.name.clone());
Card::from_parts(payload, body)
}
pub(crate) fn seed_document(quill: &Quill) -> Document {
let main = seed_main(quill);
let cards = quill
.config()
.card_kinds
.iter()
.map(|schema| seed_composable(schema, None))
.collect();
Document::from_main_and_cards(main, cards)
}
#[cfg(test)]
mod tests;