1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Deserialize, Serialize)]
4#[serde(rename_all = "camelCase")]
5pub struct InitializeRequest {}
6
7#[derive(Debug, Clone, Default, Deserialize, Serialize)]
8#[serde(rename_all = "camelCase")]
9pub struct InitializeResponse {
10 pub success: bool,
11}
12
13#[derive(Debug, Deserialize, Serialize)]
14#[serde(rename_all = "camelCase")]
15pub struct GetProductsRequest {
16 pub product_ids: Vec<String>,
17 #[serde(default = "default_product_type")]
18 pub product_type: String,
19}
20
21fn default_product_type() -> String {
22 "subs".to_string()
23}
24
25#[derive(Debug, Clone, Deserialize, Serialize)]
26#[serde(rename_all = "camelCase")]
27pub struct PricingPhase {
28 pub formatted_price: String,
29 pub price_currency_code: String,
30 pub price_amount_micros: i64,
31 pub billing_period: String,
32 pub billing_cycle_count: i32,
33 pub recurrence_mode: i32,
34}
35
36#[derive(Debug, Clone, Deserialize, Serialize)]
37#[serde(rename_all = "camelCase")]
38pub struct SubscriptionOffer {
39 pub offer_token: String,
40 pub base_plan_id: String,
41 pub offer_id: Option<String>,
42 pub pricing_phases: Vec<PricingPhase>,
43}
44
45#[derive(Debug, Clone, Deserialize, Serialize)]
46#[serde(rename_all = "camelCase")]
47pub struct Product {
48 pub product_id: String,
49 pub title: String,
50 pub description: String,
51 pub product_type: String,
52 #[serde(skip_serializing_if = "Option::is_none")]
53 pub formatted_price: Option<String>,
54 #[serde(skip_serializing_if = "Option::is_none")]
55 pub price_currency_code: Option<String>,
56 #[serde(skip_serializing_if = "Option::is_none")]
57 pub price_amount_micros: Option<i64>,
58 #[serde(skip_serializing_if = "Option::is_none")]
59 pub subscription_offer_details: Option<Vec<SubscriptionOffer>>,
60}
61
62#[derive(Debug, Clone, Deserialize, Serialize)]
63#[serde(rename_all = "camelCase")]
64pub struct GetProductsResponse {
65 pub products: Vec<Product>,
66}
67
68#[derive(Debug, Deserialize, Serialize)]
69#[serde(rename_all = "camelCase")]
70pub struct PurchaseRequest {
71 pub product_id: String,
72 #[serde(default = "default_product_type")]
73 pub product_type: String,
74 #[serde(skip_serializing_if = "Option::is_none")]
75 pub offer_token: Option<String>,
76}
77
78#[derive(Debug, Clone, Deserialize, Serialize)]
79#[serde(rename_all = "camelCase")]
80pub struct Purchase {
81 pub order_id: Option<String>,
82 pub package_name: String,
83 pub product_id: String,
84 pub purchase_time: i64,
85 pub purchase_token: String,
86 pub purchase_state: i32,
87 pub is_auto_renewing: bool,
88 pub is_acknowledged: bool,
89 pub original_json: String,
90 pub signature: String,
91}
92
93#[derive(Debug, Clone, Deserialize, Serialize)]
94#[serde(rename_all = "camelCase")]
95pub struct RestorePurchasesRequest {
96 #[serde(default = "default_product_type")]
97 pub product_type: String,
98}
99
100#[derive(Debug, Clone, Deserialize, Serialize)]
101#[serde(rename_all = "camelCase")]
102pub struct RestorePurchasesResponse {
103 pub purchases: Vec<Purchase>,
104}
105
106#[derive(Debug, Clone, Deserialize, Serialize)]
107#[serde(rename_all = "camelCase")]
108pub struct PurchaseHistoryRecord {
109 pub product_id: String,
110 pub purchase_time: i64,
111 pub purchase_token: String,
112 pub quantity: i32,
113 pub original_json: String,
114 pub signature: String,
115}
116
117#[derive(Debug, Clone, Deserialize, Serialize)]
118#[serde(rename_all = "camelCase")]
119pub struct GetPurchaseHistoryResponse {
120 pub history: Vec<PurchaseHistoryRecord>,
121}
122
123#[derive(Debug, Deserialize, Serialize)]
124#[serde(rename_all = "camelCase")]
125pub struct AcknowledgePurchaseRequest {
126 pub purchase_token: String,
127}
128
129#[derive(Debug, Clone, Deserialize, Serialize)]
130#[serde(rename_all = "camelCase")]
131pub struct AcknowledgePurchaseResponse {
132 pub success: bool,
133}