@layerzerolabs/common-utils-macros-stellar-contracts 0.2.122

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/Cargo.toml +21 -0
  2. package/LICENSE +23 -0
  3. package/clippy.toml +7 -0
  4. package/package.json +37 -0
  5. package/rust-toolchain.toml +4 -0
  6. package/rustfmt.toml +15 -0
  7. package/src/auth.rs +95 -0
  8. package/src/contract_ttl.rs +92 -0
  9. package/src/error.rs +43 -0
  10. package/src/lib.rs +585 -0
  11. package/src/lz_contract.rs +105 -0
  12. package/src/rbac.rs +90 -0
  13. package/src/storage.rs +522 -0
  14. package/src/tests/auth.rs +230 -0
  15. package/src/tests/contract_ttl.rs +695 -0
  16. package/src/tests/error.rs +156 -0
  17. package/src/tests/lz_contract.rs +87 -0
  18. package/src/tests/mod.rs +11 -0
  19. package/src/tests/rbac.rs +523 -0
  20. package/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_multisig_code.snap +31 -0
  21. package/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_ownable_code.snap +39 -0
  22. package/src/tests/snapshots/common_macros__tests__auth__snapshot_only_auth_preserves_function_signature.snap +19 -0
  23. package/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contractimpl_code.snap +77 -0
  24. package/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contracttrait_code.snap +46 -0
  25. package/src/tests/snapshots/common_macros__tests__error__snapshot_generated_contract_error_code.snap +20 -0
  26. package/src/tests/snapshots/common_macros__tests__lz_contract__snapshot_generated_lz_contract_code.snap +51 -0
  27. package/src/tests/snapshots/common_macros__tests__rbac__snapshot_authorizer_role.snap +21 -0
  28. package/src/tests/snapshots/common_macros__tests__rbac__snapshot_preserve_function_signature.snap +21 -0
  29. package/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +10 -0
  30. package/src/tests/snapshots/common_macros__tests__ttl_extendable__snapshot_generated_ttl_extendable_code.snap +8 -0
  31. package/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +28 -0
  32. package/src/tests/storage/extract_fields.rs +87 -0
  33. package/src/tests/storage/gen_accessor_methods.rs +223 -0
  34. package/src/tests/storage/gen_args.rs +65 -0
  35. package/src/tests/storage/gen_enum_variant.rs +78 -0
  36. package/src/tests/storage/gen_key.rs +108 -0
  37. package/src/tests/storage/gen_params.rs +105 -0
  38. package/src/tests/storage/generate_storage.rs +410 -0
  39. package/src/tests/storage/is_primitive_type.rs +48 -0
  40. package/src/tests/storage/mod.rs +16 -0
  41. package/src/tests/storage/parse_default.rs +164 -0
  42. package/src/tests/storage/parse_name.rs +158 -0
  43. package/src/tests/storage/parse_no_ttl_extension.rs +124 -0
  44. package/src/tests/storage/parse_storage_type.rs +174 -0
  45. package/src/tests/storage/snapshots/common_macros__tests__storage__generate_storage__snapshot_generated_storage_code.snap +412 -0
  46. package/src/tests/storage/storage_kind.rs +39 -0
  47. package/src/tests/storage/test_setup.rs +25 -0
  48. package/src/tests/storage/validate_attrs.rs +138 -0
  49. package/src/tests/storage/variant_config.rs +226 -0
  50. package/src/tests/test_helpers.rs +87 -0
  51. package/src/tests/ttl_configurable.rs +34 -0
  52. package/src/tests/ttl_extendable.rs +32 -0
  53. package/src/tests/upgradeable.rs +169 -0
  54. package/src/tests/utils.rs +267 -0
  55. package/src/ttl_configurable.rs +24 -0
  56. package/src/ttl_extendable.rs +28 -0
  57. package/src/upgradeable.rs +136 -0
  58. package/src/utils.rs +56 -0
