feat(rpc): 完成 issue #1 Go 调用边界
bat-rust / Build and test Rust (push) Failing after 3m17s

This commit is contained in:
2026-07-24 17:58:34 +08:00
parent ecda08ed97
commit 102b49b666
20 changed files with 1011 additions and 34 deletions
+50 -3
View File
@@ -3036,8 +3036,17 @@ struct CommandReport<T> {
}
fn run_sync_command(options: &CliOptions, command_name: &'static str) -> anyhow::Result<()> {
if let Some(rpc_method) = sync_command_rpc_method(options, command_name)
.filter(|_| daemon_rpc_available(&options.state_dir))
run_sync_command_with_rpc(options, command_name, daemon_rpc_available, daemon_rpc_call)
}
fn run_sync_command_with_rpc(
options: &CliOptions,
command_name: &'static str,
rpc_available: impl Fn(&Path) -> bool,
rpc_call: impl Fn(&Path, &str, Option<serde_json::Value>) -> anyhow::Result<serde_json::Value>,
) -> anyhow::Result<()> {
if let Some(rpc_method) =
sync_command_rpc_method(options, command_name).filter(|_| rpc_available(&options.state_dir))
{
let _control_lock = DaemonControlLock::acquire(&options.state_dir)?;
let params = if rpc_method == RPC_METHOD_REFRESH {
@@ -3045,7 +3054,7 @@ fn run_sync_command(options: &CliOptions, command_name: &'static str) -> anyhow:
} else {
None
};
let report = daemon_rpc_call(&options.state_dir, rpc_method, params)?;
let report = rpc_call(&options.state_dir, rpc_method, params)?;
print_json_value(options.output_format, &report)?;
return Ok(());
}
@@ -7264,6 +7273,44 @@ mod tests {
assert_eq!(sync_command_rpc_method(&options, "repair"), None);
}
#[test]
fn repair_command_uses_rpc_when_default_daemon_shape() {
let temp = tempfile::TempDir::new().unwrap();
let state_dir = temp.path().join("state");
fs::create_dir_all(&state_dir).unwrap();
let seen = Arc::new(Mutex::new(Vec::<(String, Option<serde_json::Value>)>::new()));
let seen_calls = Arc::clone(&seen);
let options = parse(&[
"bat",
"repair",
"--json",
"--state-dir",
state_dir.to_str().unwrap(),
])
.unwrap();
run_sync_command_with_rpc(
&options,
"repair",
|_| true,
move |_state_dir, method, params| {
seen_calls
.lock()
.unwrap()
.push((method.to_string(), params.clone()));
Ok(serde_json::json!({
"task_id": "task-fake-repair",
"kind": "resource.repair",
}))
},
)
.unwrap();
let seen = seen.lock().unwrap();
assert_eq!(seen.len(), 1);
assert_eq!(seen[0].0, RPC_METHOD_RESOURCE_REPAIR);
assert_eq!(seen[0].1, None);
}
#[test]
fn explicit_no_quiet_up_to_date_overrides_watch_default() {
let options = parse(&[