spreadsheet_kit/cli/commands/
verify.rs1use 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(¤t)?;
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(¤t).await?;
32
33 let baseline_workbook = baseline_state.open_workbook(&baseline_id).await?;
34 let current_workbook = current_state.open_workbook(¤t_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 ¤t_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}