@@ -0,0 +1,164 @@
1
+ //! Unit tests for the `parse_default` function.
2
+
3
+ use crate::storage::test::parse_default_for_test;
4
+ use quote::quote;
5
+
6
+ use super::test_setup::parse_attrs;
7
+
8
+ #[test]
9
+ fn test_no_default_returns_none() {
10
+ let attrs = parse_attrs(quote! {
11
+ enum Test {
12
+ #[persistent(u32)]
13
+ Variant,
14
+ }
15
+ });
16
+
17
+ let result = parse_default_for_test(&attrs);
18
+ assert!(result.is_ok());
19
+ assert!(result.unwrap().is_none());
20
+ }
21
+
22
+ #[test]
23
+ fn test_parses_integer_default() {
24
+ let attrs = parse_attrs(quote! {
25
+ enum Test {
26
+ #[persistent(u32)]
27
+ #[default(42)]
28
+ Variant,
29
+ }
30
+ });
31
+
32
+ let result = parse_default_for_test(&attrs);
33
+ assert!(result.is_ok());
34
+ let default = result.unwrap();
35
+ assert!(default.is_some());
36
+ assert_eq!(quote!(#default).to_string(), "42");
37
+ }
38
+
39
+ #[test]
40
+ fn test_parses_zero_default() {
41
+ let attrs = parse_attrs(quote! {
42
+ enum Test {
43
+ #[persistent(u32)]
44
+ #[default(0)]
45
+ Variant,
46
+ }
47
+ });
48
+
49
+ let result = parse_default_for_test(&attrs);
50
+ assert!(result.is_ok());
51
+ let default = result.unwrap();
52
+ assert!(default.is_some());
53
+ assert_eq!(quote!(#default).to_string(), "0");
54
+ }
55
+
56
+ #[test]
57
+ fn test_parses_boolean_default() {
58
+ let attrs = parse_attrs(quote! {
59
+ enum Test {
60
+ #[persistent(bool)]
61
+ #[default(true)]
62
+ Variant,
63
+ }
64
+ });
65
+
66
+ let result = parse_default_for_test(&attrs);
67
+ assert!(result.is_ok());
68
+ let default = result.unwrap();
69
+ assert!(default.is_some());
70
+ assert_eq!(quote!(#default).to_string(), "true");
71
+ }
72
+
73
+ #[test]
74
+ fn test_parses_method_call_default() {
75
+ let attrs = parse_attrs(quote! {
76
+ enum Test {
77
+ #[persistent(String)]
78
+ #[default(String::from_str(env, "hello"))]
79
+ Variant,
80
+ }
81
+ });
82
+
83
+ let result = parse_default_for_test(&attrs);
84
+ assert!(result.is_ok());
85
+ let default = result.unwrap();
86
+ assert!(default.is_some());
87
+ let default_str = quote!(#default).to_string();
88
+ assert!(default_str.contains("String :: from_str"));
89
+ }
90
+
91
+ #[test]
92
+ fn test_error_multiple_defaults() {
93
+ let attrs = parse_attrs(quote! {
94
+ enum Test {
95
+ #[persistent(u32)]
96
+ #[default(0)]
97
+ #[default(1)]
98
+ Variant,
99
+ }
100
+ });
101
+
102
+ let result = parse_default_for_test(&attrs);
103
+ assert!(result.is_err());
104
+ let err = result.unwrap_err();
105
+ assert!(err.contains("multiple default values specified"));
106
+ }
107
+
108
+ #[test]
109
+ fn test_error_default_without_parens() {
110
+ let attrs = parse_attrs(quote! {
111
+ enum Test {
112
+ #[persistent(u32)]
113
+ #[default]
114
+ Variant,
115
+ }
116
+ });
117
+
118
+ let result = parse_default_for_test(&attrs);
119
+ assert!(result.is_err());
120
+ let err = result.unwrap_err();
121
+ assert!(err.contains("failed to parse default value"));
122
+ }
123
+
124
+ #[test]
125
+ fn test_error_default_empty_parens() {
126
+ let attrs = parse_attrs(quote! {
127
+ enum Test {
128
+ #[persistent(u32)]
129
+ #[default()]
130
+ Variant,
131
+ }
132
+ });
133
+
134
+ let result = parse_default_for_test(&attrs);
135
+ assert!(result.is_err());
136
+ let err = result.unwrap_err();
137
+ assert!(err.contains("failed to parse default value"));
138
+ }
139
+
140
+ #[test]
141
+ fn test_empty_attrs_returns_none() {
142
+ let attrs: Vec<syn::Attribute> = vec![];
143
+
144
+ let result = parse_default_for_test(&attrs);
145
+ assert!(result.is_ok());
146
+ assert!(result.unwrap().is_none());
147
+ }
148
+
149
+ #[test]
150
+ fn test_parses_negative_default() {
151
+ let attrs = parse_attrs(quote! {
152
+ enum Test {
153
+ #[persistent(i64)]
154
+ #[default(-100)]
155
+ Variant,
156
+ }
157
+ });
158
+
159
+ let result = parse_default_for_test(&attrs);
160
+ assert!(result.is_ok());
161
+ let default = result.unwrap();
162
+ assert!(default.is_some());
163
+ assert_eq!(quote!(#default).to_string(), "- 100");
164
+ }
@@ -0,0 +1,158 @@
1
+ //! Unit tests for the `parse_name` function.
2
+
3
+ use crate::storage::test::parse_name_for_test;
4
+ use quote::quote;
5
+
6
+ use super::test_setup::parse_attrs;
7
+
8
+ #[test]
9
+ fn test_no_name_returns_none() {
10
+ let attrs = parse_attrs(quote! {
11
+ enum Test {
12
+ #[persistent(u32)]
13
+ Variant,
14
+ }
15
+ });
16
+
17
+ let result = parse_name_for_test(&attrs);
18
+ assert!(result.is_ok());
19
+ assert!(result.unwrap().is_none());
20
+ }
21
+
22
+ #[test]
23
+ fn test_parses_custom_name() {
24
+ let attrs = parse_attrs(quote! {
25
+ enum Test {
26
+ #[persistent(u32)]
27
+ #[name("custom_name")]
28
+ Variant,
29
+ }
30
+ });
31
+
32
+ let result = parse_name_for_test(&attrs);
33
+ assert!(result.is_ok());
34
+ let name = result.unwrap();
35
+ assert_eq!(name, Some("custom_name".to_string()));
36
+ }
37
+
38
+ #[test]
39
+ fn test_parses_name_with_underscores() {
40
+ let attrs = parse_attrs(quote! {
41
+ enum Test {
42
+ #[persistent(u32)]
43
+ #[name("my_custom_storage_key")]
44
+ Variant,
45
+ }
46
+ });
47
+
48
+ let result = parse_name_for_test(&attrs);
49
+ assert!(result.is_ok());
50
+ let name = result.unwrap();
51
+ assert_eq!(name, Some("my_custom_storage_key".to_string()));
52
+ }
53
+
54
+ #[test]
55
+ fn test_error_multiple_names() {
56
+ let attrs = parse_attrs(quote! {
57
+ enum Test {
58
+ #[persistent(u32)]
59
+ #[name("first")]
60
+ #[name("second")]
61
+ Variant,
62
+ }
63
+ });
64
+
65
+ let result = parse_name_for_test(&attrs);
66
+ assert!(result.is_err());
67
+ let err = result.unwrap_err();
68
+ assert!(err.contains("multiple name attributes specified"));
69
+ }
70
+
71
+ #[test]
72
+ fn test_error_name_without_parens() {
73
+ let attrs = parse_attrs(quote! {
74
+ enum Test {
75
+ #[persistent(u32)]
76
+ #[name]
77
+ Variant,
78
+ }
79
+ });
80
+
81
+ let result = parse_name_for_test(&attrs);
82
+ assert!(result.is_err());
83
+ let err = result.unwrap_err();
84
+ assert!(err.contains("failed to parse name attribute"));
85
+ }
86
+
87
+ #[test]
88
+ fn test_error_name_empty_parens() {
89
+ let attrs = parse_attrs(quote! {
90
+ enum Test {
91
+ #[persistent(u32)]
92
+ #[name()]
93
+ Variant,
94
+ }
95
+ });
96
+
97
+ let result = parse_name_for_test(&attrs);
98
+ assert!(result.is_err());
99
+ let err = result.unwrap_err();
100
+ assert!(err.contains("failed to parse name attribute"));
101
+ }
102
+
103
+ #[test]
104
+ fn test_error_name_with_integer() {
105
+ let attrs = parse_attrs(quote! {
106
+ enum Test {
107
+ #[persistent(u32)]
108
+ #[name(123)]
109
+ Variant,
110
+ }
111
+ });
112
+
113
+ let result = parse_name_for_test(&attrs);
114
+ assert!(result.is_err());
115
+ let err = result.unwrap_err();
116
+ assert!(err.contains("failed to parse name attribute"));
117
+ }
118
+
119
+ #[test]
120
+ fn test_error_name_with_identifier() {
121
+ let attrs = parse_attrs(quote! {
122
+ enum Test {
123
+ #[persistent(u32)]
124
+ #[name(some_ident)]
125
+ Variant,
126
+ }
127
+ });
128
+
129
+ let result = parse_name_for_test(&attrs);
130
+ assert!(result.is_err());
131
+ let err = result.unwrap_err();
132
+ assert!(err.contains("failed to parse name attribute"));
133
+ }
134
+
135
+ #[test]
136
+ fn test_empty_attrs_returns_none() {
137
+ let attrs: Vec<syn::Attribute> = vec![];
138
+
139
+ let result = parse_name_for_test(&attrs);
140
+ assert!(result.is_ok());
141
+ assert!(result.unwrap().is_none());
142
+ }
143
+
144
+ #[test]
145
+ fn test_parses_name_with_special_chars() {
146
+ let attrs = parse_attrs(quote! {
147
+ enum Test {
148
+ #[persistent(u32)]
149
+ #[name("key_v2_beta")]
150
+ Variant,
151
+ }
152
+ });
153
+
154
+ let result = parse_name_for_test(&attrs);
155
+ assert!(result.is_ok());
156
+ let name = result.unwrap();
157
+ assert_eq!(name, Some("key_v2_beta".to_string()));
158
+ }
@@ -0,0 +1,124 @@
1
+ //! Unit tests for the `parse_no_ttl_extension` function.
2
+
3
+ use crate::storage::test::parse_no_ttl_extension_for_test;
4
+ use quote::quote;
5
+
6
+ use super::test_setup::parse_attrs;
7
+
8
+ #[test]
9
+ fn test_no_attribute_returns_false() {
10
+ let attrs = parse_attrs(quote! {
11
+ enum Test {
12
+ #[persistent(u32)]
13
+ Variant,
14
+ }
15
+ });
16
+
17
+ let result = parse_no_ttl_extension_for_test(&attrs);
18
+ assert!(result.is_ok());
19
+ assert!(!result.unwrap());
20
+ }
21
+
22
+ #[test]
23
+ fn test_attribute_present_returns_true() {
24
+ let attrs = parse_attrs(quote! {
25
+ enum Test {
26
+ #[persistent(u32)]
27
+ #[no_ttl_extension]
28
+ Variant,
29
+ }
30
+ });
31
+
32
+ let result = parse_no_ttl_extension_for_test(&attrs);
33
+ assert!(result.is_ok());
34
+ assert!(result.unwrap());
35
+ }
36
+
37
+ #[test]
38
+ fn test_attribute_before_storage_type() {
39
+ let attrs = parse_attrs(quote! {
40
+ enum Test {
41
+ #[no_ttl_extension]
42
+ #[persistent(u32)]
43
+ Variant,
44
+ }
45
+ });
46
+
47
+ let result = parse_no_ttl_extension_for_test(&attrs);
48
+ assert!(result.is_ok());
49
+ assert!(result.unwrap());
50
+ }
51
+
52
+ #[test]
53
+ fn test_error_attribute_with_parens() {
54
+ let attrs = parse_attrs(quote! {
55
+ enum Test {
56
+ #[persistent(u32)]
57
+ #[no_ttl_extension()]
58
+ Variant,
59
+ }
60
+ });
61
+
62
+ let result = parse_no_ttl_extension_for_test(&attrs);
63
+ assert!(result.is_err());
64
+ let err = result.unwrap_err();
65
+ assert!(err.contains("does not accept arguments"));
66
+ }
67
+
68
+ #[test]
69
+ fn test_error_attribute_with_value() {
70
+ let attrs = parse_attrs(quote! {
71
+ enum Test {
72
+ #[persistent(u32)]
73
+ #[no_ttl_extension(true)]
74
+ Variant,
75
+ }
76
+ });
77
+
78
+ let result = parse_no_ttl_extension_for_test(&attrs);
79
+ assert!(result.is_err());
80
+ let err = result.unwrap_err();
81
+ assert!(err.contains("does not accept arguments"));
82
+ }
83
+
84
+ #[test]
85
+ fn test_error_attribute_with_key_value() {
86
+ let attrs = parse_attrs(quote! {
87
+ enum Test {
88
+ #[persistent(u32)]
89
+ #[no_ttl_extension = true]
90
+ Variant,
91
+ }
92
+ });
93
+
94
+ let result = parse_no_ttl_extension_for_test(&attrs);
95
+ assert!(result.is_err());
96
+ let err = result.unwrap_err();
97
+ assert!(err.contains("does not accept arguments"));
98
+ }
99
+
100
+ #[test]
101
+ fn test_error_multiple_attributes() {
102
+ let attrs = parse_attrs(quote! {
103
+ enum Test {
104
+ #[persistent(u32)]
105
+ #[no_ttl_extension]
106
+ #[no_ttl_extension]
107
+ Variant,
108
+ }
109
+ });
110
+
111
+ let result = parse_no_ttl_extension_for_test(&attrs);
112
+ assert!(result.is_err());
113
+ let err = result.unwrap_err();
114
+ assert!(err.contains("multiple #[no_ttl_extension]"));
115
+ }
116
+
117
+ #[test]
118
+ fn test_empty_attrs_returns_false() {
119
+ let attrs: Vec<syn::Attribute> = vec![];
120
+
121
+ let result = parse_no_ttl_extension_for_test(&attrs);
122
+ assert!(result.is_ok());
123
+ assert!(!result.unwrap());
124
+ }
@@ -0,0 +1,174 @@
1
+ //! Unit tests for the `parse_storage_type` function.
2
+
3
+ use crate::storage::test::parse_storage_type_for_test;
4
+ use crate::tests::test_helpers::assert_panics_contains;
5
+ use quote::quote;
6
+
7
+ use super::test_setup::parse_attrs;
8
+
9
+ #[test]
10
+ fn test_parses_instance_storage() {
11
+ let attrs = parse_attrs(quote! {
12
+ enum Test {
13
+ #[instance(u32)]
14
+ Variant,
15
+ }
16
+ });
17
+
18
+ let result = parse_storage_type_for_test(&attrs);
19
+ assert!(result.is_ok());
20
+ let (kind_name, ty) = result.unwrap();
21
+ assert_eq!(kind_name, "instance");
22
+ assert_eq!(quote!(#ty).to_string(), "u32");
23
+ }
24
+
25
+ #[test]
26
+ fn test_parses_persistent_storage() {
27
+ let attrs = parse_attrs(quote! {
28
+ enum Test {
29
+ #[persistent(Address)]
30
+ Variant,
31
+ }
32
+ });
33
+
34
+ let result = parse_storage_type_for_test(&attrs);
35
+ assert!(result.is_ok());
36
+ let (kind_name, ty) = result.unwrap();
37
+ assert_eq!(kind_name, "persistent");
38
+ assert_eq!(quote!(#ty).to_string(), "Address");
39
+ }
40
+
41
+ #[test]
42
+ fn test_parses_temporary_storage() {
43
+ let attrs = parse_attrs(quote! {
44
+ enum Test {
45
+ #[temporary(bool)]
46
+ Variant,
47
+ }
48
+ });
49
+
50
+ let result = parse_storage_type_for_test(&attrs);
51
+ assert!(result.is_ok());
52
+ let (kind_name, ty) = result.unwrap();
53
+ assert_eq!(kind_name, "temporary");
54
+ assert_eq!(quote!(#ty).to_string(), "bool");
55
+ }
56
+
57
+ #[test]
58
+ fn test_parses_complex_type() {
59
+ let attrs = parse_attrs(quote! {
60
+ enum Test {
61
+ #[persistent(Option<Address>)]
62
+ Variant,
63
+ }
64
+ });
65
+
66
+ let result = parse_storage_type_for_test(&attrs);
67
+ assert!(result.is_ok());
68
+ let (kind_name, ty) = result.unwrap();
69
+ assert_eq!(kind_name, "persistent");
70
+ assert_eq!(quote!(#ty).to_string(), "Option < Address >");
71
+ }
72
+
73
+ #[test]
74
+ fn test_parses_generic_type_with_multiple_params() {
75
+ let attrs = parse_attrs(quote! {
76
+ enum Test {
77
+ #[persistent(Map<Address, u64>)]
78
+ Variant,
79
+ }
80
+ });
81
+
82
+ let result = parse_storage_type_for_test(&attrs);
83
+ assert!(result.is_ok());
84
+ let (_, ty) = result.unwrap();
85
+ assert_eq!(quote!(#ty).to_string(), "Map < Address , u64 >");
86
+ }
87
+
88
+ #[test]
89
+ fn test_error_missing_storage_type() {
90
+ let attrs = parse_attrs(quote! {
91
+ enum Test {
92
+ #[default(0)]
93
+ Variant,
94
+ }
95
+ });
96
+
97
+ let result = parse_storage_type_for_test(&attrs);
98
+ assert!(result.is_err());
99
+ let err = result.unwrap_err();
100
+ assert!(err.contains("storage type must be specified exactly once"));
101
+ }
102
+
103
+ #[test]
104
+ fn test_error_empty_attrs() {
105
+ let attrs: Vec<syn::Attribute> = vec![];
106
+
107
+ let result = parse_storage_type_for_test(&attrs);
108
+ assert!(result.is_err());
109
+ let err = result.unwrap_err();
110
+ assert!(err.contains("storage type must be specified exactly once"));
111
+ }
112
+
113
+ #[test]
114
+ fn test_error_multiple_storage_types() {
115
+ let attrs = parse_attrs(quote! {
116
+ enum Test {
117
+ #[instance(u32)]
118
+ #[persistent(u32)]
119
+ Variant,
120
+ }
121
+ });
122
+
123
+ let result = parse_storage_type_for_test(&attrs);
124
+ assert!(result.is_err());
125
+ let err = result.unwrap_err();
126
+ assert!(err.contains("storage type must be specified exactly once"));
127
+ }
128
+
129
+ #[test]
130
+ fn test_panics_missing_type_param() {
131
+ let attrs = parse_attrs(quote! {
132
+ enum Test {
133
+ #[instance]
134
+ Variant,
135
+ }
136
+ });
137
+
138
+ assert_panics_contains("missing type param", "failed to parse storage type", || {
139
+ let _ = parse_storage_type_for_test(&attrs);
140
+ });
141
+ }
142
+
143
+ #[test]
144
+ fn test_panics_invalid_type_param() {
145
+ let attrs = parse_attrs(quote! {
146
+ enum Test {
147
+ #[persistent(u32, String)]
148
+ Variant,
149
+ }
150
+ });
151
+
152
+ assert_panics_contains("multiple type params", "failed to parse storage type", || {
153
+ let _ = parse_storage_type_for_test(&attrs);
154
+ });
155
+ }
156
+
157
+ #[test]
158
+ fn test_ignores_non_storage_attrs() {
159
+ let attrs = parse_attrs(quote! {
160
+ enum Test {
161
+ /// Doc comment
162
+ #[default(0)]
163
+ #[name("custom")]
164
+ #[persistent(u64)]
165
+ Variant,
166
+ }
167
+ });
168
+
169
+ let result = parse_storage_type_for_test(&attrs);
170
+ assert!(result.is_ok());
171
+ let (kind_name, ty) = result.unwrap();
172
+ assert_eq!(kind_name, "persistent");
173
+ assert_eq!(quote!(#ty).to_string(), "u64");
174
+ }