use std::path::Path;
use dbmd_core::emit::{self, Emit, EmittedFile};
use dbmd_core::store::Layer;
use dbmd_core::Store;
use crate::cli::EmitArgs;
use crate::context::Context;
use crate::error::{CliError, CliResult};
pub fn run(ctx: &Context, args: &EmitArgs) -> CliResult {
let store = Store::open_strict(Path::new(&args.dir))?;
let dump = emit::compute(&store).map_err(CliError::from)?;
if ctx.json {
println!("{}", json_dump(&args.dir, &dump));
} else {
print!("{}", text_dump(&dump));
}
Ok(())
}
fn text_dump(dump: &Emit) -> String {
let mut out = String::new();
for f in &dump.files {
out.push_str(&f.path);
out.push('\n');
}
out
}
fn json_dump(store_dir: &str, dump: &Emit) -> String {
let files: Vec<serde_json::Value> = dump.files.iter().map(file_json).collect();
serde_json::json!({
"store": store_dir,
"files": files,
"summary": {
"files": dump.files.len(),
"sources": dump.sources,
"records": dump.records,
},
})
.to_string()
}
fn file_json(f: &EmittedFile) -> serde_json::Value {
serde_json::json!({
"path": f.path,
"layer": f.layer.map(layer_word),
"frontmatter": f.frontmatter,
"type": f.type_,
"meta_type": f.meta_type,
"title": f.title,
"summary": f.summary,
"body": f.body,
"links": f.links,
"created": f.created.map(|t| t.to_rfc3339()),
"updated": f.updated.map(|t| t.to_rfc3339()),
"sha256": f.sha256,
})
}
fn layer_word(layer: Layer) -> &'static str {
match layer {
Layer::Sources => "source",
Layer::Records => "record",
}
}