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:
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;