Skip to main content

spreadsheet_kit/cli/commands/
verify.rs

1use crate::runtime::stateless::StatelessRuntime;
2use crate::tools::{self, NamedRangesParams};
3use crate::verification::{VerifyOptions, compare_workbooks};
4use anyhow::Result;
5use serde_json::Value;
6use std::path::PathBuf;
7
8pub async fn verify(
9    baseline: PathBuf,
10    current: PathBuf,
11    targets: Option<Vec<String>>,
12    sheet_name: Option<String>,
13    named_ranges: bool,
14    errors_only: bool,
15    targets_only: bool,
16) -> Result<Value> {
17    let options = VerifyOptions {
18        targets: targets.unwrap_or_default(),
19        sheet_filter: sheet_name.clone(),
20        include_named_range_deltas: named_ranges,
21        errors_only,
22        targets_only,
23    };
24    options.validate()?;
25
26    let runtime = StatelessRuntime;
27    let baseline = runtime.normalize_existing_file(&baseline)?;
28    let current = runtime.normalize_existing_file(&current)?;
29
30    let (baseline_state, baseline_id) = runtime.open_state_for_file(&baseline).await?;
31    let (current_state, current_id) = runtime.open_state_for_file(&current).await?;
32
33    let baseline_workbook = baseline_state.open_workbook(&baseline_id).await?;
34    let current_workbook = current_state.open_workbook(&current_id).await?;
35
36    let baseline_named = if named_ranges {
37        Some(
38            tools::named_ranges(
39                baseline_state.clone(),
40                NamedRangesParams {
41                    workbook_or_fork_id: baseline_id.clone(),
42                    sheet_name: sheet_name.clone(),
43                    name_prefix: None,
44                },
45            )
46            .await?,
47        )
48    } else {
49        None
50    };
51    let current_named = if named_ranges {
52        Some(
53            tools::named_ranges(
54                current_state.clone(),
55                NamedRangesParams {
56                    workbook_or_fork_id: current_id.clone(),
57                    sheet_name,
58                    name_prefix: None,
59                },
60            )
61            .await?,
62        )
63    } else {
64        None
65    };
66
67    let response = compare_workbooks(
68        baseline.display().to_string(),
69        current.display().to_string(),
70        &baseline_workbook,
71        &current_workbook,
72        &options,
73        baseline_named.as_ref().map(|r| r.items.as_slice()),
74        current_named.as_ref().map(|r| r.items.as_slice()),
75    )?;
76
77    Ok(serde_json::to_value(response)?)
78}