lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README | LICENSE

commit 576d75e16b34e7d94014684732c9c276a32c1d7e
parent eec2badb91364f5d4735d0b375aa0ce51c5f23d0
Author: triesap <tyson@radroots.org>
Date:   Sun, 29 Mar 2026 18:02:39 +0000

events: split trade service and public lanes

Diffstat:
Mcrates/events-codec/src/trade/decode.rs | 14+++++++-------
Mcrates/events/src/kinds.rs | 230++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------
Mcrates/events/src/trade.rs | 99+++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------
3 files changed, 259 insertions(+), 84 deletions(-)

diff --git a/crates/events-codec/src/trade/decode.rs b/crates/events-codec/src/trade/decode.rs @@ -4,7 +4,7 @@ use alloc::{borrow::ToOwned, format, string::String, vec::Vec}; #[cfg(feature = "serde_json")] use radroots_events::{ RadrootsNostrEvent, - kinds::{KIND_PROFILE, is_trade_listing_kind}, + kinds::{KIND_PROFILE, is_trade_kind}, tags::TAG_D, trade::{RadrootsTradeEnvelope, RadrootsTradeEnvelopeError, RadrootsTradeMessageType}, }; @@ -35,18 +35,18 @@ pub enum RadrootsTradeEnvelopeParseError { impl core::fmt::Display for RadrootsTradeEnvelopeParseError { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { match self { - Self::InvalidKind(kind) => write!(f, "invalid trade listing event kind: {kind}"), - Self::InvalidJson => write!(f, "invalid trade listing envelope json"), + Self::InvalidKind(kind) => write!(f, "invalid trade event kind: {kind}"), + Self::InvalidJson => write!(f, "invalid trade envelope json"), Self::InvalidEnvelope(error) => write!(f, "{error}"), Self::MessageTypeKindMismatch { event_kind, message_type, } => write!( f, - "trade listing envelope type {message_type:?} does not match event kind {event_kind}" + "trade envelope type {message_type:?} does not match event kind {event_kind}" ), - Self::MissingTag(tag) => write!(f, "missing required trade listing tag: {tag}"), - Self::InvalidTag(tag) => write!(f, "invalid trade listing tag: {tag}"), + Self::MissingTag(tag) => write!(f, "missing required trade tag: {tag}"), + Self::InvalidTag(tag) => write!(f, "invalid trade tag: {tag}"), Self::ListingAddrTagMismatch => { write!(f, "trade listing address tag does not match envelope") } @@ -153,7 +153,7 @@ fn required_tag_value<'a>( pub fn trade_envelope_from_event<T: DeserializeOwned>( event: &RadrootsNostrEvent, ) -> Result<RadrootsTradeEnvelope<T>, RadrootsTradeEnvelopeParseError> { - if !is_trade_listing_kind(event.kind) { + if !is_trade_kind(event.kind) { return Err(RadrootsTradeEnvelopeParseError::InvalidKind(event.kind)); } let envelope = serde_json::from_str::<RadrootsTradeEnvelope<T>>(&event.content) diff --git a/crates/events/src/kinds.rs b/crates/events/src/kinds.rs @@ -52,38 +52,75 @@ pub const KIND_APPLICATION_HANDLER: u32 = 31990; pub const KIND_TRADE_LISTING_VALIDATE_REQ: u32 = 5321; pub const KIND_TRADE_LISTING_VALIDATE_RES: u32 = 6321; -pub const KIND_TRADE_LISTING_ORDER_REQ: u32 = 5322; -pub const KIND_TRADE_LISTING_ORDER_RES: u32 = 6322; -pub const KIND_TRADE_LISTING_ORDER_REVISION_REQ: u32 = 5323; -pub const KIND_TRADE_LISTING_ORDER_REVISION_RES: u32 = 6323; -pub const KIND_TRADE_LISTING_QUESTION_REQ: u32 = 5324; -pub const KIND_TRADE_LISTING_ANSWER_RES: u32 = 6324; -pub const KIND_TRADE_LISTING_DISCOUNT_REQ: u32 = 5325; -pub const KIND_TRADE_LISTING_DISCOUNT_OFFER_RES: u32 = 6325; -pub const KIND_TRADE_LISTING_DISCOUNT_ACCEPT_REQ: u32 = 5326; -pub const KIND_TRADE_LISTING_DISCOUNT_DECLINE_REQ: u32 = 5327; -pub const KIND_TRADE_LISTING_CANCEL_REQ: u32 = 5328; -pub const KIND_TRADE_LISTING_FULFILLMENT_UPDATE_REQ: u32 = 5329; -pub const KIND_TRADE_LISTING_RECEIPT_REQ: u32 = 5330; - -pub const TRADE_LISTING_KINDS: [u32; 15] = [ +pub const KIND_TRADE_ORDER_REQUEST: u32 = 3422; +pub const KIND_TRADE_ORDER_RESPONSE: u32 = 3423; +pub const KIND_TRADE_ORDER_REVISION: u32 = 3424; +pub const KIND_TRADE_ORDER_REVISION_RESPONSE: u32 = 3425; +pub const KIND_TRADE_QUESTION: u32 = 3426; +pub const KIND_TRADE_ANSWER: u32 = 3427; +pub const KIND_TRADE_DISCOUNT_REQUEST: u32 = 3428; +pub const KIND_TRADE_DISCOUNT_OFFER: u32 = 3429; +pub const KIND_TRADE_DISCOUNT_ACCEPT: u32 = 3430; +pub const KIND_TRADE_DISCOUNT_DECLINE: u32 = 3431; +pub const KIND_TRADE_CANCEL: u32 = 3432; +pub const KIND_TRADE_FULFILLMENT_UPDATE: u32 = 3433; +pub const KIND_TRADE_RECEIPT: u32 = 3434; + +pub const KIND_TRADE_LISTING_ORDER_REQ: u32 = KIND_TRADE_ORDER_REQUEST; +pub const KIND_TRADE_LISTING_ORDER_RES: u32 = KIND_TRADE_ORDER_RESPONSE; +pub const KIND_TRADE_LISTING_ORDER_REVISION_REQ: u32 = KIND_TRADE_ORDER_REVISION; +pub const KIND_TRADE_LISTING_ORDER_REVISION_RES: u32 = KIND_TRADE_ORDER_REVISION_RESPONSE; +pub const KIND_TRADE_LISTING_QUESTION_REQ: u32 = KIND_TRADE_QUESTION; +pub const KIND_TRADE_LISTING_ANSWER_RES: u32 = KIND_TRADE_ANSWER; +pub const KIND_TRADE_LISTING_DISCOUNT_REQ: u32 = KIND_TRADE_DISCOUNT_REQUEST; +pub const KIND_TRADE_LISTING_DISCOUNT_OFFER_RES: u32 = KIND_TRADE_DISCOUNT_OFFER; +pub const KIND_TRADE_LISTING_DISCOUNT_ACCEPT_REQ: u32 = KIND_TRADE_DISCOUNT_ACCEPT; +pub const KIND_TRADE_LISTING_DISCOUNT_DECLINE_REQ: u32 = KIND_TRADE_DISCOUNT_DECLINE; +pub const KIND_TRADE_LISTING_CANCEL_REQ: u32 = KIND_TRADE_CANCEL; +pub const KIND_TRADE_LISTING_FULFILLMENT_UPDATE_REQ: u32 = KIND_TRADE_FULFILLMENT_UPDATE; +pub const KIND_TRADE_LISTING_RECEIPT_REQ: u32 = KIND_TRADE_RECEIPT; + +pub const TRADE_SERVICE_KINDS: [u32; 2] = [ KIND_TRADE_LISTING_VALIDATE_REQ, KIND_TRADE_LISTING_VALIDATE_RES, - KIND_TRADE_LISTING_ORDER_REQ, - KIND_TRADE_LISTING_ORDER_RES, - KIND_TRADE_LISTING_ORDER_REVISION_REQ, - KIND_TRADE_LISTING_ORDER_REVISION_RES, - KIND_TRADE_LISTING_QUESTION_REQ, - KIND_TRADE_LISTING_ANSWER_RES, - KIND_TRADE_LISTING_DISCOUNT_REQ, - KIND_TRADE_LISTING_DISCOUNT_OFFER_RES, - KIND_TRADE_LISTING_DISCOUNT_ACCEPT_REQ, - KIND_TRADE_LISTING_DISCOUNT_DECLINE_REQ, - KIND_TRADE_LISTING_CANCEL_REQ, - KIND_TRADE_LISTING_FULFILLMENT_UPDATE_REQ, - KIND_TRADE_LISTING_RECEIPT_REQ, ]; +pub const TRADE_PUBLIC_KINDS: [u32; 13] = [ + KIND_TRADE_ORDER_REQUEST, + KIND_TRADE_ORDER_RESPONSE, + KIND_TRADE_ORDER_REVISION, + KIND_TRADE_ORDER_REVISION_RESPONSE, + KIND_TRADE_QUESTION, + KIND_TRADE_ANSWER, + KIND_TRADE_DISCOUNT_REQUEST, + KIND_TRADE_DISCOUNT_OFFER, + KIND_TRADE_DISCOUNT_ACCEPT, + KIND_TRADE_DISCOUNT_DECLINE, + KIND_TRADE_CANCEL, + KIND_TRADE_FULFILLMENT_UPDATE, + KIND_TRADE_RECEIPT, +]; + +pub const TRADE_KINDS: [u32; 15] = [ + KIND_TRADE_LISTING_VALIDATE_REQ, + KIND_TRADE_LISTING_VALIDATE_RES, + KIND_TRADE_ORDER_REQUEST, + KIND_TRADE_ORDER_RESPONSE, + KIND_TRADE_ORDER_REVISION, + KIND_TRADE_ORDER_REVISION_RESPONSE, + KIND_TRADE_QUESTION, + KIND_TRADE_ANSWER, + KIND_TRADE_DISCOUNT_REQUEST, + KIND_TRADE_DISCOUNT_OFFER, + KIND_TRADE_DISCOUNT_ACCEPT, + KIND_TRADE_DISCOUNT_DECLINE, + KIND_TRADE_CANCEL, + KIND_TRADE_FULFILLMENT_UPDATE, + KIND_TRADE_RECEIPT, +]; + +pub const TRADE_LISTING_KINDS: [u32; 15] = TRADE_KINDS; + pub const KIND_JOB_REQUEST_MIN: u32 = 5000; pub const KIND_JOB_REQUEST_MAX: u32 = 5999; pub const KIND_JOB_RESULT_MIN: u32 = 6000; @@ -91,19 +128,59 @@ pub const KIND_JOB_RESULT_MAX: u32 = 6999; pub const KIND_JOB_FEEDBACK: u32 = 7000; #[inline] +pub const fn is_trade_service_request_kind(kind: u32) -> bool { + kind == KIND_TRADE_LISTING_VALIDATE_REQ +} + +#[inline] +pub const fn is_trade_service_result_kind(kind: u32) -> bool { + kind == KIND_TRADE_LISTING_VALIDATE_RES +} + +#[inline] +pub const fn is_trade_service_kind(kind: u32) -> bool { + is_trade_service_request_kind(kind) || is_trade_service_result_kind(kind) +} + +#[inline] +pub const fn is_trade_public_kind(kind: u32) -> bool { + matches!( + kind, + KIND_TRADE_ORDER_REQUEST + | KIND_TRADE_ORDER_RESPONSE + | KIND_TRADE_ORDER_REVISION + | KIND_TRADE_ORDER_REVISION_RESPONSE + | KIND_TRADE_QUESTION + | KIND_TRADE_ANSWER + | KIND_TRADE_DISCOUNT_REQUEST + | KIND_TRADE_DISCOUNT_OFFER + | KIND_TRADE_DISCOUNT_ACCEPT + | KIND_TRADE_DISCOUNT_DECLINE + | KIND_TRADE_CANCEL + | KIND_TRADE_FULFILLMENT_UPDATE + | KIND_TRADE_RECEIPT + ) +} + +#[inline] +pub const fn is_trade_kind(kind: u32) -> bool { + is_trade_service_kind(kind) || is_trade_public_kind(kind) +} + +#[inline] pub const fn is_trade_listing_request_kind(kind: u32) -> bool { matches!( kind, KIND_TRADE_LISTING_VALIDATE_REQ - | KIND_TRADE_LISTING_ORDER_REQ - | KIND_TRADE_LISTING_ORDER_REVISION_REQ - | KIND_TRADE_LISTING_QUESTION_REQ - | KIND_TRADE_LISTING_DISCOUNT_REQ - | KIND_TRADE_LISTING_DISCOUNT_ACCEPT_REQ - | KIND_TRADE_LISTING_DISCOUNT_DECLINE_REQ - | KIND_TRADE_LISTING_CANCEL_REQ - | KIND_TRADE_LISTING_FULFILLMENT_UPDATE_REQ - | KIND_TRADE_LISTING_RECEIPT_REQ + | KIND_TRADE_ORDER_REQUEST + | KIND_TRADE_ORDER_REVISION + | KIND_TRADE_QUESTION + | KIND_TRADE_DISCOUNT_REQUEST + | KIND_TRADE_DISCOUNT_ACCEPT + | KIND_TRADE_DISCOUNT_DECLINE + | KIND_TRADE_CANCEL + | KIND_TRADE_FULFILLMENT_UPDATE + | KIND_TRADE_RECEIPT ) } @@ -112,26 +189,42 @@ pub const fn is_trade_listing_result_kind(kind: u32) -> bool { matches!( kind, KIND_TRADE_LISTING_VALIDATE_RES - | KIND_TRADE_LISTING_ORDER_RES - | KIND_TRADE_LISTING_ORDER_REVISION_RES - | KIND_TRADE_LISTING_ANSWER_RES - | KIND_TRADE_LISTING_DISCOUNT_OFFER_RES + | KIND_TRADE_ORDER_RESPONSE + | KIND_TRADE_ORDER_REVISION_RESPONSE + | KIND_TRADE_ANSWER + | KIND_TRADE_DISCOUNT_OFFER ) } #[inline] pub const fn is_trade_listing_kind(kind: u32) -> bool { - is_trade_listing_request_kind(kind) || is_trade_listing_result_kind(kind) + is_trade_kind(kind) +} + +#[inline] +pub const fn trade_service_result_kind_for_request(kind: u32) -> Option<u32> { + match kind { + KIND_TRADE_LISTING_VALIDATE_REQ => Some(KIND_TRADE_LISTING_VALIDATE_RES), + _ => None, + } +} + +#[inline] +pub const fn trade_service_request_kind_for_result(kind: u32) -> Option<u32> { + match kind { + KIND_TRADE_LISTING_VALIDATE_RES => Some(KIND_TRADE_LISTING_VALIDATE_REQ), + _ => None, + } } #[inline] pub const fn trade_listing_result_kind_for_request(kind: u32) -> Option<u32> { match kind { KIND_TRADE_LISTING_VALIDATE_REQ => Some(KIND_TRADE_LISTING_VALIDATE_RES), - KIND_TRADE_LISTING_ORDER_REQ => Some(KIND_TRADE_LISTING_ORDER_RES), - KIND_TRADE_LISTING_ORDER_REVISION_REQ => Some(KIND_TRADE_LISTING_ORDER_REVISION_RES), - KIND_TRADE_LISTING_QUESTION_REQ => Some(KIND_TRADE_LISTING_ANSWER_RES), - KIND_TRADE_LISTING_DISCOUNT_REQ => Some(KIND_TRADE_LISTING_DISCOUNT_OFFER_RES), + KIND_TRADE_ORDER_REQUEST => Some(KIND_TRADE_ORDER_RESPONSE), + KIND_TRADE_ORDER_REVISION => Some(KIND_TRADE_ORDER_REVISION_RESPONSE), + KIND_TRADE_QUESTION => Some(KIND_TRADE_ANSWER), + KIND_TRADE_DISCOUNT_REQUEST => Some(KIND_TRADE_DISCOUNT_OFFER), _ => None, } } @@ -140,10 +233,10 @@ pub const fn trade_listing_result_kind_for_request(kind: u32) -> Option<u32> { pub const fn trade_listing_request_kind_for_result(kind: u32) -> Option<u32> { match kind { KIND_TRADE_LISTING_VALIDATE_RES => Some(KIND_TRADE_LISTING_VALIDATE_REQ), - KIND_TRADE_LISTING_ORDER_RES => Some(KIND_TRADE_LISTING_ORDER_REQ), - KIND_TRADE_LISTING_ORDER_REVISION_RES => Some(KIND_TRADE_LISTING_ORDER_REVISION_REQ), - KIND_TRADE_LISTING_ANSWER_RES => Some(KIND_TRADE_LISTING_QUESTION_REQ), - KIND_TRADE_LISTING_DISCOUNT_OFFER_RES => Some(KIND_TRADE_LISTING_DISCOUNT_REQ), + KIND_TRADE_ORDER_RESPONSE => Some(KIND_TRADE_ORDER_REQUEST), + KIND_TRADE_ORDER_REVISION_RESPONSE => Some(KIND_TRADE_ORDER_REVISION), + KIND_TRADE_ANSWER => Some(KIND_TRADE_QUESTION), + KIND_TRADE_DISCOUNT_OFFER => Some(KIND_TRADE_DISCOUNT_REQUEST), _ => None, } } @@ -315,6 +408,25 @@ mod kinds_constants_tests { "KIND_TRADE_LISTING_VALIDATE_RES", KIND_TRADE_LISTING_VALIDATE_RES, ), + ("KIND_TRADE_ORDER_REQUEST", KIND_TRADE_ORDER_REQUEST), + ("KIND_TRADE_ORDER_RESPONSE", KIND_TRADE_ORDER_RESPONSE), + ("KIND_TRADE_ORDER_REVISION", KIND_TRADE_ORDER_REVISION), + ( + "KIND_TRADE_ORDER_REVISION_RESPONSE", + KIND_TRADE_ORDER_REVISION_RESPONSE, + ), + ("KIND_TRADE_QUESTION", KIND_TRADE_QUESTION), + ("KIND_TRADE_ANSWER", KIND_TRADE_ANSWER), + ("KIND_TRADE_DISCOUNT_REQUEST", KIND_TRADE_DISCOUNT_REQUEST), + ("KIND_TRADE_DISCOUNT_OFFER", KIND_TRADE_DISCOUNT_OFFER), + ("KIND_TRADE_DISCOUNT_ACCEPT", KIND_TRADE_DISCOUNT_ACCEPT), + ("KIND_TRADE_DISCOUNT_DECLINE", KIND_TRADE_DISCOUNT_DECLINE), + ("KIND_TRADE_CANCEL", KIND_TRADE_CANCEL), + ( + "KIND_TRADE_FULFILLMENT_UPDATE", + KIND_TRADE_FULFILLMENT_UPDATE, + ), + ("KIND_TRADE_RECEIPT", KIND_TRADE_RECEIPT), ("KIND_TRADE_LISTING_ORDER_REQ", KIND_TRADE_LISTING_ORDER_REQ), ("KIND_TRADE_LISTING_ORDER_RES", KIND_TRADE_LISTING_ORDER_RES), ( @@ -446,11 +558,29 @@ mod kinds_constants_tests { #[test] fn classifies_trade_listing_kinds() { + assert!(is_trade_service_request_kind( + KIND_TRADE_LISTING_VALIDATE_REQ + )); + assert!(is_trade_service_result_kind( + KIND_TRADE_LISTING_VALIDATE_RES + )); + assert!(is_trade_service_kind(KIND_TRADE_LISTING_VALIDATE_REQ)); + assert!(is_trade_public_kind(KIND_TRADE_ORDER_REQUEST)); + assert!(is_trade_public_kind(KIND_TRADE_ORDER_RESPONSE)); + assert!(is_trade_kind(KIND_TRADE_ORDER_REQUEST)); assert!(is_trade_listing_request_kind(KIND_TRADE_LISTING_ORDER_REQ)); assert!(is_trade_listing_result_kind(KIND_TRADE_LISTING_ORDER_RES)); assert!(is_trade_listing_kind(KIND_TRADE_LISTING_RECEIPT_REQ)); assert!(!is_trade_listing_kind(KIND_LISTING)); assert_eq!( + trade_service_result_kind_for_request(KIND_TRADE_LISTING_VALIDATE_REQ), + Some(KIND_TRADE_LISTING_VALIDATE_RES) + ); + assert_eq!( + trade_service_request_kind_for_result(KIND_TRADE_LISTING_VALIDATE_RES), + Some(KIND_TRADE_LISTING_VALIDATE_REQ) + ); + assert_eq!( trade_listing_result_kind_for_request(KIND_TRADE_LISTING_ORDER_REQ), Some(KIND_TRADE_LISTING_ORDER_RES) ); diff --git a/crates/events/src/trade.rs b/crates/events/src/trade.rs @@ -365,6 +365,16 @@ pub enum RadrootsTradeDomain { #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))] #[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum RadrootsTradeTransportLane { + Service, + Public, +} + +#[cfg_attr(feature = "ts-rs", derive(TS))] +#[cfg_attr(feature = "ts-rs", ts(export, export_to = "types.ts"))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))] +#[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum RadrootsTradeMessageType { ListingValidateRequest, ListingValidateResult, @@ -390,19 +400,19 @@ impl RadrootsTradeMessageType { match kind { KIND_TRADE_LISTING_VALIDATE_REQ => Some(Self::ListingValidateRequest), KIND_TRADE_LISTING_VALIDATE_RES => Some(Self::ListingValidateResult), - KIND_TRADE_LISTING_ORDER_REQ => Some(Self::OrderRequest), - KIND_TRADE_LISTING_ORDER_RES => Some(Self::OrderResponse), - KIND_TRADE_LISTING_ORDER_REVISION_REQ => Some(Self::OrderRevision), - KIND_TRADE_LISTING_ORDER_REVISION_RES => None, - KIND_TRADE_LISTING_QUESTION_REQ => Some(Self::Question), - KIND_TRADE_LISTING_ANSWER_RES => Some(Self::Answer), - KIND_TRADE_LISTING_DISCOUNT_REQ => Some(Self::DiscountRequest), - KIND_TRADE_LISTING_DISCOUNT_OFFER_RES => Some(Self::DiscountOffer), - KIND_TRADE_LISTING_DISCOUNT_ACCEPT_REQ => Some(Self::DiscountAccept), - KIND_TRADE_LISTING_DISCOUNT_DECLINE_REQ => Some(Self::DiscountDecline), - KIND_TRADE_LISTING_CANCEL_REQ => Some(Self::Cancel), - KIND_TRADE_LISTING_FULFILLMENT_UPDATE_REQ => Some(Self::FulfillmentUpdate), - KIND_TRADE_LISTING_RECEIPT_REQ => Some(Self::Receipt), + KIND_TRADE_ORDER_REQUEST => Some(Self::OrderRequest), + KIND_TRADE_ORDER_RESPONSE => Some(Self::OrderResponse), + KIND_TRADE_ORDER_REVISION => Some(Self::OrderRevision), + KIND_TRADE_ORDER_REVISION_RESPONSE => None, + KIND_TRADE_QUESTION => Some(Self::Question), + KIND_TRADE_ANSWER => Some(Self::Answer), + KIND_TRADE_DISCOUNT_REQUEST => Some(Self::DiscountRequest), + KIND_TRADE_DISCOUNT_OFFER => Some(Self::DiscountOffer), + KIND_TRADE_DISCOUNT_ACCEPT => Some(Self::DiscountAccept), + KIND_TRADE_DISCOUNT_DECLINE => Some(Self::DiscountDecline), + KIND_TRADE_CANCEL => Some(Self::Cancel), + KIND_TRADE_FULFILLMENT_UPDATE => Some(Self::FulfillmentUpdate), + KIND_TRADE_RECEIPT => Some(Self::Receipt), _ => None, } } @@ -412,24 +422,57 @@ impl RadrootsTradeMessageType { match self { Self::ListingValidateRequest => KIND_TRADE_LISTING_VALIDATE_REQ, Self::ListingValidateResult => KIND_TRADE_LISTING_VALIDATE_RES, - Self::OrderRequest => KIND_TRADE_LISTING_ORDER_REQ, - Self::OrderResponse => KIND_TRADE_LISTING_ORDER_RES, - Self::OrderRevision => KIND_TRADE_LISTING_ORDER_REVISION_REQ, - Self::OrderRevisionAccept => KIND_TRADE_LISTING_ORDER_REVISION_RES, - Self::OrderRevisionDecline => KIND_TRADE_LISTING_ORDER_REVISION_RES, - Self::Question => KIND_TRADE_LISTING_QUESTION_REQ, - Self::Answer => KIND_TRADE_LISTING_ANSWER_RES, - Self::DiscountRequest => KIND_TRADE_LISTING_DISCOUNT_REQ, - Self::DiscountOffer => KIND_TRADE_LISTING_DISCOUNT_OFFER_RES, - Self::DiscountAccept => KIND_TRADE_LISTING_DISCOUNT_ACCEPT_REQ, - Self::DiscountDecline => KIND_TRADE_LISTING_DISCOUNT_DECLINE_REQ, - Self::Cancel => KIND_TRADE_LISTING_CANCEL_REQ, - Self::FulfillmentUpdate => KIND_TRADE_LISTING_FULFILLMENT_UPDATE_REQ, - Self::Receipt => KIND_TRADE_LISTING_RECEIPT_REQ, + Self::OrderRequest => KIND_TRADE_ORDER_REQUEST, + Self::OrderResponse => KIND_TRADE_ORDER_RESPONSE, + Self::OrderRevision => KIND_TRADE_ORDER_REVISION, + Self::OrderRevisionAccept => KIND_TRADE_ORDER_REVISION_RESPONSE, + Self::OrderRevisionDecline => KIND_TRADE_ORDER_REVISION_RESPONSE, + Self::Question => KIND_TRADE_QUESTION, + Self::Answer => KIND_TRADE_ANSWER, + Self::DiscountRequest => KIND_TRADE_DISCOUNT_REQUEST, + Self::DiscountOffer => KIND_TRADE_DISCOUNT_OFFER, + Self::DiscountAccept => KIND_TRADE_DISCOUNT_ACCEPT, + Self::DiscountDecline => KIND_TRADE_DISCOUNT_DECLINE, + Self::Cancel => KIND_TRADE_CANCEL, + Self::FulfillmentUpdate => KIND_TRADE_FULFILLMENT_UPDATE, + Self::Receipt => KIND_TRADE_RECEIPT, } } #[inline] + pub const fn lane(self) -> RadrootsTradeTransportLane { + match self { + Self::ListingValidateRequest | Self::ListingValidateResult => { + RadrootsTradeTransportLane::Service + } + Self::OrderRequest + | Self::OrderResponse + | Self::OrderRevision + | Self::OrderRevisionAccept + | Self::OrderRevisionDecline + | Self::Question + | Self::Answer + | Self::DiscountRequest + | Self::DiscountOffer + | Self::DiscountAccept + | Self::DiscountDecline + | Self::Cancel + | Self::FulfillmentUpdate + | Self::Receipt => RadrootsTradeTransportLane::Public, + } + } + + #[inline] + pub const fn is_service(self) -> bool { + matches!(self.lane(), RadrootsTradeTransportLane::Service) + } + + #[inline] + pub const fn is_public(self) -> bool { + matches!(self.lane(), RadrootsTradeTransportLane::Public) + } + + #[inline] pub const fn requires_order_id(self) -> bool { !matches!( self, @@ -579,6 +622,8 @@ mod tests { RadrootsTradeMessageType::from_kind(KIND_TRADE_LISTING_ORDER_RES), Some(RadrootsTradeMessageType::OrderResponse) ); + assert!(RadrootsTradeMessageType::ListingValidateRequest.is_service()); + assert!(RadrootsTradeMessageType::OrderRequest.is_public()); assert!(RadrootsTradeMessageType::OrderRequest.is_request()); assert!(RadrootsTradeMessageType::OrderResponse.is_result()); }