sync_readme/
main.rs

1//! This is a helper binary which converts a crate + rustdoc json into a
2//! nicer markdown for readme generation.
3//!
4//! We copied a lot of the rustdoc extract code from <https://github.com/gifnksm/cargo-sync-rdme>
5
6use anyhow::Context;
7use camino::Utf8PathBuf;
8use clap::Parser;
9
10use crate::config::{Metadata, Package};
11
12mod config;
13mod content;
14mod render;
15
16/// Simple program to greet a person
17#[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}