lib

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

commit 1e7f3d77a971cd4b77dad63d0488548d5f248494
parent c83fff8939521ded3f013ba3887433e31ce436cc
Author: triesap <tyson@radroots.org>
Date:   Mon, 13 Apr 2026 02:45:15 +0000

sdk: type listing draft publish surface

Diffstat:
Mcrates/sdk/src/client.rs | 9+++++----
Mcrates/sdk/src/listing.rs | 21+++++++++++++++++++--
Mcrates/sdk/tests/client.rs | 8++++----
Mcrates/sdk/tests/facade.rs | 6+++---
Mcrates/sdk/tests/radrootsd.rs | 9+++++++--
5 files changed, 38 insertions(+), 15 deletions(-)

diff --git a/crates/sdk/src/client.rs b/crates/sdk/src/client.rs @@ -370,7 +370,7 @@ impl<'a> ListingClient<'a> { pub fn build_draft( &self, listing_value: &listing::RadrootsListing, - ) -> Result<WireEventParts, listing::EventEncodeError> { + ) -> Result<listing::RadrootsListingDraft, listing::EventEncodeError> { listing::build_draft(listing_value) } @@ -393,7 +393,8 @@ impl<'a> ListingClient<'a> { listing_value: &listing::RadrootsListing, ) -> Result<SdkPublishReceipt, SdkPublishError> { let parts = listing::build_draft(listing_value) - .map_err(|err| SdkPublishError::Encode(err.to_string()))?; + .map_err(|err| SdkPublishError::Encode(err.to_string()))? + .into_wire_parts(); self.client .publish_parts_via_relay_with_identity(identity, parts, "listing.publish_with_identity") .await @@ -407,12 +408,12 @@ impl<'a> ListingClient<'a> { pub async fn publish_draft_with_identity( &self, identity: &RadrootsIdentity, - draft: WireEventParts, + draft: listing::RadrootsListingDraft, ) -> Result<SdkPublishReceipt, SdkPublishError> { self.client .publish_parts_via_relay_with_identity( identity, - draft, + draft.into_wire_parts(), "listing.publish_draft_with_identity", ) .await diff --git a/crates/sdk/src/listing.rs b/crates/sdk/src/listing.rs @@ -7,13 +7,30 @@ pub use radroots_trade::listing::validation::RadrootsTradeListing as TradeListin use crate::{NostrTags, RadrootsNostrEvent, WireEventParts}; +#[derive(Debug, Clone)] +pub struct RadrootsListingDraft { + parts: WireEventParts, +} + +impl RadrootsListingDraft { + pub fn as_wire_parts(&self) -> &WireEventParts { + &self.parts + } + + pub fn into_wire_parts(self) -> WireEventParts { + self.parts + } +} + pub fn build_tags(listing: &RadrootsListing) -> Result<NostrTags, EventEncodeError> { radroots_events_codec::listing::encode::listing_build_tags(listing) } #[cfg(feature = "serde_json")] -pub fn build_draft(listing: &RadrootsListing) -> Result<WireEventParts, EventEncodeError> { - radroots_events_codec::listing::encode::to_wire_parts(listing) +pub fn build_draft(listing: &RadrootsListing) -> Result<RadrootsListingDraft, EventEncodeError> { + Ok(RadrootsListingDraft { + parts: radroots_events_codec::listing::encode::to_wire_parts(listing)?, + }) } #[cfg(feature = "serde_json")] diff --git a/crates/sdk/tests/client.rs b/crates/sdk/tests/client.rs @@ -157,15 +157,15 @@ fn listing_and_trade_clients_wrap_existing_sdk_facades() { .listing() .build_draft(&listing_value) .expect("listing draft"); - assert_eq!(draft.kind, KIND_LISTING); + assert_eq!(draft.as_wire_parts().kind, KIND_LISTING); let event = RadrootsNostrEvent { id: "listing-1".into(), author: "seller".into(), created_at: 1, - kind: draft.kind, - tags: draft.tags, - content: draft.content, + kind: draft.as_wire_parts().kind, + tags: draft.as_wire_parts().tags.clone(), + content: draft.as_wire_parts().content.clone(), sig: String::new(), }; let parsed = client diff --git a/crates/sdk/tests/facade.rs b/crates/sdk/tests/facade.rs @@ -113,9 +113,9 @@ fn listing_event(listing_value: &RadrootsListing) -> RadrootsNostrEvent { id: "event-1".into(), author: "seller".into(), created_at: 1, - kind: parts.kind, - tags: parts.tags, - content: parts.content, + kind: parts.as_wire_parts().kind, + tags: parts.as_wire_parts().tags.clone(), + content: parts.as_wire_parts().content.clone(), sig: String::new(), } } diff --git a/crates/sdk/tests/radrootsd.rs b/crates/sdk/tests/radrootsd.rs @@ -12,7 +12,7 @@ use radroots_sdk::listing::{ use radroots_sdk::{ RadrootsNostrEvent, RadrootsSdkClient, RadrootsSdkConfig, RadrootsdAuth, RadrootsdConfig, SdkEnvironment, SdkPublishError, SdkRadrootsdListingPublishRequest, SdkTransportMode, - SdkTransportReceipt, SignerConfig, WireEventParts, + SdkTransportReceipt, SignerConfig, }; use serde_json::{Value, json}; use tokio::io::{AsyncReadExt, AsyncWriteExt}; @@ -238,7 +238,12 @@ fn sample_listing() -> RadrootsListing { } } -fn sdk_event(author: &str, created_at: u32, parts: WireEventParts) -> RadrootsNostrEvent { +fn sdk_event( + author: &str, + created_at: u32, + draft: radroots_sdk::listing::RadrootsListingDraft, +) -> RadrootsNostrEvent { + let parts = draft.into_wire_parts(); RadrootsNostrEvent { id: "event-1".to_owned(), author: author.to_owned(),