• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

gluesql / gluesql / 19007449208

02 Nov 2025 04:42AM UTC coverage: 97.993% (-0.02%) from 98.015%
19007449208

push

github

web-flow
Merge pull request #1833 from moreal/clippy-manual-let-else

Resolves more clippy rules

clippy::manual_let_else
clippy::manual_string_new
clippy::manual_assert
clippy::from_iter_instead_of_collect
clippy::implicit_clone
clippy::inefficient_to_string
clippy::map_unwrap_or
clippy::needless_continue

279 of 304 new or added lines in 59 files covered. (91.78%)

2 existing lines in 2 files now uncovered.

39502 of 40311 relevant lines covered (97.99%)

73228.77 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

99.82
/core/src/data/value/binary_op/integer/macros.rs
1
macro_rules! impl_interval_method {
2
    (checked_mul, $lhs_variant: ident, $op: ident, $lhs: ident, $rhs: ident) => {
3
        return Ok(Value::Interval($lhs * $rhs))
4
    };
5
    ($other: ident, $lhs_variant: ident, $op: ident, $lhs: ident, $rhs: ident) => {
6
        return Err(ValueError::NonNumericMathOperation {
7
            lhs: $lhs_variant($lhs),
8
            operator: $op,
9
            rhs: Value::Interval($rhs),
10
        }
11
        .into())
12
    };
13
}
14

15
macro_rules! impl_method {
16
    ($lhs_variant: ident, $lhs_primitive: ident, $lhs: ident, $method: ident, $op: ident, $rhs: ident) => {{
17
        match *$rhs {
18
            I8(rhs) => $lhs
19
                .$method($lhs_primitive::try_from($rhs)?)
20
                .ok_or_else(|| {
50✔
21
                    ValueError::BinaryOperationOverflow {
50✔
22
                        lhs: $lhs_variant($lhs),
50✔
23
                        rhs: I8(rhs),
50✔
24
                        operator: $op,
50✔
25
                    }
50✔
26
                    .into()
50✔
27
                }),
50✔
28
            I16(rhs) => $lhs
29
                .$method($lhs_primitive::try_from($rhs)?)
30
                .ok_or_else(|| {
50✔
31
                    ValueError::BinaryOperationOverflow {
50✔
32
                        lhs: $lhs_variant($lhs),
50✔
33
                        rhs: I16(rhs),
50✔
34
                        operator: $op,
50✔
35
                    }
50✔
36
                    .into()
50✔
37
                }),
50✔
38
            I32(rhs) => $lhs
39
                .$method($lhs_primitive::try_from($rhs)?)
40
                .ok_or_else(|| {
50✔
41
                    ValueError::BinaryOperationOverflow {
50✔
42
                        lhs: $lhs_variant($lhs),
50✔
43
                        rhs: I32(rhs),
50✔
44
                        operator: $op,
50✔
45
                    }
50✔
46
                    .into()
50✔
47
                }),
50✔
48
            I64(rhs) => $lhs
49
                .$method($lhs_primitive::try_from($rhs)?)
50
                .ok_or_else(|| {
50✔
51
                    ValueError::BinaryOperationOverflow {
50✔
52
                        lhs: $lhs_variant($lhs),
50✔
53
                        rhs: I64(rhs),
50✔
54
                        operator: $op,
50✔
55
                    }
50✔
56
                    .into()
50✔
57
                }),
50✔
58
            I128(rhs) => $lhs
59
                .$method($lhs_primitive::try_from($rhs)?)
60
                .ok_or_else(|| {
50✔
61
                    ValueError::BinaryOperationOverflow {
50✔
62
                        lhs: $lhs_variant($lhs),
50✔
63
                        rhs: I128(rhs),
50✔
64
                        operator: $op,
50✔
65
                    }
50✔
66
                    .into()
50✔
67
                }),
50✔
68
            U8(rhs) => $lhs
69
                .$method($lhs_primitive::try_from($rhs)?)
70
                .ok_or_else(|| {
50✔
71
                    ValueError::BinaryOperationOverflow {
50✔
72
                        lhs: $lhs_variant($lhs),
50✔
73
                        rhs: U8(rhs),
50✔
74
                        operator: $op,
50✔
75
                    }
50✔
76
                    .into()
50✔
77
                }),
50✔
78
            U16(rhs) => $lhs
79
                .$method($lhs_primitive::try_from($rhs)?)
80
                .ok_or_else(|| {
50✔
81
                    ValueError::BinaryOperationOverflow {
50✔
82
                        lhs: $lhs_variant($lhs),
50✔
83
                        rhs: U16(rhs),
50✔
84
                        operator: $op,
50✔
85
                    }
50✔
86
                    .into()
50✔
87
                }),
50✔
88
            U32(rhs) => $lhs
89
                .$method($lhs_primitive::try_from($rhs)?)
90
                .ok_or_else(|| {
50✔
91
                    ValueError::BinaryOperationOverflow {
50✔
92
                        lhs: $lhs_variant($lhs),
50✔
93
                        rhs: U32(rhs),
50✔
94
                        operator: $op,
50✔
95
                    }
50✔
96
                    .into()
50✔
97
                }),
50✔
98
            U64(rhs) => $lhs
99
                .$method($lhs_primitive::try_from($rhs)?)
100
                .ok_or_else(|| {
50✔
101
                    ValueError::BinaryOperationOverflow {
50✔
102
                        lhs: $lhs_variant($lhs),
50✔
103
                        rhs: U64(rhs),
50✔
104
                        operator: $op,
50✔
105
                    }
50✔
106
                    .into()
50✔
107
                }),
50✔
108
            U128(rhs) => $lhs
109
                .$method($lhs_primitive::try_from($rhs)?)
110
                .ok_or_else(|| {
50✔
111
                    ValueError::BinaryOperationOverflow {
50✔
112
                        lhs: $lhs_variant($lhs),
50✔
113
                        rhs: U128(rhs),
50✔
114
                        operator: $op,
50✔
115
                    }
50✔
116
                    .into()
50✔
117
                }),
50✔
118
            F32(rhs) => $lhs
119
                .$method($lhs_primitive::try_from($rhs)?)
120
                .ok_or_else(|| {
50✔
121
                    ValueError::BinaryOperationOverflow {
50✔
122
                        lhs: $lhs_variant($lhs),
50✔
123
                        rhs: F32(rhs),
50✔
124
                        operator: $op,
50✔
125
                    }
50✔
126
                    .into()
50✔
127
                }),
50✔
128
            F64(rhs) => $lhs
129
                .$method($lhs_primitive::try_from($rhs)?)
130
                .ok_or_else(|| {
50✔
131
                    ValueError::BinaryOperationOverflow {
50✔
132
                        lhs: $lhs_variant($lhs),
50✔
133
                        rhs: F64(rhs),
50✔
134
                        operator: $op,
50✔
135
                    }
50✔
136
                    .into()
50✔
137
                }),
50✔
138
            Decimal(rhs) => $lhs
139
                .$method($lhs_primitive::try_from($rhs)?)
140
                .ok_or_else(|| {
50✔
141
                    ValueError::BinaryOperationOverflow {
50✔
142
                        lhs: $lhs_variant($lhs),
50✔
143
                        rhs: Decimal(rhs),
50✔
144
                        operator: $op,
50✔
145
                    }
50✔
146
                    .into()
50✔
147
                }),
50✔
148
            Null => return Ok(Null),
149
            Interval(rhs) => {
150
                super::macros::impl_interval_method!($method, $lhs_variant, $op, $lhs, rhs);
151
            }
152
            _ => Err(ValueError::NonNumericMathOperation {
153
                lhs: $lhs_variant($lhs),
154
                operator: $op,
155
                rhs: $rhs.clone(),
156
            }
157
            .into()),
158
        }
159
        .map($lhs_variant)
160
    }};
161
}
162

