sui_field_count/
lib.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4pub use sui_field_count_derive::*;
5
6/// Trait that provides a constant indicating the number of fields in a struct.
7pub trait FieldCount {
8    const FIELD_COUNT: usize;
9}
10
11#[cfg(test)]
12mod tests {
13    use super::*;
14
15    #[test]
16    fn test_basic_field_count() {
17        #[derive(FieldCount)]
18        struct EmptyStruct {}
19        #[derive(FieldCount)]
20        struct BasicStruct {
21            _field1: String,
22            _field2: i32,
23            _field3: bool,
24        }
25
26        assert_eq!(BasicStruct::FIELD_COUNT, 3);
27        assert_eq!(EmptyStruct::FIELD_COUNT, 0);
28    }
29
30    #[test]
31    fn test_lifetime_field_count() {
32        #[derive(FieldCount)]
33        struct LifetimeStruct<'a> {
34            _field1: &'a str,
35            _field2: &'a [u8],
36            _field3: &'a Vec<String>,
37        }
38
39        assert_eq!(LifetimeStruct::FIELD_COUNT, 3);
40    }
41
42    #[test]
43    fn test_generic_type_field_count() {
44        #[derive(FieldCount)]
45        struct GenericStruct<T> {
46            _field1: T,
47            _field2: Vec<T>,
48            _field3: Option<T>,
49        }
50
51        assert_eq!(GenericStruct::<String>::FIELD_COUNT, 3);
52        assert_eq!(GenericStruct::<i32>::FIELD_COUNT, 3);
53    }
54
55    #[test]
56    fn test_where_clause_field_count() {
57        #[derive(FieldCount)]
58        struct WhereStruct<T>
59        where
60            T: Clone,
61        {
62            _field1: T,
63            _field2: Vec<T>,
64        }
65
66        assert_eq!(WhereStruct::<String>::FIELD_COUNT, 2);
67        assert_eq!(WhereStruct::<i32>::FIELD_COUNT, 2);
68    }
69}