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:
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());
}