1use anyhow::Context;
7use camino::Utf8PathBuf;
8use clap::Parser;
9
10use crate::config::{Metadata, Package};
11
12mod config;
13mod content;
14mod render;
15
16#[derive(Parser, Debug)]
18#[command(version, about, long_about = None)]
19struct Args {
20 #[arg(long)]
21 cargo_toml: Utf8PathBuf,
22
23 #[arg(long)]
24 rustdoc_json: Utf8PathBuf,
25
26 #[arg(long)]
27 readme_md: Utf8PathBuf,
28
29 #[arg(long)]
30 render_output: Utf8PathBuf,
31}
32
33#[derive(Clone, Default, serde_derive::Deserialize)]
34struct ManifestMetadata {
35 #[serde(alias = "sync-readme")]
36 sync_readme: Metadata,
37}
38
39fn main() -> anyhow::Result<()> {
40 let args = Args::parse();
41
42 let cargo_toml =
43 cargo_toml::Manifest::<ManifestMetadata>::from_path_with_metadata(args.cargo_toml).context("cargo toml")?;
44 let pkg = cargo_toml.package();
45
46 let package = Package {
47 name: pkg.name.clone(),
48 license: pkg.license().map(|l| l.to_owned()),
49 version: pkg.version().to_owned(),
50 rustdoc_json: args.rustdoc_json,
51 metadata: pkg.metadata.clone().unwrap_or_default().sync_readme,
52 };
53
54 let content = content::create(&package).context("content")?;
55 let readme = std::fs::read_to_string(&args.readme_md).context("readme read")?;
56 let render = render::render(&readme, &content).context("render")?;
57
58 let output = serde_json::to_string_pretty(&sync_readme_common::SyncReadmeRenderOutput {
59 rendered: render,
60 source: readme,
61 path: args.readme_md,
62 })
63 .context("json output")?;
64
65 std::fs::write(&args.render_output, output).context("write output")?;
66
67 Ok(())
68}