use indexmap::IndexMap;
use quillmark_core::quill::CardSchema;
use quillmark_core::{Card, Document, Payload, QuillReference, QuillValue};
use crate::Quill;
fn seed_parts(schema: &CardSchema) -> (Payload, String) {
let mut names: Vec<&str> = schema.fields.keys().map(String::as_str).collect();
names.sort_by_key(|name| schema.fields[*name].ui_order());
let mut fields: IndexMap<String, QuillValue> = IndexMap::new();
for name in names {
if let Some(example) = &schema.fields[name].example {
fields.insert(name.to_string(), example.clone());
}
}
let body = if schema.body_enabled() {
schema
.body
.as_ref()
.and_then(|b| b.example.clone())
.unwrap_or_default()
} else {
String::new()
};
(Payload::from_index_map(fields), body)
}
fn main_reference(quill: &Quill) -> QuillReference {
let config = quill.source().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.source().config().main);
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) -> Option<Card> {
let schema = quill.source().config().card_kind(card_kind)?;
Some(seed_composable(schema))
}
fn seed_composable(schema: &CardSchema) -> Card {
let (mut payload, body) = seed_parts(schema);
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
.source()
.config()
.card_kinds
.iter()
.map(seed_composable)
.collect();
Document::from_main_and_cards(main, cards, Vec::new())
}
#[cfg(test)]
mod tests;