commit 270964c32ea6cf9ba330d77e2714a0caaf2c3da2
parent beb99b13e992af5593e0255a7229a1a0c09a498b
Author: triesap <tyson@radroots.org>
Date: Wed, 24 Jun 2026 07:38:26 +0000
dto: render events bindings from registry
- Switch events TypeScript type output to the dto registry renderer.
- Render external data enums and path-aware integer policy errors in xtask.
- Preserve core imports and SDK-local tuple wrapper declarations for events output.
- Remove the stale hand-authored events type module while keeping constants and kinds for RCLD-05.
Diffstat:
7 files changed, 212 insertions(+), 1344 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
@@ -500,6 +500,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b"
[[package]]
+name = "dto_bindgen"
+version = "0.1.0"
+source = "git+https://github.com/triesap/dto_bindgen?rev=96ed6c691aacab31860828d25da2e0167b13d92c#96ed6c691aacab31860828d25da2e0167b13d92c"
+dependencies = [
+ "dto_bindgen_backend_python",
+ "dto_bindgen_backend_ts",
+ "dto_bindgen_core",
+ "dto_bindgen_macros",
+ "sha2",
+]
+
+[[package]]
+name = "dto_bindgen_backend_python"
+version = "0.1.0"
+source = "git+https://github.com/triesap/dto_bindgen?rev=96ed6c691aacab31860828d25da2e0167b13d92c#96ed6c691aacab31860828d25da2e0167b13d92c"
+dependencies = [
+ "dto_bindgen_core",
+]
+
+[[package]]
+name = "dto_bindgen_backend_ts"
+version = "0.1.0"
+source = "git+https://github.com/triesap/dto_bindgen?rev=96ed6c691aacab31860828d25da2e0167b13d92c#96ed6c691aacab31860828d25da2e0167b13d92c"
+dependencies = [
+ "dto_bindgen_core",
+]
+
+[[package]]
name = "dto_bindgen_core"
version = "0.1.0"
source = "git+https://github.com/triesap/dto_bindgen?rev=96ed6c691aacab31860828d25da2e0167b13d92c#96ed6c691aacab31860828d25da2e0167b13d92c"
@@ -514,6 +542,16 @@ dependencies = [
]
[[package]]
+name = "dto_bindgen_macros"
+version = "0.1.0"
+source = "git+https://github.com/triesap/dto_bindgen?rev=96ed6c691aacab31860828d25da2e0167b13d92c#96ed6c691aacab31860828d25da2e0167b13d92c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
name = "either"
version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1703,6 +1741,7 @@ dependencies = [
name = "radroots_events"
version = "0.1.0-alpha.2"
dependencies = [
+ "dto_bindgen",
"dto_bindgen_core",
"hex",
"radroots_core",
diff --git a/crates/events_bindings/src/lib.rs b/crates/events_bindings/src/lib.rs
@@ -2,19 +2,11 @@ pub use radroots_events as upstream;
mod model;
-pub use model::{constants_module, kinds_module, types_module};
+pub use model::{constants_module, kinds_module};
#[cfg(test)]
mod tests {
- use super::{constants_module, kinds_module, types_module};
-
- #[test]
- fn preserves_event_type_exports() {
- let rendered = types_module().render();
- assert!(rendered.contains("export type RadrootsListing"));
- assert!(rendered.contains("export type RadrootsJobInput"));
- assert!(rendered.contains("export type RadrootsTradeOrderRequested"));
- }
+ use super::{constants_module, kinds_module};
#[test]
fn preserves_event_constant_exports() {
diff --git a/crates/events_bindings/src/model.rs b/crates/events_bindings/src/model.rs
@@ -1,1302 +1,5 @@
use radroots_sdk_binding_model::{self as ts, TsValue};
-pub fn types_module() -> ts::TsModule {
- ts::module(vec![
- ts::type_alias(
- "JobFeedbackStatus",
- ts::union(vec![
- ts::string_literal("payment_required"),
- ts::string_literal("processing"),
- ts::string_literal("error"),
- ts::string_literal("success"),
- ts::string_literal("partial"),
- ]),
- ),
- ts::type_alias(
- "JobInputType",
- ts::union(vec![
- ts::string_literal("url"),
- ts::string_literal("event"),
- ts::string_literal("job"),
- ts::string_literal("text"),
- ]),
- ),
- ts::type_alias(
- "JobPaymentRequest",
- ts::object(vec![
- ts::field("amount_sat", ts::number()),
- ts::optional_field("bolt11", ts::union(vec![ts::string(), ts::null()])),
- ]),
- ),
- ts::type_alias(
- "RadrootsAccountClaim",
- ts::object(vec![
- ts::field("username", ts::string()),
- ts::field("pubkey", ts::string()),
- ts::optional_field("nip05", ts::union(vec![ts::string(), ts::null()])),
- ]),
- ),
- ts::type_alias_params(
- "RadrootsActiveTradeEnvelope",
- &["T"],
- ts::object(vec![
- ts::field("version", ts::number()),
- ts::field("domain", ts::reference("RadrootsTradeDomain")),
- ts::field("type", ts::reference("RadrootsActiveTradeMessageType")),
- ts::field("order_id", ts::string()),
- ts::field("listing_addr", ts::string()),
- ts::field("payload", ts::reference("T")),
- ]),
- ),
- ts::type_alias(
- "RadrootsActiveTradeMessageType",
- ts::union(vec![
- ts::string_literal("TradeOrderRequested"),
- ts::string_literal("TradeOrderDecision"),
- ts::string_literal("TradeOrderRevisionProposed"),
- ts::string_literal("TradeOrderRevisionDecision"),
- ts::string_literal("TradeOrderCancelled"),
- ]),
- ),
- ts::type_alias(
- "RadrootsAppData",
- ts::object(vec![
- ts::field("d_tag", ts::string()),
- ts::field("content", ts::string()),
- ]),
- ),
- ts::type_alias(
- "RadrootsComment",
- ts::object(vec![
- ts::field("root", ts::reference("RadrootsNostrEventRef")),
- ts::field("parent", ts::reference("RadrootsNostrEventRef")),
- ts::field("content", ts::string()),
- ]),
- ),
- ts::type_alias(
- "RadrootsCoop",
- ts::object(vec![
- ts::field("d_tag", ts::string()),
- ts::field("name", ts::string()),
- ts::optional_field("about", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("website", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("picture", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("banner", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field(
- "location",
- ts::union(vec![ts::reference("RadrootsCoopLocation"), ts::null()]),
- ),
- ts::optional_field("tags", ts::union(vec![ts::array(ts::string()), ts::null()])),
- ]),
- ),
- ts::type_alias(
- "RadrootsCoopLocation",
- ts::object(vec![
- ts::optional_field("primary", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("city", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("region", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("country", ts::union(vec![ts::string(), ts::null()])),
- ts::field("gcs", ts::reference("RadrootsGcsLocation")),
- ]),
- ),
- ts::type_alias(
- "RadrootsCoopRef",
- ts::object(vec![
- ts::field("pubkey", ts::string()),
- ts::field("d_tag", ts::string()),
- ]),
- ),
- ts::type_alias(
- "RadrootsDocument",
- ts::object(vec![
- ts::field("d_tag", ts::string()),
- ts::field("doc_type", ts::string()),
- ts::field("title", ts::string()),
- ts::field("version", ts::string()),
- ts::optional_field("summary", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("effective_at", ts::union(vec![ts::number(), ts::null()])),
- ts::optional_field("body_markdown", ts::union(vec![ts::string(), ts::null()])),
- ts::field("subject", ts::reference("RadrootsDocumentSubject")),
- ts::optional_field("tags", ts::union(vec![ts::array(ts::string()), ts::null()])),
- ]),
- ),
- ts::type_alias(
- "RadrootsDocumentSubject",
- ts::object(vec![
- ts::field("pubkey", ts::string()),
- ts::optional_field("address", ts::union(vec![ts::string(), ts::null()])),
- ]),
- ),
- ts::type_alias(
- "RadrootsFarm",
- ts::object(vec![
- ts::field("d_tag", ts::string()),
- ts::field("name", ts::string()),
- ts::optional_field("about", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("website", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("picture", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("banner", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field(
- "location",
- ts::union(vec![ts::reference("RadrootsFarmLocation"), ts::null()]),
- ),
- ts::optional_field("tags", ts::union(vec![ts::array(ts::string()), ts::null()])),
- ]),
- ),
- ts::type_alias(
- "RadrootsFarmLocation",
- ts::object(vec![
- ts::optional_field("primary", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("city", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("region", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("country", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field(
- "gcs",
- ts::union(vec![ts::reference("RadrootsGcsLocation"), ts::null()]),
- ),
- ]),
- ),
- ts::type_alias(
- "RadrootsFarmRef",
- ts::object(vec![
- ts::field("pubkey", ts::string()),
- ts::field("d_tag", ts::string()),
- ]),
- ),
- ts::type_alias(
- "RadrootsFollow",
- ts::object(vec![ts::field(
- "list",
- ts::array(ts::reference("RadrootsFollowProfile")),
- )]),
- ),
- ts::type_alias(
- "RadrootsFollowProfile",
- ts::object(vec![
- ts::field("published_at", ts::number()),
- ts::field("public_key", ts::string()),
- ts::optional_field("relay_url", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("contact_name", ts::union(vec![ts::string(), ts::null()])),
- ]),
- ),
- ts::type_alias(
- "RadrootsGcsLocation",
- ts::object(vec![
- ts::field("lat", ts::number()),
- ts::field("lng", ts::number()),
- ts::field("geohash", ts::string()),
- ts::field("point", ts::reference("RadrootsGeoJsonPoint")),
- ts::field("polygon", ts::reference("RadrootsGeoJsonPolygon")),
- ts::optional_field("accuracy", ts::union(vec![ts::number(), ts::null()])),
- ts::optional_field("altitude", ts::union(vec![ts::number(), ts::null()])),
- ts::optional_field("tag_0", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("label", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("area", ts::union(vec![ts::number(), ts::null()])),
- ts::optional_field("elevation", ts::union(vec![ts::number(), ts::null()])),
- ts::optional_field("soil", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("climate", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("gc_id", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("gc_name", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("gc_admin1_id", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("gc_admin1_name", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("gc_country_id", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("gc_country_name", ts::union(vec![ts::string(), ts::null()])),
- ]),
- ),
- ts::type_alias(
- "RadrootsGeoChat",
- ts::object(vec![
- ts::field("geohash", ts::string()),
- ts::field("content", ts::string()),
- ts::optional_field("nickname", ts::union(vec![ts::string(), ts::null()])),
- ts::field("teleported", ts::boolean()),
- ]),
- ),
- ts::type_alias(
- "RadrootsGeoJsonPoint",
- ts::object(vec![
- ts::field("type", ts::string()),
- ts::field("coordinates", ts::tuple(vec![ts::number(), ts::number()])),
- ]),
- ),
- ts::type_alias(
- "RadrootsGeoJsonPolygon",
- ts::object(vec![
- ts::field("type", ts::string()),
- ts::field(
- "coordinates",
- ts::array(ts::array(ts::tuple(vec![ts::number(), ts::number()]))),
- ),
- ]),
- ),
- ts::type_alias(
- "RadrootsGiftWrap",
- ts::object(vec![
- ts::field("recipient", ts::reference("RadrootsGiftWrapRecipient")),
- ts::field("content", ts::string()),
- ts::optional_field("expiration", ts::union(vec![ts::number(), ts::null()])),
- ]),
- ),
- ts::type_alias(
- "RadrootsGiftWrapRecipient",
- ts::object(vec![
- ts::field("public_key", ts::string()),
- ts::optional_field("relay_url", ts::union(vec![ts::string(), ts::null()])),
- ]),
- ),
- ts::type_alias(
- "RadrootsJobFeedback",
- ts::object(vec![
- ts::field("kind", ts::number()),
- ts::field("status", ts::reference("JobFeedbackStatus")),
- ts::optional_field("extra_info", ts::union(vec![ts::string(), ts::null()])),
- ts::field("request_event", ts::reference("RadrootsNostrEventPtr")),
- ts::optional_field("customer_pubkey", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field(
- "payment",
- ts::union(vec![ts::reference("JobPaymentRequest"), ts::null()]),
- ),
- ts::optional_field("content", ts::union(vec![ts::string(), ts::null()])),
- ts::field("encrypted", ts::boolean()),
- ]),
- ),
- ts::type_alias(
- "RadrootsJobInput",
- ts::object(vec![
- ts::field("data", ts::string()),
- ts::field("input_type", ts::reference("JobInputType")),
- ts::optional_field("relay", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("marker", ts::union(vec![ts::string(), ts::null()])),
- ]),
- ),
- ts::type_alias(
- "RadrootsJobParam",
- ts::object(vec![
- ts::field("key", ts::string()),
- ts::field("value", ts::string()),
- ]),
- ),
- ts::type_alias(
- "RadrootsJobRequest",
- ts::object(vec![
- ts::field("kind", ts::number()),
- ts::field("inputs", ts::array(ts::reference("RadrootsJobInput"))),
- ts::optional_field("output", ts::union(vec![ts::string(), ts::null()])),
- ts::field("params", ts::array(ts::reference("RadrootsJobParam"))),
- ts::optional_field("bid_sat", ts::union(vec![ts::number(), ts::null()])),
- ts::field("relays", ts::array(ts::string())),
- ts::field("providers", ts::array(ts::string())),
- ts::field("topics", ts::array(ts::string())),
- ts::field("encrypted", ts::boolean()),
- ]),
- ),
- ts::type_alias(
- "RadrootsJobResult",
- ts::object(vec![
- ts::field("kind", ts::number()),
- ts::field("request_event", ts::reference("RadrootsNostrEventPtr")),
- ts::optional_field("request_json", ts::union(vec![ts::string(), ts::null()])),
- ts::field("inputs", ts::array(ts::reference("RadrootsJobInput"))),
- ts::optional_field("customer_pubkey", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field(
- "payment",
- ts::union(vec![ts::reference("JobPaymentRequest"), ts::null()]),
- ),
- ts::optional_field("content", ts::union(vec![ts::string(), ts::null()])),
- ts::field("encrypted", ts::boolean()),
- ]),
- ),
- ts::type_alias(
- "RadrootsList",
- ts::object(vec![
- ts::field("content", ts::string()),
- ts::field("entries", ts::array(ts::reference("RadrootsListEntry"))),
- ]),
- ),
- ts::type_alias(
- "RadrootsListEntry",
- ts::object(vec![
- ts::field("tag", ts::string()),
- ts::field("values", ts::array(ts::string())),
- ]),
- ),
- ts::type_alias(
- "RadrootsListSet",
- ts::object(vec![
- ts::field("d_tag", ts::string()),
- ts::field("content", ts::string()),
- ts::field("entries", ts::array(ts::reference("RadrootsListEntry"))),
- ts::optional_field("title", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("description", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("image", ts::union(vec![ts::string(), ts::null()])),
- ]),
- ),
- ts::type_alias(
- "RadrootsListing",
- ts::object(vec![
- ts::field("d_tag", ts::string()),
- ts::field("farm", ts::reference("RadrootsFarmRef")),
- ts::field("product", ts::reference("RadrootsListingProduct")),
- ts::field("primary_bin_id", ts::string()),
- ts::field("bins", ts::array(ts::reference("RadrootsListingBin"))),
- ts::optional_field(
- "resource_area",
- ts::union(vec![ts::reference("RadrootsResourceAreaRef"), ts::null()]),
- ),
- ts::optional_field(
- "plot",
- ts::union(vec![ts::reference("RadrootsPlotRef"), ts::null()]),
- ),
- ts::optional_field(
- "discounts",
- ts::union(vec![
- ts::array(ts::reference("RadrootsCoreDiscount")),
- ts::null(),
- ]),
- ),
- ts::optional_field(
- "inventory_available",
- ts::union(vec![ts::reference("RadrootsCoreDecimal"), ts::null()]),
- ),
- ts::optional_field(
- "availability",
- ts::union(vec![
- ts::reference("RadrootsListingAvailability"),
- ts::null(),
- ]),
- ),
- ts::optional_field(
- "delivery_method",
- ts::union(vec![
- ts::reference("RadrootsListingDeliveryMethod"),
- ts::null(),
- ]),
- ),
- ts::optional_field(
- "location",
- ts::union(vec![ts::reference("RadrootsListingLocation"), ts::null()]),
- ),
- ts::optional_field(
- "images",
- ts::union(vec![
- ts::array(ts::reference("RadrootsListingImage")),
- ts::null(),
- ]),
- ),
- ]),
- ),
- ts::type_alias(
- "RadrootsListingAvailability",
- ts::union(vec![
- ts::object(vec![
- ts::field("kind", ts::string_literal("window")),
- ts::field(
- "amount",
- ts::object(vec![
- ts::optional_field("start", ts::union(vec![ts::number(), ts::null()])),
- ts::optional_field("end", ts::union(vec![ts::number(), ts::null()])),
- ]),
- ),
- ]),
- ts::object(vec![
- ts::field("kind", ts::string_literal("status")),
- ts::field(
- "amount",
- ts::object(vec![ts::field(
- "status",
- ts::reference("RadrootsListingStatus"),
- )]),
- ),
- ]),
- ]),
- ),
- ts::type_alias(
- "RadrootsListingBin",
- ts::object(vec![
- ts::field("bin_id", ts::string()),
- ts::field("quantity", ts::reference("RadrootsCoreQuantity")),
- ts::field(
- "price_per_canonical_unit",
- ts::reference("RadrootsCoreQuantityPrice"),
- ),
- ts::optional_field(
- "display_amount",
- ts::union(vec![ts::reference("RadrootsCoreDecimal"), ts::null()]),
- ),
- ts::optional_field(
- "display_unit",
- ts::union(vec![ts::reference("RadrootsCoreUnit"), ts::null()]),
- ),
- ts::optional_field("display_label", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field(
- "display_price",
- ts::union(vec![ts::reference("RadrootsCoreMoney"), ts::null()]),
- ),
- ts::optional_field(
- "display_price_unit",
- ts::union(vec![ts::reference("RadrootsCoreUnit"), ts::null()]),
- ),
- ]),
- ),
- ts::type_alias(
- "RadrootsListingDeliveryMethod",
- ts::union(vec![
- ts::object(vec![ts::field("kind", ts::string_literal("pickup"))]),
- ts::object(vec![ts::field(
- "kind",
- ts::string_literal("local_delivery"),
- )]),
- ts::object(vec![ts::field("kind", ts::string_literal("shipping"))]),
- ts::object(vec![
- ts::field("kind", ts::string_literal("other")),
- ts::field(
- "amount",
- ts::object(vec![ts::field("method", ts::string())]),
- ),
- ]),
- ]),
- ),
- ts::type_alias(
- "RadrootsListingImage",
- ts::object(vec![
- ts::field("url", ts::string()),
- ts::optional_field(
- "size",
- ts::union(vec![ts::reference("RadrootsListingImageSize"), ts::null()]),
- ),
- ]),
- ),
- ts::type_alias(
- "RadrootsListingImageSize",
- ts::object(vec![
- ts::field("w", ts::number()),
- ts::field("h", ts::number()),
- ]),
- ),
- ts::type_alias(
- "RadrootsListingLocation",
- ts::object(vec![
- ts::field("primary", ts::string()),
- ts::optional_field("city", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("region", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("country", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("lat", ts::union(vec![ts::number(), ts::null()])),
- ts::optional_field("lng", ts::union(vec![ts::number(), ts::null()])),
- ts::optional_field("geohash", ts::union(vec![ts::string(), ts::null()])),
- ]),
- ),
- ts::type_alias(
- "RadrootsListingProduct",
- ts::object(vec![
- ts::field("key", ts::string()),
- ts::field("title", ts::string()),
- ts::field("category", ts::string()),
- ts::optional_field("summary", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("process", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("lot", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("location", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("profile", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("year", ts::union(vec![ts::string(), ts::null()])),
- ]),
- ),
- ts::type_alias(
- "RadrootsListingProductTagKeys",
- ts::readonly_tuple(vec![
- ts::string_literal("key"),
- ts::string_literal("title"),
- ts::string_literal("category"),
- ts::string_literal("summary"),
- ts::string_literal("process"),
- ts::string_literal("lot"),
- ts::string_literal("location"),
- ts::string_literal("profile"),
- ts::string_literal("year"),
- ]),
- ),
- ts::type_alias(
- "RadrootsListingStatus",
- ts::union(vec![
- ts::object(vec![ts::field("kind", ts::string_literal("active"))]),
- ts::object(vec![ts::field("kind", ts::string_literal("sold"))]),
- ts::object(vec![
- ts::field("kind", ts::string_literal("other")),
- ts::field("amount", ts::object(vec![ts::field("value", ts::string())])),
- ]),
- ]),
- ),
- ts::type_alias(
- "RadrootsMessage",
- ts::object(vec![
- ts::field(
- "recipients",
- ts::array(ts::reference("RadrootsMessageRecipient")),
- ),
- ts::field("content", ts::string()),
- ts::optional_field(
- "reply_to",
- ts::union(vec![ts::reference("RadrootsNostrEventPtr"), ts::null()]),
- ),
- ts::optional_field("subject", ts::union(vec![ts::string(), ts::null()])),
- ]),
- ),
- ts::type_alias(
- "RadrootsMessageFile",
- ts::object(vec![
- ts::field(
- "recipients",
- ts::array(ts::reference("RadrootsMessageRecipient")),
- ),
- ts::field("file_url", ts::string()),
- ts::optional_field(
- "reply_to",
- ts::union(vec![ts::reference("RadrootsNostrEventPtr"), ts::null()]),
- ),
- ts::optional_field("subject", ts::union(vec![ts::string(), ts::null()])),
- ts::field("file_type", ts::string()),
- ts::field("encryption_algorithm", ts::string()),
- ts::field("decryption_key", ts::string()),
- ts::field("decryption_nonce", ts::string()),
- ts::field("encrypted_hash", ts::string()),
- ts::optional_field("original_hash", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("size", ts::union(vec![ts::number(), ts::null()])),
- ts::optional_field(
- "dimensions",
- ts::union(vec![
- ts::reference("RadrootsMessageFileDimensions"),
- ts::null(),
- ]),
- ),
- ts::optional_field("blurhash", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("thumb", ts::union(vec![ts::string(), ts::null()])),
- ts::field("fallbacks", ts::array(ts::string())),
- ]),
- ),
- ts::type_alias(
- "RadrootsMessageFileDimensions",
- ts::object(vec![
- ts::field("w", ts::number()),
- ts::field("h", ts::number()),
- ]),
- ),
- ts::type_alias(
- "RadrootsMessageRecipient",
- ts::object(vec![
- ts::field("public_key", ts::string()),
- ts::optional_field("relay_url", ts::union(vec![ts::string(), ts::null()])),
- ]),
- ),
- ts::type_alias(
- "RadrootsNostrEvent",
- ts::object(vec![
- ts::field("id", ts::string()),
- ts::field("author", ts::string()),
- ts::field("created_at", ts::number()),
- ts::field("kind", ts::number()),
- ts::field("tags", ts::array(ts::array(ts::string()))),
- ts::field("content", ts::string()),
- ts::field("sig", ts::string()),
- ]),
- ),
- ts::type_alias(
- "RadrootsNostrEventPtr",
- ts::object(vec![
- ts::field("id", ts::string()),
- ts::optional_field("relays", ts::union(vec![ts::string(), ts::null()])),
- ]),
- ),
- ts::type_alias(
- "RadrootsNostrEventRef",
- ts::object(vec![
- ts::field("id", ts::string()),
- ts::field("author", ts::string()),
- ts::field("kind", ts::number()),
- ts::optional_field("d_tag", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field(
- "relays",
- ts::union(vec![ts::array(ts::string()), ts::null()]),
- ),
- ]),
- ),
- ts::type_alias(
- "RadrootsPlot",
- ts::object(vec![
- ts::field("d_tag", ts::string()),
- ts::field("farm", ts::reference("RadrootsFarmRef")),
- ts::field("name", ts::string()),
- ts::optional_field("about", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field(
- "location",
- ts::union(vec![ts::reference("RadrootsPlotLocation"), ts::null()]),
- ),
- ts::optional_field("tags", ts::union(vec![ts::array(ts::string()), ts::null()])),
- ]),
- ),
- ts::type_alias(
- "RadrootsPlotLocation",
- ts::object(vec![
- ts::optional_field("primary", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("city", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("region", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("country", ts::union(vec![ts::string(), ts::null()])),
- ts::field("gcs", ts::reference("RadrootsGcsLocation")),
- ]),
- ),
- ts::type_alias(
- "RadrootsPlotRef",
- ts::object(vec![
- ts::field("pubkey", ts::string()),
- ts::field("d_tag", ts::string()),
- ]),
- ),
- ts::type_alias(
- "RadrootsPost",
- ts::object(vec![ts::field("content", ts::string())]),
- ),
- ts::type_alias(
- "RadrootsProfile",
- ts::object(vec![
- ts::field("name", ts::string()),
- ts::optional_field("display_name", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("nip05", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("about", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("website", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("picture", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("banner", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("lud06", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("lud16", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("bot", ts::union(vec![ts::string(), ts::null()])),
- ]),
- ),
- ts::type_alias(
- "RadrootsProfileType",
- ts::union(vec![
- ts::string_literal("individual"),
- ts::string_literal("farm"),
- ts::string_literal("coop"),
- ts::string_literal("any"),
- ts::string_literal("radrootsd"),
- ]),
- ),
- ts::type_alias(
- "RadrootsReaction",
- ts::object(vec![
- ts::field("root", ts::reference("RadrootsNostrEventRef")),
- ts::field("content", ts::string()),
- ]),
- ),
- ts::type_alias(
- "RadrootsRelayDocument",
- ts::object(vec![
- ts::optional_field("name", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("description", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("pubkey", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("contact", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field(
- "supported_nips",
- ts::union(vec![ts::array(ts::number()), ts::null()]),
- ),
- ts::optional_field("software", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("version", ts::union(vec![ts::string(), ts::null()])),
- ]),
- ),
- ts::type_alias(
- "RadrootsResourceArea",
- ts::object(vec![
- ts::field("d_tag", ts::string()),
- ts::field("name", ts::string()),
- ts::optional_field("about", ts::union(vec![ts::string(), ts::null()])),
- ts::field("location", ts::reference("RadrootsResourceAreaLocation")),
- ts::optional_field("tags", ts::union(vec![ts::array(ts::string()), ts::null()])),
- ]),
- ),
- ts::type_alias(
- "RadrootsResourceAreaLocation",
- ts::object(vec![
- ts::optional_field("primary", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("city", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("region", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("country", ts::union(vec![ts::string(), ts::null()])),
- ts::field("gcs", ts::reference("RadrootsGcsLocation")),
- ]),
- ),
- ts::type_alias(
- "RadrootsResourceAreaRef",
- ts::object(vec![
- ts::field("pubkey", ts::string()),
- ts::field("d_tag", ts::string()),
- ]),
- ),
- ts::type_alias(
- "RadrootsResourceHarvestCap",
- ts::object(vec![
- ts::field("d_tag", ts::string()),
- ts::field("resource_area", ts::reference("RadrootsResourceAreaRef")),
- ts::field("product", ts::reference("RadrootsResourceHarvestProduct")),
- ts::field("start", ts::bigint()),
- ts::field("end", ts::bigint()),
- ts::field("cap_quantity", ts::reference("RadrootsCoreQuantity")),
- ts::optional_field(
- "display_amount",
- ts::union(vec![ts::reference("RadrootsCoreDecimal"), ts::null()]),
- ),
- ts::optional_field(
- "display_unit",
- ts::union(vec![ts::reference("RadrootsCoreUnit"), ts::null()]),
- ),
- ts::optional_field("display_label", ts::union(vec![ts::string(), ts::null()])),
- ts::optional_field("tags", ts::union(vec![ts::array(ts::string()), ts::null()])),
- ]),
- ),
- ts::type_alias(
- "RadrootsResourceHarvestProduct",
- ts::object(vec![
- ts::field("key", ts::string()),
- ts::optional_field("category", ts::union(vec![ts::string(), ts::null()])),
- ]),
- ),
- ts::type_alias(
- "RadrootsSeal",
- ts::object(vec![ts::field("content", ts::string())]),
- ),
- ts::type_alias(
- "RadrootsTradeAnswer",
- ts::object(vec![ts::field("question_id", ts::string())]),
- ),
- ts::type_alias(
- "RadrootsTradeDiscountDecision",
- ts::union(vec![
- ts::object(vec![
- ts::field("kind", ts::string_literal("accept")),
- ts::field(
- "amount",
- ts::object(vec![ts::field(
- "value",
- ts::reference("RadrootsCoreDiscountValue"),
- )]),
- ),
- ]),
- ts::object(vec![
- ts::field("kind", ts::string_literal("decline")),
- ts::field(
- "amount",
- ts::object(vec![ts::optional_field(
- "reason",
- ts::union(vec![ts::string(), ts::null()]),
- )]),
- ),
- ]),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeDiscountOffer",
- ts::object(vec![
- ts::field("discount_id", ts::string()),
- ts::field("value", ts::reference("RadrootsCoreDiscountValue")),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeDiscountRequest",
- ts::object(vec![
- ts::field("discount_id", ts::string()),
- ts::field("value", ts::reference("RadrootsCoreDiscountValue")),
- ]),
- ),
- ts::type_alias("RadrootsTradeDomain", ts::string_literal("trade:listing")),
- ts::type_alias(
- "RadrootsTradeEconomicActor",
- ts::union(vec![
- ts::string_literal("buyer"),
- ts::string_literal("seller"),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeEconomicEffect",
- ts::union(vec![
- ts::string_literal("increase"),
- ts::string_literal("decrease"),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeEconomicLineKind",
- ts::union(vec![
- ts::string_literal("listing_discount"),
- ts::string_literal("basket_adjustment"),
- ts::string_literal("revision_adjustment"),
- ]),
- ),
- ts::type_alias_params(
- "RadrootsTradeEnvelope",
- &["T"],
- ts::object(vec![
- ts::field("version", ts::number()),
- ts::field("domain", ts::reference("RadrootsTradeDomain")),
- ts::field("type", ts::reference("RadrootsTradeMessageType")),
- ts::optional_field("order_id", ts::union(vec![ts::string(), ts::null()])),
- ts::field("listing_addr", ts::string()),
- ts::field("payload", ts::reference("T")),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeInventoryCommitment",
- ts::object(vec![
- ts::field("bin_id", ts::string()),
- ts::field("bin_count", ts::number()),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeListingCancel",
- ts::object(vec![ts::optional_field(
- "reason",
- ts::union(vec![ts::string(), ts::null()]),
- )]),
- ),
- ts::type_alias(
- "RadrootsTradeListingParseError",
- ts::union(vec![
- ts::object(vec![ts::field("InvalidKind", ts::number())]),
- ts::object(vec![ts::field("MissingTag", ts::string())]),
- ts::object(vec![ts::field("InvalidTag", ts::string())]),
- ts::object(vec![ts::field("InvalidNumber", ts::string())]),
- ts::string_literal("InvalidUnit"),
- ts::string_literal("InvalidCurrency"),
- ts::object(vec![ts::field("InvalidJson", ts::string())]),
- ts::object(vec![ts::field("InvalidDiscount", ts::string())]),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeListingValidateRequest",
- ts::object(vec![ts::optional_field(
- "listing_event",
- ts::union(vec![ts::reference("RadrootsNostrEventPtr"), ts::null()]),
- )]),
- ),
- ts::type_alias(
- "RadrootsTradeListingValidateResult",
- ts::object(vec![
- ts::field("valid", ts::boolean()),
- ts::field(
- "errors",
- ts::array(ts::reference("RadrootsTradeListingValidationError")),
- ),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeListingValidationError",
- ts::union(vec![
- ts::object(vec![
- ts::field("kind", ts::string_literal("invalid_kind")),
- ts::field("amount", ts::object(vec![ts::field("kind", ts::number())])),
- ]),
- ts::object(vec![ts::field(
- "kind",
- ts::string_literal("missing_listing_id"),
- )]),
- ts::object(vec![
- ts::field("kind", ts::string_literal("listing_event_not_found")),
- ts::field(
- "amount",
- ts::object(vec![ts::field("listing_addr", ts::string())]),
- ),
- ]),
- ts::object(vec![
- ts::field("kind", ts::string_literal("listing_event_fetch_failed")),
- ts::field(
- "amount",
- ts::object(vec![ts::field("listing_addr", ts::string())]),
- ),
- ]),
- ts::object(vec![
- ts::field("kind", ts::string_literal("parse_error")),
- ts::field(
- "amount",
- ts::object(vec![ts::field(
- "error",
- ts::reference("RadrootsTradeListingParseError"),
- )]),
- ),
- ]),
- ts::object(vec![ts::field(
- "kind",
- ts::string_literal("invalid_seller"),
- )]),
- ts::object(vec![ts::field(
- "kind",
- ts::string_literal("missing_farm_profile"),
- )]),
- ts::object(vec![ts::field(
- "kind",
- ts::string_literal("missing_farm_record"),
- )]),
- ts::object(vec![ts::field("kind", ts::string_literal("missing_title"))]),
- ts::object(vec![ts::field(
- "kind",
- ts::string_literal("missing_description"),
- )]),
- ts::object(vec![ts::field(
- "kind",
- ts::string_literal("missing_product_type"),
- )]),
- ts::object(vec![ts::field("kind", ts::string_literal("missing_bins"))]),
- ts::object(vec![ts::field(
- "kind",
- ts::string_literal("missing_primary_bin"),
- )]),
- ts::object(vec![ts::field("kind", ts::string_literal("invalid_bin"))]),
- ts::object(vec![ts::field("kind", ts::string_literal("missing_price"))]),
- ts::object(vec![ts::field("kind", ts::string_literal("invalid_price"))]),
- ts::object(vec![ts::field(
- "kind",
- ts::string_literal("missing_inventory"),
- )]),
- ts::object(vec![ts::field(
- "kind",
- ts::string_literal("invalid_inventory"),
- )]),
- ts::object(vec![ts::field(
- "kind",
- ts::string_literal("missing_availability"),
- )]),
- ts::object(vec![ts::field(
- "kind",
- ts::string_literal("missing_location"),
- )]),
- ts::object(vec![ts::field(
- "kind",
- ts::string_literal("missing_delivery_method"),
- )]),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeMessagePayload",
- ts::union(vec![
- ts::object(vec![
- ts::field("kind", ts::string_literal("listing_validate_request")),
- ts::field(
- "amount",
- ts::reference("RadrootsTradeListingValidateRequest"),
- ),
- ]),
- ts::object(vec![
- ts::field("kind", ts::string_literal("listing_validate_result")),
- ts::field(
- "amount",
- ts::reference("RadrootsTradeListingValidateResult"),
- ),
- ]),
- ts::object(vec![
- ts::field("kind", ts::string_literal("trade_order_requested")),
- ts::field("amount", ts::reference("RadrootsTradeOrderRequested")),
- ]),
- ts::object(vec![
- ts::field("kind", ts::string_literal("order_response")),
- ts::field("amount", ts::reference("RadrootsTradeOrderResponse")),
- ]),
- ts::object(vec![
- ts::field("kind", ts::string_literal("order_revision")),
- ts::field("amount", ts::reference("RadrootsTradeOrderRevision")),
- ]),
- ts::object(vec![
- ts::field("kind", ts::string_literal("order_revision_accept")),
- ts::field(
- "amount",
- ts::reference("RadrootsTradeOrderRevisionResponse"),
- ),
- ]),
- ts::object(vec![
- ts::field("kind", ts::string_literal("order_revision_decline")),
- ts::field(
- "amount",
- ts::reference("RadrootsTradeOrderRevisionResponse"),
- ),
- ]),
- ts::object(vec![
- ts::field("kind", ts::string_literal("question")),
- ts::field("amount", ts::reference("RadrootsTradeQuestion")),
- ]),
- ts::object(vec![
- ts::field("kind", ts::string_literal("answer")),
- ts::field("amount", ts::reference("RadrootsTradeAnswer")),
- ]),
- ts::object(vec![
- ts::field("kind", ts::string_literal("discount_request")),
- ts::field("amount", ts::reference("RadrootsTradeDiscountRequest")),
- ]),
- ts::object(vec![
- ts::field("kind", ts::string_literal("discount_offer")),
- ts::field("amount", ts::reference("RadrootsTradeDiscountOffer")),
- ]),
- ts::object(vec![
- ts::field("kind", ts::string_literal("discount_accept")),
- ts::field("amount", ts::reference("RadrootsTradeDiscountDecision")),
- ]),
- ts::object(vec![
- ts::field("kind", ts::string_literal("discount_decline")),
- ts::field("amount", ts::reference("RadrootsTradeDiscountDecision")),
- ]),
- ts::object(vec![
- ts::field("kind", ts::string_literal("cancel")),
- ts::field("amount", ts::reference("RadrootsTradeListingCancel")),
- ]),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeMessageType",
- ts::union(vec![
- ts::string_literal("listing_validate_request"),
- ts::string_literal("listing_validate_result"),
- ts::string_literal("order_request"),
- ts::string_literal("order_response"),
- ts::string_literal("order_revision"),
- ts::string_literal("order_revision_accept"),
- ts::string_literal("order_revision_decline"),
- ts::string_literal("question"),
- ts::string_literal("answer"),
- ts::string_literal("discount_request"),
- ts::string_literal("discount_offer"),
- ts::string_literal("discount_accept"),
- ts::string_literal("discount_decline"),
- ts::string_literal("cancel"),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeOrderCancelled",
- ts::object(vec![
- ts::field("order_id", ts::string()),
- ts::field("listing_addr", ts::string()),
- ts::field("buyer_pubkey", ts::string()),
- ts::field("seller_pubkey", ts::string()),
- ts::field("reason", ts::string()),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeOrderChange",
- ts::union(vec![
- ts::object(vec![
- ts::field("kind", ts::string_literal("bin_count")),
- ts::field(
- "amount",
- ts::object(vec![
- ts::field("item_index", ts::number()),
- ts::field("bin_count", ts::number()),
- ]),
- ),
- ]),
- ts::object(vec![
- ts::field("kind", ts::string_literal("item_add")),
- ts::field(
- "amount",
- ts::object(vec![ts::field(
- "item",
- ts::reference("RadrootsTradeOrderItem"),
- )]),
- ),
- ]),
- ts::object(vec![
- ts::field("kind", ts::string_literal("item_remove")),
- ts::field(
- "amount",
- ts::object(vec![ts::field("item_index", ts::number())]),
- ),
- ]),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeOrderDecision",
- ts::union(vec![
- ts::object(vec![
- ts::field("decision", ts::string_literal("accepted")),
- ts::field(
- "inventory_commitments",
- ts::array(ts::reference("RadrootsTradeInventoryCommitment")),
- ),
- ]),
- ts::object(vec![
- ts::field("decision", ts::string_literal("declined")),
- ts::field("reason", ts::string()),
- ]),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeOrderDecisionEvent",
- ts::object(vec![
- ts::field("order_id", ts::string()),
- ts::field("listing_addr", ts::string()),
- ts::field("buyer_pubkey", ts::string()),
- ts::field("seller_pubkey", ts::string()),
- ts::field("decision", ts::reference("RadrootsTradeOrderDecision")),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeOrderEconomicItem",
- ts::object(vec![
- ts::field("bin_id", ts::string()),
- ts::field("bin_count", ts::number()),
- ts::field("quantity_amount", ts::reference("RadrootsCoreDecimal")),
- ts::field("quantity_unit", ts::reference("RadrootsCoreUnit")),
- ts::field("unit_price_amount", ts::reference("RadrootsCoreDecimal")),
- ts::field("unit_price_currency", ts::reference("RadrootsCoreCurrency")),
- ts::field("line_subtotal", ts::reference("RadrootsCoreMoney")),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeOrderEconomicLine",
- ts::object(vec![
- ts::field("id", ts::string()),
- ts::field("kind", ts::reference("RadrootsTradeEconomicLineKind")),
- ts::field("actor", ts::reference("RadrootsTradeEconomicActor")),
- ts::field("effect", ts::reference("RadrootsTradeEconomicEffect")),
- ts::field("amount", ts::reference("RadrootsCoreMoney")),
- ts::field("reason", ts::string()),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeOrderEconomicTotals",
- ts::object(vec![
- ts::field("subtotal", ts::reference("RadrootsCoreMoney")),
- ts::field("discount_total", ts::reference("RadrootsCoreMoney")),
- ts::field("adjustment_total", ts::reference("RadrootsCoreMoney")),
- ts::field("total", ts::reference("RadrootsCoreMoney")),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeOrderEconomics",
- ts::object(vec![
- ts::field("quote_id", ts::string()),
- ts::field("quote_version", ts::number()),
- ts::field("pricing_basis", ts::reference("RadrootsTradePricingBasis")),
- ts::field("currency", ts::reference("RadrootsCoreCurrency")),
- ts::field(
- "items",
- ts::array(ts::reference("RadrootsTradeOrderEconomicItem")),
- ),
- ts::field(
- "discounts",
- ts::array(ts::reference("RadrootsTradeOrderEconomicLine")),
- ),
- ts::field(
- "adjustments",
- ts::array(ts::reference("RadrootsTradeOrderEconomicLine")),
- ),
- ts::field("subtotal", ts::reference("RadrootsCoreMoney")),
- ts::field("discount_total", ts::reference("RadrootsCoreMoney")),
- ts::field("adjustment_total", ts::reference("RadrootsCoreMoney")),
- ts::field("total", ts::reference("RadrootsCoreMoney")),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeOrderItem",
- ts::object(vec![
- ts::field("bin_id", ts::string()),
- ts::field("bin_count", ts::number()),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeOrderRequested",
- ts::object(vec![
- ts::field("order_id", ts::string()),
- ts::field("listing_addr", ts::string()),
- ts::field("buyer_pubkey", ts::string()),
- ts::field("seller_pubkey", ts::string()),
- ts::field("items", ts::array(ts::reference("RadrootsTradeOrderItem"))),
- ts::field("economics", ts::reference("RadrootsTradeOrderEconomics")),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeOrderResponse",
- ts::object(vec![
- ts::field("accepted", ts::boolean()),
- ts::optional_field("reason", ts::union(vec![ts::string(), ts::null()])),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeOrderRevision",
- ts::object(vec![
- ts::field("revision_id", ts::string()),
- ts::field(
- "changes",
- ts::array(ts::reference("RadrootsTradeOrderChange")),
- ),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeOrderRevisionDecision",
- ts::union(vec![
- ts::object(vec![ts::field("decision", ts::string_literal("accepted"))]),
- ts::object(vec![
- ts::field("decision", ts::string_literal("declined")),
- ts::field("reason", ts::string()),
- ]),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeOrderRevisionDecisionEvent",
- ts::object(vec![
- ts::field("revision_id", ts::string()),
- ts::field("order_id", ts::string()),
- ts::field("listing_addr", ts::string()),
- ts::field("buyer_pubkey", ts::string()),
- ts::field("seller_pubkey", ts::string()),
- ts::field("root_event_id", ts::string()),
- ts::field("prev_event_id", ts::string()),
- ts::field(
- "decision",
- ts::reference("RadrootsTradeOrderRevisionDecision"),
- ),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeOrderRevisionProposed",
- ts::object(vec![
- ts::field("revision_id", ts::string()),
- ts::field("order_id", ts::string()),
- ts::field("listing_addr", ts::string()),
- ts::field("buyer_pubkey", ts::string()),
- ts::field("seller_pubkey", ts::string()),
- ts::field("root_event_id", ts::string()),
- ts::field("prev_event_id", ts::string()),
- ts::field("items", ts::array(ts::reference("RadrootsTradeOrderItem"))),
- ts::field("economics", ts::reference("RadrootsTradeOrderEconomics")),
- ts::field("reason", ts::string()),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeOrderRevisionResponse",
- ts::object(vec![
- ts::field("accepted", ts::boolean()),
- ts::optional_field("reason", ts::union(vec![ts::string(), ts::null()])),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradeOrderStatus",
- ts::union(vec![
- ts::string_literal("draft"),
- ts::string_literal("validated"),
- ts::string_literal("requested"),
- ts::string_literal("questioned"),
- ts::string_literal("revised"),
- ts::string_literal("accepted"),
- ts::string_literal("declined"),
- ts::string_literal("cancelled"),
- ]),
- ),
- ts::type_alias(
- "RadrootsTradePricingBasis",
- ts::string_literal("listing_event"),
- ),
- ts::type_alias(
- "RadrootsTradeQuestion",
- ts::object(vec![ts::field("question_id", ts::string())]),
- ),
- ts::type_alias(
- "RadrootsTradeTransportLane",
- ts::union(vec![
- ts::string_literal("service"),
- ts::string_literal("public"),
- ]),
- ),
- ])
-}
-
pub fn constants_module() -> ts::TsModule {
ts::module(vec![
ts::import_type(&["RadrootsListingProductTagKeys"], "./types.js"),
diff --git a/packages/events-bindings/src/generated/types.ts b/packages/events-bindings/src/generated/types.ts
@@ -75,7 +75,7 @@ export type RadrootsListEntry = { tag: string, values: Array<string>, };
export type RadrootsListSet = { d_tag: string, content: string, entries: Array<RadrootsListEntry>, title?: string | null, description?: string | null, image?: string | null, };
-export type RadrootsListing = { d_tag: string, farm: RadrootsFarmRef, product: RadrootsListingProduct, primary_bin_id: string, bins: Array<RadrootsListingBin>, resource_area?: RadrootsResourceAreaRef | null, plot?: RadrootsPlotRef | null, discounts?: Array<RadrootsCoreDiscount> | null, inventory_available?: RadrootsCoreDecimal | null, availability?: RadrootsListingAvailability | null, delivery_method?: RadrootsListingDeliveryMethod | null, location?: RadrootsListingLocation | null, images?: Array<RadrootsListingImage> | null, };
+export type RadrootsListing = { d_tag: string, published_at?: number | null, farm: RadrootsFarmRef, product: RadrootsListingProduct, primary_bin_id: string, bins: Array<RadrootsListingBin>, resource_area?: RadrootsResourceAreaRef | null, plot?: RadrootsPlotRef | null, discounts?: Array<RadrootsCoreDiscount> | null, inventory_available?: RadrootsCoreDecimal | null, availability?: RadrootsListingAvailability | null, delivery_method?: RadrootsListingDeliveryMethod | null, location?: RadrootsListingLocation | null, images?: Array<RadrootsListingImage> | null, };
export type RadrootsListingAvailability = { kind: "window", amount: { start?: number | null, end?: number | null, }, } | { kind: "status", amount: { status: RadrootsListingStatus, }, };
diff --git a/tools/xtask/src/dto_render.rs b/tools/xtask/src/dto_render.rs
@@ -141,36 +141,79 @@ fn render_enum(
imports: &mut BTreeMap<String, BTreeSet<String>>,
) -> Result<String, String> {
match &def.repr {
- EnumRepr::External
- if def
- .variants
- .iter()
- .all(|variant| matches!(variant.shape, VariantShape::Unit)) =>
- {
- let variants = def
- .variants
- .iter()
- .map(|variant| quote_string(&variant.wire_name))
- .collect::<Vec<_>>();
- Ok(format!(
- "export type {} = {};",
- enum_type_name(def),
- render_union(variants)
- ))
- }
+ EnumRepr::External => render_external_enum(def, registry, options, imports),
EnumRepr::Internal { tag } => {
render_tagged_enum(def, tag, None, registry, options, imports)
}
EnumRepr::Adjacent { tag, content } => {
render_tagged_enum(def, tag, Some(content.as_str()), registry, options, imports)
}
- EnumRepr::External | EnumRepr::Untagged => Err(format!(
+ EnumRepr::Untagged => Err(format!(
"unsupported enum representation for {}",
enum_type_name(def)
)),
}
}
+fn render_external_enum(
+ def: &EnumDef,
+ registry: &Registry,
+ options: &DtoRegistryRenderOptions,
+ imports: &mut BTreeMap<String, BTreeSet<String>>,
+) -> Result<String, String> {
+ let variants = def
+ .variants
+ .iter()
+ .map(|variant| render_external_variant(def, variant, registry, options, imports))
+ .collect::<Result<Vec<_>, _>>()?;
+ Ok(format!(
+ "export type {} = {};",
+ enum_type_name(def),
+ render_union(variants)
+ ))
+}
+
+fn render_external_variant(
+ def: &EnumDef,
+ variant: &VariantDef,
+ registry: &Registry,
+ options: &DtoRegistryRenderOptions,
+ imports: &mut BTreeMap<String, BTreeSet<String>>,
+) -> Result<String, String> {
+ let rendered: Result<String, String> = match &variant.shape {
+ VariantShape::Unit => Ok(quote_string(&variant.wire_name)),
+ VariantShape::Newtype(ty) => Ok(format!(
+ "{{ {}: {}, }}",
+ render_property_name(&variant.wire_name),
+ render_type_ref(ty, None, registry, options, imports)?
+ )),
+ VariantShape::Tuple(items) => {
+ let rendered = items
+ .iter()
+ .map(|item| render_type_ref(item, None, registry, options, imports))
+ .collect::<Result<Vec<_>, _>>()?;
+ Ok(format!(
+ "{{ {}: [{}], }}",
+ render_property_name(&variant.wire_name),
+ rendered.join(", ")
+ ))
+ }
+ VariantShape::Struct(fields) => Ok(format!(
+ "{{ {}: {}, }}",
+ render_property_name(&variant.wire_name),
+ render_object_fields(fields, registry, options, imports)?
+ )),
+ };
+
+ rendered.map_err(|error| {
+ format!(
+ "{error} while rendering external enum {}.{}",
+ enum_type_name(def),
+ variant.rust_name
+ )
+ })
+}
+
fn render_tagged_enum(
def: &EnumDef,
tag: &str,
@@ -292,7 +335,13 @@ fn render_object_field(
} else {
"?"
};
- let mut value = render_type_ref(&field.ty, field.int_repr, registry, options, imports)?;
+ let mut value = render_type_ref(&field.ty, field.int_repr, registry, options, imports)
+ .map_err(|error| {
+ format!(
+ "{error} while rendering field {} at {}",
+ field.target.typescript, field.source
+ )
+ })?;
if field.presence.nullable {
value = render_nullable(value);
}
@@ -644,7 +693,7 @@ mod tests {
assert_eq!(
error,
- "large integer field requires explicit numeric policy"
+ "large integer field requires explicit numeric policy while rendering field value at src/dto.rs:1:1"
);
}
@@ -715,4 +764,35 @@ mod tests {
"export type Counter = { value: number, };\n\nexport type TransparentCounters = { maybeCount?: string | null, countList: Array<string>, fixedCounts: [string, string], byKey: Record<string, string>, namedCounter: Counter, };"
);
}
+
+ #[test]
+ fn renders_external_data_enums() {
+ let mut registry = Registry::new();
+ registry.register_type(
+ RustTypeId::new("sdk", "ParseError"),
+ TypeDef::Enum(
+ EnumDef::new("ParseError", "ParseError", EnumRepr::External, span())
+ .with_variant(VariantDef::new(
+ "InvalidKind",
+ "InvalidKind",
+ VariantShape::Newtype(TypeRef::Primitive(Primitive::U32)),
+ span(),
+ ))
+ .with_variant(VariantDef::new(
+ "InvalidUnit",
+ "InvalidUnit",
+ VariantShape::Unit,
+ span(),
+ )),
+ ),
+ );
+
+ let rendered = render_registry_types(®istry, &DtoRegistryRenderOptions::default())
+ .expect("registry renders");
+
+ assert_eq!(
+ rendered.body_ts(),
+ "export type ParseError = { InvalidKind: number, } | \"InvalidUnit\";"
+ );
+ }
}
diff --git a/tools/xtask/src/dto_roots.rs b/tools/xtask/src/dto_roots.rs
@@ -1,4 +1,4 @@
-use dto_bindgen_core::{Registry, RootDescriptor, build_registry};
+use dto_bindgen_core::{Registry, RootDescriptor, RustTypeId, TypeId, build_registry};
use crate::dto_render::{DtoRegistryRenderOptions, DtoTypesModule, render_registry_types};
@@ -118,6 +118,20 @@ pub fn core_types_module() -> Result<DtoTypesModule, String> {
))
}
+pub fn events_types_module() -> Result<DtoTypesModule, String> {
+ let root_set =
+ package_root_set("events").ok_or_else(|| "missing events DTO roots".to_owned())?;
+ let registry = root_set.registry();
+ let rendered = render_registry_types(
+ ®istry,
+ &core_import_options(®istry, DtoRegistryRenderOptions::default()),
+ )?;
+ Ok(DtoTypesModule::new(
+ rendered.imports_ts().unwrap_or_default(),
+ with_events_sdk_wrappers(rendered.body_ts()),
+ ))
+}
+
fn core_roots() -> Vec<RootDescriptor> {
radroots_core::dto::dto_roots().into_iter().collect()
}
@@ -126,6 +140,59 @@ fn events_roots() -> Vec<RootDescriptor> {
radroots_events::dto::dto_roots().into_iter().collect()
}
+fn core_import_options(
+ registry: &Registry,
+ mut options: DtoRegistryRenderOptions,
+) -> DtoRegistryRenderOptions {
+ for export_name in [
+ "RadrootsCoreCurrency",
+ "RadrootsCoreDecimal",
+ "RadrootsCoreDiscount",
+ "RadrootsCoreDiscountScope",
+ "RadrootsCoreDiscountThreshold",
+ "RadrootsCoreDiscountValue",
+ "RadrootsCoreMoney",
+ "RadrootsCorePercent",
+ "RadrootsCoreQuantity",
+ "RadrootsCoreQuantityPrice",
+ "RadrootsCoreUnit",
+ "RadrootsCoreUnitDimension",
+ ] {
+ if let Some(type_id) = core_type_id(registry, export_name) {
+ options = options.with_external_type(type_id, export_name, "@radroots/core-bindings");
+ }
+ }
+ options
+}
+
+fn core_type_id(registry: &Registry, rust_ident: &str) -> Option<TypeId> {
+ registry
+ .rust_id_to_type_id
+ .get(&RustTypeId::new("radroots_core", rust_ident))
+ .copied()
+}
+
+fn with_events_sdk_wrappers(body: &str) -> String {
+ let mut declarations = body
+ .split("\n\n")
+ .filter(|declaration| !declaration.trim().is_empty())
+ .map(str::to_owned)
+ .collect::<Vec<_>>();
+ declarations.push(
+ "export type RadrootsListingProductTagKeys = readonly [\"key\", \"title\", \"category\", \"summary\", \"process\", \"lot\", \"location\", \"profile\", \"year\"];"
+ .to_owned(),
+ );
+ declarations.sort_by(|left, right| declaration_name(left).cmp(declaration_name(right)));
+ declarations.join("\n\n")
+}
+
+fn declaration_name(declaration: &str) -> &str {
+ declaration
+ .strip_prefix("export type ")
+ .and_then(|rest| rest.split([' ', '<']).next())
+ .unwrap_or(declaration)
+}
+
#[cfg(test)]
mod tests {
use super::{
diff --git a/tools/xtask/src/output.rs b/tools/xtask/src/output.rs
@@ -88,8 +88,8 @@ pub fn package_outputs() -> Result<Vec<PackageOutput>, String> {
},
PackageOutput {
spec: spec_by_key("events"),
- types_ts: Some(TsSource::Module(radroots_events_bindings::types_module())),
- types_imports_ts: Some(EVENTS_TYPES_IMPORTS_TS),
+ types_ts: Some(TsSource::DtoRegistry(dto_roots::events_types_module()?)),
+ types_imports_ts: None,
constants_ts: Some(TsSource::Module(
radroots_events_bindings::constants_module(),
)),
@@ -166,19 +166,6 @@ fn combined_imports(first: Option<&str>, second: Option<&str>) -> Option<String>
}
}
-const EVENTS_TYPES_IMPORTS_TS: &str = r#"import type {
- RadrootsCoreCurrency,
- RadrootsCoreDecimal,
- RadrootsCoreDiscount,
- RadrootsCoreDiscountValue,
- RadrootsCoreMoney,
- RadrootsCoreQuantity,
- RadrootsCoreQuantityPrice,
- RadrootsCoreUnit,
-} from "@radroots/core-bindings";
-
-"#;
-
const REPLICA_DB_SCHEMA_TYPES_IMPORTS_TS: &str = r#"import type {
IResult,
IResultList,