rhi

Coordinated trade for connected markets
git clone https://radroots.dev/git/rhi.git
Log | Files | Refs | README | LICENSE

commit 023f017adbd475cbd91a69621b878675bf3cc0c9
parent e0774fc9ca04320cec6840b35a5f0044d66a998a
Author: triesap <137732411+triesap@users.noreply.github.com>
Date:   Sun, 13 Apr 2025 00:37:23 +0000

Adds input marker matching to job request events subscriber, adds handlers for job request marker types.

Diffstat:
MCargo.lock | 25+++++++++++++++++++++++++
MCargo.toml | 1+
Msrc/events/job_request.rs | 81++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
Asrc/handlers/job_request_order.rs | 17+++++++++++++++++
Asrc/handlers/job_request_preview.rs | 17+++++++++++++++++
Asrc/handlers/job_request_quote.rs | 17+++++++++++++++++
Asrc/handlers/mod.rs | 3+++
Msrc/lib.rs | 1+
8 files changed, 155 insertions(+), 7 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -573,6 +573,7 @@ checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", + "futures-executor", "futures-io", "futures-sink", "futures-task", @@ -596,12 +597,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] name = "futures-io" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] name = "futures-sink" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -622,6 +645,7 @@ dependencies = [ "futures-channel", "futures-core", "futures-io", + "futures-macro", "futures-sink", "futures-task", "memchr", @@ -1419,6 +1443,7 @@ dependencies = [ "anyhow", "clap", "config", + "futures", "nostr", "nostr-sdk", "serde", diff --git a/Cargo.toml b/Cargo.toml @@ -10,6 +10,7 @@ description = "rhizome is a Nostr data vending machine (NIP-90)" anyhow = "1.0" clap = { version = "4", features = ["derive"] } config = "0.15" +futures = "0.3" nostr = { version = "0.40.0", features = ["nip04"] } nostr-sdk = "0.40.0" serde = "1.0" diff --git a/src/events/job_request.rs b/src/events/job_request.rs @@ -7,6 +7,9 @@ use nostr_sdk::RelayPoolNotification; use tracing::{info, warn}; use crate::KIND_JOB_REQUEST; +use crate::handlers::job_request_order::handle_job_request_order; +use crate::handlers::job_request_preview::handle_job_request_preview; +use crate::handlers::job_request_quote::handle_job_request_quote; use crate::utils::nostr::{ nostr_event_job_request_feedback, nostr_filter_kind, nostr_filter_new_events, nostr_tag_at_value, nostr_tag_first_value, nostr_tag_relays_parse, nostr_tag_slice, @@ -117,7 +120,7 @@ pub async fn subscriber(keys: Keys, relays: Vec<String>) -> Result<()> { if let Err(err) = handle_event(event.clone(), keys.clone(), client.clone()).await { - let _ = handle_error(err, event, keys, client).await; + let _ = handle_error(err, event, keys, client, None).await; } }); } @@ -134,8 +137,10 @@ async fn handle_error( event: Event, keys: Keys, client: Client, + job_req: Option<JobRequest>, ) -> Result<()> { - warn!("job_request handle_error {}", error); + warn!("job_request handle_error error {}", error); + warn!("job_request handle_error event {:?}", { event.clone() }); let builder = nostr_event_job_request_feedback(&event, error, "error", None)?; let event_id = client.send_event_builder(builder).await?; @@ -147,11 +152,46 @@ async fn handle_error( } async fn handle_event(event: Event, keys: Keys, client: Client) -> Result<(), JobRequestError> { - let job_request = parse_event(&event, &keys)?; - - info!("job_request handle_event job_request {:?}", { - job_request.clone() - }); + let job_req = parse_event(&event, &keys)?; + for input in &job_req.inputs { + let marker = input + .marker + .as_ref() + .ok_or_else(|| JobRequestError::InvalidInputMarker(job_req.id.to_string()))?; + + match marker { + JobRequestInputMarker::Order => { + process_job_request( + handle_job_request_order, + event.clone(), + job_req.clone(), + keys.clone(), + client.clone(), + ) + .await; + } + JobRequestInputMarker::Quote => { + process_job_request( + handle_job_request_quote, + event.clone(), + job_req.clone(), + keys.clone(), + client.clone(), + ) + .await; + } + JobRequestInputMarker::Preview => { + process_job_request( + handle_job_request_preview, + event.clone(), + job_req.clone(), + keys.clone(), + client.clone(), + ) + .await; + } + } + } Ok(()) } @@ -238,3 +278,30 @@ fn parse_event(event: &Event, keys: &Keys) -> Result<JobRequest, JobRequestError hashtags, }) } + +async fn process_job_request<F, Fut>( + handler: F, + event: Event, + job_req: JobRequest, + keys: Keys, + client: Client, +) where + F: FnOnce(Event, JobRequest, Keys, Client) -> Fut, + Fut: std::future::Future<Output = Result<(), JobRequestError>>, +{ + let error_event = event.clone(); + let error_job_req = job_req.clone(); + let error_keys = keys.clone(); + let error_client = client.clone(); + + if let Err(err) = handler(event, job_req.clone(), keys.clone(), client.clone()).await { + let _ = handle_error( + err, + error_event, + error_keys, + error_client, + Some(error_job_req), + ) + .await; + } +} diff --git a/src/handlers/job_request_order.rs b/src/handlers/job_request_order.rs @@ -0,0 +1,17 @@ +use anyhow::Result; +use nostr::{event::Event, key::Keys}; +use nostr_sdk::Client; +use tracing::info; + +use crate::events::job_request::{JobRequest, JobRequestError}; + +pub async fn handle_job_request_order( + event: Event, + job_req: JobRequest, + keys: Keys, + client: Client, +) -> Result<(), JobRequestError> { + info!("handle_job_request_order job_req: {:?}", job_req); + + Ok(()) +} diff --git a/src/handlers/job_request_preview.rs b/src/handlers/job_request_preview.rs @@ -0,0 +1,17 @@ +use anyhow::Result; +use nostr::{event::Event, key::Keys}; +use nostr_sdk::Client; +use tracing::info; + +use crate::events::job_request::{JobRequest, JobRequestError}; + +pub async fn handle_job_request_preview( + event: Event, + job_req: JobRequest, + keys: Keys, + client: Client, +) -> Result<(), JobRequestError> { + info!("handle_job_request_preview job_req: {:?}", job_req); + + Ok(()) +} diff --git a/src/handlers/job_request_quote.rs b/src/handlers/job_request_quote.rs @@ -0,0 +1,17 @@ +use anyhow::Result; +use nostr::{event::Event, key::Keys}; +use nostr_sdk::Client; +use tracing::info; + +use crate::events::job_request::{JobRequest, JobRequestError}; + +pub async fn handle_job_request_quote( + event: Event, + job_req: JobRequest, + keys: Keys, + client: Client, +) -> Result<(), JobRequestError> { + info!("handle_job_request_quote job_req: {:?}", job_req); + + Ok(()) +} diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs @@ -0,0 +1,3 @@ +pub mod job_request_order; +pub mod job_request_preview; +pub mod job_request_quote; diff --git a/src/lib.rs b/src/lib.rs @@ -1,5 +1,6 @@ pub mod config; pub mod events; +pub mod handlers; pub mod keys; pub mod utils;