163
macro_rules! impl_try_binary_op {
164
    ($variant: ident, $primitive: ident) => {
165
        use $crate::{
166
            data::value::{
167
                TryBinaryOperator,
168
                Value::*,
169
                error::{NumericBinaryOperator::*, ValueError},
170
            },
171
            result::Result,
172
        };
173

174
        impl TryBinaryOperator for $primitive {
175
            type Rhs = Value;
176

177
            fn try_add(&self, rhs: &Self::Rhs) -> Result<Value> {
351,159✔
178
                let lhs = *self;
351,159✔
179
                super::macros::impl_method!($variant, $primitive, lhs, checked_add, Add, rhs)
351,159✔
180
            }
351,159✔
181

182
            fn try_subtract(&self, rhs: &Self::Rhs) -> Result<Value> {
72,232✔
183
                let lhs = *self;
72,232✔
184
                super::macros::impl_method!($variant, $primitive, lhs, checked_sub, Subtract, rhs)
72,232✔
185
            }
72,232✔
186

187
            fn try_multiply(&self, rhs: &Self::Rhs) -> Result<Value> {
185,056✔
188
                let lhs = *self;
185,056✔
189
                super::macros::impl_method!($variant, $primitive, lhs, checked_mul, Multiply, rhs)
185,056✔
190
            }
185,056✔
191

192
            fn try_divide(&self, rhs: &Self::Rhs) -> Result<Value> {
58,820✔
193
                let lhs = *self;
58,820✔
194
                super::macros::impl_method!($variant, $primitive, lhs, checked_div, Divide, rhs)
58,820✔
195
            }
58,820✔
196

197
            fn try_modulo(&self, rhs: &Self::Rhs) -> Result<Value> {
75,825✔
198
                let lhs = *self;
75,825✔
199
                super::macros::impl_method!($variant, $primitive, lhs, checked_rem, Modulo, rhs)
75,825✔
200
            }
75,825✔
201
        }
202
    };
203
}
204

