use include_dir::{Dir, include_dir};
use serde_json::Value;
use crate::types::{PersonaDraft, PersonaManifest};
static SAMPLES_DIR: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR/samples");
pub fn list_samples() -> Vec<&'static str> {
let mut out: Vec<&'static str> = SAMPLES_DIR
.dirs()
.filter_map(|d| d.path().file_name()?.to_str()?.strip_prefix("persona-"))
.collect();
out.sort_unstable();
out
}
pub fn load_sample(slug: &str) -> Option<(PersonaDraft, PersonaManifest)> {
let dirname = format!("persona-{slug}");
let dir = SAMPLES_DIR.get_dir(&dirname)?;
let draft_bytes = dir.get_file(format!("{dirname}/draft.json"))?.contents();
let manifest_bytes = dir.get_file(format!("{dirname}/manifest.json"))?.contents();
let draft: PersonaDraft = serde_json::from_slice(draft_bytes).ok()?;
let manifest: PersonaManifest = serde_json::from_slice(manifest_bytes).ok()?;
Some((draft, manifest))
}
pub fn load_sample_raw(slug: &str) -> Option<(Value, Value)> {
let dirname = format!("persona-{slug}");
let dir = SAMPLES_DIR.get_dir(&dirname)?;
let draft_bytes = dir.get_file(format!("{dirname}/draft.json"))?.contents();
let manifest_bytes = dir.get_file(format!("{dirname}/manifest.json"))?.contents();
let draft: Value = serde_json::from_slice(draft_bytes).ok()?;
let manifest: Value = serde_json::from_slice(manifest_bytes).ok()?;
Some((draft, manifest))
}