1
+ use anyhow:: Context ;
1
2
use serde:: Deserialize ;
2
3
3
4
use shopify_function:: prelude:: * ;
@@ -26,53 +27,44 @@ type CartResponseData = cart_run::input::ResponseData;
26
27
type DeliveryResponseData = delivery_run:: input:: ResponseData ;
27
28
28
29
impl CartResponseData {
29
- fn metafield ( & self ) -> Metafield {
30
- self . discount_node
30
+ fn metafield ( & self ) -> anyhow:: Result < Metafield > {
31
+ let metafield = self
32
+ . discount_node
31
33
. metafield
32
34
. as_ref ( )
33
- . map ( |metafield| serde_json:: from_str ( & metafield. value ) )
34
- . unwrap ( )
35
- . expect ( "Missing required metafield configuration" )
35
+ . context ( "Missing metafield" ) ?;
36
+ serde_json:: from_str ( & metafield. value ) . context ( "Metafield value cannot be parsed" )
36
37
}
37
- fn valid_discount_codes ( & self ) -> Vec < String > {
38
- self . fetch_result
39
- . as_ref ( )
40
- . unwrap ( )
41
- . body
42
- . as_ref ( )
43
- . map ( |available_codes| serde_json:: from_str ( available_codes) )
44
- . unwrap ( )
45
- . expect ( "Missing required metafield configuration" )
38
+ fn valid_discount_codes ( & self ) -> anyhow:: Result < Vec < String > > {
39
+ let fetch_result = self . fetch_result . as_ref ( ) . context ( "Missing fetch result" ) ?;
40
+ let body = fetch_result. body . as_ref ( ) . context ( "Missing body" ) ?;
41
+ serde_json:: from_str ( body) . context ( "Fetch result body cannot be parsed" )
46
42
}
47
43
}
48
44
49
45
impl DeliveryResponseData {
50
- fn metafield ( & self ) -> Metafield {
51
- self . discount_node
46
+ fn metafield ( & self ) -> anyhow:: Result < Metafield > {
47
+ let metafield = & self
48
+ . discount_node
52
49
. metafield
53
50
. as_ref ( )
54
- . map ( |metafield| serde_json:: from_str ( & metafield. value ) )
55
- . unwrap ( )
56
- . expect ( "Missing required metafield configuration" )
51
+ . context ( "Missing metafield" ) ?;
52
+ serde_json:: from_str ( & metafield. value ) . context ( "Metafield value cannot be parsed" )
57
53
}
58
54
59
- fn valid_discount_codes ( & self ) -> Vec < String > {
60
- self . fetch_result
61
- . as_ref ( )
62
- . unwrap ( )
63
- . body
64
- . as_ref ( )
65
- . map ( |available_codes| serde_json:: from_str ( available_codes) )
66
- . unwrap ( )
67
- . expect ( "Missing required metafield configuration" )
55
+ fn valid_discount_codes ( & self ) -> anyhow:: Result < Vec < String > > {
56
+ let fetch_result = self . fetch_result . as_ref ( ) . expect ( "Missing fetch result" ) ;
57
+ let body = fetch_result. body . as_ref ( ) . expect ( "Missing body" ) ;
58
+ serde_json:: from_str ( body) . context ( "Fetch result body cannot be parsed" )
68
59
}
69
60
}
70
61
71
62
#[ derive( Deserialize ) ]
63
+ #[ serde( rename_all = "camelCase" ) ]
72
64
struct Metafield {
73
- cart_percent : Option < Decimal > ,
74
- product_percent : Option < Decimal > ,
75
- delivery_percent : Option < Decimal > ,
65
+ order_percentage : Option < Decimal > ,
66
+ product_percentage : Option < Decimal > ,
67
+ delivery_percentage : Option < Decimal > ,
76
68
}
77
69
78
70
#[ shopify_function_target(
@@ -81,15 +73,14 @@ struct Metafield {
81
73
schema_path = "schema.graphql"
82
74
) ]
83
75
fn cart_run ( input : CartResponseData ) -> Result < FunctionCartRunResult > {
84
- let default = FunctionCartRunResult { operations : vec ! [ ] } ;
85
- let codes = input. valid_discount_codes ( ) ;
76
+ let codes = input. valid_discount_codes ( ) ?;
86
77
let available_discount_code = codes. first ( ) ;
87
78
88
79
if available_discount_code. is_none ( ) {
89
- return Ok ( default ) ;
80
+ return Ok ( FunctionCartRunResult { operations : vec ! [ ] } ) ;
90
81
}
91
82
92
- let metafield = input. metafield ( ) ;
83
+ let metafield = input. metafield ( ) ? ;
93
84
let mut operations: Vec < CartOperation > = vec ! [ ] ;
94
85
let available_discount_code = available_discount_code. unwrap ( ) ;
95
86
@@ -101,11 +92,11 @@ fn cart_run(input: CartResponseData) -> Result<FunctionCartRunResult> {
101
92
} ,
102
93
) ) ;
103
94
104
- if metafield. cart_percent . is_some ( ) {
95
+ if metafield. order_percentage . is_some ( ) {
105
96
operations. push ( create_order_discount ( & metafield, available_discount_code) ) ;
106
97
}
107
98
108
- if metafield. product_percent . is_some ( ) {
99
+ if metafield. product_percentage . is_some ( ) {
109
100
let highest_priced_line = input
110
101
. cart
111
102
. lines
@@ -132,13 +123,12 @@ fn cart_run(input: CartResponseData) -> Result<FunctionCartRunResult> {
132
123
schema_path = "schema.graphql"
133
124
) ]
134
125
fn delivery_run ( input : DeliveryResponseData ) -> Result < FunctionDeliveryRunResult > {
135
- let default = FunctionDeliveryRunResult { operations : vec ! [ ] } ;
136
- let codes = input. valid_discount_codes ( ) ;
126
+ let codes = input. valid_discount_codes ( ) ?;
137
127
let available_discount_code = codes. first ( ) ;
138
- let metafield = input. metafield ( ) ;
128
+ let metafield = input. metafield ( ) ? ;
139
129
140
- if available_discount_code. is_none ( ) || metafield. delivery_percent . is_none ( ) {
141
- return Ok ( default ) ;
130
+ if available_discount_code. is_none ( ) || metafield. delivery_percentage . is_none ( ) {
131
+ return Ok ( FunctionDeliveryRunResult { operations : vec ! [ ] } ) ;
142
132
}
143
133
144
134
let mut operations: Vec < DeliveryOperation > = vec ! [ ] ;
@@ -183,7 +173,7 @@ fn create_order_discount(metafield: &Metafield, available_discount_code: &str) -
183
173
} ) ,
184
174
message: None ,
185
175
value: OrderDiscountCandidateValue :: Percentage ( CartPercentage {
186
- value: metafield. cart_percent . unwrap( ) ,
176
+ value: metafield. order_percentage . unwrap( ) ,
187
177
} ) ,
188
178
conditions: None ,
189
179
} ] ,
@@ -207,7 +197,7 @@ fn create_product_discount(
207
197
} ) ,
208
198
message: None ,
209
199
value: ProductDiscountCandidateValue :: Percentage ( CartPercentage {
210
- value: metafield. product_percent . unwrap( ) ,
200
+ value: metafield. product_percentage . unwrap( ) ,
211
201
} ) ,
212
202
} ] ,
213
203
} )
@@ -225,7 +215,7 @@ fn create_delivery_discount_candidate(
225
215
} ,
226
216
) ] ,
227
217
value : DeliveryDiscountCandidateValue :: Percentage ( DeliveryPercentage {
228
- value : metafield. delivery_percent . unwrap ( ) ,
218
+ value : metafield. delivery_percentage . unwrap ( ) ,
229
219
} ) ,
230
220
message : None ,
231
221
associated_discount_code : Some ( DeliveryAssociatedDiscountCode {
@@ -271,9 +261,9 @@ mod tests {
271
261
"discountNode" : {
272
262
"metafield" : {
273
263
"value" : json!( {
274
- "cart_percent " : "10" ,
275
- "product_percent " : "20" ,
276
- "delivery_percent " : "30" ,
264
+ "orderPercentage " : "10" ,
265
+ "productPercentage " : "20" ,
266
+ "deliveryPercentage " : "30" ,
277
267
} ) . to_string( ) ,
278
268
}
279
269
} ,
0 commit comments