sdk

Radroots SDK and bindings
git clone https://radroots.dev/git/sdk.git
Log | Files | Refs | README

runtime_local.rs (4523B)


      1 use radroots_authority::RadrootsActorContext;
      2 use radroots_core::{
      3     RadrootsCoreCurrency, RadrootsCoreDecimal, RadrootsCoreMoney, RadrootsCoreQuantity,
      4     RadrootsCoreQuantityPrice, RadrootsCoreUnit,
      5 };
      6 use radroots_events::contract::RadrootsActorRole;
      7 use radroots_events::ids::{RadrootsDTag, RadrootsInventoryBinId};
      8 use radroots_nostr::prelude::RadrootsNostrKeys;
      9 use radroots_sdk::protocol::farm::RadrootsFarmRef;
     10 use radroots_sdk::protocol::listing::{
     11     RadrootsListing, RadrootsListingBin, RadrootsListingProduct,
     12 };
     13 use radroots_sdk::{
     14     ListingPreparePublishRequest, OrderStatusRequest, PushOutboxRequest, RadrootsSdk,
     15     RadrootsSdkError, RadrootsSdkLocalKeySigner, RadrootsSdkSignerProvider, RadrootsSdkTimestamp,
     16     SdkIdempotencyKey, SdkRelayTargetPolicy, SdkRelayUrlPolicy,
     17 };
     18 
     19 const RELAY: &str = "wss://relay.example.com";
     20 
     21 #[tokio::main]
     22 async fn main() -> Result<(), Box<dyn std::error::Error>> {
     23     let keys = RadrootsNostrKeys::generate();
     24     let seller = keys.public_key().to_hex();
     25     let signer = RadrootsSdkLocalKeySigner::new(keys)?;
     26     let sdk = RadrootsSdk::builder()
     27         .fixed_clock(RadrootsSdkTimestamp::from_unix_seconds(1_700_000_000))
     28         .signer_provider(RadrootsSdkSignerProvider::LocalKey(signer))
     29         .build()
     30         .await?;
     31     let actor = RadrootsActorContext::test(seller.as_str(), [RadrootsActorRole::Seller])?;
     32     let listing = sample_listing(seller.as_str());
     33     let prepare_request = ListingPreparePublishRequest::new(actor.clone(), listing);
     34     let target_relays = SdkRelayTargetPolicy::try_explicit([RELAY], SdkRelayUrlPolicy::Public)?;
     35     let idempotency_key = SdkIdempotencyKey::new("example-1")?;
     36 
     37     let prepared = sdk.listings().prepare_publish(prepare_request)?;
     38     let enqueue = sdk
     39         .listings()
     40         .enqueue_prepared_publish(
     41             &actor,
     42             prepared.clone(),
     43             target_relays,
     44             Some(idempotency_key),
     45         )
     46         .await?;
     47     let push = sdk
     48         .sync()
     49         .push_outbox(PushOutboxRequest::new().with_limit(1))
     50         .await;
     51     let order_status = sdk
     52         .orders()
     53         .status(OrderStatusRequest::parse("example-order-1")?)
     54         .await?;
     55 
     56     assert_eq!(
     57         prepared.public_listing_addr.as_str(),
     58         enqueue.public_listing_addr.as_str()
     59     );
     60     #[cfg(feature = "relay-runtime")]
     61     assert!(matches!(
     62         push,
     63         Err(RadrootsSdkError::ProductSyncRelaySetupFailure { .. })
     64     ));
     65     #[cfg(not(feature = "relay-runtime"))]
     66     assert!(matches!(
     67         push,
     68         Err(RadrootsSdkError::ProductSyncUnsupported { .. })
     69     ));
     70     assert!(!order_status.found);
     71     Ok(())
     72 }
     73 
     74 fn sample_listing(seller: &str) -> RadrootsListing {
     75     RadrootsListing {
     76         d_tag: RadrootsDTag::parse("AAAAAAAAAAAAAAAAAAAAAQ").expect("d tag"),
     77         published_at: None,
     78         farm: RadrootsFarmRef {
     79             pubkey: seller.to_owned(),
     80             d_tag: "AAAAAAAAAAAAAAAAAAAAAA".to_owned(),
     81         },
     82         product: RadrootsListingProduct {
     83             key: "coffee".to_owned(),
     84             title: "Coffee".to_owned(),
     85             category: "coffee".to_owned(),
     86             summary: Some("Single origin coffee".to_owned()),
     87             process: None,
     88             lot: None,
     89             location: None,
     90             profile: None,
     91             year: None,
     92         },
     93         primary_bin_id: RadrootsInventoryBinId::parse("bin-1").expect("bin id"),
     94         bins: vec![RadrootsListingBin {
     95             bin_id: RadrootsInventoryBinId::parse("bin-1").expect("bin id"),
     96             quantity: RadrootsCoreQuantity::new(
     97                 RadrootsCoreDecimal::from(1000u32),
     98                 RadrootsCoreUnit::MassG,
     99             ),
    100             price_per_canonical_unit: RadrootsCoreQuantityPrice {
    101                 amount: RadrootsCoreMoney::new(
    102                     RadrootsCoreDecimal::from(20u32),
    103                     RadrootsCoreCurrency::USD,
    104                 ),
    105                 quantity: RadrootsCoreQuantity::new(
    106                     RadrootsCoreDecimal::from(1u32),
    107                     RadrootsCoreUnit::MassG,
    108                 ),
    109             },
    110             display_amount: None,
    111             display_unit: None,
    112             display_label: None,
    113             display_price: None,
    114             display_price_unit: None,
    115         }],
    116         resource_area: None,
    117         plot: None,
    118         discounts: None,
    119         inventory_available: None,
    120         availability: None,
    121         delivery_method: None,
    122         location: None,
    123         images: None,
    124     }
    125 }