use crate::models::Platform;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum Subscription {
NewOrders {
platform: Option<Platform>,
crossplay: bool,
},
Item { item_id: String },
Profile { user_id: String },
}
impl Subscription {
pub fn all_new_orders() -> Self {
Self::NewOrders {
platform: None,
crossplay: true,
}
}
pub fn new_orders_for(platform: Platform) -> Self {
Self::NewOrders {
platform: Some(platform),
crossplay: true,
}
}
pub fn new_orders(platform: Option<Platform>, crossplay: bool) -> Self {
Self::NewOrders {
platform,
crossplay,
}
}
pub fn item(item_id: impl Into<String>) -> Self {
Self::Item {
item_id: item_id.into(),
}
}
pub fn profile(user_id: impl Into<String>) -> Self {
Self::Profile {
user_id: user_id.into(),
}
}
pub(crate) fn subscribe_route(&self) -> &'static str {
match self {
Self::NewOrders { .. } => "@wfm|cmd/subscribe/newOrders",
Self::Item { .. } => "@wfm|cmd/subscribe/item",
Self::Profile { .. } => "@wfm|cmd/subscribe/profile",
}
}
pub(crate) fn unsubscribe_route(&self) -> &'static str {
match self {
Self::NewOrders { .. } => "@wfm|cmd/unsubscribe/newOrders",
Self::Item { .. } => "@wfm|cmd/unsubscribe/item",
Self::Profile { .. } => "@wfm|cmd/unsubscribe/profile",
}
}
pub(crate) fn to_payload(&self) -> serde_json::Value {
match self {
Self::NewOrders {
platform,
crossplay,
} => {
let mut payload = serde_json::json!({
"crossplay": crossplay,
});
if let Some(p) = platform {
payload["platform"] = serde_json::json!(p);
}
payload
}
Self::Item { item_id } => {
serde_json::json!({
"itemId": item_id,
})
}
Self::Profile { user_id } => {
serde_json::json!({
"userId": user_id,
})
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_all_new_orders() {
let sub = Subscription::all_new_orders();
assert!(matches!(
sub,
Subscription::NewOrders {
platform: None,
crossplay: true
}
));
}
#[test]
fn test_item_subscription() {
let sub = Subscription::item("nikana_prime_set");
assert!(matches!(sub, Subscription::Item { item_id } if item_id == "nikana_prime_set"));
}
#[test]
fn test_payload_generation() {
let sub = Subscription::item("test-item");
let payload = sub.to_payload();
assert_eq!(payload["itemId"], "test-item");
}
}