cli

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

commit 0eaf5d04063be0e02d3b020490d28ae1be4cd601
parent ff7ff71237cdfadaec68cfd0d290e17bfcad7b7e
Author: triesap <tyson@radroots.org>
Date:   Sat,  9 May 2026 00:32:40 +0000

cli: name order event list explicitly

- rename internal order history views to order event list views
- route order event list through an event_list runtime function
- keep request-event read behavior separate from reducer status reads
- update affected unit imports and event-list test naming

Diffstat:
Msrc/domain/runtime.rs | 8++++----
Msrc/operation_order.rs | 19+++++++++----------
Msrc/runtime/order.rs | 76+++++++++++++++++++++++++++++++++++++++++-----------------------------------
3 files changed, 54 insertions(+), 49 deletions(-)

diff --git a/src/domain/runtime.rs b/src/domain/runtime.rs @@ -2137,7 +2137,7 @@ pub struct OrderWorkflowView { } #[derive(Debug, Clone, Serialize)] -pub struct OrderHistoryView { +pub struct OrderEventListView { pub state: String, pub source: String, #[serde(skip_serializing_if = "Option::is_none")] @@ -2158,12 +2158,12 @@ pub struct OrderHistoryView { #[serde(skip_serializing_if = "Option::is_none")] pub reason: Option<String>, #[serde(default, skip_serializing_if = "Vec::is_empty")] - pub orders: Vec<OrderHistoryEntryView>, + pub orders: Vec<OrderEventListEntryView>, #[serde(default, skip_serializing_if = "Vec::is_empty")] pub actions: Vec<String>, } -impl OrderHistoryView { +impl OrderEventListView { pub fn disposition(&self) -> CommandDisposition { match self.state.as_str() { "unconfigured" => CommandDisposition::Unconfigured, @@ -2175,7 +2175,7 @@ impl OrderHistoryView { } #[derive(Debug, Clone, Serialize)] -pub struct OrderHistoryEntryView { +pub struct OrderEventListEntryView { pub id: String, pub state: String, #[serde(skip_serializing_if = "Option::is_none")] diff --git a/src/operation_order.rs b/src/operation_order.rs @@ -498,11 +498,10 @@ impl OperationService<OrderEventListRequest> for OrderOperationService<'_> { request: OperationRequest<OrderEventListRequest>, ) -> Result<OperationResult<Self::Result>, OperationAdapterError> { let order_id = string_input(&request, "order_id"); - let view = - crate::runtime::order::history(self.config, order_id.as_deref()).map_err(|error| { - OperationAdapterError::runtime_failure(request.operation_id(), error) - })?; - history_result::<OrderEventListResult>(request.operation_id(), &view) + let view = crate::runtime::order::event_list(self.config, order_id.as_deref()).map_err( + |error| OperationAdapterError::runtime_failure(request.operation_id(), error), + )?; + event_list_result::<OrderEventListResult>(request.operation_id(), &view) } } @@ -1246,9 +1245,9 @@ fn order_submit_error_detail(view: &OrderSubmitView) -> Value { }) } -fn history_result<R>( +fn event_list_result<R>( operation_id: &str, - view: &crate::domain::runtime::OrderHistoryView, + view: &crate::domain::runtime::OrderEventListView, ) -> Result<OperationResult<R>, OperationAdapterError> where R: OperationResultData, @@ -1260,7 +1259,7 @@ where format!("order event list finished with state `{}`", view.state) }); if disposition == CommandDisposition::ExternalUnavailable { - let detail = order_history_error_detail(view); + let detail = order_event_list_error_detail(view); Err(OperationAdapterError::network_unavailable_with_detail( operation_id, message, @@ -1270,7 +1269,7 @@ where Err(OperationAdapterError::operation_unavailable_with_detail( operation_id, message, - order_history_error_detail(view), + order_event_list_error_detail(view), )) } else { Err(OperationAdapterError::from_command_disposition( @@ -1283,7 +1282,7 @@ where } } -fn order_history_error_detail(view: &crate::domain::runtime::OrderHistoryView) -> Value { +fn order_event_list_error_detail(view: &crate::domain::runtime::OrderEventListView) -> Value { json!({ "state": &view.state, "seller_pubkey": &view.seller_pubkey, diff --git a/src/runtime/order.rs b/src/runtime/order.rs @@ -80,8 +80,8 @@ use radroots_trade::order::{ use serde::{Deserialize, Serialize}; use crate::domain::runtime::{ - OrderCancellationView, OrderDecisionView, OrderDraftItemView, OrderFulfillmentView, - OrderGetView, OrderHistoryEntryView, OrderHistoryView, OrderInventoryBinView, + OrderCancellationView, OrderDecisionView, OrderDraftItemView, OrderEventListEntryView, + OrderEventListView, OrderFulfillmentView, OrderGetView, OrderInventoryBinView, OrderInventoryView, OrderIssueView, OrderListView, OrderNewView, OrderPaymentView, OrderReceiptView, OrderRevisionDecisionView, OrderRevisionProposalView, OrderSettlementView, OrderStatusFulfillmentView, OrderStatusLifecycleCancellationView, @@ -768,12 +768,12 @@ pub fn watch( }) } -pub fn history( +pub fn event_list( config: &RuntimeConfig, order_id: Option<&str>, -) -> Result<OrderHistoryView, RuntimeError> { +) -> Result<OrderEventListView, RuntimeError> { if config.relay.urls.is_empty() { - return Ok(order_history_unconfigured( + return Ok(order_event_list_unconfigured( None, "order event list requires at least one configured relay".to_owned(), Vec::new(), @@ -784,7 +784,7 @@ pub fn history( let seller = match accounts::resolve_account(config)? { Some(account) => account, None => { - return Ok(order_history_unconfigured( + return Ok(order_event_list_unconfigured( None, "order event list requires a selected seller account".to_owned(), config.relay.urls.clone(), @@ -801,7 +801,7 @@ pub fn history( target_relays, failed_relays, }) => { - return Ok(order_history_unavailable( + return Ok(order_event_list_unavailable( seller_pubkey, reason, target_relays, @@ -811,7 +811,11 @@ pub fn history( Err(error) => return Err(RuntimeError::Network(error.to_string())), }; - Ok(order_history_from_receipt(seller_pubkey, order_id, receipt)) + Ok(order_event_list_from_receipt( + seller_pubkey, + order_id, + receipt, + )) } pub fn decide( @@ -4104,13 +4108,13 @@ fn active_order_reducer_issue_view(issue_value: RadrootsActiveOrderReducerIssue) } } -fn order_history_unconfigured( +fn order_event_list_unconfigured( seller_pubkey: Option<String>, reason: String, target_relays: Vec<String>, actions: Vec<String>, -) -> OrderHistoryView { - OrderHistoryView { +) -> OrderEventListView { + OrderEventListView { state: "unconfigured".to_owned(), source: ORDER_EVENT_LIST_SOURCE.to_owned(), seller_pubkey, @@ -4127,13 +4131,13 @@ fn order_history_unconfigured( } } -fn order_history_unavailable( +fn order_event_list_unavailable( seller_pubkey: String, reason: String, target_relays: Vec<String>, failed_relays: Vec<DirectRelayFailure>, -) -> OrderHistoryView { - OrderHistoryView { +) -> OrderEventListView { + OrderEventListView { state: "unavailable".to_owned(), source: ORDER_EVENT_LIST_SOURCE.to_owned(), seller_pubkey: Some(seller_pubkey), @@ -4150,11 +4154,11 @@ fn order_history_unavailable( } } -fn order_history_from_receipt( +fn order_event_list_from_receipt( seller_pubkey: String, order_id: Option<&str>, receipt: DirectRelayFetchReceipt, -) -> OrderHistoryView { +) -> OrderEventListView { let DirectRelayFetchReceipt { target_relays, connected_relays, @@ -4167,7 +4171,7 @@ fn order_history_from_receipt( let mut orders = Vec::new(); for event in events { - match order_history_entry_from_event(&event, seller_pubkey.as_str()) { + match order_event_list_entry_from_event(&event, seller_pubkey.as_str()) { Ok(entry) => { decoded_count += 1; if order_id.is_none_or(|order_id| entry.id == order_id) { @@ -4196,7 +4200,7 @@ fn order_history_from_receipt( None }; - OrderHistoryView { + OrderEventListView { state: if orders.is_empty() { "empty" } else { "ready" }.to_owned(), source: ORDER_EVENT_LIST_SOURCE.to_owned(), seller_pubkey: Some(seller_pubkey), @@ -8113,10 +8117,10 @@ fn order_decision_binding_error_view( view } -fn order_history_entry_from_event( +fn order_event_list_entry_from_event( event: &RadrootsNostrEvent, seller_pubkey: &str, -) -> Result<OrderHistoryEntryView, RuntimeError> { +) -> Result<OrderEventListEntryView, RuntimeError> { let event_kind = event_kind_u32(event); if event_kind != KIND_TRADE_ORDER_REQUEST { return Err(RuntimeError::Config(format!( @@ -8144,7 +8148,7 @@ fn order_history_entry_from_event( let listing_event_id = context.listing_event.as_ref().map(|event| event.id.clone()); let created_at_unix = u64::from(event.created_at); - Ok(OrderHistoryEntryView { + Ok(OrderEventListEntryView { id: envelope.order_id.clone(), state: "requested".to_owned(), event_id: Some(event.id), @@ -10409,11 +10413,12 @@ mod tests { order_cancellation_event_parts, order_cancellation_payload_from_status, order_cancellation_preflight_view_from_status, order_decision_dry_run_view, order_decision_preflight_view_from_status, order_decision_view_from_resolution, - order_economics_from_resolved_listing, order_fulfillment_dry_run_view, - order_fulfillment_preflight_view_from_status, order_history_entry_from_event, - order_history_from_receipt, order_payment_dry_run_view, order_payment_event_parts, - order_payment_payload_from_status, order_payment_preflight_view_from_status, - order_receipt_dry_run_view, order_receipt_event_parts, order_receipt_payload_from_status, + order_economics_from_resolved_listing, order_event_list_entry_from_event, + order_event_list_from_receipt, order_fulfillment_dry_run_view, + order_fulfillment_preflight_view_from_status, order_payment_dry_run_view, + order_payment_event_parts, order_payment_payload_from_status, + order_payment_preflight_view_from_status, order_receipt_dry_run_view, + order_receipt_event_parts, order_receipt_payload_from_status, order_receipt_preflight_view_from_status, order_relay_publish_client, order_request_filter, order_revision_decision_event_parts, order_revision_decision_payload_from_proposal, order_revision_decision_preflight_view_from_status, order_revision_event_parts, @@ -10722,8 +10727,8 @@ mod tests { .sign_with_keys(buyer.keys()) .expect("signed order request"); - let entry = - order_history_entry_from_event(&event, seller_pubkey.as_str()).expect("history entry"); + let entry = order_event_list_entry_from_event(&event, seller_pubkey.as_str()) + .expect("history entry"); assert_eq!(entry.id, "ord_AAAAAAAAAAAAAAAAAAAAAg"); assert_eq!(entry.state, "requested"); @@ -11580,7 +11585,7 @@ mod tests { } #[test] - fn order_history_counts_decoded_before_order_id_narrowing() { + fn order_event_list_counts_decoded_before_order_id_narrowing() { let seller = RadrootsIdentity::generate(); let other_seller = RadrootsIdentity::generate(); let buyer = RadrootsIdentity::generate(); @@ -11625,13 +11630,14 @@ mod tests { ], }; - let history = order_history_from_receipt(seller_pubkey, Some(first_order_id), receipt); + let event_list = + order_event_list_from_receipt(seller_pubkey, Some(first_order_id), receipt); - assert_eq!(history.fetched_count, 3); - assert_eq!(history.decoded_count, 2); - assert_eq!(history.skipped_count, 1); - assert_eq!(history.count, 1); - assert_eq!(history.orders[0].id, first_order_id); + assert_eq!(event_list.fetched_count, 3); + assert_eq!(event_list.decoded_count, 2); + assert_eq!(event_list.skipped_count, 1); + assert_eq!(event_list.count, 1); + assert_eq!(event_list.orders[0].id, first_order_id); } #[test]