205
#[cfg(test)]
206
macro_rules! generate_binary_op_tests {
207
    ($variant: ident, $primitive: ident) => {
208
        mod try_binary_op_tests {
209
            use {
210
                rust_decimal::prelude::Decimal,
211
                $crate::data::{
212
                    NumericBinaryOperator::{self, *},
213
                    ValueError,
214
                    value::{
215
                        TryBinaryOperator,
216
                        Value::{self, *},
217
                    },
218
                },
219
            };
220

221
            fn overflow_err(
650✔
222
                lhs: Value,
650✔
223
                rhs: Value,
650✔
224
                op: NumericBinaryOperator,
650✔
225
            ) -> Result<Value, $crate::result::Error> {
650✔
226
                Err(ValueError::BinaryOperationOverflow {
650✔
227
                    lhs,
650✔
228
                    rhs,
650✔
229
                    operator: op,
650✔
230
                }
650✔
231
                .into())
650✔
232
            }
650✔
233

234
            #[test]
235
            fn add_overflow() {
10✔
236
                assert_eq!(
10✔
237
                    $primitive::MAX.try_add(&Decimal(Decimal::from(1))),
10✔
238
                    overflow_err($variant($primitive::MAX), Decimal(Decimal::from(1)), Add)
10✔
239
                );
240
                assert_eq!(
10✔
241
                    $primitive::MAX.try_add(&F32(1.0_f32)),
10✔
242
                    overflow_err($variant($primitive::MAX), F32(1.0_f32), Add)
10✔
243
                );
244
                assert_eq!(
10✔
245
                    $primitive::MAX.try_add(&F64(1.0)),
10✔
246
                    overflow_err($variant($primitive::MAX), F64(1.0), Add)
10✔
247
                );
248
                assert_eq!(
10✔
249
                    $primitive::MAX.try_add(&I8(1)),
10✔
250
                    overflow_err($variant($primitive::MAX), I8(1), Add)
10✔
251
                );
252
                assert_eq!(
10✔
253
                    $primitive::MAX.try_add(&I16(1)),
10✔
254
                    overflow_err($variant($primitive::MAX), I16(1), Add)
10✔
255
                );
256
                assert_eq!(
10✔
257
                    $primitive::MAX.try_add(&I32(1)),
10✔
258
                    overflow_err($variant($primitive::MAX), I32(1), Add)
10✔
259
                );
260
                assert_eq!(
10✔
261
                    $primitive::MAX.try_add(&I64(1)),
10✔
262
                    overflow_err($variant($primitive::MAX), I64(1), Add)
10✔
263
                );
264
                assert_eq!(
10✔
265
                    $primitive::MAX.try_add(&I128(1)),
10✔
266
                    overflow_err($variant($primitive::MAX), I128(1), Add)
10✔
267
                );
268
                assert_eq!(
10✔
269
                    $primitive::MAX.try_add(&U8(1)),
10✔
270
                    overflow_err($variant($primitive::MAX), U8(1), Add)
10✔
271
                );
272
                assert_eq!(
10✔
273
                    $primitive::MAX.try_add(&U16(1)),
10✔
274
                    overflow_err($variant($primitive::MAX), U16(1), Add)
10✔
275
                );
276
                assert_eq!(
10✔
277
                    $primitive::MAX.try_add(&U32(1)),
10✔
278
                    overflow_err($variant($primitive::MAX), U32(1), Add)
10✔
279
                );
280
                assert_eq!(
10✔
281
                    $primitive::MAX.try_add(&U64(1)),
10✔
282
                    overflow_err($variant($primitive::MAX), U64(1), Add)
10✔
283
                );
284
                assert_eq!(
10✔
285
                    $primitive::MAX.try_add(&U128(1)),
10✔
286
                    overflow_err($variant($primitive::MAX), U128(1), Add)
10✔
287
                );
288
            }
10✔
289

290
            #[test]
291
            fn sub_overflow() {
10✔
292
                assert_eq!(
10✔
293
                    $primitive::MIN.try_subtract(&Decimal(Decimal::from(1))),
10✔
294
                    overflow_err(
10✔
295
                        $variant($primitive::MIN),
10✔
296
                        Decimal(Decimal::from(1)),
10✔
297
                        Subtract
10✔
298
                    )
299
                );
300
                assert_eq!(
10✔
301
                    $primitive::MIN.try_subtract(&F32(1.0_f32)),
10✔
302
                    overflow_err($variant($primitive::MIN), F32(1.0_f32), Subtract)
10✔
303
                );
304
                assert_eq!(
10✔
305
                    $primitive::MIN.try_subtract(&F64(1.0)),
10✔
306
                    overflow_err($variant($primitive::MIN), F64(1.0), Subtract)
10✔
307
                );
308
                assert_eq!(
10✔
309
                    $primitive::MIN.try_subtract(&I8(1)),
10✔
310
                    overflow_err($variant($primitive::MIN), I8(1), Subtract)
10✔
311
                );
312
                assert_eq!(
10✔
313
                    $primitive::MIN.try_subtract(&I16(1)),
10✔
314
                    overflow_err($variant($primitive::MIN), I16(1), Subtract)
10✔
315
                );
316
                assert_eq!(
10✔
317
                    $primitive::MIN.try_subtract(&I32(1)),
10✔
318
                    overflow_err($variant($primitive::MIN), I32(1), Subtract)
10✔
319
                );
320
                assert_eq!(
10✔
321
                    $primitive::MIN.try_subtract(&I64(1)),
10✔
322
                    overflow_err($variant($primitive::MIN), I64(1), Subtract)
10✔
323
                );
324
                assert_eq!(
10✔
325
                    $primitive::MIN.try_subtract(&I128(1)),
10✔
326
                    overflow_err($variant($primitive::MIN), I128(1), Subtract)
10✔
327
                );
328
                assert_eq!(
10✔
329
                    $primitive::MIN.try_subtract(&U8(1)),
10✔
330
                    overflow_err($variant($primitive::MIN), U8(1), Subtract)
10✔
331
                );
332
                assert_eq!(
10✔
333
                    $primitive::MIN.try_subtract(&U16(1)),
10✔
334
                    overflow_err($variant($primitive::MIN), U16(1), Subtract)
10✔
335
                );
336
                assert_eq!(
10✔
337
                    $primitive::MIN.try_subtract(&U32(1)),
10✔
338
                    overflow_err($variant($primitive::MIN), U32(1), Subtract)
10✔
339
                );
340
                assert_eq!(
10✔
341
                    $primitive::MIN.try_subtract(&U64(1)),
10✔
342
                    overflow_err($variant($primitive::MIN), U64(1), Subtract)
10✔
343
                );
344
                assert_eq!(
10✔
345
                    $primitive::MIN.try_subtract(&U128(1)),
10✔
346
                    overflow_err($variant($primitive::MIN), U128(1), Subtract)
10✔
347
                );
348
            }
10✔
349

350
            #[test]
351
            fn mul_overflow() {
10✔
352
                assert_eq!(
10✔
353
                    $primitive::MAX.try_multiply(&Decimal(Decimal::from(2))),
10✔
354
                    overflow_err(
10✔
355
                        $variant($primitive::MAX),
10✔
356
                        Decimal(Decimal::from(2)),
10✔
357
                        Multiply
10✔
358
                    )
359
                );
360
                assert_eq!(
10✔
361
                    $primitive::MAX.try_multiply(&F32(2.0_f32)),
10✔
362
                    overflow_err($variant($primitive::MAX), F32(2.0_f32), Multiply)
10✔
363
                );
364
                assert_eq!(
10✔
365
                    $primitive::MAX.try_multiply(&F64(2.0)),
10✔
366
                    overflow_err($variant($primitive::MAX), F64(2.0), Multiply)
10✔
367
                );
368
                assert_eq!(
10✔
369
                    $primitive::MAX.try_multiply(&I8(2)),
10✔
370
                    overflow_err($variant($primitive::MAX), I8(2), Multiply)
10✔
371
                );
372
                assert_eq!(
10✔
373
                    $primitive::MAX.try_multiply(&I16(2)),
10✔
374
                    overflow_err($variant($primitive::MAX), I16(2), Multiply)
10✔
375
                );
376
                assert_eq!(
10✔
377
                    $primitive::MAX.try_multiply(&I32(2)),
10✔
378
                    overflow_err($variant($primitive::MAX), I32(2), Multiply)
10✔
379
                );
380
                assert_eq!(
10✔
381
                    $primitive::MAX.try_multiply(&I64(2)),
10✔
382
                    overflow_err($variant($primitive::MAX), I64(2), Multiply)
10✔
383
                );
384
                assert_eq!(
10✔
385
                    $primitive::MAX.try_multiply(&I128(2)),
10✔
386
                    overflow_err($variant($primitive::MAX), I128(2), Multiply)
10✔
387
                );
388
                assert_eq!(
10✔
389
                    $primitive::MAX.try_multiply(&U8(2)),
10✔
390
                    overflow_err($variant($primitive::MAX), U8(2), Multiply)
10✔
391
                );
392
                assert_eq!(
10✔
393
                    $primitive::MAX.try_multiply(&U16(2)),
10✔
394
                    overflow_err($variant($primitive::MAX), U16(2), Multiply)
10✔
395
                );
396
                assert_eq!(
10✔
397
                    $primitive::MAX.try_multiply(&U32(2)),
10✔
398
                    overflow_err($variant($primitive::MAX), U32(2), Multiply)
10✔
399
                );
400
                assert_eq!(
10✔
401
                    $primitive::MAX.try_multiply(&U64(2)),
10✔
402
                    overflow_err($variant($primitive::MAX), U64(2), Multiply)
10✔
403
                );
404
                assert_eq!(
10✔
405
                    $primitive::MAX.try_multiply(&U128(2)),
10✔
406
                    overflow_err($variant($primitive::MAX), U128(2), Multiply)
10✔
407
                );
408
            }
10✔
409

410
            #[test]
411
            fn div_overflow() {
10✔
412
                assert_eq!(
10✔
413
                    $primitive::MAX.try_divide(&Decimal(Decimal::from(0))),
10✔
414
                    overflow_err($variant($primitive::MAX), Decimal(Decimal::from(0)), Divide)
10✔
415
                );
416
                assert_eq!(
10✔
417
                    $primitive::MAX.try_divide(&F32(0.0_f32)),
10✔
418
                    overflow_err($variant($primitive::MAX), F32(0.0_f32), Divide)
10✔
419
                );
420
                assert_eq!(
10✔
421
                    $primitive::MAX.try_divide(&F64(0.0)),
10✔
422
                    overflow_err($variant($primitive::MAX), F64(0.0), Divide)
10✔
423
                );
424
                assert_eq!(
10✔
425
                    $primitive::MAX.try_divide(&I8(0)),
10✔
426
                    overflow_err($variant($primitive::MAX), I8(0), Divide)
10✔
427
                );
428
                assert_eq!(
10✔
429
                    $primitive::MAX.try_divide(&I16(0)),
10✔
430
                    overflow_err($variant($primitive::MAX), I16(0), Divide)
10✔
431
                );
432
                assert_eq!(
10✔
433
                    $primitive::MAX.try_divide(&I32(0)),
10✔
434
                    overflow_err($variant($primitive::MAX), I32(0), Divide)
10✔
435
                );
436
                assert_eq!(
10✔
437
                    $primitive::MAX.try_divide(&I64(0)),
10✔
438
                    overflow_err($variant($primitive::MAX), I64(0), Divide)
10✔
439
                );
440
                assert_eq!(
10✔
441
                    $primitive::MAX.try_divide(&I128(0)),
10✔
442
                    overflow_err($variant($primitive::MAX), I128(0), Divide)
10✔
443
                );
444
                assert_eq!(
10✔
445
                    $primitive::MAX.try_divide(&U8(0)),
10✔
446
                    overflow_err($variant($primitive::MAX), U8(0), Divide)
10✔
447
                );
448
                assert_eq!(
10✔
449
                    $primitive::MAX.try_divide(&U16(0)),
10✔
450
                    overflow_err($variant($primitive::MAX), U16(0), Divide)
10✔
451
                );
452
                assert_eq!(
10✔
453
                    $primitive::MAX.try_divide(&U32(0)),
10✔
454
                    overflow_err($variant($primitive::MAX), U32(0), Divide)
10✔
455
                );
456
                assert_eq!(
10✔
457
                    $primitive::MAX.try_divide(&U64(0)),
10✔
458
                    overflow_err($variant($primitive::MAX), U64(0), Divide)
10✔
459
                );
460
                assert_eq!(
10✔
461
                    $primitive::MAX.try_divide(&U128(0)),
10✔
462
                    overflow_err($variant($primitive::MAX), U128(0), Divide)
10✔
463
                );
464
            }
10✔
465

466
            #[test]
467
            fn mod_overflow() {
10✔
468
                assert_eq!(
10✔
469
                    $primitive::MAX.try_modulo(&Decimal(Decimal::from(0))),
10✔
470
                    overflow_err($variant($primitive::MAX), Decimal(Decimal::from(0)), Modulo)
10✔
471
                );
472
                assert_eq!(
10✔
473
                    $primitive::MAX.try_modulo(&F32(0.0_f32)),
10✔
474
                    overflow_err($variant($primitive::MAX), F32(0.0_f32), Modulo)
10✔
475
                );
476
                assert_eq!(
10✔
477
                    $primitive::MAX.try_modulo(&F64(0.0)),
10✔
478
                    overflow_err($variant($primitive::MAX), F64(0.0), Modulo)
10✔
479
                );
480
                assert_eq!(
10✔
481
                    $primitive::MAX.try_modulo(&I8(0)),
10✔
482
                    overflow_err($variant($primitive::MAX), I8(0), Modulo)
10✔
483
                );
484
                assert_eq!(
10✔
485
                    $primitive::MAX.try_modulo(&I16(0)),
10✔
486
                    overflow_err($variant($primitive::MAX), I16(0), Modulo)
10✔
487
                );
488
                assert_eq!(
10✔
489
                    $primitive::MAX.try_modulo(&I32(0)),
10✔
490
                    overflow_err($variant($primitive::MAX), I32(0), Modulo)
10✔
491
                );
492
                assert_eq!(
10✔
493
                    $primitive::MAX.try_modulo(&I64(0)),
10✔
494
                    overflow_err($variant($primitive::MAX), I64(0), Modulo)
10✔
495
                );
496
                assert_eq!(
10✔
497
                    $primitive::MAX.try_modulo(&I128(0)),
10✔
498
                    overflow_err($variant($primitive::MAX), I128(0), Modulo)
10✔
499
                );
500
                assert_eq!(
10✔
501
                    $primitive::MAX.try_modulo(&U8(0)),
10✔
502
                    overflow_err($variant($primitive::MAX), U8(0), Modulo)
10✔
503
                );
504
                assert_eq!(
10✔
505
                    $primitive::MAX.try_modulo(&U16(0)),
10✔
506
                    overflow_err($variant($primitive::MAX), U16(0), Modulo)
10✔
507
                );
508
                assert_eq!(
10✔
509
                    $primitive::MAX.try_modulo(&U32(0)),
10✔
510
                    overflow_err($variant($primitive::MAX), U32(0), Modulo)
10✔
511
                );
512
                assert_eq!(
10✔
513
                    $primitive::MAX.try_modulo(&U64(0)),
10✔
514
                    overflow_err($variant($primitive::MAX), U64(0), Modulo)
10✔
515
                );
516
                assert_eq!(
10✔
517
                    $primitive::MAX.try_modulo(&U128(0)),
10✔
518
                    overflow_err($variant($primitive::MAX), U128(0), Modulo)
10✔
519
                );
520
            }
10✔
521

522
            #[test]
523
            fn try_add() {
10✔
524
                let base: $primitive = 1;
10✔
525

526
                assert_eq!(base.try_add(&Decimal(Decimal::ONE)), Ok($variant(2)));
10✔
527
                assert_eq!(base.try_add(&F32(1.0_f32)), Ok($variant(2)));
10✔
528
                assert_eq!(base.try_add(&F64(1.0)), Ok($variant(2)));
10✔
529
                assert_eq!(base.try_add(&I8(1)), Ok($variant(2)));
10✔
530
                assert_eq!(base.try_add(&I16(1)), Ok($variant(2)));
10✔
531
                assert_eq!(base.try_add(&I32(1)), Ok($variant(2)));
10✔
532
                assert_eq!(base.try_add(&I64(1)), Ok($variant(2)));
10✔
533
                assert_eq!(base.try_add(&I128(1)), Ok($variant(2)));
10✔
534
                assert_eq!(base.try_add(&U8(1)), Ok($variant(2)));
10✔
535
                assert_eq!(base.try_add(&U16(1)), Ok($variant(2)));
10✔
536
                assert_eq!(base.try_add(&U32(1)), Ok($variant(2)));
10✔
537
                assert_eq!(base.try_add(&U64(1)), Ok($variant(2)));
10✔
538
                assert_eq!(base.try_add(&U128(1)), Ok($variant(2)));
10✔
539

540
                assert_eq!(
10✔
541
                    base.try_add(&Bool(true)),
10✔
542
                    Err(ValueError::NonNumericMathOperation {
10✔
543
                        lhs: $variant(base),
10✔
544
                        operator: NumericBinaryOperator::Add,
10✔
545
                        rhs: Bool(true)
10✔
546
                    }
10✔
547
                    .into())
10✔
548
                );
549
            }
10✔
550

551
            #[test]
552
            fn try_subtract() {
10✔
553
                let base: $primitive = 1;
10✔
554

555
                assert_eq!(base.try_subtract(&Decimal(Decimal::ONE)), Ok($variant(0)));
10✔
556
                assert_eq!(base.try_subtract(&F32(1.0_f32)), Ok($variant(0)));
10✔
557
                assert_eq!(base.try_subtract(&F64(1.0)), Ok($variant(0)));
10✔
558
                assert_eq!(base.try_subtract(&I8(1)), Ok($variant(0)));
10✔
559
                assert_eq!(base.try_subtract(&I16(1)), Ok($variant(0)));
10✔
560
                assert_eq!(base.try_subtract(&I32(1)), Ok($variant(0)));
10✔
561
                assert_eq!(base.try_subtract(&I64(1)), Ok($variant(0)));
10✔
562
                assert_eq!(base.try_subtract(&I128(1)), Ok($variant(0)));
10✔
563
                assert_eq!(base.try_subtract(&U8(1)), Ok($variant(0)));
10✔
564
                assert_eq!(base.try_subtract(&U16(1)), Ok($variant(0)));
10✔
565
                assert_eq!(base.try_subtract(&U32(1)), Ok($variant(0)));
10✔
566
                assert_eq!(base.try_subtract(&U64(1)), Ok($variant(0)));
10✔
567
                assert_eq!(base.try_subtract(&U128(1)), Ok($variant(0)));
10✔
568

569
                assert_eq!(
10✔
570
                    base.try_subtract(&Bool(true)),
10✔
571
                    Err(ValueError::NonNumericMathOperation {
10✔
572
                        lhs: $variant(base),
10✔
573
                        operator: NumericBinaryOperator::Subtract,
10✔
574
                        rhs: Bool(true)
10✔
575
                    }
10✔
576
                    .into())
10✔
577
                );
578
            }
10✔
579

580
            #[test]
581
            fn try_multiply() {
10✔
582
                let base: $primitive = 3;
10✔
583

584
                assert_eq!(base.try_multiply(&Decimal(Decimal::TWO)), Ok($variant(6)));
10✔
585
                assert_eq!(base.try_multiply(&F32(2.0_f32)), Ok($variant(6)));
10✔
586
                assert_eq!(base.try_multiply(&F64(2.0)), Ok($variant(6)));
10✔
587
                assert_eq!(base.try_multiply(&I8(2)), Ok($variant(6)));
10✔
588
                assert_eq!(base.try_multiply(&I16(2)), Ok($variant(6)));
10✔
589
                assert_eq!(base.try_multiply(&I32(2)), Ok($variant(6)));
10✔
590
                assert_eq!(base.try_multiply(&I64(2)), Ok($variant(6)));
10✔
591
                assert_eq!(base.try_multiply(&I128(2)), Ok($variant(6)));
10✔
592
                assert_eq!(base.try_multiply(&U8(2)), Ok($variant(6)));
10✔
593
                assert_eq!(base.try_multiply(&U16(2)), Ok($variant(6)));
10✔
594
                assert_eq!(base.try_multiply(&U32(2)), Ok($variant(6)));
10✔
595
                assert_eq!(base.try_multiply(&U64(2)), Ok($variant(6)));
10✔
596
                assert_eq!(base.try_multiply(&U128(2)), Ok($variant(6)));
10✔
597

598
                assert_eq!(
10✔
599
                    base.try_multiply(&Bool(true)),
10✔
600
                    Err(ValueError::NonNumericMathOperation {
10✔
601
                        lhs: $variant(base),
10✔
602
                        operator: NumericBinaryOperator::Multiply,
10✔
603
                        rhs: Bool(true)
10✔
604
                    }
10✔
605
                    .into())
10✔
606
                );
607
            }
10✔
608

609
            #[test]
610
            fn try_divide() {
10✔
611
                let base: $primitive = 6;
10✔
612

613
                assert_eq!(base.try_divide(&Decimal(Decimal::TWO)), Ok($variant(3)));
10✔
614
                assert_eq!(base.try_divide(&F32(2.0_f32)), Ok($variant(3)));
10✔
615
                assert_eq!(base.try_divide(&F64(2.0)), Ok($variant(3)));
10✔
616
                assert_eq!(base.try_divide(&I8(2)), Ok($variant(3)));
10✔
617
                assert_eq!(base.try_divide(&I16(2)), Ok($variant(3)));
10✔
618
                assert_eq!(base.try_divide(&I32(2)), Ok($variant(3)));
10✔
619
                assert_eq!(base.try_divide(&I64(2)), Ok($variant(3)));
10✔
620
                assert_eq!(base.try_divide(&I128(2)), Ok($variant(3)));
10✔
621
                assert_eq!(base.try_divide(&U8(2)), Ok($variant(3)));
10✔
622
                assert_eq!(base.try_divide(&U16(2)), Ok($variant(3)));
10✔
623
                assert_eq!(base.try_divide(&U32(2)), Ok($variant(3)));
10✔
624
                assert_eq!(base.try_divide(&U64(2)), Ok($variant(3)));
10✔
625
                assert_eq!(base.try_divide(&U128(2)), Ok($variant(3)));
10✔
626

627
                assert_eq!(
10✔
628
                    base.try_divide(&Bool(true)),
10✔
629
                    Err(ValueError::NonNumericMathOperation {
10✔
630
                        lhs: $variant(base),
10✔
631
                        operator: NumericBinaryOperator::Divide,
10✔
632
                        rhs: Bool(true)
10✔
633
                    }
10✔
634
                    .into())
10✔
635
                );
636
            }
10✔
637

638
            #[test]
639
            fn try_modulo() {
10✔
640
                let base: $primitive = 9;
10✔
641

642
                assert_eq!(base.try_modulo(&Decimal(Decimal::ONE)), Ok($variant(0)));
10✔
643
                assert_eq!(base.try_modulo(&F32(1.0_f32)), Ok($variant(0)));
10✔
644
                assert_eq!(base.try_modulo(&F64(1.0)), Ok($variant(0)));
10✔
645
                assert_eq!(base.try_modulo(&I8(1)), Ok($variant(0)));
10✔
646
                assert_eq!(base.try_modulo(&I16(1)), Ok($variant(0)));
10✔
647
                assert_eq!(base.try_modulo(&I32(1)), Ok($variant(0)));
10✔
648
                assert_eq!(base.try_modulo(&I64(1)), Ok($variant(0)));
10✔
649
                assert_eq!(base.try_modulo(&I128(1)), Ok($variant(0)));
10✔
650
                assert_eq!(base.try_modulo(&U8(1)), Ok($variant(0)));
10✔
651
                assert_eq!(base.try_modulo(&U16(1)), Ok($variant(0)));
10✔
652
                assert_eq!(base.try_modulo(&U32(1)), Ok($variant(0)));
10✔
653
                assert_eq!(base.try_modulo(&U64(1)), Ok($variant(0)));
10✔
654
                assert_eq!(base.try_modulo(&U128(1)), Ok($variant(0)));
10✔
655

656
                assert_eq!(
10✔
657
                    base.try_modulo(&Bool(true)),
10✔
658
                    Err(ValueError::NonNumericMathOperation {
10✔
659
                        lhs: $variant(base),
10✔
660
                        operator: NumericBinaryOperator::Modulo,
10✔
661
                        rhs: Bool(true)
10✔
662
                    }
10✔
663
                    .into())
10✔
664
                );
665
            }
10✔
666
        }
667
    };
668
}
669

