cli

Command-line interface for Radroots
git clone https://radroots.dev/git/cli.git
Log | Files | Refs | README | LICENSE

commit f08c10945ffc172b13d2ee079b09b5c1d93589c4
parent 64c52fbc0a0eac0169f285ec508e46192069bcb6
Author: triesap <tyson@radroots.org>
Date:   Mon, 13 Apr 2026 15:00:03 +0000

order: route cli submit through radroots_sdk

Diffstat:
Msrc/runtime/daemon.rs | 91+++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------
1 file changed, 61 insertions(+), 30 deletions(-)

diff --git a/src/runtime/daemon.rs b/src/runtime/daemon.rs @@ -92,8 +92,6 @@ struct BridgeStatusRemote { struct BridgeJobRemote { job_id: String, command: String, - #[serde(default)] - idempotency_key: Option<String>, status: String, terminal: bool, recovered_after_restart: bool, @@ -133,12 +131,6 @@ struct Nip46SessionRemote { signer_authority: Option<ActorWriteSignerAuthority>, } -#[derive(Debug, Clone, Deserialize)] -struct BridgePublishResponseRemote { - deduplicated: bool, - job: BridgeJobRemote, -} - #[derive(Debug, Clone)] pub struct BridgeListingPublishResult { pub deduplicated: bool, @@ -431,28 +423,31 @@ pub fn bridge_order_request( signer_session_id: Option<&str>, signer_authority: Option<&ActorWriteSignerAuthority>, ) -> Result<BridgeOrderRequestResult, DaemonRpcError> { - let target = actor_write_target(config)?; - let response: BridgePublishResponseRemote = call( - &target, - "bridge.order.request", - Some(serde_json::json!({ - "order": order, - "idempotency_key": idempotency_key, - "signer_session_id": signer_session_id, - "signer_authority": signer_authority, - })), - RpcAuthMode::BridgeBearer, - )?; - Ok(BridgeOrderRequestResult { - deduplicated: response.deduplicated, - job_id: response.job.job_id, - idempotency_key: response.job.idempotency_key, - status: response.job.status, - signer_mode: response.job.signer_mode, - signer_session_id: response.job.signer_session_id, - event_id: response.job.event_id, - event_addr: response.job.event_addr, - }) + let Some(signer_session_id) = signer_session_id else { + return Err(DaemonRpcError::Unconfigured( + "order publish requires a signer session id".to_owned(), + )); + }; + + let sdk = actor_write_sdk_client(config)?; + let session = SdkRadrootsdSignerSessionRef::from_session_id(signer_session_id.to_owned()); + let mut options = radroots_sdk::SdkRadrootsdOrderRequestPublishOptions::from_signer_session_ref( + &session, + ); + if let Some(idempotency_key) = idempotency_key { + options = options.with_idempotency_key(idempotency_key.to_owned()); + } + if let Some(signer_authority) = signer_authority { + options = options.with_signer_authority(sdk_signer_authority(signer_authority)); + } + + let receipt = block_on_sdk( + sdk.trade() + .publish_order_request_via_radrootsd_with_options(order, &options), + )? + .map_err(map_sdk_publish_error)?; + + map_order_request_receipt(receipt, idempotency_key) } fn bridge_status(config: &RuntimeConfig) -> Result<BridgeStatusRemote, DaemonRpcError> { @@ -580,6 +575,42 @@ fn map_listing_publish_receipt( }) } +fn map_order_request_receipt( + receipt: radroots_sdk::SdkPublishReceipt, + idempotency_key: Option<&str>, +) -> Result<BridgeOrderRequestResult, DaemonRpcError> { + let radroots_sdk::SdkTransportReceipt::Radrootsd(transport_receipt) = receipt.transport_receipt else { + return Err(DaemonRpcError::InvalidResponse( + "sdk order publish returned a non-radrootsd transport receipt".to_owned(), + )); + }; + let Some(job_id) = transport_receipt.job_id else { + return Err(DaemonRpcError::InvalidResponse( + "sdk order publish did not return a job id".to_owned(), + )); + }; + let Some(status) = transport_receipt.status else { + return Err(DaemonRpcError::InvalidResponse( + "sdk order publish did not return a job status".to_owned(), + )); + }; + let Some(signer_mode) = transport_receipt.signer_mode else { + return Err(DaemonRpcError::InvalidResponse( + "sdk order publish did not return a signer mode".to_owned(), + )); + }; + Ok(BridgeOrderRequestResult { + deduplicated: transport_receipt.deduplicated, + job_id, + idempotency_key: idempotency_key.map(str::to_owned), + status, + signer_mode, + signer_session_id: transport_receipt.signer_session_id, + event_id: receipt.event_id, + event_addr: transport_receipt.event_addr, + }) +} + fn block_on_sdk<F, T>(future: F) -> Result<T, DaemonRpcError> where F: std::future::Future<Output = T>,