kalshi-pmx 0.1.1

Async Rust client for Kalshi's Trade API and WebSocket streams.
Documentation
use kalshi_pmx::generated::{
    BatchCreateOrdersV2Request, BookSide, CreateOrderGroupRequest, CreateOrderV2Request,
    CreateRFQRequest, SelfTradePreventionType, UpdateOrderGroupLimitRequest,
};
use serde_json::json;

#[test]
fn generated_component_enums_serialize_and_deserialize() {
    assert_eq!(serde_json::to_value(BookSide::Bid).unwrap(), json!("bid"));
    assert_eq!(
        serde_json::from_value::<BookSide>(json!("ask")).unwrap(),
        BookSide::Ask
    );
    assert_eq!(
        serde_json::to_value(SelfTradePreventionType::TakerAtCross).unwrap(),
        json!("taker_at_cross")
    );
    assert_eq!(
        serde_json::from_value::<SelfTradePreventionType>(json!("maker")).unwrap(),
        SelfTradePreventionType::Maker
    );
}

#[test]
fn generated_order_request_builder_sets_required_and_optional_fields() {
    let order = CreateOrderV2Request::new(
        "TICKER-1",
        BookSide::Bid,
        "1.00",
        "0.5000",
        "good_till_canceled",
        SelfTradePreventionType::TakerAtCross,
    )
    .client_order_id("client-1")
    .post_only(true)
    .subaccount(7);

    let value = serde_json::to_value(&order).unwrap();
    assert_eq!(value["ticker"], "TICKER-1");
    assert_eq!(value["side"], "bid");
    assert_eq!(value["count"], "1.00");
    assert_eq!(value["price"], "0.5000");
    assert_eq!(value["client_order_id"], "client-1");
    assert_eq!(value["post_only"], true);
    assert_eq!(value["subaccount"], 7);
    assert!(value.get("reduce_only").is_none());

    let batch = BatchCreateOrdersV2Request::new(vec![order]);
    let batch = serde_json::to_value(batch).unwrap();
    assert_eq!(batch["orders"].as_array().unwrap().len(), 1);
}

#[test]
fn generated_misc_request_builders_cover_empty_and_fixed_point_bodies() {
    let group = CreateOrderGroupRequest::new()
        .subaccount(4)
        .contracts_limit_fp("3.50");
    let group = serde_json::to_value(group).unwrap();
    assert_eq!(group["subaccount"], 4);
    assert_eq!(group["contracts_limit_fp"], "3.50");

    let limit = UpdateOrderGroupLimitRequest::new().contracts_limit(10);
    let limit = serde_json::to_value(limit).unwrap();
    assert_eq!(limit["contracts_limit"], 10);

    let rfq = CreateRFQRequest::new("TICKER-1", false)
        .contracts_fp("2.00")
        .target_cost_dollars("1.25")
        .replace_existing(true);
    let rfq = serde_json::to_value(rfq).unwrap();
    assert_eq!(rfq["market_ticker"], "TICKER-1");
    assert_eq!(rfq["contracts_fp"], "2.00");
    assert_eq!(rfq["target_cost_dollars"], "1.25");
    assert_eq!(rfq["rest_remainder"], false);
    assert_eq!(rfq["replace_existing"], true);
}