code_ownership 2.1.0 → 2.1.1
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.
- checksums.yaml +4 -4
- data/Cargo.lock +8 -14
- data/ext/cargo-vendor/magnus-0.8.2/.cargo-checksum.json +1 -0
- data/ext/cargo-vendor/magnus-0.8.2/.cargo_vcs_info.json +6 -0
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/CHANGELOG.md +66 -1
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/Cargo.lock +243 -9
- data/ext/cargo-vendor/magnus-0.8.2/Cargo.toml +277 -0
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/Cargo.toml.orig +11 -6
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/README.md +75 -23
- data/ext/cargo-vendor/magnus-0.8.2/build.rs +15 -0
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/examples/complete_object/test/temperature_test.rb +4 -4
- data/ext/cargo-vendor/magnus-0.8.2/examples/inheritance.rs +66 -0
- data/ext/cargo-vendor/magnus-0.8.2/examples/mut_point.rs +116 -0
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/api.rs +4 -3
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/class.rs +9 -7
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/encoding.rs +5 -5
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/error.rs +12 -3
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/fiber.rs +5 -5
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/gc.rs +3 -3
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/integer.rs +134 -0
- data/ext/cargo-vendor/magnus-0.8.2/src/io.rs +230 -0
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/lib.rs +53 -54
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/macros.rs +2 -2
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/method.rs +14 -100
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/module.rs +1 -1
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/mutex.rs +1 -1
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/r_array.rs +2 -2
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/r_bignum.rs +100 -3
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/r_hash.rs +63 -1
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/r_string.rs +31 -231
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/r_typed_data.rs +6 -9
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/rb_sys.rs +4 -4
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/scan_args.rs +3 -3
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/thread.rs +16 -10
- data/ext/cargo-vendor/magnus-0.8.2/src/time.rs +462 -0
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/try_convert.rs +64 -2
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/typed_data.rs +113 -11
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/value/flonum.rs +1 -1
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/value.rs +83 -6
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/test +1 -1
- data/ext/cargo-vendor/magnus-0.8.2/tests/hash.rs +44 -0
- data/ext/cargo-vendor/magnus-0.8.2/tests/io.rs +62 -0
- data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/return_iter.rs +1 -1
- data/ext/cargo-vendor/magnus-0.8.2/tests/string.rs +23 -0
- data/ext/cargo-vendor/magnus-0.8.2/tests/time.rs +71 -0
- data/ext/cargo-vendor/magnus-macros-0.8.0/.cargo-checksum.json +1 -0
- data/ext/cargo-vendor/magnus-macros-0.8.0/.cargo_vcs_info.json +6 -0
- data/ext/cargo-vendor/magnus-macros-0.8.0/Cargo.lock +47 -0
- data/ext/cargo-vendor/{magnus-macros-0.6.0 → magnus-macros-0.8.0}/Cargo.toml +10 -1
- data/ext/cargo-vendor/{magnus-macros-0.6.0 → magnus-macros-0.8.0}/Cargo.toml.orig +1 -1
- data/ext/cargo-vendor/magnus-macros-0.8.0/src/lib.rs +545 -0
- data/ext/cargo-vendor/{magnus-macros-0.6.0 → magnus-macros-0.8.0}/src/typed_data.rs +3 -3
- data/ext/cargo-vendor/{magnus-macros-0.6.0 → magnus-macros-0.8.0}/src/util.rs +1 -1
- data/ext/cargo-vendor/serde_magnus-0.10.0/.cargo-checksum.json +1 -0
- data/ext/cargo-vendor/serde_magnus-0.10.0/.cargo_vcs_info.json +6 -0
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/Cargo.lock +77 -75
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/Cargo.toml +3 -3
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/Cargo.toml.orig +7 -4
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/README.md +8 -5
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/src/de/array_deserializer.rs +12 -8
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/src/de/array_enumerator.rs +12 -7
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/src/de/deserializer.rs +21 -18
- data/ext/cargo-vendor/serde_magnus-0.10.0/src/de/enum_deserializer.rs +35 -0
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/src/de/hash_deserializer.rs +18 -11
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/src/de/mod.rs +76 -76
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/src/de/variant_deserializer.rs +10 -9
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/src/error.rs +10 -4
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/src/lib.rs +6 -5
- data/ext/cargo-vendor/serde_magnus-0.10.0/src/ser/enums.rs +11 -0
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/src/ser/map_serializer.rs +11 -12
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/src/ser/mod.rs +53 -50
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/src/ser/seq_serializer.rs +11 -10
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/src/ser/serializer.rs +50 -34
- data/ext/cargo-vendor/serde_magnus-0.10.0/src/ser/struct_serializer.rs +40 -0
- data/ext/cargo-vendor/serde_magnus-0.10.0/src/ser/struct_variant_serializer.rs +45 -0
- data/ext/cargo-vendor/serde_magnus-0.10.0/src/ser/tuple_variant_serializer.rs +38 -0
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/tests/deserializing_arrays.rs +3 -3
- data/ext/cargo-vendor/serde_magnus-0.10.0/tests/deserializing_booleans.rs +15 -0
- data/ext/cargo-vendor/serde_magnus-0.10.0/tests/deserializing_enums.rs +39 -0
- data/ext/cargo-vendor/serde_magnus-0.10.0/tests/deserializing_floats.rs +12 -0
- data/ext/cargo-vendor/serde_magnus-0.10.0/tests/deserializing_integers.rs +18 -0
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/tests/deserializing_maps.rs +3 -2
- data/ext/cargo-vendor/serde_magnus-0.10.0/tests/deserializing_options.rs +15 -0
- data/ext/cargo-vendor/serde_magnus-0.10.0/tests/deserializing_results.rs +17 -0
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/tests/deserializing_strings.rs +7 -7
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/tests/deserializing_structs.rs +9 -9
- data/ext/cargo-vendor/serde_magnus-0.10.0/tests/deserializing_tuples.rs +27 -0
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/tests/deserializing_vecs.rs +3 -3
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/tests/serializing_arrays.rs +3 -3
- data/ext/cargo-vendor/serde_magnus-0.10.0/tests/serializing_booleans.rs +15 -0
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/tests/serializing_enums.rs +9 -7
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/tests/serializing_floats.rs +2 -2
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/tests/serializing_integers.rs +4 -4
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/tests/serializing_maps.rs +3 -2
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/tests/serializing_options.rs +3 -3
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/tests/serializing_results.rs +5 -4
- data/ext/cargo-vendor/serde_magnus-0.10.0/tests/serializing_strings.rs +30 -0
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/tests/serializing_structs.rs +15 -7
- data/ext/cargo-vendor/serde_magnus-0.10.0/tests/serializing_tuples.rs +35 -0
- data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/tests/serializing_vecs.rs +3 -3
- data/ext/code_ownership/Cargo.toml +2 -2
- data/ext/code_ownership/extconf.rb +2 -1
- data/ext/code_ownership/src/lib.rs +16 -16
- data/lib/code_ownership/cli.rb +1 -0
- data/lib/code_ownership/private/file_path_finder.rb +3 -7
- data/lib/code_ownership/private/file_path_team_cache.rb +5 -9
- data/lib/code_ownership/private/for_file_output_builder.rb +0 -1
- data/lib/code_ownership/private/team_finder.rb +8 -14
- data/lib/code_ownership/version.rb +2 -2
- data/lib/code_ownership.rb +12 -17
- metadata +182 -186
- data/ext/cargo-vendor/magnus-0.7.1/.cargo-checksum.json +0 -1
- data/ext/cargo-vendor/magnus-0.7.1/.cargo_vcs_info.json +0 -6
- data/ext/cargo-vendor/magnus-0.7.1/Cargo.toml +0 -95
- data/ext/cargo-vendor/magnus-0.7.1/build.rs +0 -5
- data/ext/cargo-vendor/magnus-0.7.1/examples/mut_point.rs +0 -60
- data/ext/cargo-vendor/magnus-0.7.1/src/time.rs +0 -190
- data/ext/cargo-vendor/magnus-0.7.1/tests/hash.rs +0 -25
- data/ext/cargo-vendor/magnus-0.7.1/tests/string.rs +0 -13
- data/ext/cargo-vendor/magnus-macros-0.6.0/.cargo-checksum.json +0 -1
- data/ext/cargo-vendor/magnus-macros-0.6.0/.cargo_vcs_info.json +0 -6
- data/ext/cargo-vendor/magnus-macros-0.6.0/src/lib.rs +0 -401
- data/ext/cargo-vendor/rb-sys-env-0.1.2/.cargo-checksum.json +0 -1
- data/ext/cargo-vendor/rb-sys-env-0.1.2/.cargo_vcs_info.json +0 -6
- data/ext/cargo-vendor/rb-sys-env-0.1.2/Cargo.toml +0 -25
- data/ext/cargo-vendor/rb-sys-env-0.1.2/Cargo.toml.orig +0 -14
- data/ext/cargo-vendor/rb-sys-env-0.1.2/LICENSE-APACHE +0 -190
- data/ext/cargo-vendor/rb-sys-env-0.1.2/LICENSE-MIT +0 -21
- data/ext/cargo-vendor/rb-sys-env-0.1.2/readme.md +0 -119
- data/ext/cargo-vendor/rb-sys-env-0.1.2/src/defines.rs +0 -37
- data/ext/cargo-vendor/rb-sys-env-0.1.2/src/lib.rs +0 -180
- data/ext/cargo-vendor/rb-sys-env-0.1.2/src/rb_env.rs +0 -110
- data/ext/cargo-vendor/rb-sys-env-0.1.2/src/ruby_version.rs +0 -163
- data/ext/cargo-vendor/rb-sys-env-0.1.2/src/utils.rs +0 -6
- data/ext/cargo-vendor/serde_magnus-0.9.0/.cargo-checksum.json +0 -1
- data/ext/cargo-vendor/serde_magnus-0.9.0/.cargo_vcs_info.json +0 -6
- data/ext/cargo-vendor/serde_magnus-0.9.0/src/de/enum_deserializer.rs +0 -30
- data/ext/cargo-vendor/serde_magnus-0.9.0/src/ser/enums.rs +0 -11
- data/ext/cargo-vendor/serde_magnus-0.9.0/src/ser/struct_serializer.rs +0 -36
- data/ext/cargo-vendor/serde_magnus-0.9.0/src/ser/struct_variant_serializer.rs +0 -37
- data/ext/cargo-vendor/serde_magnus-0.9.0/src/ser/tuple_variant_serializer.rs +0 -33
- data/ext/cargo-vendor/serde_magnus-0.9.0/tests/deserializing_booleans.rs +0 -18
- data/ext/cargo-vendor/serde_magnus-0.9.0/tests/deserializing_enums.rs +0 -39
- data/ext/cargo-vendor/serde_magnus-0.9.0/tests/deserializing_floats.rs +0 -12
- data/ext/cargo-vendor/serde_magnus-0.9.0/tests/deserializing_integers.rs +0 -18
- data/ext/cargo-vendor/serde_magnus-0.9.0/tests/deserializing_options.rs +0 -15
- data/ext/cargo-vendor/serde_magnus-0.9.0/tests/deserializing_results.rs +0 -17
- data/ext/cargo-vendor/serde_magnus-0.9.0/tests/deserializing_tuples.rs +0 -31
- data/ext/cargo-vendor/serde_magnus-0.9.0/tests/serializing_booleans.rs +0 -15
- data/ext/cargo-vendor/serde_magnus-0.9.0/tests/serializing_strings.rs +0 -30
- data/ext/cargo-vendor/serde_magnus-0.9.0/tests/serializing_tuples.rs +0 -27
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/.cargo/config.toml +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/Gemfile +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/LICENSE +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/examples/complete_object/Rakefile +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/examples/complete_object/lib/temperature.rb +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/examples/custom_exception_ruby/Rakefile +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/examples/custom_exception_ruby/lib/ahriman/error.rb +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/examples/custom_exception_ruby/lib/ahriman.rb +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/examples/custom_exception_ruby/test/error_test.rb +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/examples/custom_exception_rust/Rakefile +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/examples/custom_exception_rust/lib/ahriman.rb +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/examples/custom_exception_rust/test/error_test.rb +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/examples/fibonacci.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/examples/hello_world.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/examples/point.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/examples/rust_blank/Rakefile +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/examples/rust_blank/lib/rust_blank.rb +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/examples/rust_blank/test/bench.rb +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/examples/rust_blank/test/blank_test.rb +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/block.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/embed.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/enumerator.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/exception.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/float.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/into_value.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/numeric.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/object.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/process.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/r_complex.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/r_file.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/r_float.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/r_match.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/r_object.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/r_rational.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/r_regexp.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/r_struct.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/range.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/src/symbol.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/allocate_before_init.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/array_slice.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/block_call.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/bytes.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/call_proc.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/classname.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/clone.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/codepoints.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/debug_exception.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/encoding_capable.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/enumerator.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/enumeratorize.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/float_convert_from_value.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/float_convert_to_value.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/fmt.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/freeze.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/integer_convert_to_value.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/integer_traits.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/ivar.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/lazy_id.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/make_proc.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/proc_new.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/range.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/return_custom_error.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/scan_args.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/str.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/struct.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/symbol.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/try_convert_array.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/tuple_to_array.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/typed_data.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/typed_data_obj.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/typed_data_subclass.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/typed_data_subclass_from_ruby.rs +0 -0
- /data/ext/cargo-vendor/{magnus-0.7.1 → magnus-0.8.2}/tests/yield.rs +0 -0
- /data/ext/cargo-vendor/{magnus-macros-0.6.0 → magnus-macros-0.8.0}/LICENSE +0 -0
- /data/ext/cargo-vendor/{magnus-macros-0.6.0 → magnus-macros-0.8.0}/src/init.rs +0 -0
- /data/ext/cargo-vendor/{serde_magnus-0.9.0 → serde_magnus-0.10.0}/LICENSE +0 -0
|
@@ -0,0 +1,545 @@
|
|
|
1
|
+
//! Derive and proc macros for magnus.
|
|
2
|
+
//!
|
|
3
|
+
//! ```
|
|
4
|
+
//! #[magnus::wrap(class = "RbPoint", free_immediately, size)]
|
|
5
|
+
//! struct Point {
|
|
6
|
+
//! x: isize,
|
|
7
|
+
//! y: isize,
|
|
8
|
+
//! }
|
|
9
|
+
//!
|
|
10
|
+
//! #[magnus::init]
|
|
11
|
+
//! fn init(ruby: &magnus::Ruby) -> Result<(), magnus::Error> {
|
|
12
|
+
//! ruby.define_class("RbPoint", ruby.class_object())?;
|
|
13
|
+
//! Ok(())
|
|
14
|
+
//! }
|
|
15
|
+
//! ```
|
|
16
|
+
|
|
17
|
+
#![warn(missing_docs)]
|
|
18
|
+
|
|
19
|
+
use proc_macro::TokenStream;
|
|
20
|
+
use syn::parse_macro_input;
|
|
21
|
+
|
|
22
|
+
mod init;
|
|
23
|
+
mod typed_data;
|
|
24
|
+
mod util;
|
|
25
|
+
|
|
26
|
+
/// Mark a function as the 'init' function to be run for a library when it is
|
|
27
|
+
/// `require`d by Ruby code.
|
|
28
|
+
///
|
|
29
|
+
/// The init function is used to define your Ruby modules & classes, bind
|
|
30
|
+
/// functions as Ruby methods, etc.
|
|
31
|
+
///
|
|
32
|
+
/// # Attributes
|
|
33
|
+
///
|
|
34
|
+
/// * `name = "..."` - sets the name of the init function exported for Ruby.
|
|
35
|
+
/// This default's to the current crate's name. The name will be prepended
|
|
36
|
+
/// with `Init_` and `-` will be replaced with `_`. This (minus the `Init_`
|
|
37
|
+
/// prefix) must match the name of the final `.so`/`.bundle` file.
|
|
38
|
+
///
|
|
39
|
+
/// # Examples
|
|
40
|
+
///
|
|
41
|
+
/// ```
|
|
42
|
+
/// fn distance(a: (f64, f64), b: (f64, f64)) -> f64 {
|
|
43
|
+
/// ((b.0 - a.0).powi(2) + (b.1 - a.1).powi(2)).sqrt()
|
|
44
|
+
/// }
|
|
45
|
+
///
|
|
46
|
+
/// #[magnus::init]
|
|
47
|
+
/// fn init(ruby: &magnus::Ruby) {
|
|
48
|
+
/// ruby.define_global_function("distance", magnus::function!(distance, 2));
|
|
49
|
+
/// }
|
|
50
|
+
/// ```
|
|
51
|
+
/// The init function can also return `Result<(), magnus::Error>`.
|
|
52
|
+
/// ```
|
|
53
|
+
/// use magnus::{function, method, prelude::*, Error, Ruby};
|
|
54
|
+
///
|
|
55
|
+
/// #[magnus::wrap(class = "Euclid::Point", free_immediately, size)]
|
|
56
|
+
/// struct Point {
|
|
57
|
+
/// x: isize,
|
|
58
|
+
/// y: isize,
|
|
59
|
+
/// }
|
|
60
|
+
///
|
|
61
|
+
/// impl Point {
|
|
62
|
+
/// fn new(x: isize, y: isize) -> Self {
|
|
63
|
+
/// Self { x, y }
|
|
64
|
+
/// }
|
|
65
|
+
///
|
|
66
|
+
/// fn x(&self) -> isize {
|
|
67
|
+
/// self.x
|
|
68
|
+
/// }
|
|
69
|
+
///
|
|
70
|
+
/// fn y(&self) -> isize {
|
|
71
|
+
/// self.y
|
|
72
|
+
/// }
|
|
73
|
+
/// }
|
|
74
|
+
///
|
|
75
|
+
/// #[magnus::init]
|
|
76
|
+
/// fn init(ruby: &Ruby) -> Result<(), Error> {
|
|
77
|
+
/// let module = ruby.define_module("Euclid")?;
|
|
78
|
+
/// let class = module.define_class("Point", ruby.class_object())?;
|
|
79
|
+
/// class.define_singleton_method("new", function!(Point::new, 2))?;
|
|
80
|
+
/// class.define_method("x", method!(Point::x, 0))?;
|
|
81
|
+
/// class.define_method("y", method!(Point::y, 0))?;
|
|
82
|
+
/// Ok(())
|
|
83
|
+
/// }
|
|
84
|
+
/// ```
|
|
85
|
+
/// Setting the name.
|
|
86
|
+
/// ```
|
|
87
|
+
/// #[magnus::init(name = "example")]
|
|
88
|
+
/// fn init() {
|
|
89
|
+
/// ()
|
|
90
|
+
/// }
|
|
91
|
+
/// ```
|
|
92
|
+
#[proc_macro_attribute]
|
|
93
|
+
pub fn init(attrs: TokenStream, item: TokenStream) -> TokenStream {
|
|
94
|
+
let mut name = None;
|
|
95
|
+
if !attrs.is_empty() {
|
|
96
|
+
let attr_parser = syn::meta::parser(|meta| {
|
|
97
|
+
if meta.path.is_ident("name") {
|
|
98
|
+
name = Some(meta.value()?.parse::<syn::LitStr>()?.value());
|
|
99
|
+
Ok(())
|
|
100
|
+
} else {
|
|
101
|
+
Err(meta.error("unsupported attribute"))
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
parse_macro_input!(attrs with attr_parser);
|
|
105
|
+
}
|
|
106
|
+
match init::expand(name, parse_macro_input!(item)) {
|
|
107
|
+
Ok(tokens) => tokens,
|
|
108
|
+
Err(e) => e.into_compile_error(),
|
|
109
|
+
}
|
|
110
|
+
.into()
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/// Allows a Rust type to be passed to Ruby, where it is automatically wrapped
|
|
114
|
+
/// as a Ruby object.
|
|
115
|
+
///
|
|
116
|
+
/// For more control over the wrapping behavior, see [`TypedData`].
|
|
117
|
+
///
|
|
118
|
+
/// # Attributes
|
|
119
|
+
///
|
|
120
|
+
/// The `#[wrap]` macro supports several attributes to configure its behavior:
|
|
121
|
+
///
|
|
122
|
+
/// * `class = "..."` (required):
|
|
123
|
+
/// Specifies the Ruby class associated with the Rust type. Supports module
|
|
124
|
+
/// paths, such as `Foo::Bar::Baz`, to locate nested classes.
|
|
125
|
+
///
|
|
126
|
+
/// * `name = "..."`:
|
|
127
|
+
/// Specifies a debug name for the type. This name must be unique and
|
|
128
|
+
/// defaults to the class name if not explicitly provided.
|
|
129
|
+
///
|
|
130
|
+
/// * `free_immediately`:
|
|
131
|
+
/// Indicates that the Rust type should be dropped as soon as the Ruby object
|
|
132
|
+
/// is garbage collected. This is only safe if the type's [`Drop`]
|
|
133
|
+
/// implementation does not call Ruby, as calling Ruby during the garbage
|
|
134
|
+
/// collection process is unsafe and can lead to undefined behavior.
|
|
135
|
+
///
|
|
136
|
+
/// * `size`:
|
|
137
|
+
/// Reports the [`std::mem::size_of_val`] of the type to Ruby, helping Ruby's
|
|
138
|
+
/// garbage collector determine when to run.
|
|
139
|
+
///
|
|
140
|
+
/// * `unsafe_generics`:
|
|
141
|
+
/// Disables compile-time checks for types with generics, allowing their use
|
|
142
|
+
/// with `#[wrap]`. This should only be used if you are confident that the
|
|
143
|
+
/// derived implementation of [`TypedData`] is correct for your generic type.
|
|
144
|
+
///
|
|
145
|
+
/// # Variant Attributes
|
|
146
|
+
///
|
|
147
|
+
/// When wrapping enums, the `#[magnus(...)]` attribute can also be applied to
|
|
148
|
+
/// individual variants to define specific behavior for them:
|
|
149
|
+
///
|
|
150
|
+
/// * `class = "..."`:
|
|
151
|
+
/// Specifies the Ruby class associated with a particular variant. This is
|
|
152
|
+
/// useful for defining subclasses for the variants.
|
|
153
|
+
///
|
|
154
|
+
/// # Examples
|
|
155
|
+
///
|
|
156
|
+
/// Wrapping a struct:
|
|
157
|
+
///
|
|
158
|
+
/// ```
|
|
159
|
+
/// use magnus::{function, prelude::*, wrap, Ruby};
|
|
160
|
+
///
|
|
161
|
+
/// #[wrap(class = "Point", free_immediately, size)]
|
|
162
|
+
/// struct Point {
|
|
163
|
+
/// x: isize,
|
|
164
|
+
/// y: isize,
|
|
165
|
+
/// }
|
|
166
|
+
///
|
|
167
|
+
/// fn point(x: isize, y: isize) -> Point {
|
|
168
|
+
/// Point { x, y }
|
|
169
|
+
/// }
|
|
170
|
+
///
|
|
171
|
+
/// fn distance(a: &Point, b: &Point) -> f64 {
|
|
172
|
+
/// (((b.x - a.x).pow(2) + (b.y - a.y).pow(2)) as f64).sqrt()
|
|
173
|
+
/// }
|
|
174
|
+
///
|
|
175
|
+
/// #[magnus::init]
|
|
176
|
+
/// fn init(ruby: &Ruby) {
|
|
177
|
+
/// ruby.define_global_function("point", function!(point, 2));
|
|
178
|
+
/// ruby.define_global_function("distance", function!(distance, 2));
|
|
179
|
+
/// }
|
|
180
|
+
/// ```
|
|
181
|
+
///
|
|
182
|
+
/// See [`examples/point.rs`] for the complete example.
|
|
183
|
+
///
|
|
184
|
+
/// [`examples/point.rs`]: https://github.com/matsadler/magnus/blob/main/examples/point.rs
|
|
185
|
+
///
|
|
186
|
+
/// Handling mutability:
|
|
187
|
+
///
|
|
188
|
+
/// ```
|
|
189
|
+
/// use std::cell::RefCell;
|
|
190
|
+
///
|
|
191
|
+
/// use magnus::{prelude::*, wrap};
|
|
192
|
+
///
|
|
193
|
+
/// struct Point {
|
|
194
|
+
/// x: isize,
|
|
195
|
+
/// y: isize,
|
|
196
|
+
/// }
|
|
197
|
+
///
|
|
198
|
+
/// #[wrap(class = "Point")]
|
|
199
|
+
/// struct MutPoint(RefCell<Point>);
|
|
200
|
+
///
|
|
201
|
+
/// impl MutPoint {
|
|
202
|
+
/// fn set_x(&self, i: isize) {
|
|
203
|
+
/// self.0.borrow_mut().x = i;
|
|
204
|
+
/// }
|
|
205
|
+
/// }
|
|
206
|
+
/// ```
|
|
207
|
+
///
|
|
208
|
+
/// See [`examples/mut_point.rs`] for the complete example.
|
|
209
|
+
///
|
|
210
|
+
/// [`examples/mut_point.rs`]: https://github.com/matsadler/magnus/blob/main/examples/mut_point.rs
|
|
211
|
+
///
|
|
212
|
+
/// Supporting subclassing:
|
|
213
|
+
///
|
|
214
|
+
/// ```
|
|
215
|
+
/// use std::cell::RefCell;
|
|
216
|
+
///
|
|
217
|
+
/// use magnus::{function, method, prelude::*, wrap, Error, Ruby};
|
|
218
|
+
///
|
|
219
|
+
/// #[derive(Default)]
|
|
220
|
+
/// struct Point {
|
|
221
|
+
/// x: isize,
|
|
222
|
+
/// y: isize,
|
|
223
|
+
/// }
|
|
224
|
+
///
|
|
225
|
+
/// #[derive(Default)]
|
|
226
|
+
/// #[wrap(class = "Point")]
|
|
227
|
+
/// struct MutPoint(RefCell<Point>);
|
|
228
|
+
///
|
|
229
|
+
/// impl MutPoint {
|
|
230
|
+
/// fn initialize(&self, x: isize, y: isize) {
|
|
231
|
+
/// let mut this = self.0.borrow_mut();
|
|
232
|
+
/// this.x = x;
|
|
233
|
+
/// this.y = y;
|
|
234
|
+
/// }
|
|
235
|
+
/// }
|
|
236
|
+
///
|
|
237
|
+
/// #[magnus::init]
|
|
238
|
+
/// fn init(ruby: &Ruby) -> Result<(), Error> {
|
|
239
|
+
/// let class = ruby.define_class("Point", ruby.class_object()).unwrap();
|
|
240
|
+
/// class.define_alloc_func::<MutPoint>();
|
|
241
|
+
/// class.define_method("initialize", method!(MutPoint::initialize, 2))?;
|
|
242
|
+
/// Ok(())
|
|
243
|
+
/// }
|
|
244
|
+
/// ```
|
|
245
|
+
///
|
|
246
|
+
/// Error handling:
|
|
247
|
+
///
|
|
248
|
+
/// ```
|
|
249
|
+
/// use std::cell::RefCell;
|
|
250
|
+
///
|
|
251
|
+
/// use magnus::{prelude::*, wrap, Error, Ruby};
|
|
252
|
+
///
|
|
253
|
+
/// struct Point {
|
|
254
|
+
/// x: isize,
|
|
255
|
+
/// y: isize,
|
|
256
|
+
/// }
|
|
257
|
+
///
|
|
258
|
+
/// #[wrap(class = "Point")]
|
|
259
|
+
/// struct MutPoint(RefCell<Point>);
|
|
260
|
+
///
|
|
261
|
+
/// impl MutPoint {
|
|
262
|
+
/// fn add_x(ruby: &Ruby, rb_self: &Self, val: isize) -> Result<isize, Error> {
|
|
263
|
+
/// if let Some(sum) = rb_self.0.borrow().x.checked_add(val) {
|
|
264
|
+
/// rb_self.0.borrow_mut().x = sum;
|
|
265
|
+
/// Ok(sum)
|
|
266
|
+
/// } else {
|
|
267
|
+
/// return Err(Error::new(
|
|
268
|
+
/// ruby.exception_range_error(),
|
|
269
|
+
/// "result out of range",
|
|
270
|
+
/// ));
|
|
271
|
+
/// }
|
|
272
|
+
/// }
|
|
273
|
+
/// }
|
|
274
|
+
/// ```
|
|
275
|
+
///
|
|
276
|
+
/// Wrapping an enum with subclasses:
|
|
277
|
+
///
|
|
278
|
+
/// ```
|
|
279
|
+
/// use std::f64::consts::PI;
|
|
280
|
+
///
|
|
281
|
+
/// use magnus::{function, method, prelude::*, wrap, Ruby};
|
|
282
|
+
///
|
|
283
|
+
/// #[wrap(class = "Shape")]
|
|
284
|
+
/// enum Shape {
|
|
285
|
+
/// #[magnus(class = "Circle")]
|
|
286
|
+
/// Circle { r: f64 },
|
|
287
|
+
/// #[magnus(class = "Rectangle")]
|
|
288
|
+
/// Rectangle { x: f64, y: f64 },
|
|
289
|
+
/// }
|
|
290
|
+
///
|
|
291
|
+
/// impl Shape {
|
|
292
|
+
/// fn area(&self) -> f64 {
|
|
293
|
+
/// match self {
|
|
294
|
+
/// Shape::Circle { r } => PI * r * r,
|
|
295
|
+
/// Shape::Rectangle { x, y } => x * y,
|
|
296
|
+
/// }
|
|
297
|
+
/// }
|
|
298
|
+
/// }
|
|
299
|
+
///
|
|
300
|
+
/// #[magnus::init]
|
|
301
|
+
/// fn init(ruby: &Ruby) -> Result<(), magnus::Error> {
|
|
302
|
+
/// let shape = ruby.define_class("Shape", ruby.class_object())?;
|
|
303
|
+
/// shape.define_method("area", method!(Shape::area, 0))?;
|
|
304
|
+
///
|
|
305
|
+
/// let circle = ruby.define_class("Circle", shape)?;
|
|
306
|
+
/// circle.define_singleton_method("new", function!(|r| Shape::Circle { r }, 1))?;
|
|
307
|
+
///
|
|
308
|
+
/// let rectangle = ruby.define_class("Rectangle", shape)?;
|
|
309
|
+
/// rectangle.define_singleton_method("new", function!(|x, y| Shape::Rectangle { x, y }, 2))?;
|
|
310
|
+
///
|
|
311
|
+
/// Ok(())
|
|
312
|
+
/// }
|
|
313
|
+
/// ```
|
|
314
|
+
///
|
|
315
|
+
/// See [`examples/inheritance.rs`] for the complete example.
|
|
316
|
+
///
|
|
317
|
+
/// [`examples/inheritance.rs`]: https://github.com/matsadler/magnus/blob/main/examples/inheritance.rs
|
|
318
|
+
#[proc_macro_attribute]
|
|
319
|
+
pub fn wrap(attrs: TokenStream, item: TokenStream) -> TokenStream {
|
|
320
|
+
typed_data::expand(parse_macro_input!(attrs), parse_macro_input!(item)).into()
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/// Derives `DataTypeFunctions` with default implementations, for simple uses
|
|
324
|
+
/// of [`TypedData`].
|
|
325
|
+
///
|
|
326
|
+
/// For cases where no custom `DataTypeFunctions` are required a default
|
|
327
|
+
/// implementation can be derived. The [`macro@wrap`] macro may be a simpler
|
|
328
|
+
/// alternative in this use case.
|
|
329
|
+
#[proc_macro_derive(DataTypeFunctions)]
|
|
330
|
+
pub fn derive_data_type_functions(input: TokenStream) -> TokenStream {
|
|
331
|
+
typed_data::expand_derive_data_type_functions(parse_macro_input!(input)).into()
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/// Derives `TypedData`, allowing a Rust type to be passed to Ruby and
|
|
335
|
+
/// automatically wrapped as a Ruby object.
|
|
336
|
+
///
|
|
337
|
+
/// For simpler use cases, consider using [`macro@wrap`].
|
|
338
|
+
///
|
|
339
|
+
/// # Attributes
|
|
340
|
+
///
|
|
341
|
+
/// The `#[magnus(...)]` attribute supports the following values to configure
|
|
342
|
+
/// its behavior:
|
|
343
|
+
///
|
|
344
|
+
/// * `class = "..."` (required):
|
|
345
|
+
/// Specifies the Ruby class associated with the Rust type. Supports module
|
|
346
|
+
/// paths, such as `Foo::Bar::Baz`.
|
|
347
|
+
///
|
|
348
|
+
/// * `name = "..."`:
|
|
349
|
+
/// Specifies a debug name for the type. This name must be unique and
|
|
350
|
+
/// defaults to the class name if not explicitly provided.
|
|
351
|
+
///
|
|
352
|
+
/// * `free_immediately`:
|
|
353
|
+
/// Indicates that the Rust type should be dropped as soon as the Ruby object
|
|
354
|
+
/// is garbage collected. This is only safe if the type's [`Drop`] and
|
|
355
|
+
/// `DataTypeFunctions::free` implementations do not call Ruby.
|
|
356
|
+
/// If safe this should be enabled as this performs better and is more
|
|
357
|
+
/// memory efficient.
|
|
358
|
+
///
|
|
359
|
+
/// * `mark`:
|
|
360
|
+
/// Enables Ruby to call the `DataTypeFunctions::mark` function.
|
|
361
|
+
///
|
|
362
|
+
/// * `size`:
|
|
363
|
+
/// Enables Ruby to call the `DataTypeFunctions::size` function.
|
|
364
|
+
///
|
|
365
|
+
/// * `compact`:
|
|
366
|
+
/// Enables Ruby to call the `DataTypeFunctions::compact` function.
|
|
367
|
+
///
|
|
368
|
+
/// * `wb_protected`:
|
|
369
|
+
/// Enable the 'write barrier protected' flag.
|
|
370
|
+
///
|
|
371
|
+
/// Types that contain Ruby values by default do not participate in
|
|
372
|
+
/// generational GC (they are scanned every GC). This flag asserts all
|
|
373
|
+
/// operations that write Ruby values to this type are protected with
|
|
374
|
+
/// write barriers (see `typed_data::Writebarrier::writebarrier`) so this
|
|
375
|
+
/// type can participate in generational GC.
|
|
376
|
+
///
|
|
377
|
+
/// The write barrier is hard to get right. Magnus recommends you do not use
|
|
378
|
+
/// this flag.
|
|
379
|
+
///
|
|
380
|
+
/// * `frozen_shareable`:
|
|
381
|
+
/// Sets the `frozen_shareable` flag for objects that can be safely accessed
|
|
382
|
+
/// concurrently from multiple threads when frozen. This allows objects to
|
|
383
|
+
/// shared between Ractors.
|
|
384
|
+
///
|
|
385
|
+
/// * `unsafe_generics`:
|
|
386
|
+
/// Disables compile-time checks for types with generics, allowing their use
|
|
387
|
+
/// with `#[magnus(...)]`. Use this only if you are confident the derived
|
|
388
|
+
/// implementation is correct for your generic type.
|
|
389
|
+
///
|
|
390
|
+
/// # Field Attributes
|
|
391
|
+
///
|
|
392
|
+
/// The `#[magnus(...)]` attribute can be set on struct fields with the
|
|
393
|
+
/// following values:
|
|
394
|
+
///
|
|
395
|
+
/// * `opaque_attr_reader`:
|
|
396
|
+
/// For a Ruby value wrapped in `Opaque`, creates an accessor method that
|
|
397
|
+
/// returns the unwrapped Ruby value.
|
|
398
|
+
///
|
|
399
|
+
/// # Variant Attributes
|
|
400
|
+
///
|
|
401
|
+
/// The `#[magnus(...)]` attribute can be set on enum variants with the
|
|
402
|
+
/// following values:
|
|
403
|
+
///
|
|
404
|
+
/// * `class = "..."`:
|
|
405
|
+
/// Specifies the Ruby class associated with the variant. Supports module
|
|
406
|
+
/// paths, such as `Foo::Bar::Baz`.
|
|
407
|
+
///
|
|
408
|
+
/// # Examples
|
|
409
|
+
///
|
|
410
|
+
/// Wrapping a struct
|
|
411
|
+
///
|
|
412
|
+
/// ```
|
|
413
|
+
/// use magnus::{function, prelude::*, DataTypeFunctions, Ruby, TypedData};
|
|
414
|
+
///
|
|
415
|
+
/// #[derive(DataTypeFunctions, TypedData)]
|
|
416
|
+
/// #[magnus(class = "Point", size, free_immediately)]
|
|
417
|
+
/// struct Point {
|
|
418
|
+
/// x: isize,
|
|
419
|
+
/// y: isize,
|
|
420
|
+
/// }
|
|
421
|
+
///
|
|
422
|
+
/// // wraps `Point` struct in a Ruby `Point` object when returned to Ruby.
|
|
423
|
+
/// fn point(x: isize, y: isize) -> Point {
|
|
424
|
+
/// Point { x, y }
|
|
425
|
+
/// }
|
|
426
|
+
///
|
|
427
|
+
/// // automatically unwraps `Point` objects to references to `Point`` structs
|
|
428
|
+
/// // when invoking the function.
|
|
429
|
+
/// fn distance(a: &Point, b: &Point) -> f64 {
|
|
430
|
+
/// (((b.x - a.x).pow(2) + (b.y - a.y).pow(2)) as f64).sqrt()
|
|
431
|
+
/// }
|
|
432
|
+
///
|
|
433
|
+
/// #[magnus::init]
|
|
434
|
+
/// fn init(ruby: &Ruby) {
|
|
435
|
+
/// ruby.define_global_function("point", function!(point, 2));
|
|
436
|
+
/// ruby.define_global_function("distance", function!(distance, 2));
|
|
437
|
+
/// }
|
|
438
|
+
/// ```
|
|
439
|
+
///
|
|
440
|
+
/// Wrapping an enum with subclasses:
|
|
441
|
+
///
|
|
442
|
+
/// ```
|
|
443
|
+
/// use magnus::{class, prelude::*, wrap, Error, Ruby};
|
|
444
|
+
///
|
|
445
|
+
/// #[wrap(class = "Shape")]
|
|
446
|
+
/// enum Shape {
|
|
447
|
+
/// #[magnus(class = "Circle")]
|
|
448
|
+
/// Circle { r: f64 },
|
|
449
|
+
/// #[magnus(class = "Rectangle")]
|
|
450
|
+
/// Rectangle { x: f64, y: f64 },
|
|
451
|
+
/// }
|
|
452
|
+
///
|
|
453
|
+
/// #[magnus::init]
|
|
454
|
+
/// fn init(ruby: &Ruby) -> Result<(), Error> {
|
|
455
|
+
/// let shape = ruby.define_class("Shape", ruby.class_object())?;
|
|
456
|
+
/// ruby.define_class("Circle", shape)?;
|
|
457
|
+
/// ruby.define_class("Rectangle", shape)?;
|
|
458
|
+
/// Ok(())
|
|
459
|
+
/// }
|
|
460
|
+
/// ```
|
|
461
|
+
///
|
|
462
|
+
/// Custom `DataTypeFunctions` implementation:
|
|
463
|
+
///
|
|
464
|
+
/// ```
|
|
465
|
+
/// use std::mem::size_of_val;
|
|
466
|
+
///
|
|
467
|
+
/// use magnus::{DataTypeFunctions, TypedData};
|
|
468
|
+
///
|
|
469
|
+
/// #[derive(TypedData)]
|
|
470
|
+
/// #[magnus(class = "Name", size, free_immediately)]
|
|
471
|
+
/// struct Name {
|
|
472
|
+
/// first: String,
|
|
473
|
+
/// last: String,
|
|
474
|
+
/// }
|
|
475
|
+
///
|
|
476
|
+
/// impl DataTypeFunctions for Name {
|
|
477
|
+
/// fn size(&self) -> usize {
|
|
478
|
+
/// size_of_val(&self.first) + size_of_val(&self.last)
|
|
479
|
+
/// }
|
|
480
|
+
/// }
|
|
481
|
+
/// ```
|
|
482
|
+
///
|
|
483
|
+
/// Struct containing Ruby values:
|
|
484
|
+
///
|
|
485
|
+
/// ```
|
|
486
|
+
/// use magnus::{
|
|
487
|
+
/// class, function, gc, method, prelude::*, typed_data::Obj, value::Opaque, DataTypeFunctions,
|
|
488
|
+
/// Ruby, TypedData,
|
|
489
|
+
/// };
|
|
490
|
+
///
|
|
491
|
+
/// #[derive(DataTypeFunctions, TypedData)]
|
|
492
|
+
/// #[magnus(class = "Point", size, free_immediately)]
|
|
493
|
+
/// struct Point {
|
|
494
|
+
/// x: isize,
|
|
495
|
+
/// y: isize,
|
|
496
|
+
/// }
|
|
497
|
+
///
|
|
498
|
+
/// #[derive(TypedData)]
|
|
499
|
+
/// #[magnus(class = "Line", free_immediately, mark)]
|
|
500
|
+
/// struct Line {
|
|
501
|
+
/// #[magnus(opaque_attr_reader)]
|
|
502
|
+
/// start: Opaque<Obj<Point>>,
|
|
503
|
+
/// #[magnus(opaque_attr_reader)]
|
|
504
|
+
/// end: Opaque<Obj<Point>>,
|
|
505
|
+
/// }
|
|
506
|
+
///
|
|
507
|
+
/// impl Line {
|
|
508
|
+
/// fn new(start: Obj<Point>, end: Obj<Point>) -> Self {
|
|
509
|
+
/// Self {
|
|
510
|
+
/// start: start.into(),
|
|
511
|
+
/// end: end.into(),
|
|
512
|
+
/// }
|
|
513
|
+
/// }
|
|
514
|
+
///
|
|
515
|
+
/// fn length(&self) -> f64 {
|
|
516
|
+
/// let start = self.start();
|
|
517
|
+
/// let end = self.end();
|
|
518
|
+
///
|
|
519
|
+
/// (((end.x - start.x).pow(2) + (end.y - start.y).pow(2)) as f64).sqrt()
|
|
520
|
+
/// }
|
|
521
|
+
/// }
|
|
522
|
+
///
|
|
523
|
+
/// impl DataTypeFunctions for Line {
|
|
524
|
+
/// fn mark(&self, marker: &gc::Marker) {
|
|
525
|
+
/// marker.mark(self.start);
|
|
526
|
+
/// marker.mark(self.end);
|
|
527
|
+
/// }
|
|
528
|
+
/// }
|
|
529
|
+
///
|
|
530
|
+
/// #[magnus::init]
|
|
531
|
+
/// fn init(ruby: &Ruby) -> Result<(), magnus::Error> {
|
|
532
|
+
/// let line = ruby.define_class("Line", ruby.class_object())?;
|
|
533
|
+
/// line.define_singleton_method("new", function!(Line::new, 2))?;
|
|
534
|
+
/// line.define_method("length", method!(Line::length, 0))?;
|
|
535
|
+
/// Ok(())
|
|
536
|
+
/// }
|
|
537
|
+
/// ```
|
|
538
|
+
#[proc_macro_derive(TypedData, attributes(magnus))]
|
|
539
|
+
pub fn derive_typed_data(input: TokenStream) -> TokenStream {
|
|
540
|
+
match typed_data::expand_derive_typed_data(parse_macro_input!(input)) {
|
|
541
|
+
Ok(tokens) => tokens,
|
|
542
|
+
Err(e) => e.into_compile_error(),
|
|
543
|
+
}
|
|
544
|
+
.into()
|
|
545
|
+
}
|
|
@@ -23,7 +23,7 @@ pub fn expand_derive_data_type_functions(input: DeriveInput) -> TokenStream {
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
pub fn expand_derive_typed_data(input: DeriveInput) -> Result<TokenStream, Error> {
|
|
26
|
-
let attrs = match util::
|
|
26
|
+
let attrs = match util::get_magnus_attribute(&input.attrs)? {
|
|
27
27
|
Some(v) => v,
|
|
28
28
|
None => return Err(Error::new(input.span(), "missing #[magnus] attribute")),
|
|
29
29
|
};
|
|
@@ -101,7 +101,7 @@ pub fn expand_derive_typed_data(input: DeriveInput) -> Result<TokenStream, Error
|
|
|
101
101
|
let mut arms = Vec::new();
|
|
102
102
|
if let Data::Enum(DataEnum { ref variants, .. }) = input.data {
|
|
103
103
|
for variant in variants.into_iter() {
|
|
104
|
-
let attrs = match util::
|
|
104
|
+
let attrs = match util::get_magnus_attribute(&variant.attrs)? {
|
|
105
105
|
Some(v) => v,
|
|
106
106
|
None => continue,
|
|
107
107
|
};
|
|
@@ -156,7 +156,7 @@ pub fn expand_derive_typed_data(input: DeriveInput) -> Result<TokenStream, Error
|
|
|
156
156
|
}) = input.data
|
|
157
157
|
{
|
|
158
158
|
for field in named {
|
|
159
|
-
let attrs = match util::
|
|
159
|
+
let attrs = match util::get_magnus_attribute(&field.attrs)? {
|
|
160
160
|
Some(v) => v,
|
|
161
161
|
None => continue,
|
|
162
162
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
use syn::{spanned::Spanned, Attribute, Error};
|
|
2
2
|
|
|
3
|
-
pub fn
|
|
3
|
+
pub fn get_magnus_attribute(attrs: &[Attribute]) -> Result<Option<&Attribute>, Error> {
|
|
4
4
|
let attrs = attrs
|
|
5
5
|
.iter()
|
|
6
6
|
.filter(|attr| attr.path().is_ident("magnus"))
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"files":{".cargo_vcs_info.json":"2c38e040fea253142cb5a88f405d5f4c062118b5550641a009bf3b30e7f9699f","Cargo.lock":"1ed6717180355d2a3b20b126d28fefa66ee37c3f8b60d1cc6fa4f74702c8d202","Cargo.toml":"5079fbefcc7954a3ad0dac5b30941a3e40f9d2b5660bfe4487b532b115728562","Cargo.toml.orig":"248511fc699d0cee31cc2a37210092049a626e73ae30225797b03a90d59b1b9f","LICENSE":"b13a15a45244679c4be9cc2e3a6e93e18d971fe890350e131f68a8f7d013d8ad","README.md":"e503b7e52e357adadf3827053e7f57a11500988c0a416c216ad474a9b3e3e119","src/de/array_deserializer.rs":"1f42ec33e453dc3f7da70fd67205514a39a103ab53a4f1694ccffbd6d35e4022","src/de/array_enumerator.rs":"32811edb0e1bbf621a16ee350985c246ee1d2ae9d64ec1b939fce7b3f4224cec","src/de/deserializer.rs":"99b25308b7635a09b297626b9fda4f215b025c215ee00a04fe5bd87852f19deb","src/de/enum_deserializer.rs":"4d381ecf4dc8ef9d619a9095d01376c3ccdc798d1ca434166c655fafea1420e6","src/de/hash_deserializer.rs":"8e30abfb865d99506585faaba06473cbb2b81fbc4969a518979a0417111d4344","src/de/mod.rs":"b3246446aa3a753fc2e5bb105fcc714c72928952697eaf8df4d38b57bee5c2ce","src/de/variant_deserializer.rs":"12e050e8d1aad7c1729086c2e0bc5bb9e5fb50749f0abc62f587684e222400aa","src/error.rs":"f3490e6323cfb1d2f311eb127393a755d077bf5a8c4990e14d2dfd546a18482e","src/lib.rs":"e62af27388e0bcbf91986b2789590c9b1b939031d494ecdeeb2f002d46db2b32","src/ser/enums.rs":"b68468f459f98aaa89cf86fdacf8f91439a53b53a25af66d11660772d79bba6c","src/ser/map_serializer.rs":"a8fa655d63ca8ca12107061c8ffc4779908acd608952a77b1ee7bcde52751812","src/ser/mod.rs":"cea133e2e4abd68f3d4b9f1ec7985bbea6b0790b76f9243cf32f3b4fe3770ad4","src/ser/seq_serializer.rs":"1521207de5b8469f33ddb936f1a126ee8b5117aa9c9067b6558d95d63709ebec","src/ser/serializer.rs":"c8e3834042d72c7fee92d029f7743be57607a13c70627ff9988674b9c68049e4","src/ser/struct_serializer.rs":"07b6de2746f11914660e82f9cb8c7fa714fddc3af1bc0f0ac0cb30dadea9a604","src/ser/struct_variant_serializer.rs":"dea6fbe823045d86128c3dde0b1613653a7199390939f1ce092a41c88ba4ee3f","src/ser/tuple_variant_serializer.rs":"0f0879f939d822cd83e86813f5b30741ce9dccae69572ea62c4336b1783277ca","tests/deserializing_arrays.rs":"00f2c4aaa2da6e1e32d4b7b50f8841087518074e5701ec4e2667df151d05b908","tests/deserializing_booleans.rs":"c36ef7e1bce155166bfd89626e4a0e3a56e8f31948f8691a2ab2f439a6c9bd57","tests/deserializing_enums.rs":"9930b4fc875ffed2a168fe32c8d42848fca7109175c7cc84455dd554abe25f60","tests/deserializing_floats.rs":"0d1b7c7c7f607f3599a3bd090f47113856ed6ca484a1b2b4d9336186fe3202a2","tests/deserializing_integers.rs":"fb8994ec18f91404583141f82703c02291dfda4571d43e843631f9f606ca8c7f","tests/deserializing_maps.rs":"bbadcee9578f92a56a0101698d97887d0b1ed719290cf4de6f803d237707e575","tests/deserializing_options.rs":"64a17c3bda53526a6a03c5d3aa43ea693a7f53251e80265b5ffe5256e5a0c7cd","tests/deserializing_results.rs":"538fac6cd2f76142b80beed35aabbc1641aa8927dd750c9d7e01614fe5cbfb3f","tests/deserializing_strings.rs":"b74758e444f53549d31c26defe5f8896ab661e461a2b2958d0f3a6626dae795e","tests/deserializing_structs.rs":"f4a145c10442ad689fe3d3f6d750c286bbab266fa7231802e38a6df03d3f2fee","tests/deserializing_tuples.rs":"0ab7ccf9c143fb3da2e238bc6e3c5b82ccecaee1dd1b0def36d762df2b0583bf","tests/deserializing_vecs.rs":"26d09798e73a315ce3c70e1463bef5a5f67b76f33575cc0b9012d6785b588b41","tests/serializing_arrays.rs":"c2be6d3dcc28334bcdd97d8da0f0c87816caafc13197e2f708c683eac4f9ab5d","tests/serializing_booleans.rs":"301afdc45cd5d96c2534d0a4e485cc856e2381cbf89b106b758b562eb82e7a8b","tests/serializing_enums.rs":"2b03414a7560e3979ed3f3cf312c417833e7d48343e462ff46effacde25328e1","tests/serializing_floats.rs":"2a4a73cb8b4f92c7f3ae66926f7cc174d547af3ba5cef876193fa9b11fe2130f","tests/serializing_integers.rs":"70cc2836f5ea96e2ffe8f671cf64cc1f499ca703ca5d6b83fd2c2dd489503591","tests/serializing_maps.rs":"ed1ba4644f93c97c53969cbbcee082bdeb80ea42b034be5cb74706a66617f42a","tests/serializing_options.rs":"adec0f3cee27f8144b4eaab90c29ac02f72faf8d93a2b7ac2be1192904f4018d","tests/serializing_results.rs":"547106207266e648280bf60e4c8a36df50be0a7d467b59bf083d4accc9484d36","tests/serializing_strings.rs":"84cbbd43f497857be9129dc45184c827061b665dc88efd43702bd78f573de233","tests/serializing_structs.rs":"5287d45724a83ad0f075e54095fb71aeca45b228c745136f9159b157bdc2de6b","tests/serializing_tuples.rs":"a4ea4e188f59341a6c2bba4acc91848a32a113fadc1754e3c3a31a1322b04cf0","tests/serializing_vecs.rs":"fad941c4641fa142c80ce866633d0d37adfd3922783de5776b2dbd2aad3563bd"},"package":"c4a5121544138e6a14036e48ecbe589fb63577f35620caaa32642257b412c317"}
|