sdk

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

lib.rs (14051B)


      1 pub use radroots_trade as upstream;
      2 
      3 pub mod dto;
      4 
      5 pub use dto::dto_roots;
      6 
      7 #[derive(Clone, Copy, Debug, Eq, PartialEq)]
      8 pub enum TradeTypeDisposition {
      9     SourceTradeRoot,
     10     EventsBindingImport,
     11     SdkLocalPackageShape,
     12 }
     13 
     14 #[derive(Clone, Copy, Debug, Eq, PartialEq)]
     15 pub struct TradeTypeInventoryEntry {
     16     pub export_name: &'static str,
     17     pub disposition: TradeTypeDisposition,
     18 }
     19 
     20 #[derive(Clone, Copy, Debug, Eq, PartialEq)]
     21 pub enum TradeLargeIntegerPolicy {
     22     JsonNumberSafeCount,
     23 }
     24 
     25 #[derive(Clone, Copy, Debug, Eq, PartialEq)]
     26 pub struct TradeLargeIntegerPolicyEntry {
     27     pub type_name: &'static str,
     28     pub field_name: &'static str,
     29     pub policy: TradeLargeIntegerPolicy,
     30 }
     31 
     32 pub const TRADE_TYPE_INVENTORY: &[TradeTypeInventoryEntry] = &[
     33     event_import("RadrootsFarmRef"),
     34     event_import("RadrootsListing"),
     35     event_import("RadrootsListingAvailability"),
     36     event_import("RadrootsListingBin"),
     37     event_import("RadrootsListingDeliveryMethod"),
     38     event_import("RadrootsListingLocation"),
     39     event_import("RadrootsListingProduct"),
     40     event_import("RadrootsListingStatus"),
     41     local_shape("RadrootsTradeFacetCount"),
     42     source_root("RadrootsTradeListing"),
     43     local_shape("RadrootsTradeListingBackofficeOverlay"),
     44     local_shape("RadrootsTradeListingBackofficeQuery"),
     45     local_shape("RadrootsTradeListingBackofficeView"),
     46     local_shape("RadrootsTradeListingBinProjection"),
     47     local_shape("RadrootsTradeListingFacets"),
     48     local_shape("RadrootsTradeListingMarketStatus"),
     49     local_shape("RadrootsTradeListingProjection"),
     50     local_shape("RadrootsTradeListingQuery"),
     51     local_shape("RadrootsTradeListingSort"),
     52     local_shape("RadrootsTradeListingSortField"),
     53     source_root("RadrootsTradeListingSubtotal"),
     54     source_root("RadrootsTradeListingTotal"),
     55     local_shape("RadrootsTradeMarketplaceListingSummary"),
     56     local_shape("RadrootsTradeMarketplaceOrderSummary"),
     57     event_import("RadrootsTradeMessageType"),
     58     local_shape("RadrootsTradeModerationFlag"),
     59     local_shape("RadrootsTradeModerationSeverity"),
     60     local_shape("RadrootsTradeModerationStatus"),
     61     local_shape("RadrootsTradeOrderBackofficeOverlay"),
     62     local_shape("RadrootsTradeOrderBackofficeQuery"),
     63     local_shape("RadrootsTradeOrderBackofficeView"),
     64     local_shape("RadrootsTradeOrderFacets"),
     65     local_shape("RadrootsTradeOrderQuery"),
     66     local_shape("RadrootsTradeOrderSort"),
     67     local_shape("RadrootsTradeOrderSortField"),
     68     event_import("RadrootsTradeOrderStatus"),
     69     local_shape("RadrootsTradeOrderWorkflowMessage"),
     70     local_shape("RadrootsTradeOrderWorkflowProjection"),
     71     local_shape("RadrootsTradeReviewPriority"),
     72     local_shape("RadrootsTradeReviewQueueEntry"),
     73     local_shape("RadrootsTradeReviewStatus"),
     74     local_shape("RadrootsTradeSortDirection"),
     75 ];
     76 
     77 pub const TRADE_LARGE_INTEGER_POLICIES: &[TradeLargeIntegerPolicyEntry] = &[
     78     json_number_safe_count("RadrootsTradeFacetCount", "count"),
     79     json_number_safe_count(
     80         "RadrootsTradeListingBackofficeView",
     81         "open_moderation_flag_count",
     82     ),
     83     json_number_safe_count("RadrootsTradeListingProjection", "order_count"),
     84     json_number_safe_count("RadrootsTradeListingProjection", "open_order_count"),
     85     json_number_safe_count("RadrootsTradeListingProjection", "terminal_order_count"),
     86     json_number_safe_count("RadrootsTradeMarketplaceListingSummary", "order_count"),
     87     json_number_safe_count("RadrootsTradeMarketplaceListingSummary", "open_order_count"),
     88     json_number_safe_count(
     89         "RadrootsTradeMarketplaceListingSummary",
     90         "terminal_order_count",
     91     ),
     92     json_number_safe_count("RadrootsTradeMarketplaceOrderSummary", "item_count"),
     93     json_number_safe_count("RadrootsTradeMarketplaceOrderSummary", "total_bin_count"),
     94     json_number_safe_count(
     95         "RadrootsTradeOrderBackofficeView",
     96         "open_moderation_flag_count",
     97     ),
     98     json_number_safe_count("RadrootsTradeOrderWorkflowProjection", "question_count"),
     99     json_number_safe_count("RadrootsTradeOrderWorkflowProjection", "answer_count"),
    100     json_number_safe_count("RadrootsTradeOrderWorkflowProjection", "revision_count"),
    101     json_number_safe_count(
    102         "RadrootsTradeOrderWorkflowProjection",
    103         "discount_request_count",
    104     ),
    105     json_number_safe_count(
    106         "RadrootsTradeOrderWorkflowProjection",
    107         "discount_offer_count",
    108     ),
    109     json_number_safe_count(
    110         "RadrootsTradeOrderWorkflowProjection",
    111         "discount_accept_count",
    112     ),
    113     json_number_safe_count(
    114         "RadrootsTradeOrderWorkflowProjection",
    115         "discount_decline_count",
    116     ),
    117     json_number_safe_count("RadrootsTradeOrderWorkflowProjection", "cancellation_count"),
    118 ];
    119 
    120 const fn source_root(export_name: &'static str) -> TradeTypeInventoryEntry {
    121     TradeTypeInventoryEntry {
    122         export_name,
    123         disposition: TradeTypeDisposition::SourceTradeRoot,
    124     }
    125 }
    126 
    127 const fn event_import(export_name: &'static str) -> TradeTypeInventoryEntry {
    128     TradeTypeInventoryEntry {
    129         export_name,
    130         disposition: TradeTypeDisposition::EventsBindingImport,
    131     }
    132 }
    133 
    134 const fn local_shape(export_name: &'static str) -> TradeTypeInventoryEntry {
    135     TradeTypeInventoryEntry {
    136         export_name,
    137         disposition: TradeTypeDisposition::SdkLocalPackageShape,
    138     }
    139 }
    140 
    141 const fn json_number_safe_count(
    142     type_name: &'static str,
    143     field_name: &'static str,
    144 ) -> TradeLargeIntegerPolicyEntry {
    145     TradeLargeIntegerPolicyEntry {
    146         type_name,
    147         field_name,
    148         policy: TradeLargeIntegerPolicy::JsonNumberSafeCount,
    149     }
    150 }
    151 
    152 #[cfg(test)]
    153 mod tests {
    154     use super::{
    155         TRADE_LARGE_INTEGER_POLICIES, TRADE_TYPE_INVENTORY, TradeTypeDisposition, dto_roots,
    156     };
    157 
    158     #[test]
    159     fn trade_dto_roots_build_registry() {
    160         let registry = dto_bindgen_core::build_registry(dto_roots());
    161 
    162         assert!(
    163             !registry.has_errors(),
    164             "trade binding registry has diagnostics: {:?}",
    165             registry.diagnostics
    166         );
    167     }
    168 
    169     #[test]
    170     fn trade_type_inventory_is_deterministic() {
    171         let expected = TRADE_TYPE_INVENTORY
    172             .iter()
    173             .map(|entry| entry.export_name)
    174             .collect::<Vec<_>>();
    175 
    176         assert_eq!(
    177             expected,
    178             [
    179                 "RadrootsFarmRef",
    180                 "RadrootsListing",
    181                 "RadrootsListingAvailability",
    182                 "RadrootsListingBin",
    183                 "RadrootsListingDeliveryMethod",
    184                 "RadrootsListingLocation",
    185                 "RadrootsListingProduct",
    186                 "RadrootsListingStatus",
    187                 "RadrootsTradeFacetCount",
    188                 "RadrootsTradeListing",
    189                 "RadrootsTradeListingBackofficeOverlay",
    190                 "RadrootsTradeListingBackofficeQuery",
    191                 "RadrootsTradeListingBackofficeView",
    192                 "RadrootsTradeListingBinProjection",
    193                 "RadrootsTradeListingFacets",
    194                 "RadrootsTradeListingMarketStatus",
    195                 "RadrootsTradeListingProjection",
    196                 "RadrootsTradeListingQuery",
    197                 "RadrootsTradeListingSort",
    198                 "RadrootsTradeListingSortField",
    199                 "RadrootsTradeListingSubtotal",
    200                 "RadrootsTradeListingTotal",
    201                 "RadrootsTradeMarketplaceListingSummary",
    202                 "RadrootsTradeMarketplaceOrderSummary",
    203                 "RadrootsTradeMessageType",
    204                 "RadrootsTradeModerationFlag",
    205                 "RadrootsTradeModerationSeverity",
    206                 "RadrootsTradeModerationStatus",
    207                 "RadrootsTradeOrderBackofficeOverlay",
    208                 "RadrootsTradeOrderBackofficeQuery",
    209                 "RadrootsTradeOrderBackofficeView",
    210                 "RadrootsTradeOrderFacets",
    211                 "RadrootsTradeOrderQuery",
    212                 "RadrootsTradeOrderSort",
    213                 "RadrootsTradeOrderSortField",
    214                 "RadrootsTradeOrderStatus",
    215                 "RadrootsTradeOrderWorkflowMessage",
    216                 "RadrootsTradeOrderWorkflowProjection",
    217                 "RadrootsTradeReviewPriority",
    218                 "RadrootsTradeReviewQueueEntry",
    219                 "RadrootsTradeReviewStatus",
    220                 "RadrootsTradeSortDirection"
    221             ]
    222         );
    223     }
    224 
    225     #[test]
    226     fn source_owned_trade_support_types_are_marked_for_event_import() {
    227         for export_name in [
    228             "RadrootsFarmRef",
    229             "RadrootsListing",
    230             "RadrootsListingAvailability",
    231             "RadrootsListingBin",
    232             "RadrootsListingDeliveryMethod",
    233             "RadrootsListingLocation",
    234             "RadrootsListingProduct",
    235             "RadrootsListingStatus",
    236             "RadrootsTradeMessageType",
    237             "RadrootsTradeOrderStatus",
    238         ] {
    239             assert_eq!(
    240                 disposition(export_name),
    241                 TradeTypeDisposition::EventsBindingImport
    242             );
    243         }
    244     }
    245 
    246     #[test]
    247     fn trade_source_roots_are_marked_for_source_registry() {
    248         let source_roots = TRADE_TYPE_INVENTORY
    249             .iter()
    250             .filter(|entry| entry.disposition == TradeTypeDisposition::SourceTradeRoot)
    251             .map(|entry| entry.export_name)
    252             .collect::<Vec<_>>();
    253 
    254         assert_eq!(
    255             source_roots,
    256             [
    257                 "RadrootsTradeListing",
    258                 "RadrootsTradeListingSubtotal",
    259                 "RadrootsTradeListingTotal"
    260             ]
    261         );
    262     }
    263 
    264     #[test]
    265     fn trade_large_integer_policy_covers_current_count_fields() {
    266         let actual = TRADE_LARGE_INTEGER_POLICIES
    267             .iter()
    268             .map(|entry| (entry.type_name, entry.field_name, entry.policy))
    269             .collect::<Vec<_>>();
    270 
    271         assert_eq!(
    272             actual,
    273             [
    274                 (
    275                     "RadrootsTradeFacetCount",
    276                     "count",
    277                     super::TradeLargeIntegerPolicy::JsonNumberSafeCount
    278                 ),
    279                 (
    280                     "RadrootsTradeListingBackofficeView",
    281                     "open_moderation_flag_count",
    282                     super::TradeLargeIntegerPolicy::JsonNumberSafeCount
    283                 ),
    284                 (
    285                     "RadrootsTradeListingProjection",
    286                     "order_count",
    287                     super::TradeLargeIntegerPolicy::JsonNumberSafeCount
    288                 ),
    289                 (
    290                     "RadrootsTradeListingProjection",
    291                     "open_order_count",
    292                     super::TradeLargeIntegerPolicy::JsonNumberSafeCount
    293                 ),
    294                 (
    295                     "RadrootsTradeListingProjection",
    296                     "terminal_order_count",
    297                     super::TradeLargeIntegerPolicy::JsonNumberSafeCount
    298                 ),
    299                 (
    300                     "RadrootsTradeMarketplaceListingSummary",
    301                     "order_count",
    302                     super::TradeLargeIntegerPolicy::JsonNumberSafeCount
    303                 ),
    304                 (
    305                     "RadrootsTradeMarketplaceListingSummary",
    306                     "open_order_count",
    307                     super::TradeLargeIntegerPolicy::JsonNumberSafeCount
    308                 ),
    309                 (
    310                     "RadrootsTradeMarketplaceListingSummary",
    311                     "terminal_order_count",
    312                     super::TradeLargeIntegerPolicy::JsonNumberSafeCount
    313                 ),
    314                 (
    315                     "RadrootsTradeMarketplaceOrderSummary",
    316                     "item_count",
    317                     super::TradeLargeIntegerPolicy::JsonNumberSafeCount
    318                 ),
    319                 (
    320                     "RadrootsTradeMarketplaceOrderSummary",
    321                     "total_bin_count",
    322                     super::TradeLargeIntegerPolicy::JsonNumberSafeCount
    323                 ),
    324                 (
    325                     "RadrootsTradeOrderBackofficeView",
    326                     "open_moderation_flag_count",
    327                     super::TradeLargeIntegerPolicy::JsonNumberSafeCount
    328                 ),
    329                 (
    330                     "RadrootsTradeOrderWorkflowProjection",
    331                     "question_count",
    332                     super::TradeLargeIntegerPolicy::JsonNumberSafeCount
    333                 ),
    334                 (
    335                     "RadrootsTradeOrderWorkflowProjection",
    336                     "answer_count",
    337                     super::TradeLargeIntegerPolicy::JsonNumberSafeCount
    338                 ),
    339                 (
    340                     "RadrootsTradeOrderWorkflowProjection",
    341                     "revision_count",
    342                     super::TradeLargeIntegerPolicy::JsonNumberSafeCount
    343                 ),
    344                 (
    345                     "RadrootsTradeOrderWorkflowProjection",
    346                     "discount_request_count",
    347                     super::TradeLargeIntegerPolicy::JsonNumberSafeCount
    348                 ),
    349                 (
    350                     "RadrootsTradeOrderWorkflowProjection",
    351                     "discount_offer_count",
    352                     super::TradeLargeIntegerPolicy::JsonNumberSafeCount
    353                 ),
    354                 (
    355                     "RadrootsTradeOrderWorkflowProjection",
    356                     "discount_accept_count",
    357                     super::TradeLargeIntegerPolicy::JsonNumberSafeCount
    358                 ),
    359                 (
    360                     "RadrootsTradeOrderWorkflowProjection",
    361                     "discount_decline_count",
    362                     super::TradeLargeIntegerPolicy::JsonNumberSafeCount
    363                 ),
    364                 (
    365                     "RadrootsTradeOrderWorkflowProjection",
    366                     "cancellation_count",
    367                     super::TradeLargeIntegerPolicy::JsonNumberSafeCount
    368                 ),
    369             ]
    370         );
    371     }
    372 
    373     fn disposition(export_name: &str) -> TradeTypeDisposition {
    374         TRADE_TYPE_INVENTORY
    375             .iter()
    376             .find(|entry| entry.export_name == export_name)
    377             .map(|entry| entry.disposition)
    378             .expect("inventory entry")
    379     }
    380 }