rdocs 0.1.2

Code Documentation Made Simple
Documentation
use std::path::{Path, PathBuf};

use rdocs::{cli::CmdExit, collect, out, parser};
use serde::{Deserialize, Serialize};

#[derive(Default, Clone, Debug, Serialize, Deserialize)]
pub struct Config {
    parser: parser::Config,
    collector: collect::Config,
}

pub fn exec(
    config_path: Option<&PathBuf>,
    collect_folder: &Path,
    format: Option<out::Format>,
    output: Option<PathBuf>,
) -> CmdExit {
    let span = tracing::span!(tracing::Level::TRACE, "exec");
    let _guard = span.enter();

    let config = match config_path {
        Some(path) => {
            let rdr = match std::fs::File::open(path) {
                Ok(rdr) => rdr,
                Err(err) => {
                    return CmdExit::error_with_message(&format!(
                        "could not read config file: {err}"
                    ));
                }
            };

            match serde_yaml::from_reader(rdr) {
                Ok(config) => config,
                Err(err) => {
                    return CmdExit::error_with_message(&format!("invalid config file: {err}"));
                }
            }
        }
        None => Config::default(),
    };

    let collector = match collect::Collector::from_config(collect_folder, &config.collector) {
        Ok(collector) => collector,
        Err(err) => {
            return CmdExit::error_with_message(&format!("could not init collector: {err}"));
        }
    };
    let parser = parser::Parser::with_config(config.parser);

    let results = parser.extract_content(&collector);

    if results.is_empty() {
        CmdExit::error_with_message("code captures not found in the given path")
    } else {
        let out = match format {
            Some(format) => out::Content::All(out::Output::new(output), format),
            None => out::Content::Only(out::Output::new(output)),
        };
        if let Err(err) = out.export(results) {
            CmdExit::error_with_message(&format!("export result error: {err}"))
        } else {
            CmdExit::ok()
        }
    }
}