1use crate::tasks::workflows::{
 2    run_tests::run_tests_in,
 3    runners::{self, Platform},
 4    steps::{self, FluentBuilder, NamedJob, named, release_job},
 5};
 6use gh_workflow::*;
 7
 8pub(crate) fn run_docs_checks() -> Workflow {
 9    let docs = check_docs();
10    named::workflow()
11        .map(|workflow| run_tests_in(&["docs/**", "crates/docs_preprocessor/**"], workflow))
12        .add_job(docs.name, docs.job)
13}
14
15fn check_docs() -> NamedJob {
16    named::job(
17        release_job(&[])
18            .runs_on(runners::LINUX_LARGE)
19            .add_step(steps::checkout_repo())
20            .add_step(steps::setup_cargo_config(Platform::Linux))
21            // todo(ci): un-inline build_docs/action.yml here
22            .add_step(steps::cache_rust_dependencies())
23            .add_step(lychee_link_check("./docs/src/**/*")) // check markdown links
24            .map(steps::install_linux_dependencies)
25            .add_step(install_mdbook())
26            .add_step(build_docs())
27            .add_step(lychee_link_check("target/deploy/docs")), // check links in generated html
28    )
29}
30
31fn lychee_link_check(dir: &str) -> Step<Use> {
32    named::uses(
33        "lycheeverse",
34        "lychee-action",
35        "82202e5e9c2f4ef1a55a3d02563e1cb6041e5332",
36    ) // v2.4.1
37    .add_with(("args", format!("--no-progress --exclude '^http' '{dir}'")))
38    .add_with(("fail", true))
39}
40
41fn install_mdbook() -> Step<Use> {
42    named::uses(
43        "peaceiris",
44        "actions-mdbook",
45        "ee69d230fe19748b7abf22df32acaa93833fad08", // v2
46    )
47    .with(("mdbook-version", "0.4.37"))
48}
49
50fn build_docs() -> Step<Run> {
51    named::bash(indoc::indoc! {r#"
52        mkdir -p target/deploy
53        mdbook build ./docs --dest-dir=../target/deploy/docs/
54    "#})
55}