670
macro_rules! impl_partial_cmp_ord_method {
671
    ($primitive: ident) => {
672
        impl PartialEq<Value> for $primitive {
673
            fn eq(&self, other: &Value) -> bool {
1,681,900✔
674
                if matches!(other, Value::Bool(_)) {
1,681,900✔
675
                    return false;
10✔
676
                }
1,681,890✔
677

678
                let lhs = *self;
1,681,890✔
679
                let Ok(rhs) = $primitive::try_from(other) else {
1,681,890✔
NEW
680
                    return false;
×
681
                };
682

683
                lhs == rhs
1,681,890✔
684
            }
1,681,900✔
685
        }
686

687
        impl PartialOrd<Value> for $primitive {
688
            fn partial_cmp(&self, other: &Value) -> Option<Ordering> {
209,926✔
689
                if matches!(other, Value::Bool(_)) {
209,926✔
690
                    return None;
10✔
691
                }
209,916✔
692

693
                let lhs = self;
209,916✔
694
                let Ok(rhs) = $primitive::try_from(other) else {
209,916✔
695
                    return None;
9,744✔
696
                };
697

698
                lhs.partial_cmp(&rhs)
200,172✔
699
            }
209,926✔
700
        }
701
    };
702
}
703

704
#[cfg(test)]
705
macro_rules! generate_cmp_ord_tests {
706
    ($primitive: ident) => {
707
        mod cmp_ord_tests {
708
            use {
709
                rust_decimal::prelude::Decimal, std::cmp::Ordering, $crate::data::value::Value::*,
710
            };
711

712
            #[test]
713
            fn eq() {
10✔
714
                let base: $primitive = 1;
10✔
715

716
                assert_eq!(base, Decimal(Decimal::ONE));
10✔
717
                assert_eq!(base, F32(1.0_f32));
10✔
718
                assert_eq!(base, F64(1.0));
10✔
719
                assert_eq!(base, I8(1));
10✔
720
                assert_eq!(base, I16(1));
10✔
721
                assert_eq!(base, I32(1));
10✔
722
                assert_eq!(base, I64(1));
10✔
723
                assert_eq!(base, I128(1));
10✔
724
                assert_eq!(base, U8(1));
10✔
725
                assert_eq!(base, U16(1));
10✔
726
                assert_eq!(base, U32(1));
10✔
727
                assert_eq!(base, U64(1));
10✔
728
                assert_eq!(base, U128(1));
10✔
729

730
                assert_ne!(base, Bool(true));
10✔
731
            }
10✔
732

733
            #[test]
734
            fn partial_cmp() {
10✔
735
                let base: $primitive = 1;
10✔
736

737
                assert_eq!(
10✔
738
                    base.partial_cmp(&Decimal(Decimal::ZERO)),
10✔
739
                    Some(Ordering::Greater)
740
                );
741
                assert_eq!(base.partial_cmp(&F32(0.0_f32)), Some(Ordering::Greater));
10✔
742
                assert_eq!(base.partial_cmp(&F64(0.0)), Some(Ordering::Greater));
10✔
743
                assert_eq!(base.partial_cmp(&I8(0)), Some(Ordering::Greater));
10✔
744
                assert_eq!(base.partial_cmp(&I16(0)), Some(Ordering::Greater));
10✔
745
                assert_eq!(base.partial_cmp(&I32(0)), Some(Ordering::Greater));
10✔
746
                assert_eq!(base.partial_cmp(&I64(0)), Some(Ordering::Greater));
10✔
747
                assert_eq!(base.partial_cmp(&I128(0)), Some(Ordering::Greater));
10✔
748
                assert_eq!(base.partial_cmp(&U8(0)), Some(Ordering::Greater));
10✔
749
                assert_eq!(base.partial_cmp(&U16(0)), Some(Ordering::Greater));
10✔
750
                assert_eq!(base.partial_cmp(&U32(0)), Some(Ordering::Greater));
10✔
751
                assert_eq!(base.partial_cmp(&U64(0)), Some(Ordering::Greater));
10✔
752
                assert_eq!(base.partial_cmp(&U128(0)), Some(Ordering::Greater));
10✔
753

754
                assert_eq!(
10✔
755
                    base.partial_cmp(&Decimal(Decimal::ONE)),
10✔
756
                    Some(Ordering::Equal)
757
                );
758
                assert_eq!(base.partial_cmp(&F32(1.0_f32)), Some(Ordering::Equal));
10✔
759
                assert_eq!(base.partial_cmp(&F64(1.0)), Some(Ordering::Equal));
10✔
760
                assert_eq!(base.partial_cmp(&I8(1)), Some(Ordering::Equal));
10✔
761
                assert_eq!(base.partial_cmp(&I16(1)), Some(Ordering::Equal));
10✔
762
                assert_eq!(base.partial_cmp(&I32(1)), Some(Ordering::Equal));
10✔
763
                assert_eq!(base.partial_cmp(&I64(1)), Some(Ordering::Equal));
10✔
764
                assert_eq!(base.partial_cmp(&I128(1)), Some(Ordering::Equal));
10✔
765
                assert_eq!(base.partial_cmp(&U8(1)), Some(Ordering::Equal));
10✔
766
                assert_eq!(base.partial_cmp(&U16(1)), Some(Ordering::Equal));
10✔
767
                assert_eq!(base.partial_cmp(&U32(1)), Some(Ordering::Equal));
10✔
768
                assert_eq!(base.partial_cmp(&U64(1)), Some(Ordering::Equal));
10✔
769
                assert_eq!(base.partial_cmp(&U128(1)), Some(Ordering::Equal));
10✔
770

771
                assert_eq!(
10✔
772
                    base.partial_cmp(&Decimal(Decimal::TWO)),
10✔
773
                    Some(Ordering::Less)
774
                );
775
                assert_eq!(base.partial_cmp(&F32(2.0_f32)), Some(Ordering::Less));
10✔
776
                assert_eq!(base.partial_cmp(&F64(2.0)), Some(Ordering::Less));
10✔
777
                assert_eq!(base.partial_cmp(&I8(2)), Some(Ordering::Less));
10✔
778
                assert_eq!(base.partial_cmp(&I16(2)), Some(Ordering::Less));
10✔
779
                assert_eq!(base.partial_cmp(&I32(2)), Some(Ordering::Less));
10✔
780
                assert_eq!(base.partial_cmp(&I64(2)), Some(Ordering::Less));
10✔
781
                assert_eq!(base.partial_cmp(&I128(2)), Some(Ordering::Less));
10✔
782
                assert_eq!(base.partial_cmp(&U8(2)), Some(Ordering::Less));
10✔
783
                assert_eq!(base.partial_cmp(&U16(2)), Some(Ordering::Less));
10✔
784
                assert_eq!(base.partial_cmp(&U32(2)), Some(Ordering::Less));
10✔
785
                assert_eq!(base.partial_cmp(&U64(2)), Some(Ordering::Less));
10✔
786
                assert_eq!(base.partial_cmp(&U128(2)), Some(Ordering::Less));
10✔
787

788
                assert_eq!(base.partial_cmp(&Bool(true)), None);
10✔
789
            }
10✔
790
        }
791
    };
792
}
793

794
#[cfg(test)]
795
pub(crate) use {generate_binary_op_tests, generate_cmp_ord_tests};
796
pub(crate) use {
797
    impl_interval_method, impl_method, impl_partial_cmp_ord_method, impl_try_binary_op,
798
};
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc